martes, 20 de enero de 2015

Virtualización de máquinas en Servidor de Aula con KVM

Necesitamos crear una máquina virtual con otro sistema operativo para correr un determinado programa de otra plataforma.
Como hemos probado con VirtualBox y no va bien, me han dejado la tarea de probar con KVM que al no ser emulador y correr sobre el propio kernel parece que va mejor.

Inicialmente tiré del siguiente tutorial:

Aunque después me he servido de la siguiente presentación, bastante completa donde se va indicando todo.
http://www.gonzalonazareno.org/cloud/material/KVM.pdf

Y ésta también es una muy buena guía, de la cual he sacado la mejora de tarjeta gráfica y aceleración 2D y 3D.
http://www.makeinstall.es/2011/04/virtualizar-con-la-maquina-virtual-del.html

He comprobado que el procesador con el que vienen equipados los servidores de aula, intel i3, viene con la tecnología intel-vt, tan sólo es necesario activarla en la bios, si no está activada.
La he podido habilitar entrando en la bios y  en la pestaña que pone Advanced, allí menú CPU CONFIGURATIÓN  (en otro ordenador, me la he encontrado en  Overclocking dentro de ella vamos a CPU FEATURES )  y una vez allí ponemos la opción Intel Virtaulization Tech a enable.

Ya después de arrancar el sistema podemos ver si ha arrancado correctamente los módulos:

root@servidorweb:/# lsmod|grep kvm
kvm_intel             138825  0 
kvm                   404853  1 kvm_intel
root@servidorweb:/# 

Instalamos paquetes kvm:

root@a09-pro:~# apt-get install qemu-kvm libvirt-bin bridge-utils

 y después paquetes para aplicaciones auxiliares:

apt-get install virtinst virt-manager ubuntu-vmbuilder
virt-viewer

entre ellas virt-manager que nos va a ofrecer una interfaz gráfica para poder gestionar nuestras máquinas virtuales.

Para poder utilizar las máquinas virtuales el usuario debe pertenecer a los grupos: libvirtd y kvm.
En nuestro sistema, como los usuarios los tenemos en ldap, tenemos dos opciones:
1.- Añadirlos en el archivo de grupos: /etc/groups. Añado usuario en esos dos grupos después de los dos puntos. El sistema ya se encarga de meter mi usuario en esos grupos.

  GNU nano 2.2.6            Fichero: /etc/group                    Modificado  

clamav:x:129:
firebird:x:128:
kvm:x:130:usuario
libvirt:x:131:usuario
libvirt-qemu:x:132:libvirt-qemu
vde2-net:x:133:

2.- Creamos en ldap un nuevo grupo en la rama Groups y le añadimos los usuarios que deseemos.

Como de estas dos formas, me he encontrado, no sé el motivo, con problemas de autentificación de los usuarios, he decidido crear un usuario local con :

useradd  -D -m -d /homeInst/prueba -g kvm,libirt -p prueba prueba

Con este comando crea tanto usuario como su home, le mete la contraseña indicada y también lo mete dentro de los grupos que necesitamos.
Y luego lo añadimos como miembro de los grupos libvirt y kvm en el caso de que no se haya añadido al crearlo.

Creamos y definimos el pool de almacenamiento tal y como indica en la página 41 del pdf.
root@a09-pro:~# nano /tmp/pool-default.xml 

 GNU nano 2.2.6                   Fichero: /tmp/pool-default.xml                                              

<pool type='dir'>
<name>default</name>
<target>
<path>/var/lib/libvirt/images</path>
</target>
</pool>

root@a09-pro:~# virsh pool-autostart default
Pool default marked as autostarted

root@a09-pro:~# virsh pool-list --all
Name                 State      Autostart 
-----------------------------------------
default              inactive   yes       

root@a09-pro:~# virsh pool-start default
Pool default started

root@a09-pro:~# virsh pool-list --all
Name                 State      Autostart 
-----------------------------------------
default              active     yes       

root@a09-pro:~# 


Idem con la red en página 44:

root@a09-pro:~# virsh net-start default
Network default started

root@a09-pro:~# virsh net-autostart default
Network default marked as autostarted

root@a09-pro:~# virsh net-list
Name                 State      Autostart
-----------------------------------------
default              active     yes       

root@a09-pro:~#


Ya hemos finalizado con la instalación del software necesario, ya sólo nos quedaría crear las máquinas virtuales que necesitemos.

Lo podemos realizar mediante el comando virt-install  o directamente en modo gráfico desde virt-manager. Yo he utilizado esta forma que es más intuitiva.

Abrimos virt-manager y pulsamos el icono de máquina virtual nueva.
Ponemos nombre  y en Medio de instalación local le ponemos la dirección del ISO con la imagen del SO que queremos instalar, tipo de SO, memoria, procesadores, etc... (todo esto lo podremos modificar más adelante) y dejamos que comience y finalice la instalación.
La máquina virtual nos crea una imagen del disco duro virtual que crea(archivo .img), lo almacena en /var/lib/libvirt/images/   y por otra parte nos guarda la configuración de la máquina virtual (procesadores, memoria, gráfica, etc...) en el directorio /etc/libvirt/qemu/ un archivo xml por máquina virtual creada.
Como en mi caso queremos la máquina para trabajar con un programa de diseño gráfico y es muy importante que funcione muy bien la gráfica y tenga aceleración, se lo ponemos a mano directamente en este archivo xml en la etiqueta de video, cambiando vga por vmvga, aumentando la vram y poniendo la aceleración:
.    <video>
      <model type='vmvga' vram='131072' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
      <acceleration accel2d='yes' accel3d='yes'/>
    </video>
Ya por último, y como lo que estoy utilizando es un cliente windows, queríamos que todo funcionara lo mejor posible y habíamos leído que virtio mejoraba la fluídez, para eso añadimos un nuevo cdrom con la iso de virtio, desde Editar/Detalles de la máquina virtual con la máquina virtual seleccionada, y en información (símbolo de la bombilla) añadir nuevo hardware.


Para ello desde el administrador de dispositivos de Windows le dimos a actualizar controlador de tarjeta de red, bus pci, etc... y también los dispositivos no reconocidos, indicándole instalar desde el cdrom  o disco duro que hemos añadido.

Creo que ya poco más, la verdad es que el resultado es impresionante, y parece funcionar más rápido que una máquina real....
¿Cuál es el secreto?

lunes, 12 de enero de 2015

whatsapp en pc con pidgin

Necesitamos tener whatsapp en el instituto para hacer llegar comunicaciones por este medio.
Me puse a ver en internet y encontré que es posible hacerlo siguiendo las indicaciones de, entre otras, la siguiente página:

http://blog.desdelinux.net/como-usar-whatsapp-en-linux-con-pidgin/

más a la hora de solicitar la contraseña con yowsup, me encontre que daba error ya que la versión ha cambiado.
Después de entrar en la página del proyecto:

https://github.com/tgalal/yowsup/wiki/yowsup-cli-2.0

vi que ha cambiado un poco la filosofía del script yowsup-cli y en vez de solicitar dicho registro con la órden que indica el tutorial:

./yowsup-cli -c whatsapp_config.txt --requestcode sms

ahora se realiza en dos pasos, tal y como indica la documentación de yowsup-cli:

yowsup-cli registration --requestcode sms --phone 49XXXXXXXX --cc 49 --mcc 123 --mnc 456
yowsup-cli registration --register 123456 --phone 49XXXXXXXX --cc 49
en donde cc y mcc son los códigos de país y operadora que se pueden encontrar en el siguiente enlace de la wikipedia:
https://en.wikipedia.org/wiki/Mobile_country_code#National_operators

Ya nos da el siguiente resultado:

jmmedi-hpt yowsup # ./yowsup-cli registration --requestcode sms --phone 34XXXXXX --cc 34 --mcc 214 --mnc 03
INFO:yowsup.common.http.warequest:{"status":"sent","length":6,"method":"sms","retry_after":1805}

status: sent
retry_after: 1805
length: 6
method: sms
jmmedina-hpt yowsup # ./yowsup-cli registration --register 115-070 --phone 34XXXXXXX  --cc 34
INFO:yowsup.common.http.warequest:{"status":"ok","login":"34XXXXXXX","pw":"RoqW8JhFo4laFi2tdR3fIvxFxeE=","type":"existing","expiration":1448664009,"kind":"free","price":"0,89 \u20ac","cost":"0.89","currency":"EUR","price_expiration":1423994449}

status: ok
kind: free
pw: RoqW8JhFo4laFi2tdheE=
price: 0,89 €
price_expiration: 1423994449
currency: EUR
cost: 0.89
expiration: 1448664009
login: 346ÇXXXXXXX
type: existing
jmmedinac03-hpt yowsup # 

Si queremos tener un archivo con la configuración podemos hacer los siguiente:

 yowsup # ./yowsup-cli demos --help-config > whatsapp-config.txt

############# Yowsup Configuration Sample ###########
#
# ====================
# The file contains info about your WhatsApp account. This is used during registration and login.
# You can define or override all fields in the command line args as well.
#
# Country code. See http://www.ipipi.com/help/telephone-country-codes.htm. This is now required.
cc=49
#
# Your full phone number including the country code you defined in 'cc', without preceding '+' or '00'
phone=491234567890
#
# You obtain this password when you register using Yowsup.
password=NDkxNTIyNTI1NjAyMkBzLndoYXRzYXBwLm5ldA==
#######################################################

y cambiamos los campos cc, phone y password por nuestros datos.

Si queremos más información sobre las opciones de yowsup-cli, en este caso demos, lo podemos ver con:

yowsup # ./yowsup-cli demos -h
usage: demos [-h] [-v] [-d] [--help-config] [-l phone:b64password | -c CONFIG]
             [-m] [-y] [-e] [-s phone message]

Run a yowsup demo

optional arguments:
  -h, --help            show this help message and exit
  -v, --version         Print version info and exit
  -d, --debug           Show debug messages
  --help-config         Prints a config file sample

Configuration options for demos:
  -l phone:b64password, --login phone:b64password
                        WhatsApp login credentials, in the format
                        phonenumber:password, where password is base64
                        encoded.
  -c CONFIG, --config CONFIG
                        Path to config file containing authentication info.
                        For more info about config format use --help-config
  -m, --moxie           Enable experimental support for the new WhatsApp
                        encryption

Command line interface demo:
  -y, --yowsup          Start the Yowsup command line client

Echo client demo:
  -e, --echo            Start the Yowsup Echo client

Send client demo:
  -s phone message, --send phone message
                        Send a message to specified phone number, wait for
                        server receipt and exit


Y ya como indica el tuturial, abrir pidgin y crear una cuenta nueva de whatsapp con login número de teléfono(346XXXXXX) y password el código recibido como pw:.........

Probado y funcionando.

jueves, 11 de diciembre de 2014

Manejo de Colas de Impresión

Hoy, después de solucionar un problema con una tarea, las impresoras han empezado a imprimir los trabajos que tenían pendientes, por lo que he tenido que vaciar las colas de impresión de los equipos afectados.
Me he ayudado de la utilidad dsh para pasársela a los equipos con el comando:

cancel Impresora

donde Impresora es el nombre de la impresora en el equipo.

Si queremos pausar o deshabilitar una impresora:

cupsdisable Impresora


Si queremos reanudarlas

cupsenable Impresora

miércoles, 19 de noviembre de 2014

Host Virtuales en Apache con Debian Wheezy

Como estoy preparando el tercer servidor como servidor web me he estado peleando un par de días con los Host Virtuales.
Esto es, tengo en el servidor web varios "servidores", por decirlo así, diferentes. Uno para las fotos del centro, otro para ficheros, paquetes, etc.....
A cada uno se accede poniendo un nombre en el navegador: p.e. FotosIeso, y el servidor apache ve a qué carpeta se tiene que dirigir y lo muestra. Aparentemente son independientes entre sí.
Pues bien, este sistema lo tenía con el anterior servidor en debian Squeeze, pero ahora, con el cambio a Wheezy no conseguía hacerlo funcionar.
Puedes ver como se crea en el siguiente enlace:

http://www.servidordebian.org/es/wheezy/internet/http/start

y aquí puedes ver un poco más específico de los host virtuales:

http://www.ubuntufacil.com/2013/12/hosts-virtuales-con-apache2-en-ubuntu-13-10/

Pues bien creaba ficheros con los datos de cada host virtual y al intentar enlazarlo me daba error, pero por mucho que buscaba no encontraba, hasta que dí con la solución. Como es un foro, pego el enlace pero la solución está dentro de las respuestas:

http://www.daboweb.com/foros/index.php?topic=38922.0

Resumiendo en /etc/apache2/sites-enabled/default, está la configuración por defecto del servidor apache, éste fichero está enlazado a /etc/apache2/sites-available/000-default.
Pues bien, hay que desenlazarlo:

root@servidorweb:/etc/apache2/sites-available# a2dissite default

Copiamos el fichero default con otro nombre. en mi caso repositorioiesburguillos y cambiamos los datos, es decir ServerName, ServerAdmin, DocumentRoot y el Directorio. Quedaría tal que así
<VirtualHost *:80>
ServerAdmin iesburguillos@iesburguillos.com
Servername repositorioiesburguillos
DocumentRoot /var/www/repository
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/repository>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from 172.17.164.0/24
# allow from all

</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from 172.17.164.0/24
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

y ya lo enlazamos con:

root@servidorweb:/etc/apache2/sites-available# a2ensite repositorioiesburguillos

Así procedemos con todos los host virtuales que deseemos.


martes, 11 de noviembre de 2014

Bonding en servidor

Actualizando el tercer servidor, me he encontrado con una cosa de las que tenía pendientes hace mucho tiempo y es realizar bonding.
La idea es realizarlo con los servidores nfs  y ldap que son los que más tráfico tienen, pero voy a probarlo en este tercer servidor.
Lo he sacado de la siguiente página:

http://www.servidordebian.org/es/wheezy/config/network/bonding

resumo:

Instalar paquete ifenslave-2.6 y ojo, meterlo dentro del mayhave.

Modificar el /etc/network/interfaces:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo eth0

iface lo inet loopback


iface eth0 inet static
        address 192.168.0.254
        netmask 255.255.255.0
        broadcast 192.168.0.255

auto bond0

iface bond0 inet static
        bond-slaves eth3 eth2
        bond-mode balance-rr
        bond-miimon 100
        bond-primary eth3 eth2

        address XX.XX.XX.30
        netmask 255.255.255.0
        network XX.XX.XX.0
        broadcast XX.XX.XX.255
        gateway XX.XX.XX.XX

Tengo tres interfaces de red:
Eth0 es una red local donde están conectados los thinclients del aula
Eth3 es la tarjeta de red conectada al centro y quedará como principal del bonding
eth2 es la añadida al bonding.

Al reinicar networking y luego el equipo, me doy cuenta que si bien tengo acceso a la red del centro, no tengo salida a internet.
Es debido a que en la instalación me ha borrado el contenido de /etc/resolv.conf y por lo tanto no resuelve.
Como veo que pone que no se debe editar a mano ya que se genera automáticamente, veo que hay que añadirlo en /etc/resolvconf/resolv.conf.d/base:

root@servidorweb:~# cat /etc/resolvconf/resolv.conf.d/base

search burguillosdelcerro 
nameserver XX.XX.XX.XX



Instalación de paquetes con dpkg. Forzar dependencias.

Algunas veces nos hemos descargado un paquete que no se encuentra en los repositorios desde la web del desarrollado.
En algunas ocasiones no nos deja instalarlo debido a que no se cumplen las dependencias.
En mi caso quise instalar la última versión de google-chrome.

root@servidorweb:/tmp# dpkg -i google-chrome-stable_current_i386.deb
Seleccionando el paquete google-chrome-stable previamente no seleccionado.
(Leyendo la base de datos ... 431340 ficheros o directorios instalados actualmente.)
Desempaquetando google-chrome-stable (de google-chrome-stable_current_i386.deb) ...
dpkg: problemas de dependencias impiden la configuración de google-chrome-stable:
 google-chrome-stable depende de libnss3 (>= 3.14.3).
 google-chrome-stable depende de xdg-utils (>= 1.0.2).

dpkg: error al procesar google-chrome-stable (--install):
 problemas de dependencias - se deja sin configurar
Procesando disparadores para desktop-file-utils ...
Procesando disparadores para gnome-menus ...
Procesando disparadores para man-db ...
Procesando disparadores para menu ...
Se encontraron errores al procesar:
 google-chrome-stable



 SSin embargo si vemos las versiones de los paquetes que dan dependencias incumplidas:

  dpkg -l libnss3
Deseado=Desconocido/Instalar/Eliminar/Purgar/Retener
| Estado=No/Instalado/Config-files/Desempaquetado/Medio-conf/Medio-inst/espera-disparo/pendiente-disparo
|/ Err?=(ninguno)/Requiere-reinst (Estado,Err: mayúsc.=malo)
||/ Nombre         Versión     Arquitectura Descripción
+++-==============-============-============-=================================
ii  libnss3:amd64  2:3.15.1-1~b amd64        Network Security Service librarie
root@servidorweb:/tmp# dpkg -l xdg-utils
Deseado=Desconocido/Instalar/Eliminar/Purgar/Retener
| Estado=No/Instalado/Config-files/Desempaquetado/Medio-conf/Medio-inst/espera-disparo/pendiente-disparo
|/ Err?=(ninguno)/Requiere-reinst (Estado,Err: mayúsc.=malo)
||/ Nombre         Versión     Arquitectura Descripción
+++-==============-============-============-=================================
ii  xdg-utils      1.1.0~rc1+gi all          desktop integration utilities fro







Por lo tanto puedo probar a forzar la instalación del paquete google-chrome con --force-depends o --force all para ver si funciona.

 root@servidorweb:/tmp# dpkg -i --force depends google-chrome-stable_current_i386.deb
(Leyendo la base de datos ... 431443 ficheros o directorios instalados actualmente.)
Preparando para reemplazar google-chrome-stable 38.0.2125.111-1 (usando google-chrome-stable_current_i386.deb) ...
Desempaquetando el reemplazo de google-chrome-stable ...
dpkg: google-chrome-stable: problemas de dependencias, pero se configurará de todas formas
 tal y como se solicitó:
 google-chrome-stable depende de libnss3 (>= 3.14.3).
 google-chrome-stable depende de xdg-utils (>= 1.0.2).

Configurando google-chrome-stable (38.0.2125.111-1) ...
Procesando disparadores para desktop-file-utils ...
Procesando disparadores para gnome-menus ...
Procesando disparadores para man-db ...
Procesando disparadores para menu ...
root@servidorweb:/tmp#



Si no vemos que una vez instalado no funciona correctamente puedo volver atrás a instalar la versión de los repositorios.

Aquí podemos ver las opciones de dpkg --force:

 dpkg --force-help
opciones de forzado de dpkg - controlan el comportamiento cuando hay problemas:

 avisa pero continúa:      --force-<cosa>,<cosa>,...
 se detiene si hay error:  --refuse-<cosa>,<cosa>,... | --no-force-<cosa>,...
 Cosas que se pueden forzar:
  [!] all                Activa todas las opciones de forzado.
  [*] downgrade          Reemplaza el paquete con una versión menor.
      configure-any      Configura cualquier paquete que pudiera ayudar a éste.
      hold               Procesa paquetes accesorios aunque estén bloqueados
      not-root           Intenta (des)instalar cosas incluso sin ser root.
      bad-path           No se pueden encontrar programas importante en PATH, seguramente cause problemas
      bad-verify         Instala un paquete aunque falle la comprobación de autenticidad
      bad-version        Procesa incluiso paquetes con versiones incorrectas
      overwrite          Sobreescribe un fichero de un paquete con otro.
      overwrite-diverted Sobreescribe un fichero desviado con una versión no desviada.
  [!] overwrite-dir      Sobreescribir el directorio de un paquete con el fichero de otro
  [!] unsafe-io          No utiliza las operaciones seguras de E/S cuando se realiza desempaqueta.
  [!] confnew            Utiliza siempre los archivos de configuración nuevos, no pregunta.
  [!] confold            Utiliza siempre los archivos de configuración antiguos, no pregunta.
  [!] confdef            Utiliza la opción predeterminada para los ficheros de
                configuración nuevo si están disponibles,
                sin preguntar. Si no se encuentra ninguno
                predeterminado preguntará, a menos que se
                utilicen también alguna de las opciones confold
                o confnew.
  [!] confmiss           Instala siempre los ficheros de configuración que faltan.
  [!] confask            Ofrece el reemplazo de ficheros de configuración sin versiones nuevas.
  [!] architecture       Procesa incluso los paquetes con arquitectura errónea o sin arquitectura.
  [!] breaks             Instala aunque pudiera romper otro paquete.
  [!] conflicts          Permite la instalación de paquetes en conflicto.
  [!] depends            Convierte todos los problemas de dependencias en avisos.
  [!] depends-version    Convierte todos los problemas de versiones de dependencias en avisos.
  [!] remove-reinstreq   Elimina los paquetes que precisan instalación.
  [!] remove-essential   Elimina un paquete esencial.

ATENCIÓN - el uso de las opciones marcadas con [!] puede dañar seriamente
su instalación. Las opciones de forzado marcadas con [*] están activas
por omisión.

jueves, 6 de noviembre de 2014

Impresoras en red en el centro

Hoy en un correo preguntaban el modo de añadir impresoras en red en el centro, y me va a servir de escusa para documentarlo.

Preparar la impresora.

Si queremos que la impresora sea accesible por red desde todo el centro tenemos que conocer su ip.
Por otra parte es interesante que nosotros decidamos que ip queremos que tenga para que no esté dentro del rango de dhcp y además sea fija y no cambie por caprichos del servidor dhcp.
Tenemos al menos dos formas para hacerlo:

  • 1. Ponerle la ip fija directamente a la impresora mediante su interface web o mediante los menús de la propia impresora ( si tiene display y esa opción). Si queremos acceder por la interface web, debemos de saber que ip coge. Para ello lo primero, lógicamente es conectarla a la red del centro e imprimir un informe de la impresora. Allí figurará tanto ip cogida como mac. Si accedemos via web, sólo tendremos que cambiar la ip a la que queramos en el apartado correspondiente. Normalmente hay que iniciar sesión y entrar dentro de configuración y apartado tcp/ip o ipv4.


  • La otra opción, que es perfectamente compatible con ésta, es crearle dentro de nuestro ldap un objeto con su nombre y asignarle una ip fija a su mac. En este caso, lógicamente también tenemos que haber enganchado el cable de red y saber cual es su mac desde el informe de la impresora. 
Entramos dentro de la base de datos ldap y creamos un objeto printer-host dentro de la rama Netgroup.  
Aquí podemos ver el mio.

Si no tenemos ese objeto es fácil crearlo, entramos en otro, por ejemplo all-host y le damos a copiar objeto cuando nos pida el nuevo nombre en DN destino, cambiamos all-host por printer-host y le damos al botón de copiar. Ya se habrá creado.
Luego sólo tenemos que añadir las impresoras a ldap. Para ello uso un script realizado por los compañeros  que se llama addprinter.sh. Lo ejecutamos en ldap de la forma:

sh addprinter.sh NombreImpresora ip mac

Éste es el contenido:

#!/bin/bash

#Añade un switch al directorio LDAP

if [ $# -ne 3 ]; then
echo "Uso: $0 printername ip mac"
exit
fi


dominio=`hostname -d`
host=$1
ip=$2
ip1=`echo $2 | cut -d"." -f1`
ip2=`echo $2 | cut -d"." -f2`
ip3=`echo $2 | cut -d"." -f3`
ip4=`echo $2 | cut -d"." -f4`
mac=`echo $3 |tr '[:lower:]' '[:upper:]'`
echo dominio: $dominio
echo printer: $host
echo dominio: $ip
echo dominio: $dominio
echo pulsa enter
read
FICHERO=$host.$dominio.ldif
if [ -e $FICHERO ]; then
rm $FICHERO
fi

echo "
dn: dc=$ip4,dc=$ip3,dc=$ip2,dc=$ip1,dc=in-addr,dc=arpa,ou=hosts,dc=instituto,dc=extremadura,dc=es
changetype: add
objectclass: dNSDomain2
objectclass: domainRelatedObject
dc: $ip4
associateddomain: $ip4.$ip3.$ip2.$ip1.in-addr.arpa
PTRRecord: $host.$dominio

dn: dc=$host,dc=$dominio,ou=hosts,dc=instituto,dc=extremadura,dc=es
changetype: add
objectclass: dnsdomain2
objectclass: domainrelatedobject
dc: $host
associateddomain: $host.$dominio
ARecord: $ip

dn: cn=$host,cn=group1,cn=INTERNAL,cn=DHCP Config,dc=instituto,dc=extremadura,dc=es
changetype: add
cn: $host
objectClass: top
objectClass: dhcpHost
dhcpHWAddress: ethernet $mac
dhcpStatements: fixed-address $host

dn: cn=printer-hosts,ou=Netgroup,dc=instituto,dc=extremadura,dc=es
changetype: delete

dn: cn=printer-hosts,ou=Netgroup,dc=instituto,dc=extremadura,dc=es
changetype: add
cn: printer-hosts
objectClass: top
objectClass: nisNetgroup" >> $FICHERO
#echo "dn: cn=printer-hosts,ou=Netgroup,dc=instituto,dc=extremadura,dc=es
#changetype: modify" >> $FICHERO
ldapsearch -xLLL -h ldap -b ou=Netgroup,dc=instituto,dc=extremadura,dc=es "(cn=printer-hosts)" | grep nisNetgr
(1)oupTriple | while read triple
do
echo $triple >> $FICHERO
done

grep "nisNetgroupTriple.*$host" $FICHERO > /dev/null
if [ $? -ne 0 ]; then
echo "nisNetgroupTriple: ($host,-,-)" >> $FICHERO
fi


echo "Añadiendo $host.$dominio a ldap con ip=$ip y mac=$mac"
more $FICHERO
ldapadd -c -x -h ldap -W -D "cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es" -f $FICHERO

(1) Ojo linea cortada

Este script nos crea objetos con el nombre de la impresora en las ramas: DHCPConfig, Hosts/dominiodelcentro, hosts/arpa/subip1/subip2/subip3/ip4 además de añadirnos la impresora al NisNetgroupTriple de la rama Netgroup/printer-host que hemos creado.Hay otro procedimiento más sencillo que es añadir la impresora desde la utilidad controlies y añadirla como un workstation normal. No obstante creo que así es mejor ya que están todas las impresoras agrupadas y localizadas.Después del reinicio de impresora ya tendremos la impresora con la ip que hemos decidido.

Añadir la impresora a los equipos.

Antes de añadir la impresora a los equipos, tenemos que descargar el archivo .ppd (para linux) y en su caso si queremos ponerla en equipos windows, los drivers de dicha impresora desde la página del fabricante.
Para añadir la impresora también tenemos varios métodos.
  • El más intuitivo es desde la interface web de cups. Abrimos una pestaña en el navegador web y ponemos en la barra de dirección localhost:631
Desde la pestaña Administración tenemos el botón de Impresoras/Añadir impresora.
Nos mostrará las impresoras encontradas por el sistema. Pinchamos en la que queremos añadir y botón siguiente.


Nos pedirá que pongamos nombre, descripción y ubicación, y botón siguiente.

Y por último le tenemos que indicar el driver. Podemos elegir de la lista, él nos indica el aconsejado, o en Seleccionar archivo le podemos decir que nos coja el que hemos descargado, que es lo que haremos.

Y ya la última ventana nos permitirá que cambiemos las opciones predeterminadas: color o blanco y negro, doble cara, etc....
  • Un segundo método es añadirla desde un terminal con el comando lpadmin, que tendría más  o menos la siguiente forma:
/usr/sbin/lpadmin -p ConserjeriaB-N -L Conserjeria  -P /etc/cups/ppd/RicohB-N.ppd -v socket://172.17.164.8
 lpadmin -p ConserjeriaB-N -E

donde le indicamos en el siguiente orden: NombreImpresora, Localización(opcional), ubicación del archivo .ppd, ip. La última línea -E es para habilitarla. 
Con -o también podemos indicarle opciones y con la -u opciones sobre usuarios.
Todo esto lo podemos ver en la documentación del comando lpadmin.

Estos dos primeros métodos tienen el inconveniente de que hay que ejecutarlos cada equipo individualmente. Si lo que queremos es añadir la impresora en varios equipos, lo ideal es hacer una tarea con puppet para que se añadan en aquellos que queramos.

Automatización con puppet.

Para ello creamos una tarea donde le indicamos la o las impresoras a añadir.
Yo al principio cree una tarea de la forma:




class comunes-poner-impresoras{



exec { "pone-impresora-Color":
command => "/usr/bin/wget http://repositorioiesburguillos/Drivers/LinEx/RicohColor.ppd;/usr/sbin/lpadmin
 (1)-p ConserjeriaColor -L Conserjeria  -P /etc/cups/ppd/RicohColor.ppd -v socket://172.17.164.7 &&   (1)lpadmin -p ConserjeriaColor -E",
       path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
cwd => "/etc/cups/ppd/",
       unless => "cat /etc/cups/printers.conf|grep \"Printer ConserjeriaColor\"",

}
exec { "pone-impresora-SalaProfes":
command => "/usr/bin/wget http://repositorioiesburguillos/Drivers/LinEx/KyoceraFS4020.ppd  ;  (1)/usr/sbin/lpadmin -p Sala-Profesores -L Conserjeria  -P /etc/cups/ppd/KyoceraFS4020.ppd  -v  (1)socket://172.17.164.6 && lpadmin -p Sala-Profesores -E",
       path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
cwd => "/etc/cups/ppd/",
       unless => "cat /etc/cups/printers.conf|grep \"Printer Sala-Profesores\"",

}
    
}
(1) Ojo linea cortada
Donde vemos que mediante un exec por impresora, descargamos el archivo .ppd  del servidor repositorioiesburguillos donde está colocado y luego mediante lpadmin añadimos la impresora.

Luego he creado un define llamado anadirImpresora.pp (se coloca en /etc/puppet/defines con este contenido:

define anadirImpresora( 
$impresora,
$localizacion,
$puerto,
$archivoPpd,
$opciones='printer-error-policy=abort-job  printer-is-shared=true',
$usuariosPermitido='all',   # usuario o @grupo o usuario,usuario
$usuariosProhibidos='none' # usuario o @grupo o usuario,usuario 
 )
# inicializamos las variables
 {
  exec { "ponerimpresora":
command => "/usr/sbin/lpadmin -p $impresora -L $localizacion  -P $archivoPpd  -v $puerto -o $opciones;   (1)/usr/sbin/lpadmin -p $impresora -u allow:$usuariosPermitidos -u deny:$usuarios Prohibidos;   (1)/usr/sbin/lpadmin -p $impresora -E; /etc/init.d/cups restart",
unless => "/bin/cat /etc/cups/printers.conf|/bin/grep \"\<Printer $impresora\"\> 1>/dev/null",
       }
}

(1) Ojo linea cortada
Lo que hace es definir un recurso llamado anadirImpresora que luego podremos utilizarlo en nuestras tareas.
Vemos que he implementado también opciones que se pueden establecer. Por defecto para que aborte el trabajo si hay un error y para que la impresora no se comprata.
Por otra parte también se puede establecer política de usuacios, por defecto permitidos todos. Podemos cambiar para prohibir a @students, etc...

Así la nueva clase quedaría algo así:


import "/etc/puppet/defines/*.pp"

class comunes-poner-impresoras{
anadirImpresora{ "prueba":
impresora => "prueba",
puerto => "socket://172.17.164.7",
archivoPpd => "/etc/cups/ppd/RicohColor.ppd",
localizacion => "prueba",
      }  
}

Como vemos importa la definición del recurso y le pasa los datos de la impresora añadir. Ya el recurso se encarga de habilitarla.