Script en bash para cambiar el puerto de Apache en todos los dominios en Plesk

Si quereis cambiar el puerto en todos los vhost`s en Plesk, tendreis que cambiar el numero 80 (puerto Apache default de Plesk) dentro del archivo httpd.include de cada vhosts, y si teneis muchos vhosts en el servidor o servidores… como no tengais este pequeño script en bash, os podeis morir en el intento

#!/bin/bash
MY_FILEPATH="/var/www/vhosts"
MY_FILE="httpd.include"
MY_REPLACE=":81"
find $MY_FILEPATH  -name $MY_FILE -exec perl -p -i -e "s[:80][$MY_REPLACE]g" {} \;
service httpd restart"

Eliminar www de la url con .htaccess y Mod_rewrite

En algún momento del desarrollo de un nuevo sitio web, deberemos decidir si queremos la url con www o sin ellas. Una vez decidido, lo podemos llevar a cabo a través del fichero .htaccess.

Para eliminarlas:

# Quitar el www del nombre de dominio
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.midominio\.com$ [NC]
RewriteRule ^(.*)$ http://midominio.com/$1 [R=301,QSA,L]
</IfModule>

Si lo que queremos es que se agregen siempre las www al nombre del dominio, entonces aplicamos lo siguiente en el archivo .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Redirigir el dominio sin www a www
RewriteCond %{HTTP_HOST} ^midominio\.com$ [NC]
RewriteRule ^(.*)$ http://www.midominio.com/$1 [R=301,QSA,L]
</IfModule>

Si quereis un editor Online de .htaccess con muchas opciones lo teneis aqui http://htaccess-online.blogofsysadmins.com/

Sacar una lista de dominios y de IPs del servidor Plesk

Si usas Plesk y quieres un listado de todos tus dominios y la IP que utilizan, sólo tienes que ejecutar esta consulta desde un cliente o desde shell MySQL con un usuario que tenga permisos (de lectura como mínimo) a la base de datos psa (es la base de datos interna de Plesk), por ejemplo, usa como usuario las mismas credenciales que tu “superadmin” de Plesk.

SELECT i.ip_address, d.name FROM psa.hosting AS h
LEFT JOIN psa.domains AS d ON h.dom_id = d.id
LEFT JOIN psa.IP_Addresses AS i ON h.ip_address_id = i.id;

Si lo que quieres es un resumen con todas las IPs, el número de dominios que usan y un dominio de ejemplo, usa esta consulta:

SELECT i.ip_address, COUNT(d.name) AS dominios, d.name AS uno FROM psa.hosting AS h
LEFT JOIN psa.domains AS d ON h.dom_id = d.id
LEFT JOIN psa.IP_Addresses AS i ON h.ip_address_id = i.id
GROUP BY h.ip_address_id
ORDER BY h.ip_address_id, d.name

Error al borrar un dominio en Parallels Plesk Panel

Un error que sigue apareciendo aunque pasen versiones y versiones de Plesk Panel ( desde la 7.4 a la 9.2 ) es la perdida de integridad referencial en algunas tablas. Esto provoca que a la hora de ejectuar algunas herramientas y falten datos se generen errores. En ese caso al borrar el dominio ‘delete.me’ nos aparece este mensaje :

0: class.MailManager.php:242
        MailManager::execWithException(string 'smart_exec', string 'mailmng', array, array, string 'lst')
1: class.MailManager.php:274
        MailManager->callMailManager(string 'remove-mailname', array)
2: class.MailManager.php:354
        MailManager->removeMailname(string 'sharoj.com', string 'delete')
3: cmd_mail.php3:1357
        mn_del(string '490')
4: class.DSMail.php:211
        DSMail->delete(boolean false)
5: class.PhDomain.php:358
        PhDomain->reset(integer '0', boolean true, boolean false)
6: class.BsDomain.php:330
        BsDomain->reset(integer '0')
7: class.BsDomain.php:302
      BsDomain->delete(integer '0')
8: class.BsDomain.php:536
        mdeleteDomains(array)
9: removeDomains.php3:42
        require(string '/opt/psa/admin/htdocs/domains/removeDomains.php3')
10: plesk.php:51

Tendremos que buscar manualmente donde está el problema y repararlo , directamente a la base de datos de Plesk (generalmente llamada psa).

Comenzamos a buscar relaciones rotas entre objetos:

# mysql -uadmin -p`cat /etc/psa/.psa.shadow` psa
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 152938
Server version: 5.0.32-Debian_7etch10-log Debian etch distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> select id, name from domains where name = "delete.me";
+------+------------+
| id   | name       |
+------+------------+
| 1241 | delete.me  |
+------+------------+
1 row in set (0.00 sec)

Ya tenemos el ID del dominio, nos centramos en las cuentas de correo ya que el error se genera al borrar cuentas de correo. Vamos a ver que tablas hay en esta version de Plesk ( 9.2.3 )

mysql> show tables like '%mail%' ;
+------------------------+
| Tables_in_psa (%mail%) |
+------------------------+
| Webmails               |
| badmailfrom            |
| mail                   |
| mail_aliases           |
| mail_redir             |
| mail_resp              |
| mass_mail              |
| mass_mail_clients      |
| mass_mail_domains      |
+------------------------+
9 rows in set (0.00 sec)

La tabla que nos interesa es mail vamos a ver que esctructura tiene y vamos sacando datos:

mysql> desc mail ;
+---------------+------------------------------------------+------+-----+---------+----------------+
| Field         | Type                                     | Null | Key | Default | Extra          |
+---------------+------------------------------------------+------+-----+---------+----------------+
| id            | int(10) unsigned                         | NO   | PRI | NULL    | auto_increment |
| mail_name     | varchar(245)                             | NO   |     |         |                |
| perm_id       | int(10) unsigned                         | NO   | MUL |         |                |
| postbox       | enum('false','true')                     | NO   |     | false   |                |
| account_id    | int(10) unsigned                         | NO   | MUL |         |                |
| redirect      | enum('false','true')                     | NO   |     | false   |                |
| redir_addr    | varchar(255)                             | YES  |     | NULL    |                |
| mail_group    | enum('false','true')                     | NO   |     | false   |                |
| autoresponder | enum('false','true')                     | NO   |     | false   |                |
| spamfilter    | enum('false','true')                     | NO   |     | true    |                |
| virusfilter   | enum('none','incoming','outgoing','any') | NO   |     | none    |                |
| mbox_quota    | bigint(20)                               | NO   |     | -1      |                |
| dom_id        | int(10) unsigned                         | NO   | MUL |         |                |
+---------------+------------------------------------------+------+-----+---------+----------------+
13 rows in set (0.01 sec)
mysql> select * from mail where dom_id = 1241;
+-----+-----------+---------+---------+------------+----------+------------+------------+---------------+------------+-------------+------------+--------+
| id  | mail_name | perm_id | postbox | account_id | redirect | redir_addr | mail_group | autoresponder | spamfilter | virusfilter | mbox_quota | dom_id |
+-----+-----------+---------+---------+------------+----------+------------+------------+---------------+------------+-------------+------------+--------+
| 490 | delete.me |    2202 | true    |       2204 | false    |            | false      | false         | false      | incoming    |         -1 |   1241 |
+-----+-----------+---------+---------+------------+----------+------------+------------+---------------+------------+-------------+------------+--------+
1 row in set (0.00 sec)

Vemos que tiene al menos una cuenta de correo para el usuario 2204, vamos a buscar este usuario en la tabla accounts, ya que el id es accounts_id

mysql> show tables like '%acco%'
    -> ;
+------------------------+
| Tables_in_psa (%acco%) |
+------------------------+
| accounts               |
+------------------------+
1 row in set (0.00 sec)
mysql> select * from accounts where id = 2204 ;
Empty set (0.01 sec)

Pues no está, aquí tenemos el problema, no existe la información del usuario pero sí el buzón.
lo más comodo es borar la entrada en la base de datos de la cuenta de correo. Dado que vamos a borrar el dominio nos es indiferente conservarlo.

mysql> delete from mail where id =490 limit 1 ;
Query OK, 1 row affected (0.03 sec)

De otra forma , habíamos dado de alta una fila en accounts con el id 2204 .

Script para integrar un PC con Linux en un dominio Windows

Bonito script para integrar un PC Linux en un dominio Windows, permite hacerlo de moto automatico pero tendras que sustituir las ips y los nombres de los servidores por los de tu red. Para ejecutarlo, debemos hacerlo con privilegios de root.

#!/bin/bash
nombrehost=$1
nombrehostanterior=`cat /etc/hostname`

while [ ! "$nombrehost" ]
do
if [ ! "$nombrehost" ]
    then
      echo "Introduzca un nombre para el equipo (ej.: a5-u02)"
      read nombrehost
      echo $nombrehost
      clear
    else
      echo "El equipo será integrado con el nombre '$nombrehost'"
fi
done
#instalamos el paquete likewise para integrar el equipo en linux
sudo apt-get install likewise-open
###### Control de errores
if [ $? -eq 0 ]
        then
               echo Se ha instalado con exito likewise >> loginstalacion.log
        else
               echo ERROR EN LA INSTALACIÓN DE LIKEWISE!!! o INSTALADO PREVIAMENTE >> loginstalacion.log
fi
#ponemos correctamente los nombres al fichero
sudo echo $nombrehost >> /etc/hostname
###### Control de errores
if [ $? -eq 0 ]
        then
               echo Se ha cambiado el nombre del equipo en /etc/hostname con exito a $nombrehost >> loginstalacion.log
        else
               echo ERROR EN LA ESCRITURA DEL FICHERO /ETC/HOSTNAME >> loginstalacion.log
        exit
fi
#sustituimos en el fichero hosts el anterior nombre por el nuevo
sudo sed s/$nombrehostanterior/$nombrehost/g -i /etc/hosts
if [ $? -eq 0 ]
        then
               echo Se ha cambiado el nombre del equipo en /etc/hosts con exito a $nombrehost >> loginstalacion.log
        else
               echo ERROR EN LA ESCRITURA DEL FICHERO /ETC/HOSTS >> loginstalacion.log
        exit
fi
#insertamos en el fichero hosts unas lineas con la direccion ip del servidor del dominio y su nombre
sudo sed -e '$i 10.10.10.2 servidor.blogofsysadmins.com servidor' -i /etc/hosts
sudo sed -e '$i 10.10.10.3 servidor.blogofsysadmins.com servidor' -i /etc/hosts
if [ $? -eq 0 ]
        then
               echo Se ha cambiado el nombre del servidor del dominio en /etc/hosts con exito >> loginstalacion.log
        else
               echo ERROR EN LA ESCRITURA DE LAS DIRECCIONES DEL SERVIDOR EN EL FICHERO /ETC/HOSTS >> loginstalacion.log
        exit
fi
#si nuestro dominio emplea un servidor de dominio tb debemos modificar el fichero /etc/dhcp3/dhclient.conf.
sudo echo prepend domain-name '"'blogofsysadmins '"' >> /etc/dhcp3/dhclient.conf
sudo echo supersede domain-name-servers 10.10.10.2,10.10.10.3,10.10.10.1';'>> /etc/dhcp3/dhclient.conf
if [ $? -eq 0 ]
        then
               echo Se han añadido los  nombres de los servidores del dominio al final de /etc/dhcp3/dhclient.conf>> loginstalacion.log
        else
               echo ERROR EN LA ESCRITURA DE LAS DIRECCIONES DEL SERVIDOR EN EL FICHERO /ETC/DHCP3/DHCLIENT.CONF >> loginstalacion.log
        exit
fi
#añadimos las direcciones de nuestros servidores de dns al fichero resolv.conf

sudo echo domain blogofsysadmins.com > /etc/resolv.conf
sudo echo search blogofsysadmins.com >> /etc/resolv.conf
sudo echo nameserver 10.10.10.2 >> /etc/resolv.conf
sudo echo nameserver 10.10.10.1 >> /etc/resolv.conf
sudo echo nameserver 10.10.10.3 >> /etc/resolv.conf
if [ $? -eq 0 ]
        then
               echo Se ha modificado el fichero /etc/resolv.conf>> loginstalacion.log
        else
               echo ERROR EN LA ESCRITURA DE LAS DIRECCIONES DEL SERVIDOR EN EL FICHERO /ETC/RESOLV.CONF >> loginstalacion.log
        exit
fi
#modificamos el fichero resolv.conf para que no pueda ser modificado por lanmanager
sudo chattr +i /etc/resolv.conf

#agregamos el equipo al dominio en este caso blogofsysadmins.com con la cuenta que queramos
#sudo domainjoin-cli join NOMBRE_DOMINIO NOMBRE_USUARIO_CON_PERMISOS_
#POR EJEMPLO
sudo domainjoin-cli join blogofsysadmins.com Administrador
#para quitarlo del dominio emplearíamos:
#sudo domainjoin-cli leave

###### Control de errores
if [ $? -eq 0 ]
        then
               echo Se ha unido con exito al dominio >> loginstalacion.log
        else
               echo ERROR, NO SE HA PODIDO UNIR EL EQUIPO AL DOMINIO >> loginstalacion.log
           lwiinfo >> loginstalacion.log
        exit
fi

cat loginstalacion.log