ftp mirroring con lftp

He necesitado hacer un mirror de unos directorios que sólo estaban disponibles por ftp y necesito lanzar sincronizaciones periódicas de forma sencilla y cómoda, para ello he usado lftp una vieja herramienta que tenía ya enterrada.

Instalar lftp

apt-get install lftp

Lo más útil de lftp es la capacidad de copiar directorios de forma recursiva ya que por defecto el cliente ftp de toda la vida de las distrubicones de linux no lo soporta.

Como puedo hacer un mirroring:

lftp -u usuario,password ftp.midominio.tld
mirror /ruta/ftp/origen /ruta/local/b

 

ls: Fatal error: Certificate verification: Not trusted

Este error aparece cuando nuestro lftp no es capaz de verificar que el certificado remoto sea válido por lo que no nos permite continuar realizando operaciones en la máquina remota. Esto está bien, si el certificado es correcto, pero habitualmente nos encontraremos con certificados incorrectos o caducados, por lo que podremos desactivarlo, ya que no nos ofrece ningún nivel de seguridad, si el certificado no está correctamente instalado.

Para desactivarlo, yo he usado esta opción con éxito ( aunque hay varias variantes buscando en google ):

set ftp:ssl-allow no;

A lo que tengo que añadir que después de ejecutar este comando con el debug activo:

set debug 10

me ha sido imposible retornar el listado de directorios, y parece ser un bug. Este caso se observa al lanzar el comando `ls` y ver infinitamente el texto: Delaying before reconnect.

Desactivado el debug, funciona correctamente

set debug 0

Mirroring sites using ftp

Aquí os dejo un pequeño script para hacer migración de sitios usando ftp de una forma bastante rápida:

FTP_USER="tu usuario"
FTP_PASSWORD="tu password"
FTP_HOST=ftp.dominio.ltd
SOURCE=/ruta/remota/origen
DEST=/ruta/remota/destino
lftp -u"${FTP_USER},${FTP_PASSWORD}" -e "set ftp:ssl-allow no; mirror ${SOURCE} ${DEST} --only-newer --verbose --use-pget-n=10; quit" ${FTP_HOST}

A tener en cuenta:

  • -u»usuario,password» Es necesario usar las comillas ya que de esa forma escapamos los caracteres especiales que pueda tener el password
  • -e«ejecuta comandos una vez que abre la conexión»
  • set ftp:ssl-allow no No valida el certificado ssl del servidor ftp
  • –only-newer Sólo ficheros nuevos
  • –use-pget n=10 Usa 10 conexiones concurrentes

vagrant ansible sys.stdout.enconding is None

Estoy desplegando una máquina con vagrant y ansible en la que use vars_promt, mi intención es hacer una serie de preguntas previas al despliegue de una máquina y llevaba un buen rato pegándome con un error, concretamente este :

Traceback (most recent call last):
  File "/usr/bin/ansible-playbook", line 309, in <module>
    sys.exit(main(sys.argv[1:]))
  File "/usr/bin/ansible-playbook", line 249, in main
    pb.run()
  File "/usr/lib/python2.7/dist-packages/ansible/playbook/__init__.py", line 305, in run
    play = Play(self, play_ds, play_basedir, vault_password=self.vault_password)
  File "/usr/lib/python2.7/dist-packages/ansible/playbook/play.py", line 65, in __init__
    self.vars             = self._get_vars()
  File "/usr/lib/python2.7/dist-packages/ansible/playbook/play.py", line 672, in _get_vars
    vname, private, prompt, encrypt, confirm, salt_size, salt, default
  File "/usr/lib/python2.7/dist-packages/ansible/callbacks.py", line 662, in on_vars_prompt
    result = prompt(msg, private)
  File "/usr/lib/python2.7/dist-packages/ansible/callbacks.py", line 648, in prompt
    msg = prompt.encode(sys.stdout.encoding)
TypeError: encode() argument 1 must be string, not None
Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

Leer el traceback de python al principio es un poco ruidoso, pero hay que leer detenidamente la traza y veremos claramente el problema. Yo al principio no lo he hecho y eso me ha llevado a dedicarle más tiempo 😀

Existe un problema documentado en ansible que genera este error cuando no es capaz de generar la codificación de salida, no se si es exactamente un bug de python2.x o es de ansible, por que en algunos casos recomiendan directamente migrar a python3 aunque ansible está desarrollado con python2.7.

Si queréis entreneros veréis que efectivamente sys.stdout.enconding devuelve None y de ahí la execepción que genera ansible.

Ahora bien,¿ como lo solucionamos ? forzando un tipo de codificacion con la variable de entorno PYTHONIOENCODING

export PYTHONIOENCODING='utf-8'

De esta manera ya podemos lanzar el provisionamiento de la máquina

vagrant provision

Esto está bien, pero no es práctico, ya que lo que queremos es olvidarnos de tener que hacer cosas manualmente, por eso automatizamos. Pues bien, hay una forma de agregar esto, y dejar nuestro Vagrantfile más o menos así:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "debian/jessie64"

  #Force sys.stdout.encoding to utf8
  ENV['PYTHONIOENCODING'] = "utf-8"

  config.vm.provision "ansible" do |ansible|
      ansible.verbose = "v"
      ansible.playbook = "ansible/playbook.yml"
  end

end

Evidentemente esto es un fichero muy sencillo, lo importante es declarar la variable de entorno

 

  ENV['PYTHONIOENCODING'] = "utf-8"

Este fallo está documentado en una issue de github https://github.com/ansible/ansible/issues/8644 aunque su resolución está prevista en una versión ‘mayor’ con lo que supongo que estará corregido en la rama 1.8.x mientras que en Debian stable estamos en la versión 1.7.2 a diciembre de 2015. Otra alternativa sería crear un virtual environment de python e instalar la versión que queramos, no lo he probado pero seguro que es posible.

 

 

solucionando problemas con subversion

En este caso agregé el fichero prueba.php al repositorio de subversion y luego lo borré… claro al comitear me sale esto :

[shell]
svn commit -m «subir fichero»
svn: Commit failed (details follow):
svn: ‘/home/jorge/Proyectos/foo/prueba.php’ is scheduled for addition, but is missing
[/shell]

… y recordé que existe algo que se llama svn revert

Así que si revierto el fichero, lo soluciono

[shell]
svn revert prueba.php
svn commit -m «otros cambios menores….»
Committed revision 11.
[/shell]

ala y a correr !

LWP will support https URLs if either Crypt::SSLeay or IO::Socket::SSL

Si estais cacharreando con los comandos y quereis hacer un GET o POST usando https os puede aparecer esto :

[shell]
$ GET https://www.hostingaldescubierto.com
LWP will support https URLs if either Crypt::SSLeay or IO::Socket::SSL
is installed. More information at
<http://search.cpan.org/dist/libwww-perl/README.SSL>.
[/shell]

y la forma de solucionarlo es instalando las liberías de perl que hacen falta:

[shell]
apt-get install libio-socket-ssl-perl libnet-ssleay-perl
[/shell]

Cómodo y sencillo 😀

SVN : Error detected while processing /usr/share/vim/vimrc

Otra de subversion :

[shell]
svn: Can’t open file ‘/var/lib/svn/hostingaldescubierto.com/db/txn-current-lock’: Permission denied
[/shell]

Esto es por que no hay permisos para modificar los ficheros, seguramente el propietario es root , pero estamos usando autenticación por apache, así le tenemos que dar permisos a www-data para que pueda commitear .

[shell]
chown -R www-data.www-data /var/lib/svn/hostingaldescubierto.com/
[/shell]

SVN : Error detected while processing /usr/share/vim/vimrc

Esta es otra de las cosas que pueden pasarte cuando estás usando subversion, que te lies a commitear y aparezca este error… el vim… qué raro …. ummmm.

Pero no es ni mas ni menos que en alertantives de mi sistema no está bien configurado el editor por defecto, así que como no estoy pasando el parámetro -m «mensaje» a svn me abre el editor por defecto para que escriba qué es lo que estoy subiendo al servidor.

[shell]
$ svn commit
Error detected while processing /usr/share/vim/vimrc:
line 20:
E319: Sorry, the command is not available in this version: syntax on
Press ENTER or type command to continue
[/shell]

Vamos a echar un vistazo a mi sistema a ver como lo tengo configurado :

[shell]
$ update-alternatives –config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).

Selection Path Priority Status
————————————————————
0 /bin/nano 40 auto mode
1 /bin/nano 40 manual mode
2 /usr/bin/vim.basic 30 manual mode
* 3 /usr/bin/vim.tiny 10 manual mode

Press enter to keep the current choice[*], or type selection number:
[/shell]

vim.tiny no soporta los colores ( syntax on ) que tengo puesto en mi entorno, así que como no quiero desactivarlos , simplemente elijo ‘vim.basic’ como editor por defecto para el sistema y eso, soluciona el mensaje que aparece al commitear.

cambiar password de usuario sistema en modo batch

En Debian existe una forma cómoda de cambiar la password de root usando un scriptecho «root:mipassword» | chpasswd

Así de simple.

Como añadido, os recomiendo usar apg ( apg – generates several random passwords ) muy cómod para generar passwords

apt-get intall apg

un ejemplo:

$ apg

Please enter some random data (only first 8 are significant)
(eg. your old password):>
kodThunOw1 (kod-Thun-Ow-ONE)
pivVabraf1 (piv-Vabr-af-ONE)
mivpicEv7 (miv-pic-Ev-SEVEN)
DeksuvLynk7 (Deks-uv-Lynk-SEVEN)
DiwrogAvLyb6 (Di-wrog-Av-Lyb-SIX)
pheFruanigs8 (phe-Fru-an-igs-EIGHT)

trucos molones : extraer un fragmento de texto

Cuántas vezces hemos tenido que buscar un fragmento en un fichero de texto desde el texto ‘tal’ hasta el texto ‘cual’. Con lo sencillo que es con linux y awk !!!!

Lo bueno que tiene linux es que cada día te sorprendes más y cada día eres consciente de lo poco que conoces, es como perderse por una megápolis.

Por ejemplo para sacar todos los usuarios desde el 100 al 111. Tomamos el 100 como march de origen y 111 como match de final y el contenido es lo seleccionado. Se podrías usar por ejemplo «<?php y ?>» o «<body>» y «</body>»

[shell]
cat /etc/passwd | awk ‘/100/,/111/ { print } ‘
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
Debian-exim:x:101:105::/var/spool/exim4:/bin/false
statd:x:102:65534::/var/lib/nfs:/bin/false
messagebus:x:103:108::/var/run/dbus:/bin/false
avahi-autoipd:x:104:109:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
avahi:x:105:110:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
gdm:x:106:113:Gnome Display Manager:/var/lib/gdm:/bin/false
haldaemon:x:107:115:Hardware abstraction layer,,,:/var/run/hal:/bin/false
hplip:x:108:7:HPLIP system user,,,:/var/run/hplip:/bin/false
polkituser:x:109:120:PolicyKit,,,:/var/run/PolicyKit:/bin/false
festival:x:110:29::/home/festival:/bin/false
mysql:x:111:121:MySQL Server,,,:/var/lib/mysql:/bin/false
[/shell]

sed: cannot rename .//sedDtwt6w: Invalid cross-device link

Error curioso al hacer un

[shell]
sed -i ‘s/foofoo/blabla/g’ *conf
[/shell]

Me lanza ester error, no me realiza el cambio y se para en el primer fichero que encuentra con *conf
[shell]
sed: cannot rename .//sedDtwt6w: Invalid cross-device link
[/shell]

Este error aparece por que el sistema de ficheros es distinto al que estamos lanzando el sed. En mi caso los ficheros son enlaces simbólicos a ficheros de otro punto de montaje.