Translate

jueves, 28 de junio de 2018

Instalación de Octave 4 en CentOS 6

El CentOS 6.9 trae por omisión el Octave 3.4.3 que no trae interface gráfica.

Es conveniente tener instalada una versión más reciente, como la 4.0.3, que trae un menú gráfico. Instalación:

  • Si YA está un Octave anterior al que se va a instalar, se recomienda desinstalarlo con:
 yum erase octave


  •  Para ver si no hay algo más instalado del Octave anterior se puede poner:
rpm -qa | grep -i octave

  • Instalamos el repositorio de Octave - EPEL:
wget https://copr.fedorainfracloud.org/coprs/g/scitech/octave/repo/epel-6/group_scitech-octave-epel-6.repo

En el sitio también se puede instalar el repositorio para CentOS 7:

https://copr.fedorainfracloud.org/coprs/g/scitech/octave/

  • Instalamos el Octave:
yum -y install octave

viernes, 22 de junio de 2018

Configuración de systemd para arranque/paro de scripts


  • Nota: systemd NO está bien hecho, además tiene muchos bugs. Desafortunadamente muchos distribuidores de Linux decidieron meter este sistema de arranque por lo que a veces se hace necesario usarlo al igual Microsoft. Una de las muchas falacias que esgrimen sus creadores es que se usa en los principales sistemas operativos modernos ya que además levanta muy rápido. Android, que son la mayoría de los dispositivos con Linux, no lo emplea y SÍ he visto teléfonos con Android de hace más de 5 años que levantan en menos de 10 segundos. Ver: adopción de systemd.
A lo que te truje chencha: Este es un ejemplo de montaje/desmontaje de un filesystem, con arranque/paro, probado en Debian 4.9.65 , kernel 4.9.0-4-amd64. El script es de un usuario que necesita montar una carpeta remota de un servidor (por sshfs) cuando arranca el sistema.

El script de ejemplo se llama monta.sh, el servicio se llama monta.service
  1. Creamos el script de montaje/desmontaje. Este irá en la carpeta bin del directorio de inicio ($HOME) del usuario . El usuario en este ejemplo (username) sera 'usuario':
  2. mkdir bin; cd bin
vi monta.sh
_____________
#!/bin/bash

uso(){
   echo "Uso: $0 start|stop|status";
   exit 1
}
status () { 
   mount | grep /home/usuario/servidor
}

start () { 
#Este es un montaje por sshfs, pero se puede usar un simple mount
#En este ejemplo se monta la carpeta del servidor /home/usuario en la carpeta local /home/usuario/servidor
#Esta carpeta local deberá haber sido creada

   ret=$( sshfs usuario@servidor.com:/home/usuario /home/usurario/servidor );
   status;
   return $ret
}
stop () { 
  #en este ejemplo concreto estamos desmontando con umount que requiere permisos de root
  #El comando umount /home/usuario/servidor se tendrá que poner el archivo /etc/sudoers
  #para el usuario correspondiente
   sudo umount /home/usuario/servidor;
   return $?
}

case $1 in
   start|stop|status) "$1"
   ;;
   *)   uso
   ;;
esac

_____________

Le ponemos permisos de ejecución:
chmod a+x monta.sh



  1. Ahora como root, creamos el archivo monta.service:

vi /lib/systemd/system/monta.service
________________________
[Unit]
Description=Monta una carpeta de un servidor remoto del usuario
#After=network.target 
After=network-online.target

[Service]
Type=simple
User=usuario
WorkingDirectory=/home/usuario
ExecStart=/home/usuario/bin/monta.sh start
ExecStop=/home/usuario/bin/monta.sh stop
RemainAfterExit=yes


[Install]
WantedBy=multi-user.target

________________________

Le ponemos sus permisos por si no los tiene correctos (no es ejecutable):

chmod 644 /lib/systemd/system/monta.service

Habilitamos el servicio con:

systemctl enable monta.service

Debe salir un mensaje similar a :

Created symlink /etc/systemd/system/multi-user.target.wants/monta.service → /lib/systemd/system/monta.service.


Recargamos el systemd:

systemctl daemon-reload


Probamos el servicio:


systemctl start monta.service
systemctl status monta.service

systemctl stop monta.service
systemctl status monta.service


Problemas:

Desafortunadamente pueden ser muchos por parte del systemd. Pero si el script funciona correctamente y ya se hicieron pruebas pero el sistemd se niega a trabajar, intente:




systemctl disable monta.service; systemctl daemon-reload; systemctl enable monta.service; systemctl start monta.service; systemctl status monta.service


systemctl restart monta.service . (En mi caso, solo así logré que reaccionara )


Otro problema es la secuencia de arranque los procesos que para poder ver que servicio o 'target' empezó o ha sido levantado se le puede dar el comando para analizar la secuencia de arranque:

systemd-analyze plot > output.svg

Y luego verlo con algún visor de imágenes como el eog:

eog output.svg

Un truco que puede funcionar, si no está claro en que momento debe de ejecutarse el proceso, es meter un retardo en el script, en mi caso fue suficiente con un retardo de 10 segs:


start () { 
   sleep 10
   ret=$( sshfs usuario@servidor.com:/home/usuario /home/usurario/servidor );
   status;
   return $ret
}



Pero me di cuenta que existe otro 'target' aparte de network.target que se llama 'network-online.target' y aparentemente con eso ya no hubo problemas.  La terminología de systemd es realmente ambigua y confusa. Quedaría ver si al levantar el usuario de manera automátcia, se monta el filesystem.

Actualización:
Efectivamente, al realizarse un login automático ya no aparece el icono de filesystem montado ya que el ambiente gráfico levanta antes que lo que el servicio monta.service logre montar el filesystem. Eso significa que se tuvo que modificar el target graphical.target para que esperara al serivio monta.service

vi /lib/systemd/system/graphical.target

________________________

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target monta.service
Wants=display-manager.service monta.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service monta.service
AllowIsolate=yes
_________________________


Es probable que sobre algún monta.service, pero solo me funcionó poniéndolo en las tres lineas mostradas ( Requires, Wants, After ). Otra confusión y ambigüedad de definiciones en el systemd, ya que el texto no es autoexplicativo. Además que hay que ver que otros 'services' o 'targets' purieran quedar afectados como es este caso. En resumen, no es un sistema que te haga ganar tiempo en la configuración del sistema operativo,es demasiado complejo en la cantidad de componentes y tiene muchas ambigüedades. El lado bueno: es que ambigüedad va con diérisis y no siempre pones palabras con diéresis en español.

Actualización 2:

Tampoco sirve graphical.taget, no parece ser el target correcto. Aparentemente con systemd-user-sessions.service si funciona:

vi /lib/systemd/system/systemd-user-sessions.service
_____________________________
[Unit]
Description=Permit User Sessions
Documentation=man:systemd-user-sessions.service(8)
After=remote-fs.target nss-user-lookup.target network.target monta.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/lib/systemd/systemd-user-sessions start
ExecStop=/lib/systemd/systemd-user-sessions stop
___________________________


Referencia: systemd.unit

lunes, 11 de junio de 2018

Caché de /etc/hosts mediante NSCD - Name Service Cache Daemon

nscd  - Name Service Cache Daemon, es un programa que permite acelerar el proceso de resolución de nombres de usuarios, grupos, hosts, etc. La idea es que si hay muchos usuarios o hosts que estén dados de alta en el sistema, la búsqueda de estos sea lo más rápido posible la siguiente vez que se acceda  a estos.
En este caso, puede ser útil cuando se tienen muchas entradas en el archivo /etc/hosts.


El archivo /etc/hosts se usa a menudo para identificar máquinas que no necesariamente deben tener un dominio. A diferencia de este, el sistema de DNS sí necesita establecer los dominios y que los hosts queden en algún dominio.

El /etc/hosts es empleado a menudo para identificar nombres servicios locales, alias, etc. Lo interesante es que este archivo en Linux puede tener cualquier tamaño dentro de los límites que establece el sistema de archivos. Por ejemplo, en ext4 el tamaño máximo es de 16 TB.

La resolución mediante /etc/hosts se hace con una búsqueda lineal, pero esta se puede acelerar si se guarda en caché mediante el servicio nscd.

Ejemplo de instalación de nscd y pruebas de resolución con /etc/hosts:


  • Instalación de nscd
 yum -y install nscd

  • Activación de nscd cuando arranque el sistema operativo:
chkconfig nscd on

Por el momento no lo arrancamos para verificar el tiempo de resolución de nombres con 16 millones de hosts y cuánto se tarda sin caché y con caché.

Script creahosts para crear alrededor de 16 millones de hosts:

#!/bin/bash
max=$(( 256*256*256 ))


for (( i=0; $i<$max; i++ )); do
  byte4=$(( $i%256 ))
  byte3=$(( $i/256 )) ; byte3=$(( $byte3%256 ))
  byte2=$(( $i/65536 )); byte2=$(( $byte2%256 ))

  printf "10.$byte2.$byte3.$byte4 a%08d\n" $i ;
done




Guardamos el archivo y le ponemos permisos de ejecución:

chmod a+x creahosts

Ejecutamos el script enviando la salida al archivo hosts.new
Nota: este proceso puede tardar decenas de minutos como se muestra en este ejemplo donde se ejecutó con el comando time. Esto se hizo en una máquina virtual de 1 núcleo Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz, con 1 GB en RAM y más de 3 GB disponibles en disco duro:

time creahosts > hosts.new

real    36m24.303s
user    24m16.402s
sys    5m0.305s


El archivo hosts.new creado tiene más de 16 millones de lineas y ocupa más de 360 MB :

[root@localhost etc]# wc  hosts.new
 16777216  33554432 386693520 hosts.new
[root@localhost etc]# ls -lh  hosts.new
-rw-r--r--. 1 root root 369M Jun  7 18:39 hosts.new


Se lo agregamos al archivo /etc/hosts:

cat hosts.new >>  /etc/hosts

Y verificamos algunas lineas del principio y del fin:

[root@localhost etc]# head /etc/hosts
127.0.0.1        localhost.localdomain localhost
::1        localhost6.localdomain6 localhost6
10.0.0.0 a00000000
10.0.0.1 a00000001
10.0.0.2 a00000002
10.0.0.3 a00000003
10.0.0.4 a00000004
10.0.0.5 a00000005
10.0.0.6 a00000006
10.0.0.7 a00000007
[root@localhost etc]# tail /etc/hosts
10.255.255.246 a16777206
10.255.255.247 a16777207
10.255.255.248 a16777208
10.255.255.249 a16777209
10.255.255.250 a16777210
10.255.255.251 a16777211
10.255.255.252 a16777212
10.255.255.253 a16777213
10.255.255.254 a16777214
10.255.255.255 a16777215



  • Medimos el tiempo de respuesta de resolución sin el nscd activo:

[root@localhost etc]# service nscd stop
[root@localhost etc]# service nscd status
nscd is stopped


[root@localhost etc]# time gethostip -d a00000004; time gethostip -d a16777210
10.0.0.4

real    0m3.458s
user    0m3.052s
sys    0m0.342s
10.255.255.250

real    0m3.488s
user    0m3.153s
sys    0m0.307s

Incluso al repetir los comandos salen tiempos similares.
Probamos ahora con el nscd:

[root@localhost etc]# service nscd start
Starting nscd:                                             [  OK  ]
[root@localhost etc]# time gethostip -d a00000004; time gethostip -d a16777210
10.0.0.4

real    0m3.336s
user    0m0.000s
sys    0m0.003s
10.255.255.250

real    0m3.173s
user    0m0.000s
sys    0m0.001s
[root@localhost etc]# time gethostip -d a00000004; time gethostip -d a16777210
10.0.0.4

real    0m0.006s
user    0m0.000s
sys    0m0.001s
10.255.255.250

real    0m0.005s
user    0m0.000s
sys    0m0.001s

Al repetir el tiempo se reduce notoriamente. Lo mismo ocurre con hostnames inexistentes:

[root@localhost etc]# time gethostip -d noexiste1; time gethostip -d noexiste2
noexiste1: Unknown host

real    0m3.427s
user    0m0.002s
sys    0m0.001s
noexiste2: Unknown host

real    0m3.368s
user    0m0.000s
sys    0m0.001s
[root@localhost etc]# time gethostip -d noexiste1; time gethostip -d noexiste2
noexiste1: Unknown host

real    0m0.003s
user    0m0.000s
sys    0m0.001s
noexiste2: Unknown host

real    0m0.002s
user    0m0.001s
sys    0m0.001s
[root@localhost etc]#


El tiempo que queda en cache está definido en /etc/nscd.conf. Así que lo modificamos si deseamos que sea permanente ponemos:

        positive-time-to-live   hosts           0        #Permanente
        negative-time-to-live   hosts           86400    #1 day


Y reiniciamos para que tome los cambios:

[root@localhost etc]# service nscd restart
Stopping nscd:                                             [  OK  ]
Starting nscd:                                             [  OK  ]



Probamos:

[root@localhost etc]# time gethostip -d a00000004; time gethostip -d a16777210
10.0.0.4

real    0m0.008s
user    0m0.001s
sys    0m0.001s
10.255.255.250

real    0m0.012s
user    0m0.000s
sys    0m0.001s
 

[root@localhost etc]# time gethostip -d a12345678; time gethostip -d a12345678
10.188.97.78

real    0m3.369s
user    0m0.000s
sys    0m0.002s
10.188.97.78

real    0m0.002s
user    0m0.000s
sys    0m0.002s
 







miércoles, 6 de junio de 2018

Actualización automática de registros de DNS con nsupdate en CentOS 6 / Automatic DNS record administration with nsupdate in CentOS 6


  • Instalar bind (que contiene el daemon named) con:
yum -y install bind-chroot
  • Una vez instalado bind agregamos al dominio el permiso de actualización en el archivo /etc/named.conf. Ejemplo:

zone "midominio.org" IN {
        type master;
        file "midominio.org.zone";
        allow-update{
                127.0.0.1;
        };
};


  • Ahora en el directorio /var/named ( el cual está definido en el parámetro directory de la sección 'options'. ) Verificamos que esté creado el file de la zona. Ejemplo de contenido del archivo: midominio.org.zone:
[root@localhost named]# pwd
/var/named
[root@localhost named]# cat midominio.org.zone
$ORIGIN .
$TTL 86400    ; 1 day
midominio.org        IN SOA    midominio.org. micorreo.midomio.org. (
                2018060602 ; serial corresponde a Año-mes-día-versión
                28800      ; refresh (8 hours)
                7200       ; retry (2 hours)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
                NS    ns.midominio.org.
                A    10.0.2.15
$ORIGIN midominio.org.
ns              A    10.0.2.15
tst1            A    10.0.3.1
tst2            A    10.0.3.2


  • Verificamos que el usuario propietario de /var/named sea named y que tenga permisos de actualización:
[root@localhost named]# chown named:named /var/named
[root@localhost named]# ls -ald /var/named
drwxr-x---. 6 named named 4096 Jun  6 16:06 /var/named



  • Activamos el booleano de SELinux para escritura de named:
setsebool -P named_write_master_zones On

  • Hacemos que se levante el named cuando arranque el sistema. (Esto se hace una sola vez):
[root@localhost named]# chkconfig named on
[root@localhost named]# chkconfig named --list
named              0:off    1:off    2:on    3:on    4:on    5:on    6:off


  • Reiniciamos el servidor de named
[root@localhost named]# service named restart
Stopping named:                                            [  OK  ]
Generating /etc/rndc.key:                                  [  OK  ]
Starting named:                                            [  OK  ]


La llave /etc/rndc.key solo la genera la primera vez que arranca el servidor named.


  • Probamos la actualización de registro de DNS mediante nsupdate (la opción -v es para que se conecte por IP y -d es debug):
[root@localhost named]# nsupdate -v -d
> server localhost
> zone midominio.org
> update add tst3.midominio.org. 86400 A 10.0.3.3
> show
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst3.midominio.org.    86400    IN    A    10.0.3.3

> send
Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  35487
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst3.midominio.org.    86400    IN    A    10.0.3.3


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  35487
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

> quit


  • Modificamos el archivo /etc/resolv.conf para que se emplee nuestro servidor de DNS. Ejemplo:
[root@localhost named]# cat /etc/resolv.conf
domain midominio.org
search midominio.org google.com
nameserver 127.0.0.1
nameserver 8.8.8.8

  • Verificamos que sí existe el nuevo host:
[root@localhost named]#  gethostip -d tst3
10.0.3.3


  • El archivo de zona (ej: midominio.org.zone ), no se actualiza hasta que no se reinicia el servidor. Sin embargo la información queda temporalmente grabada en el archivo con extensión jnl (ej:  midominio.org.zone.jnl). Ejemplo:
# ll midominio.zone*
-rw-r--r--. 1 root  root   551 Jun  6 17:16 midominio.org.zone
-rw-r--r--. 1 named named  734 Jun  6 17:32 midominio.org.zone.jnl

[root@localhost named]# cat midominio.org.zone
$ORIGIN .
$TTL 86400    ; 1 day
midominio.org        IN SOA    midominio.org. micorreo.midomio.org. (
                2018060602 ; serial corresponde a Año-mes-día-versión
                28800      ; refresh (8 hours)
                7200       ; retry (2 hours)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
                NS    ns.midominio.org.
                A    10.0.2.15
$ORIGIN midominio.org.
ns              A    10.0.2.15
tst1            A    10.0.3.1
tst2            A    10.0.3.2
 

[root@localhost named]# service named restart
Stopping named: .                                          [  OK  ]
Starting named:                                            [  OK  ]


[root@localhost named]# cat midominio.org.zone
$ORIGIN .
$TTL 86400    ; 1 day
midominio.org        IN SOA    midominio.org. micorreo.midomio.org. (
                2018060603 ; serial
                28800      ; refresh (8 hours)
                7200       ; retry (2 hours)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
                NS    ns.midominio.org.
                A    10.0.2.15
$ORIGIN midominio.org.
ns              A    10.0.2.15
tst1            A    10.0.3.1
tst2            A    10.0.3.2
tst3            A    10.0.3.3


# ls -l midominio.org.zone*
-rw-r--r--. 1 named named  387 Jun  6 17:33 midominio.org.zone
-rw-r--r--. 1 named named  734 Jun  6 17:32 midominio.org.zone.jnl



Como conectarse por dnssec

  • Generamos el par de llaves con el comando dnsssec-genkey. Nota: En mi máquina virtual se tardó más de 2 minutos en ejecutar el comando:
[root@localhost named]# dnssec-keygen -a HMAC-SHA512 -b 512 -n USER micorreo.midominio.org.
Kmicorreo.midominio.org.+165+45033

[root@localhost named]# ll *micorreo.midominio.org*
-rw-r--r--. 1 root root 129 Jun  6 19:02 Kmicorreo.midominio.org.+165+45033.key
-rw-------. 1 root root 232 Jun  6 19:02 Kmicorreo.midominio.org.+165+45033.private


La extensión "key" es 'la llave pública' y la extensión "private" se supone es la privada.

  • Creamos el archivo que contendrá la llave 'pública'. Ej.:  
 [root@localhost named]# cat dnskeys.conf
key micorreo.midominio.org. {
    algorithm HMAC-SHA512;
    secret "VVYc19ygyNU3kJ8tkyaL2Q6h9jw60kMbP14XSrbyTWsgDa3OfXnRkWlJ NJHKPuZ5vCR79B5/cYO1OYzB6BZjaA==";
}; 
  • Modificamos el archivo /etc/named.conf para que ahora la conexión se haga por llave e incluimos el archivo con la llave pública. Ej.:
include "dnskeys.conf";
zone "midominio.org" IN {
        type master;
        file "midominio.org.zone";
        allow-update{
                key micorreo.midominio.org.;
                127.0.0.1;
        };
};



  • Reiniciamos servidor para que tome los cambios:

[root@localhost named]# service named restart
Stopping named:                                            [  OK  ]
Starting named:                                            [  OK  ]


  • Probamos hacer la conexión ahora con la llave "pública". Nota: Deben estar presentes en el mismo directorio el archivo .key y elarchivo .private. Al invocar el nsupdate no es necesario ponerle la extensión .key o private , pero también funciona así:

[root@localhost named]# nsupdate -v -d -k Kmicorreo.midominio.org.+165+45033.key
Creating key...
> server localhost
> zone midominio.org
>  update add tst4.midominio.org. 86400 A 10.0.3.4
> show
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst4.midominio.org.    86400    IN    A    10.0.3.4

> send
Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  43670
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst4.midominio.org.    86400    IN    A    10.0.3.4

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528331218 300 64 Gy+LtKqROMGWjRc/DBHoviCJn54o5rwyWtk+f+tURxOkJU1q6BxKKVUY Vkp3iBNduUatbNIKyawKMnA1vxXnwg== 43670 NOERROR 0


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  43670
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528331219 300 64 bqXuQBmqM/UBCTyfQA2x2H0VN+o3cWbdZefpQtd0dBRYTCNbY3FGQcfi 15HZk+V0QqpRwPpbBnhkPUe24/Z4Mw== 43670 NOERROR 0

> quit

  • Verificamos que sí se dio de alta el nuevo host:
[root@localhost named]# gethostip -d tst4
10.0.3.4


  • Ejemplo por medio de ligas:
ln -s /var/named/Kmicorreo.midominio.org.+165+45033.private dnskey.private
ln -s /var/named/Kmicorreo.midominio.org.+165+45033.key dnskey.key

ls -l
total 0
lrwxrwxrwx. 1 root root 49 Jun  6 20:42 dnskey.key -> /var/named/Kmicorreo.midominio.org.+165+45033.key
lrwxrwxrwx. 1 root root 53 Jun  6 20:42 dnskey.private -> /var/named/Kmicorreo.midominio.org.+165+45033.private
 

# nsupdate -v -d -k dnskey
Creating key...
> server 127.0.0.1
> zone midominio.org
> update add tst5.midominio.org. 86400 A 10.0.3.5
> show
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst5.midominio.org.    86400    IN    A    10.0.3.5

> send
Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  58893
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst5.midominio.org.    86400    IN    A    10.0.3.5

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528335893 300 64 yHpONPHjgYNfoBS7Xjug01AXEMx3moPJSQu8msWh+lLduwL5yjZ97lET Ee+SXTEsmuhf4U7QFlzq+7Z5QSrX4g== 58893 NOERROR 0


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  58893
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528335893 300 64 61pYdkJNq7E5Yro4DElMUD+b+W8cjcV65kccEiF4ZQpXAAxC7n5tMCKm Tzkz7tuuSVyWJzpOMGDnhNm2mGQ3rg== 58893 NOERROR 0

> quit
[root@localhost bin]# gethostip -d tst5
10.0.3.5
 
 



Automatización 

Ejemplo de  script para automatizar el proceso de alta (suponiendo que se encuentra en el mismo directorio de dnskey.private y dnskey.key):

# cat addhost
#!/bin/bash
SERVER="127.0.0.1"
ZONE="midominio.org."
HOST="$1.$ZONE"
IP=$2
TTL="86400"
RECORD=" $HOST $TTL A $IP"

echo "
server $SERVER
zone $ZONE
update add $RECORD
show
send" | nsupdate -v -d -k dnskey
 

[root@localhost bin]# addhost tst6 10.0.3.6
Creating key...
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags:; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst6.midominio.org.    86400    IN    A    10.0.3.6

Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:    860
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst6.midominio.org.    86400    IN    A    10.0.3.6

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528336819 300 64 5rZzjNol8Zx4fZMwo9e23JsXuAEM2kaisoVr7BnLARIS9ZQsAmqKSkbv D0+1t9bC3oyVrD8zWjCBLWo9GEy5OQ== 860 NOERROR 0


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:    860
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; TSIG PSEUDOSECTION:
micorreo.midominio.org.    0    ANY    TSIG    hmac-sha512. 1528336820 300 64 8sq6u0DSsbFSO3/K2Xg/AlbMBmjWFkSsIeTzMo1wGpQmj39+s0b8Oohj lczoEIjYzy4vCQGRtZPB/RZmGh5otg== 860 NOERROR 0

[root@localhost bin]# gethostip -d tst6
10.0.3.6
 

Posibles errores y como solucionarlos:

Si al realizar el send aparece el error:
;; ->>HEADER<<- opcode: UPDATE, status: SERVFAIL, id:

pero todo lo demás parece estar bien. Ejemplo:

> send
Sending update to 127.0.0.1#53
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  47128
;; flags:; ZONE: 1, PREREQ: 0, UPDATE: 1, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA

;; UPDATE SECTION:
tst3.midominio.org.    86400    IN    A    10.0.3.3


Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: SERVFAIL, id:  47128
;; flags: qr ra; ZONE: 1, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; ZONE SECTION:
;midominio.org.            IN    SOA



Puede ser por lo siguiente:
  • Que no esté puesto el booleano de SELinux . Esto se arregla poniendo:
setsebool -P named_write_master_zones On

Verificación de la variable: 

[root@localhost named]# getsebool named_write_master_zones
named_write_master_zones --> on

  • Que no haya permisos de escritura en el directorio /var/named para el usuario named. Esto se arregla poniendo:
[root@localhost named]# chown named:named /var/named
[root@localhost named]# ls -ald /var/named
drwxr-x---. 6 named named 4096 Jun  6 17:16 /var/named
 

  • Si al verificar el estado del servidor da: named dead but subsys locked . Ejemplo:

# service named status
version: 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.5
CPUs found: 12
worker threads: 12
number of zones: 20
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running
named dead but subsys locked


 

Puede ser:
El contexto de selinux no permite guardar datos, por ejemplo nos se crea el file named.pid en la carpeta /var/named/chroot/var/run/named. Ejemplo de contexto incorrecto:

# ls -aldZ /var/named/chroot/ named/
drwxr-xr-x. root root  unconfined_u:object_r:named_conf_t:s0 /var/named/
drwxr-x---. root named system_u:object_r:named_conf_t:s0 /var/named/chroot/


Esto se puede arreglar arreglando el contexto con restorecon. Ej.:

restorecon -r -v /var/named/chroot

o mejor aún:

restorecon -r -v /var/named

[root@lab c]#  ls -aldZ /var/named/chroot/ /var/named/
drwxr-x---. named named system_u:object_r:named_zone_t:s0 /var/named/
drwxr-x---. named named system_u:object_r:named_conf_t:s0 /var/named/chroot/



  • El error:
 ; TSIG error with server: tsig indicates error

Puede ocurrir porque:
  • No se está dando la llave correcta.
  • No se creó el archivo que contiene la llave pública (por ejemplo dnskeys.conf), o no se está incluyendo en el archivo de configuración de /etc/named.conf
  • No se cuenta con los permisos necesarios para leer/guardar información en la carpeta /var/named. En este caso, como ya se mencionó más arriba, se recomienda verificar el boolean correspondiente de SELinux, verificar/restaurar los contextos, verificar propietarios y permisos.

jueves, 5 de abril de 2018

Black screen in VNC SSH tunneled session after closing SSH connection.
SSH closes X11 clients from VNC session (Fixed / Solved ) /
Pantalla negra en sesión de VNC conectada mediante túnel de SSH.
Al cerrar el SSH se cierran clientes de X11 de la sesión del vncserver ( Solucionado / resuelto )


After disconnecting from a SSH connection, the x-clients from the vncserver session were killed from the memory.
After checking the logs of the vncserver ( .vnc/<hostname>:VNCDISPLAY.log ) , I found a message that stated that the file /tmp/.X11-unix should be owned by root. Indeed, for an uknown reason it was owned by other user (in my case was owned by cron).

So I just fixed it with:

chown root:root  /tmp/.X11-unix


And no more 'black screens' in VNC session. Hope this helps somone else.


Traducción:

Después de desconectarse de una conexión SSH, los x-clients de la sesión vncserver se eliminaron de la memoria.

Después de verificar los registros de vncserver (.vnc/<hostname>: VNCDISPLAY.log), encontré un mensaje que indicaba que el archivo /tmp/.X11-unix debería ser propiedad de root. 

De hecho, por alguna razón desconocida era propiedad de otro usuario (en mi caso, de cron).

Así que lo solucioné simplemente con:

chown root: root /tmp/.X11-unix


Y no más 'pantallas negras' en la sesión de VNC. Espero que esto ayude a alguien más.

lunes, 2 de abril de 2018

Desactivación/Activación de Touchpad Mouse por script

Algunas computadoras, como cierto tipo de laptops, no muestran una combinación de teclas para activar/desactivar el Touchpad o Mouse integrado en el teclado.
Para arreglar esto se puede crear un script llamado "toggletouch" en ~/bin que contenga lo siguiente:

toggletouch
#!/bin/bash
#Toggle touchpad activa/desactiva el Touchpad o Mouse integrado al teclado
#Identificamos touchpad:
id=$( xinput | grep -i touch | cut -f2 -d'=' | sed -r 's|([^0-9]*)([0-9][0-9]*)(.*)|\2|g' )
#echo "Touchpad con id=|$id|"

enabled=$( xinput --list-props $id | grep "Device Enabled" | cut -f2 -d':' | sed -r 's|([^0-9]*)([0-9][0-9]*)(.*)|\2|g' )
#echo "enabled=$enabled"
#Poner el usuario/home correctos :
user=$( whoami ); home=$HOME

dfile="$HOME/Desktop/ToggleTouchPad.desktop"
#dpanel="$HOME/.gnome2/panel2.d/default/launchers/toggletouch.desktop"

if [ "$enabled" == "0" ]; then
  echo "Habilitando Touchpad"
  xinput --enable $id
  sed -i 's|touchPadOff.svg|touchPadOn.svg|g' $dfile ; touch $dfile
  ln -fs ~/bin/touchPadOn.svg ~/bin/touchPad.svg
else
  echo "Deshabilitando Touchpad"
  xinput --disable $id
  sed -i 's|touchPadOn.svg|touchPadOff.svg|g' $dfile ; touch $dfile
  ln -fs ~/bin/touchPadOff.svg ~/bin/touchPad.svg
fi
  touch $dfile



Los archivos  touchPadOff.svg y touchPadOn.svg son para el launcher que crearemos en ~/Desktop. El contenido de estos archivos es:

touchPadOff.svg
<svg height='200' width='200'  fill="#000000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve"><path fill="#000000" d="M76.9,58.3l14.8,14.8V25c0-4.6-3.7-8.3-8.3-8.3H35.3l8.3,8.3h39.7v33.3H76.9z"></path><path fill="#000000" d="M9.6,13.4l3.9,3.9c-3,1.2-5.2,4.2-5.2,7.7v50c0,4.6,3.7,8.3,8.3,8.3h62.9l7.1,7.1l5.3-5.3L14.9,8.1L9.6,13.4  z M71.2,75h-17v-8.3h8.7L71.2,75z M16.7,25h4.5l33.3,33.3H16.7V25z M16.7,66.7h29.2V75H16.7V66.7z"></path></svg>
 



 touchPadOn.svg
<svg height='200' width='200'  fill="#000000" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve"><path fill="#000000" d="M83.3,16.7H16.7c-4.6,0-8.3,3.7-8.3,8.3v50c0,4.6,3.7,8.3,8.3,8.3h66.7c4.6,0,8.3-3.7,8.3-8.3V25  C91.7,20.4,87.9,16.7,83.3,16.7z M45.8,75H16.7v-8.3h29.2V75z M83.3,75H54.2v-8.3h29.2V75z M83.3,58.3H16.7V25h66.7V58.3z"></path></svg>



Y por último el launcher que se llamará ToggleTouchPad.desktop, lo pondremos en ~/Desktop y contendrá lo siguiente:

ToggleTouchPad.desktop
#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Name=Toggle Touchpad
Exec=/home/mmendez/bin/toggletouch
Comment=Touch pad toggle
Icon=/home/mmendez/bin/touchPadOff.svg


Al hacer click en el launcher, el script toggletouch automáticamente cambiará el icono del launcher.

Probado en Linux CentOS 6.9