Reparación de inicio de Windows 7 tras cambiar la placa base
23Cuando se actualiza “a lo bestia” el hardware sobre el que corre Windows 7, pueden ocurrir problemas serios, como que Windows se niegue a arrancar, mostrando un BSOD con el código 0x0000007B, que viene a indicar que el sistema operativo no es capaz de acceder al disco. Sobre todo suele ocurrir cuando se cambia el chipset de la placa, o se pasa de modo IDE a AHCI. El problema es debido a que para optimizar el arranque del sistema operativo, se desactivan algunas detecciones de controladores tras la instalación, con lo que al realizar el cambio, pues Windows no es capaz de volver a arrancar.
Para solucionarlo, tendremos que reactivar dichos controladores, como bien se explica en el KB922976, bien restaurando momentáneamente el hardware original, o mediante las herramientas de reparación integradas en el DVD de Windows 7 (en el símbolo de sistema podemos ejecutar RegEdit), o incluso utilizando un editor de registro offline, como el incluido con UBCD4Win. Las claves que debemos modificar son:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msahci
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\IastorV
Poniendo en ambas el valor de Start
a 0
.
Que hacer cuando WordPress no funciona despues de instalar un plugin
2Muchas veces ocurre que se instala un plugin de wordpress y desde es momento no vuelve a funcionar nada, ni si quiera el administrador.
En la mayoría de los casos provoca un error 500 que no nos deja continuar.
Para no tener que echar mano de un backup podemos desinstalar los plugins manualmente.
Como normalmente son los últimos no son difíciles de localizar.
Para eso necesitamos acceso a la base de datos. Puedes acceder desde el panel de control de tu hosting (normalmente mediante PHPmyadmin) o bien conectando directamente a la BD. Si no te acuerdas del usuario, password y nombre de la base de datos lo puedes ver en el fichero wp-config.php
DESACTIVANDO PLUGINS
Una vez dentro de la base de datos:
Cada plugin declarado suele tener esta forma s:38:”youtube-channel-list/plugin-loader.php”;
Borrando este trocito deshabilitaremos el plugin
Eliminación de valores por defecto establecidos en el cliente OpenERP mediante SQL
0OpenERP tiene una función bastante cómoda, que permite establecer valores por defecto en el cliente web o GTK. Esto es muy útil para definir el país más utilizado al dar de alta un nuevo partner, o para establecer los impuestos más comunes al crear un nuevo producto.
Sin embargo, si se utiliza a la ligera puede dar problemas, como por ejemplo si decidimos que las nuevas líneas de factura tengan un impuesto por defecto. Al principio puede parecer que es una maravilla, hasta que queremos introducir una factura de proveedor y comprobamos que si no tenemos cuidado, vamos a asignarle el mismo IVA repercutido de las facturas de clientes, cuando debería ser IVA soportado. A la hora de deshacerlo, se pueden eliminar las líneas de impuestos y establecer de nuevo el valor con el asistente, o bien modificar directamente la base de datos.
Así, para eliminar la opción comentada de unos impuestos por defecto en la línea de factura, esta es la sentencia SQL a utilizar:
DELETE FROM ir_values WHERE name = 'invoice_line_tax_id'
‘NoneType’ object has no attribute ‘id’ en OpenERP, al cambiar el partner de la factura
0Como no estoy seguro de si es realmente un bug o un problema con los datos de prueba, lo anoto en este blog, pero no paso informe en Launchpad, que es donde debería, pero el caso es que he detectado este problema utilizando la versión 6.0.3 de OpenERP con los módulos de la localización española y nan_account_extension instalados, siempre que se introduce un cliente en la factura.
Para solucionarlo, basta con modificar la línea 395 de invoice.py en el módulo account:
if p.property_account_receivable and (p.property_account_receivable.company_id.id != company_id) and p.property_account_payable and (p.property_account_payable.company_id.id != company_id):
De esta forma, antes de utilizar las cuentas a cobrar y a pagar del partner, se comprueba que estén definidas, que es lo que estaba dando problemas, aunque entiendo que no debería, al tener instalado el módulo de NaN que en principio las gestiona debidamente.
Magento: Añadir precio con 2 decimales en correo transaccional
0Ocurre a veces que en los correos que se le envía al cliente queremos poner cierta información diferente a la estándar.
En nuestro caso queriamos poner el precio total como parte de un texto.
En principio para esto era tan fácil como usar la variable
{{var order.getSubtotal()}}
El problema vino cuando se mostraba el importe con 4 decimales.
La solución, aunque no es muy elegante, es la siguiente:
1.- Crea el fichero totalemail.phtml en /app/design/frontend/default/TUPLANTILLA/template/email/order y pon lo siguiente
<?php $order = $this->getOrder(); if ($order) { echo Mage::helper('core')->currency($order->getGrandTotal(), true, false); } ?>
2.- Dentro de la plantilla del correo transaccionable escribe esto donde quieras mostrarlo
{{block type=’core/template’ area=’frontend’ template=’email/order/z.phtml’ order=$order}}
Magento: Access denied en system configuration
0En ocasiones ocurre que, despues de instalar una extension de magento manualmente, al intentar acceder a Sistema/Configuracion nos muestra un precioso texto que dice “Access denied”.
Si despues de establecer los permisos adecuados a las carpetas y ficheros nuevos (775 y usuario web) y de haber borrado la cache sigue sin funcionar la solución, por absurda que parezca, es ir a los roles de administración y al rol administrador los permisos de los recursos cambiarlo a “Personalizar” (OJO NO GUARDAR PORQUE PERDERIAMOS LOS PERMISOS) y luego volverlo a “Todos”. Ahora si que guardamos y todo vuelve a funcionar.
Instalación simple de mod_security en Plesk 10 para Ubuntu
2Uno de los sistemas para minimizar las posibilidades de éxito de los intentos de ataque a los servidores, a nivel de aplicación, es ModSecurity. Con él podemos dormir un poquito más tranquilos, sabiendo que vamos a estar más protegidos de los ataques de inyección SQL, fuerza bruta o vulnerabilidades conocidas.
Lamentablemente, parece que por cuestiones de licencia, ya no se siguen generando los binarios en paquetes Debian, por lo que el método recomendado de instalación es compilar a partir del código fuente, pero esto necesita un cambio en el servidor Apache que viene con Plesk 10 para Ubuntu, así que mejor dejamos la última versión disponible instalable con apt, y procedemos con:
apt-get install libapache-mod-security
Esto nos dejará instalados y activados los módulos mod_security2 y mod_unique_id, con sus enlaces en /etc/apache2/mods-enabled. Ahora necesitamos un conjunto de reglas para ModSecurity, y las que vamos a utilizar son las gratuitas de Atomicorp, los editores de ASL, que las ofrecen con un retraso de 90 días sobre las de pago, disponibles en http://updates.atomicorp.com/channels/rules/delayed/. Las descargamos y descomprimimos en /etc/apache2/modsecurity.d:
mkdir /etc/apache2/modsecurity.d
wget http://updates.atomicorp.com/channels/rules/delayed/modsec-2.5-free-latest.tar.gz
tar xvf modsec-2.5-free-latest.tar.gz
Ahora creamos un fichero de configuración, también en /etc/apache2/modsecurity.d, llamado modsecurity_crs_10_config.conf, con el siguiente contenido:
SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType (null) text/html text/plain text/xml SecResponseBodyLimit 2621440 SecServerSignature Apache SecComponentSignature 200911012341 SecUploadDir /var/asl/data/suspicious SecUploadKeepFiles Off SecAuditEngine RelevantOnly SecAuditLogRelevantStatus "^(?:5|4(?!04))" SecAuditLogType Concurrent SecAuditLog /var/log/apache2/modsecurity/audit_log SecAuditLogParts ABIFHZ SecArgumentSeparator "&" SecCookieFormat 0 SecRequestBodyInMemoryLimit 131072 SecDataDir /var/asl/data/msa SecTmpDir /tmp SecAuditLogStorageDir /var/asl/data/audit SecResponseBodyLimitAction ProcessPartial #SecPcreMatchLimit 100000 #SecPcreMatchLimitRecursion 100000 SecDebugLog /var/log/apache2/modsecurity/modsec_debug_log SecDebugLogLevel 3
Atención a las carpetas especificadas para las estructuras de datos necesarias para ModSecurity, que deben existir y Apache tener permiso sobre ellas, por lo que ejecutamos:
mkdir /var/asl /var/asl/data /var/asl/data/audit /var/asl/data/msa /var/asl/data/security
chown -R www-data:www-data /var/asl/data/
Por último, creamos un fichero 00_modsecurity.conf en /etc/apache2/conf/, con ese nombre para que cargue el primero, activando las reglas que deseemos, que en nuestro caso son las siguientes:
LoadModule security2_module modules/mod_security2.so LoadModule unique_id_module modules/mod_unique_id.so # Todas + exclusiones personalizadas: Include /etc/apache2/modsecurity.d/00_asl_0_global.conf Include /etc/apache2/modsecurity.d/00_asl_custom_exclude.conf # Quitamos RBL porque coge las IPs incorrectamente, como desordenadas #Include /etc/apache2/modsecurity.d/00_asl_rbl.conf #Include /etc/apache2/modsecurity.d/00_asl_whitelist.conf # Esta sólo funciona con ModSecurity > 2.6.1 #Include /etc/apache2/modsecurity.d/00_asl_z_antievasion.conf Include /etc/apache2/modsecurity.d/00_asl_zz_strict.conf Include /etc/apache2/modsecurity.d/05_asl_exclude.conf # No tenemos el CLAM antivirus instalado #Include /etc/apache2/modsecurity.d/05_asl_scanner.conf Include /etc/apache2/modsecurity.d/09_asl_rules.conf Include /etc/apache2/modsecurity.d/09_asl_rules_antievasion.conf Include /etc/apache2/modsecurity.d/10_asl_antimalware.conf Include /etc/apache2/modsecurity.d/10_asl_antimalware_output.conf Include /etc/apache2/modsecurity.d/10_asl_rules.conf Include /etc/apache2/modsecurity.d/11_asl_data_loss.conf Include /etc/apache2/modsecurity.d/12_asl_brute.conf Include /etc/apache2/modsecurity.d/20_asl_useragents.conf Include /etc/apache2/modsecurity.d/30_asl_antimalware.conf Include /etc/apache2/modsecurity.d/30_asl_antispam.conf Include /etc/apache2/modsecurity.d/30_asl_antispam_referrer.conf Include /etc/apache2/modsecurity.d/40_asl_apache2-rules.conf Include /etc/apache2/modsecurity.d/50_asl_rootkits.conf Include /etc/apache2/modsecurity.d/60_asl_recons.conf Include /etc/apache2/modsecurity.d/61_asl_recons_dlp.conf Include /etc/apache2/modsecurity.d/98_asl_jitp.conf Include /etc/apache2/modsecurity.d/99_asl_exclude.conf Include /etc/apache2/modsecurity.d/99_asl_jitp.conf Include /etc/apache2/modsecurity.d/99_asl_redactor.conf # No tenemos el CLAM antivirus instalado #Include /etc/apache2/modsecurity.d/99_asl_scanner.conf
Vamos, prácticamente todas, menos la que da problemas por la versión de ModSecurity, que no es la 2.6.1 o superior, las de listas negras y las del antivirus CLAM.
Ya está todo listo. Comprobamos que la configuración de Apache es correcta con
apache2ctl configtest
Y si lo es, reiniciamos apache con
apache2ctl graceful
Hale, ya podemos empezar a ver correr en /var/log/apache2/modsecurity/audit_log la lista de peticiones bloqueadas.
Actualización: Cómo desactivar reglas
Es muy posible que tengamos que desactivar algunas reglas al encontrarnos con falsos positivos, mostrando errores 403 cuando los permisos y el código están perfectamente. En nuestro caso, al alojar tiendas, algunos TPVs virtuales dan problemas, así que decidimos desactivar globalmente. Para esto, se modifica el fichero /etc/apache2/modsecurity.d/00_asl_custom_exclude.conf
, añadiendo el siguiente contenido:
<LocationMatch .*> <IfModule mod_security2.c> SecRuleRemoveById 350147 SecRuleRemoveById 350148 </IfModule> </LocationMatch>
Al modificar el fichero de configuración global y utilizar .*
como patrón, indicamos que para cualquier dominio y URL alojada en el servidor no queremos que se tengan en cosideración esas reglas. También podemos modificar una regla para un dominio en particular, modificando el fichero vhost.conf
que Plesk utiliza para este menester, y regenerando la configuración, por supuesto.
Magento: Como configurar múltiples tiendas y dominios
0Crear múltiples tiendas desde el administrador de Magento es fácil usando las vistas de tienda y los nombre de tienda.
El problema real viene cuando quieres configurar su acceso mediante otros dominios, subdominios o estructura URL.
A continuación comento varias maneras de hacerlo. Usaremos cada una dependiendo de la necesidad
FORMANDO LA ESTRUCTURA DE LA URL
Es algo muy personal y dependerá del escenario. Al final el objetivo es el mismo, mantener una única base de datos para todas las tiendas.
Podemos querer estructuras de lo siguientes tipos
http://www.midominio.com/tienda1 http://www.midominio.com/tienda2 htpp://www.tienda1 htpp://www.tienda2 http://www.midominio.com http://tienda1.midominio.com http://tienda2.midominio.com
SISTEMA MULTIDOMINIO
Se aplica cuando tenemos varios dominios, por ejemplo tienda1.com y tienda2.com.
Uno de ellos siempre actuará como principal, y el resto como secundarios.
La finalidad es hacer un enrutador que nos desvíe el dominio a la instacia que toca.
Para eso editaremos el fichero index.php buscado la linea con códio
Mage::run();
y lo sustituimos por
switch($_SERVER['HTTP_HOST']) { /* tienda1.com */ case 'tienda1.com': case 'www.tienda1.com': Mage::run('tienda1', 'website'); break; /* tienda2.com (default store)*/ default: Mage::run(); break; }
UN DOMINIO CON SUBDOMINIO
Si queremos hacer una tienda exclusiva dentro de nuestro dominio, esta se la opción.
Es cuando queremos algo como
http://www.midominio.com/tienda1
El primer paso será crear en el raiz del hosting tantas carpetas como subdominios.
Una vez lo tenemos, copiamos los ficheros index.php y .htaccess de la tienda principal y que ya está funcionando a estas nuevas carpetas.
Editamos el fichero index.php cambiando esta lineas
$mageFilename = 'app/Mage.php'; Mage::run();
por esto otro
$mageFilename = '../httpdocs/app/Mage.php'; Mage::run('tienda1', 'website');
Magento: Cambiar el estado de los pedidos
4Una de las peculiaridades que no me gusta de magento es el modo en el que trata el estado de las órdenes de pedido.
Hasta que no realizas el envio y la facturación no lo cambia de estado.
Esto puede llegar a ser un problema ya que, en muchos casos, la parte de facturación no interesa.
Para esto tendremos que modificar un fichero del core de magento para que nos permita seleccionar el cambio de estado en la orden de pedido.
Lo primero será buscar el fichero config.xml que se encuentra en app\code\core\Mage\Sales\etc\y buscaremos el siguiente bloque de código.
<states> <new translate="label"> <label>New</label> <statuses> <pending/> </statuses> </new> <processing translate="label"> <label>Processing</label> <statuses> <processing/> </statuses> </processing> <complete translate="label"> <label>Complete</label> <statuses> <complete/> </statuses> </complete> <closed translate="label"> <label>Closed</label> <statuses> <closed/> </statuses> </closed> <canceled translate="label"> <label>Canceled</label> <statuses> <canceled/> </statuses> </canceled> <holded translate="label"> <label>On Hold</label> <statuses> <holded/> </statuses> </holded> </states>
y lo sustituiremos por este
<states> <new translate="label"> <label>New</label> <statuses> <pending/> <processing/> <holded/> <complete/> <closed/> <canceled/> </statuses> </new> <pending translate="label"> <label>Pending</label> <statuses> <pending/> <processing/> <holded/> <complete/> <closed/> <canceled/> </statuses> </pending> <processing translate="label"> <label>Processing</label> <statuses> <pending/> <processing/> <holded/> <complete/> <closed/> <canceled/> </statuses> </processing> <complete translate="label"> <label>Complete</label> <statuses> <complete/> <pending/> <processing/> <holded/> <closed/> <canceled/> </statuses> </complete> <closed translate="label"> <label>Closed</label> <statuses> <pending/> <processing/> <holded/> <complete/> <closed/> <canceled/> </statuses> </closed> <canceled translate="label"> <label>Canceled</label> <statuses> <pending/> <processing/> <holded/> <complete/> <closed/> <canceled/> </statuses> </canceled> <holded translate="label"> <label>On Hold</label> <statuses> <pending/> <processing/> <holded/> <complete/> <closed/> <canceled/> </statuses> </holded> </states>
Refresca la cache y ya tendremos en el admin la opcion de cambiar el estado.
Como esto significa modificar el CORE de Magento, la mejor opción será duplicar este fichero en la carpeta app/code/local para no sufrir perdidas en caso de actualizar.
Creación automática de cuentas contables en OpenERP
7El comportamiento estándar de OpenERP es utilizar una única cuenta para cobrar y otra cuenta para pagar a todos los partners, que en el caso del plan español suelen ser la 430 y la 410, respectivamente. Esto no suele gustar a los contables, que prefieren crear una 430xxxxxx para cada cliente, 400xxxxxx para cada proveedor y 410xxxxxx para cada acreedor. Por eso, con la localización española se incluyó un asistente para la creación de cuentas contables, que facilitara esta tarea, y que se puede invocar como una acción desde la ficha del partner.
No obstante, gracias a NaN, disponemos de nan_account_extension, un módulo que entre otras cosas, permite el mantenimiento automático de estas cuentas, y digo mantenimiento porque las crea o elimina automáticamente según lo que hagamos con el partner, en el momento de guardarlas.
Para utilizarlo, primero se debe configurar qué cuantas son las base, en Administración | Compañías | Compañía
, abriendo la compañía adecuada, y en la pestaña Configuración, utilizando los parámetros del grupo Creación de cuenta automática.
Por último, si se ha establecido un valor por defecto para las cuentas a cobrar y pagar, debe ser eliminado, o el módulo dejará las cuentas establecidas por defecto. Para esto, vamos a Administración | Configuración | Parámetros | Parámetros de configuración
(lo que vienen a ser las propiedades), buscamos la property_account_receivable
y property_accoyunt_payable
que no tenga asignada empresa (que será la cuenta por defecto), y la eliminamos.
Si se tiene mucha prisa, también se puede borrar el valor por defecto con el siguiente SQL:
DELETE FROM ir_property WHERE NAME IN ('property_account_payable', 'property_account_receivable') AND res_id IS NULL