vim soporte de portapapeles en entornos X

Por defecto en Debian, el paquete vim no soporta copiar y pegar texto de forma que se use el portapapeles para el entorno gráfico. Esto es debido a que vim puede ser compilado con una gran cantidad de opciones distintas, y para ello disponemos de muchos paquetes que actualizarán el binario con más o menos opciones activadas.

En este caso, necesitamos activar ‘clipboard’, pero… ¿ cómo podemos ver las opciones activas de nuestro vim ? con vim --version

$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 17 2016 06:26:47)
Included patches: 1-488, 576
Extra patches: 8.0.0056
Modified by pkg-vim-maintainers@lists.alioth.debian.org
Compiled by jamessan@debian.org
Huge version with GTK2 GUI. Features included (+) or not (-):
+acl +farsi +mouse_netterm +syntax
+arabic +file_in_path +mouse_sgr +tag_binary
+autocmd +find_in_path -mouse_sysmouse +tag_old_static
+balloon_eval +float +mouse_urxvt -tag_any_white
+browse +folding +mouse_xterm +tcl
++builtin_terms -footer +multi_byte +terminfo
+byte_offset +fork() +multi_lang +termresponse
+cindent +gettext -mzscheme +textobjects
+clientserver -hangul_input +netbeans_intg +title
+clipboard +iconv +path_extra +toolbar
+cmdline_compl +insert_expand +perl +user_commands
+cmdline_hist +jumplist +persistent_undo +vertsplit
+cmdline_info +keymap +postscript +virtualedit
+comments +langmap +printer +visual
+conceal +libcall +profile +visualextra
+cryptv +linebreak +python +viminfo
+cscope +lispindent -python3 +vreplace
+cursorbind +listcmds +quickfix +wildignore
+cursorshape +localmap +reltime +wildmenu
+dialog_con_gui +lua +rightleft +windows
+diff +menu +ruby +writebackup
+digraphs +mksession +scrollbind +X11
+dnd +modify_fname +signs -xfontset
-ebcdic +mouse +smartindent +xim
+emacs_tags +mouseshape -sniff +xsmp_interact
+eval +mouse_dec +startuptime +xterm_clipboard
+ex_extra +mouse_gpm +statusline -xterm_save
+extra_search -mouse_jsbterm -sun_workshop +xpm
system vimrc file: "$VIM/vimrc"
user vimrc file: "$HOME/.vimrc"
2nd user vimrc file: "~/.vim/vimrc"
user exrc file: "$HOME/.exrc"
system gvimrc file: "$VIM/gvimrc"
user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
system menu file: "$VIMRUNTIME/menu.vim"
fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gio-unix-2.0/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/freetype2 -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -I/usr/include/tcl8.6 -D_REENTRANT=1 -D_THREAD_SAFE=1 -D_LARGEFILE64_SOURCE=1
Linking: gcc -L. -Wl,-z,relro -L/home/pere/src/debian/ruby/ruby2.1/debian/lib -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl -L/usr/lib -llua5.2 -Wl,-E -fstack-protector -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.20/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lieee -lm -lruby-2.1 -lpthread -lgmp -ldl -lcrypt -lm

Para afinar un poco más :

$ vim --version | grep clipboard
+clipboard +iconv +path_extra +toolbar
+eval +mouse_dec +startuptime +xterm_clipboard

En este caso vemos ‘+clipboard‘ por lo que tengo la opción activada. Si no es así podemos instalar el paquete gtk para activar el soporte
apt-get install vim-gtk

Ahora ya podemos entrar a vim, escribir algo y probar a seleccionar texto y utilizar las combinaciones típicas de copiar y pegar entre vim y otra aplicación. Si no es posible copiar el texto, podemos mapear la combinación de teclas ‘control+shift+c’ en vim de la siguiente manera:

vmap <C-S-C> "y+<CR>"

… y ya podemos hacer copy+paste de vim a cualquier otro sitio. Recuerda que puedes hacer el mapping persistente en tu ~/.vimrc

Usando tftpd para extraer ficheros de un router

Cuando consigues acceso a un sistema embedido lo más práctico es poder sacar ficheros, o el sistema de ficheros completo fuera del router para poder analizarlo detenidamente.
No siempre hay herramientas como ssh, telnet o un puerto usb donde volcar los datos, pero casi siempre está disponible el comando tftp, un servicio de transferencia de ficheros sin autenticación.

Por lo que nuestro objetivo será conectar desde la consola (busybox) de nuestro router a un host externo que tenga un servidor tftpd y dejar ahí nuestro botín.

Tras algunas pruebas me he decantado por atftpd

sudo apt-get install atfpd

Preparamos la ruta que alberga el contenido

mkdir /srv/tftp/
chonw nobody.nogroup -R /srv/tftp

Desde mi consola tengo este cliente tftp que puede ser o no el tenga tu firmware


# tftp
BusyBox v1.15.3 () multi-call binary

Usage: tftp [OPTIONS] HOST [PORT]

Transfer a file from/to tftp server

Options:
-l FILE Local FILE
-r FILE Remote FILE
-g Get file
-p Put file

 

Un ejemplo para volcar un fichero de bloques mtd a mi host es este
tftp -p -l /dev/mtd6 -r mtd6 192.168.0.155

Y algo un poco más chulo para volcar casitodo el sistema de ficheros sería esto:
for file in `find /bin/ /etc/ lib/ mnt/ opt/ root/ sbin/ shares/ srv/ tmp/ usr/ var/ vmlinux.lz nocomprlist `; do tftp -p -l "$file" -r "$file"
192.168.0.155; done ;

excluyo los directorios /dev /sys /proc por que tienen ficheros en uso, ficheros de bloques, etc… por que no se pueden copiar de la manera habitual

Como nota, revisar /var/syslog para ver si la subida de ficheros no se está realizando correctamete y por qué. Por defecto el directorio es /srv/tftp el usuario nobdoy y el group nogroup. Recuerda revisar los permisos.

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

Configura wordpress con SSL

La seguridad en las comunicaciones es necesaria, y más vale tarde que nunca. Ahora podemos usar SSL de forma gratuíta gracias a Let’s Encrypt.

Let’s Encrypt es un proyecto de la Linux Foundation con el que colaboran grandes empresas como Cisco y organizaciones como Electronic Frontier Foundation que tiene como objetivo proveer de manera gratuíta certificados de seguridad para todos. Hasta ahora y aún sigue siendo así los certificados cuestan entre 60 y 300 euros dependiendo del tipo de certificado, seguro, etc… con Let’s Encrypt podremos usar un certificado sin tener que gastarnos dinero, el único incoveniente es que caduca a los 90 días y hay que renovarlo. Aunque esto no quiere decir que lo tengas que hacer manualmente, ¡ que trabaje el CRON !

He instalado este certificado para mi dominio, de manera muy sencilla por que uso Plesk y existe un plugin[2] y he cambiado la configuración de wordpress en Ajustes / Generales / Dirección de WordPress (URL) y Dirección del sitio (URL) a https://www.senin.org

Te animo a que tambien uses SSL y muevas tu blog a ssl

[1]https://letsencrypt.org/getting-started/
[2]https://devblog.plesk.com/2015/12/lets-encrypt-plesk/

Hostingaldescubierto.com ha muerto

En septiempbre de 2007 creamos hostingaldescubierto.com un sitio donde poder colgar nuestras recetas para solucionar problemas relacionados con hosting y software de gestión de hosting: Plesk, que luego pasó a llamarse Parallels y ahora es conocido como Odin.
Son muchos años en los que fuimos dejando chuletas, parches, noticias, así como artículos de opinión de compañías del mundo del hosting.
Hostingaldescubierto, no fué muy relevante, pero seguíamos publicando información por puro placer divulgativo. Hoy ya es un site muerto, como tantos otros, la falta de tiempo, el cambio de trabajo, etc… ha concluído en el cierre de hostingaldescubierto, ya no tenía sentido mantener un site en que no se publicaba desde hacía tiempo y que apenas tenía visitas.
Para no perder muchas de las ‘recetas’ he importado los artículos a mi blog, para que al menos estén vivas en algún sitio.
Espero que sea útil para alguien, al igual que cuando comenzamos.

referencia git

Staging area git

Unlike the other systems, Git has something called the “staging area” or “index”. This is an intermediate area where commits can be formatted and reviewed before completing the commit.

One thing that sets Git apart from other tools is that it’s possible to quickly stage some of your files and commit them without committing all of the other modified files in your working directory or having to list them on the command line during the commit.

This allows you to stage only portions of a modified file. Gone are the days of making two logically unrelated modifications to a file before you realized that you forgot to commit one of them. Now you can just stage the change you need for the current commit and stage the other change for the next commit. This feature scales up to as many different changes to your file as needed.

## agregar ficheros al staging
git add file

## agregar ficheros al staging
git commit -m"title" -m"description"

## agregar cambios al ultimo commit
git commit --amend -m"title" -m"description"

## deshacer commit, hash es el hash del commit al que quieres volver
git reset hash

# origins
# agregando un origen remoto, con convención ‘origin’ y ‘upstream’
git remote add origin http://rutaproject/project

# ver configuracion remota del origin
git remote show origin

#pull tirar, se trae cambios, push empuja sube cambios
#antes de hacer un push, hacer un pull
#para actualizar el contenido de mi rama
git pull origin master
o
git merge origin master
# con rebase intenta reordenar los commits de forma que no se pierda la historia
git merge --rebase origin master

#ahora ya podemos intercambiar codigo con otras ramas, voy a subir mi rama feature/new-feature
git push origin feature/new-feature

# stash, el cajón
# guardamos lo que hay en el staging pendiente de commitear en un cajón
git stats

# guardar notas para un stash
git stats save "explanation about this stash"

# ver los stash que hay
git stats list

# ver quét tiene un stash, ver stash #3
git stats show stash@{3}

## por defecto el reset, es –soft, te deja los cambios realizados en working directoy
git reset hash

## El modo –hard, elimia todo
git reset --hard hash

## deshacer el ultimo cambio, genera un commit nuevo con nombre “Revert: nombre del commit anterior”, una nueva entrada en la historia, aplicando los cambios necesarios para dejar el contenido tal y como estaba antes
git revert
## si no queremos que se genere un commit, podemos usar –no-commit y nos dejará los cambios en el staging
git revert --no-commit
## este commando requiere finarlo, y generará un nuevo commit
git revert --continue

## también se puede hace referencia a HEAD, y HEAD~1, HEAD~2 para indicar los pasos previos a HEAD

git reset HEAD
git reset HEAD~1
# Recuerda que si haces un reset HEAD, el HEAD se moverá al siguiente elemento, y los desplazamientos de ~1 o ~2 serán en base a ese estado
git reset HEAD~2

# comparar ficheros de diferentes ramas, compara somebranch con la rama actual
git diff somebranch path/to/your/file

# configurar herramienta para hacer diffing
git config diff.tool xxdiff

## rama actual
git branch

## crear rama desde la rama actual, todo tiene un origen
git checkout -b'feature/nombre'

## borrar rama
git -D branch

## renombrar rama
git -m branch newbranchname

# fusionar ramas
# debes posicionarte en la rama que va a recibir los cambios, con merge te traes los cambios a la rama actual
git merge feature/somethiing-new
# mezcla de ramas puede ser con fast forward que lo que hace es directamente cambiar el puntero HEAD a la rama que nos estamos trayendo, siempre que sea posible

“The –no-ff flag prevents git merge from executing a “fast-forward” if it detects that your current HEAD is an ancestor of the commit you’re trying to merge. A fast-forward is when, instead of constructing a merge commit, git just moves your branch pointer to point at the incoming commit. This commonly occurs when doing a git pull without any local changes.

However, occasionally you want to prevent this behavior from happening, typically because you want to maintain a specific branch topology (e.g. you’re merging in a topic branch and you want to ensure it looks that way when reading history). In order to do that, you can pass the –no-ff flag and git merge will always construct a merge instead of fast-forwarding.”

http://stackoverflow.com/questions/9069061/what-is-the-difference-between-git-merge-and-git-merge-no-ff/9069127#9069127

# etiquetas, tag
# nombra a un commit con un nombre para humanos
# para etiquetado ver http://semver.org/
# tagea el ultimo commit como v.1.0.1
git tag v1.0.1
# tagea un commit concreto
git tag v1.0.2 433fc3

# listar todos los tags
git tag

# eliminar tag
git tag -d tagname

## etiquetas anotadas
# etiquetas con mayor contenido de información agregado
# exigue que le indiques texto como si fuera un commit
git tag -a tagname

# puedes ver info del tag con git show, descripción y diffing
git show tagname

# otras ramas
## ver un fichero de la rama somebranch
git show somebranch path/to/your/file

# traerte un fichero de otra rama
git checkout somebranch path/to/your/file

# buscar a que branch pertenece un hash
git branch --contains ce1637f
# tambien se puede hacer con el reflog
git reflog show --all | grep ce1637f

# historial de cambios, muestra la historia verdadera de lo que ha pasado
git reflog

# ver las referencias de ramas remotas, en este caso busco un tag en concreto
git ls-remote origin --tags v1.5.0
a56956fc089c84482f0f457d1fa299142f8d6e42 refs/heads/release/v1.5.0

# ver ramas remotas con informacion extendida
git remote show origin

# http://stackoverflow.com/a/9074343
# git lg para mostrar un arbol con color de ramas y etiquetas
# ~./gitconfig

[alias]
lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
lg = !"git lg1"
[core]
excludesfile = /home/jorge/.gitignore_global

Prompt para bash para mostrar el branch actual

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__git_ps1)\$ '

#git find file alias script
git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :'

#git grep through branches with no pagger
for branch in `git for-each-ref –format=”%(refname)” refs/heads`; do echo “[+] $branch :” ; GIT_PAGER=cat git grep ‘OfferType’ $branch; done

git hooks
https://github.com/brigade/overcommit#installation

# git avanzada
http://learngitbranching.js.org/?demo

quitar link preview de wordpress

Pues ahora wordpress te hace un bonito preview de los links que interpreta en el texto de tu post, queda muy bonito, pero a mí no me convence y para desactivarlo hay que instalar un pluguin 🙁 https://wordpress.org/plugins/disable-embeds/

historias de usuario, tareas, tdd, bdd, clean architecture

En estas últimas semanas me he dado cuenta lo importante que son las historias de usuario, definirlas bien para poder segmentar el trabajo. Esto me ha llevado a indagar más sobre cómo escribir, desgranar tareas y como comenzar con tests y finalmente con el código. He encontrado mucho material que me parece demasiado interesante como para perderlo, asi que lo pongo aquí :





http://codurance.com/2015/05/12/does-tdd-lead-to-good-design
http://coding-is-like-cooking.info/2013/04/outside-in-development-with-double-loop-tdd
http://blog.alexsimo.com/clean-architecture-traduccion
https://www.sitepoint.com/clean-code-architecture-and-test-driven-development-in-php
http://lisacrispin.com/2011/11/08/using-the-agile-testing-quadrants
https://testhuddle.com/resource/a-new-agile-testing-ecosystem
https://techblog.badoo.com/blog/2016/05/11/crazy-agile-api

vagrant no sync folder

En instalaciones ‘frescas’ con Debian me está ocurriendo que cuando creo un proyecto de Vagrant con una Debian 8 por defecto la carpeta /vagrant no se sincroniza correctamente.

vagrant init debian/jessie64

La verdad que es un chasco estar trabajando en una instalación y de repente ver que has perdido el contenido al reiniciar la máquina vagrant por que no te aseguraste que estaba sincronizando correctamente…

Vagrant usa 4 tipos disintos para sincronizar directorios, por defecto deja al propio vagrant que decida que quiere hacer y si no es capaz de usar el driver propio de Vagrant, usa rsync. En el caso de la instalación fresca de Debian, he encontrado que el problema está en un fichero de mi proyecto

./vagrant/machines/default/virtualbox/synced_folders
{"rsync":{"/vagrant":{"type":"rsync","guestpath":"/vagrant","hostpath":"/home/jorge/projects/vagrant/data","disabled":false,"owner":"vagrant","group":"vagrant"}}}

Como vemos aquí está forzando a usar rsync cuando yo no quiero, prefiero que use el propio driver de Debian. Así que directamente eliminando este fichero y reinciniando la máquina vagrant debería comenzar a sincronizar correctamente. Peeeeero no funciona, el fichero se vuelve a crear, así que tendremos que ir a la configuración principal, a ver que encontramos, vamos a ver que hay por ahí…

Si echamos un vistazo a ~/.vagrant vemos lo siguiente:

.
./data
./data/lock.dotlock.lock
./data/machine-index
./data/machine-index/index.lock
./data/machine-index/index
./data/fp-leases
./boxes
./boxes/debian-VAGRANTSLASH-jessie64
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/box.ovf
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/metadata.json
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/Vagrantfile
./boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/debian-jessie-disk1.vmdk
./boxes/debian-VAGRANTSLASH-jessie64/metadata_url
./tmp
./rgloader
./rgloader/loader.rb
./setup_version
./insecure_private_key
./gems
./gems/ruby
./gems/ruby/2.1.0

Y si curioseamos el fichero Vagarnt de jessie64 vemos esto :

# The contents below were provided by the Packer Vagrant post-processor

Vagrant.configure("2") do |config|
  config.vm.base_mac = "0800271EC67E"
end


# The contents below (if any) are custom contents provided by the
# Packer template during image build.
Vagrant.configure("2") do |config|
  config.vm.synced_folder \
    ".",
    "/vagrant",
    type: "rsync"
end

Vemos aquí que hay un preset para definir el tipo de sincronización a rsync, no tengo muy claro si es una configuración por defecto o se fuenza a que la imagen se configure así , por lo que tendríamos dos caminos o bien lo cambiamos en ./vagrant/machines/default/virtualbox/synced_folders de nuestro proyecto o cambiarlo  en ~/.vagrant/boxes/debian-VAGRANTSLASH-jessie64/8.4.0/virtualbox/Vagrantfile, que es lo que voy a probar, me cargo esta linea, reiniciamos

Vale ahora hay otro problema …. ( todo esto con una versión fresca de Debian )

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

stdin: is not a tty
mount: unknown filesystem type 'vboxsf'

Esto parece ser que es por que me faltan las ‘guest-utils‘ así que las instalo

$ sudo apt-get install virtualbox-guest-dkms
[sudo] password for jorge: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  lockfile-progs
Use 'apt-get autoremove' to remove it.
The following extra packages will be installed:
  libnotify-bin virtualbox-guest-utils virtualbox-guest-x11
The following NEW packages will be installed:
  libnotify-bin virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,939 kB of archives.
After this operation, 12.2 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
Get:1 http://ftp.es.debian.org/debian/ jessie/main libnotify-bin amd64 0.7.6-2 [22.7 kB]
Get:2 http://ftp.es.debian.org/debian/ jessie/contrib virtualbox-guest-utils amd64 4.3.36-dfsg-1+deb8u1 [387 kB]
Get:3 http://ftp.es.debian.org/debian/ jessie/contrib virtualbox-guest-dkms all 4.3.36-dfsg-1+deb8u1 [498 kB]
Get:4 http://ftp.es.debian.org/debian/ jessie/contrib virtualbox-guest-x11 amd64 4.3.36-dfsg-1+deb8u1 [1,030 kB]
Fetched 1,939 kB in 2s (756 kB/s)               
Selecting previously unselected package libnotify-bin.
(Reading database ... 170777 files and directories currently installed.)
Preparing to unpack .../libnotify-bin_0.7.6-2_amd64.deb ...
Unpacking libnotify-bin (0.7.6-2) ...
Selecting previously unselected package virtualbox-guest-utils.
Preparing to unpack .../virtualbox-guest-utils_4.3.36-dfsg-1+deb8u1_amd64.deb ...
Unpacking virtualbox-guest-utils (4.3.36-dfsg-1+deb8u1) ...
Selecting previously unselected package virtualbox-guest-dkms.
Preparing to unpack .../virtualbox-guest-dkms_4.3.36-dfsg-1+deb8u1_all.deb ...
Unpacking virtualbox-guest-dkms (4.3.36-dfsg-1+deb8u1) ...
Selecting previously unselected package virtualbox-guest-x11.
Preparing to unpack .../virtualbox-guest-x11_4.3.36-dfsg-1+deb8u1_amd64.deb ...
Unpacking virtualbox-guest-x11 (4.3.36-dfsg-1+deb8u1) ...
Processing triggers for man-db (2.7.0.2-5) ...
Processing triggers for systemd (215-17+deb8u4) ...
Setting up libnotify-bin (0.7.6-2) ...
Setting up virtualbox-guest-utils (4.3.36-dfsg-1+deb8u1) ...
Setting up virtualbox-guest-dkms (4.3.36-dfsg-1+deb8u1) ...
Loading new virtualbox-guest-4.3.36 DKMS files...
First Installation: checking all kernels...
Building only for 4.5.0
Building initial module for 4.5.0
Error! Bad return status for module build on kernel: 4.5.0 (x86_64)
Consult /var/lib/dkms/virtualbox-guest/4.3.36/build/make.log for more information.
Setting up virtualbox-guest-x11 (4.3.36-dfsg-1+deb8u1) ...
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
Processing triggers for systemd (215-17+deb8u4) ...
Processing triggers for libc-bin (2.19-18+deb8u4) ...

 

Pero ahora tenemos otro problema… no compilan las guest-utils con mi kernel 4.5 … vamos a echar un vistazo

  CC [M]  /var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/vfsmod.o
  CC [M]  /var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/dirops.o
  CC [M]  /var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.o
/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.c: In function ‘sf_get_link’:
/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.c:79:5: error: implicit declaration of function ‘VbglR0SfReadLink’ [-Werror=implicit-function-declaration]
     rc = VbglR0SfReadLink(&client_handle, &sf_g->map, sf_i->path, PATH_MAX, path);
     ^
cc1: some warnings being treated as errors
scripts/Makefile.build:258: recipe for target '/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.o' failed
make[2]: *** [/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf/lnkops.o] Error 1
scripts/Makefile.build:407: recipe for target '/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf' failed
make[1]: *** [/var/lib/dkms/virtualbox-guest/4.3.36/build/vboxsf] Error 2
Makefile:1391: recipe for target '_module_/var/lib/dkms/virtualbox-guest/4.3.36/build' failed
make: *** [_module_/var/lib/dkms/virtualbox-guest/4.3.36/build] Error 2
make: Leaving directory '/usr/src/linux-headers-4.5.0'

Googleando un poco veo que es un bug reportado y tengo dos opciones o pasar de esta forma de sincronizar carpetas o bien bajarme una versión actual y parcheada de VirtualBox … me lo voy a pensar 😀

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.