jueves, 10 de mayo de 2018

Postgres: Eliminar procesos con más de un día

Para eliminar consultas y procesos que llevan más de un día ejecutándose, y que están en estado idle, por ejemplo tras una desxconexión abrupta de red

Suave:
select  pg_cancel_backend(pid) from pg_stat_activity where state = 'idle' and backend_start < NOW() - INTERVAL '1 day' or  query_start < NOW() - INTERVAL '1 day' ;


 Dura:
select  pg_terminate_backend(pid) from pg_stat_activity where state = 'idle' and backend_start < NOW() - INTERVAL '1 day' or  query_start < NOW() - INTERVAL '1 day' ;

viernes, 4 de mayo de 2018

Instalación de PowerCli 10 en windows


La instalación  en windows 10 con powershell 5.
1- Buscamos en el botón de inicio PowerShell y con el botón derecho le damos a ejecutar como administrador
2- Instalamos el powercli usando lo siguiente
Install-Module VMware.PowerCLI
3- Para evitar problemas de conexión cuando piden el certificado y algunas cosas :
set-ExecutionPolicy RemoteSigned
Set-PowerCLIConfiguration -InvalidCertificateAction ignore -confirm:$true
Ejemplo de conexión a un VC y borrado de una máquina

Connect-VIServer -server NOMBREDELVC -protocol http -user USER  -Password "XXXXXX"
get-VM  NOMBREMAQUINA |  Remove-VM

miércoles, 4 de abril de 2018

Apache: Redirección a HTTPS y usar Autenticación Digest

Supongamos que tenemos un directorio privado al que queremos forzar que sea siempre por https y además en vez de usar autenticación basic (que va en claro) y queremos usar digest (que usa MD5). Hacemos lo siguientes

A) Para la redirección:

A.1) Editamos el archivo .htaccess en el directorio. En este caso /home/dieguz2/public_html/privado/.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://localhost/~dieguz2/privado/ [R=301,L]


B) Para la autenticación con Digest:

B.1) Editamos el archivo .htaccess en el directorio. En este caso /home/dieguz2/public_html/privado/.htaccess y añadimos lo siguiente

AuthType Digest
AuthName "cosaprivada"
AuthDigestDomain "/privado/" "https://localhost/~dieguz2/privado/"

AuthDigestProvider file
AuthUserFile /home/dieguz2/public_html/privado/.htpasswd
Require valid-user

B.2) generamos el archivo con usuarios
sintaxis para la generación de los usuarios y contraseñas
htdigest [ -c ] passwdfile realm username

En nuestro caso
El el "realm" debe ser igual al AuthName (en este caso "cosaprivada")

htdigest -c /home/dieguz2/public_html/privado/.htpasswd cosaprivada nombreusuario

miércoles, 10 de enero de 2018

iRMC S4: solucionar error con jdk9

En la versión 9 de java, se ha incluido la firma MD5 como insegura. Esto hace que si intentamos usar el iRMC S4  y la Video Redirection (JWS) salga el siguiente error:
Una aplicación sin firma solicita acceso sin restricciones al sistema, el siguiente está firmado con un algoritmo de firma débil MD5withRSA y se trata como no firmado.
 Para solucionarlo debemos editar las políticas de seguridad de java:
sudo vi ${JAVA_HOME}/conf/security/java.security
En mi caso la variable JAVAHOME  tiene el valor/usr/java/latest . Editando el archivo, tenemos que cambiar la línea:
jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, DSA keySize < 1024
por
jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024, DSA keySize < 1024
Esto ha funcionado en openSUSE Leap 42.3 con el jdk9

miércoles, 13 de diciembre de 2017

Python: función para separar nombre de apellidos

Unafunción que recibe como parámetro una cadena e intenta separar el nombre de los apellidos. Tiene en cuenta algunas separadores especiales (de, del ....)
Funciona siempre bien, si las dos últimas palabras son apellidos (con o sin palabras especiales)
Nombre1 Apellido1
Apellido2 Nombre1
Nombre2 Apellido1 Apellido2
Nombre1 [del,de ...] Nombre2 [del,de ...] Apellido1 [del,de ...] Apellido2 Nombre1 Apellido1

No funciona bien con :
Nombre1 Nombre2 Apellido1

Siempre da por supuesto que si hay al menos 3 palabras, las dos últimas forman el apellido:

def obtenerNombrePassswd(cadena):
 lista = cadena.split(" ")
 especiales = ['da', 'de', 'del', 'la', 'las', 'los', 'mac',
  'mc', 'van', 'von', 'y', 'i', 'san', 'santa']
 salida = list()
 for m in reversed(lista):
  if ( (len(salida) > 0 
   and (m.upper() in map(str.upper, especiales))) 
   or ((len(salida) > 2) ) ):
    salida[-1] = str(m) + ' ' +  salida[-1] 
  else:
   salida.append(m)
 nombre = str(salida[-1])
 if len(salida) >1:
  apellido1 = salida[-2]
 if len(salida) == 3:
  apellido2 = salida[0]
 apellidos = " ".join(salida[:-1])
 return [ nombre, apellidos]

lunes, 11 de diciembre de 2017

Memcached: escuchar únicamente en localhost en Centos

 En Centos editamos el archivo /etc/sysconfig/memcached y modificamos la línea OPTIONS
OPTIONS="-l localhost"
Se debe poner esto en vez de "-l 127.0.0.1" para que escuche también por el ::1 (ipv6)

lunes, 9 de octubre de 2017

Instalación de DNIe (DNI electrónico) en Linux Opensuse Leap 42.3


Tras un par de versiones de Suse en las que fui incapaz de hacer funcionar el DNI electrónico en mi lector ( sí funcionaba en windows 7, pero aún he conseguido hacerlo funcionar el Windows 10 ), de forma milagrosa parece que funciona. Los Pasos más o menos son estos, no es una guía perfecta, dado que he tenido que probar bastante cosas. Mi lector de DNI es el lector PC Twin Reader (Gemalto IDBridge CT30), lo repartía la UGR hace unos años:

Instalación del paquete

Descargamos el paquete libpkcs11-dnie-1.4.0-1.x86_64.rpm y lo instalamos con yast

Instalación de certificados

Instalamos todos los certificados del área de descargas. Yo he casi instalado todos los certificados (Al menos los raíz y los subordinados)

Autoridad de Certificación Raíz del DNIe:
Autoridad de Certificación Subordinadas:
Autoridad de Validación AV DNIE FNMT

Instalación de paquetes adicionales

zypper in -y libpcsclite1 pcsc-lite pcsc-ccid pcsc-acsccid pinentry-gtk2 libpcsclite1-32bit pcsc-gempc perl-pcsc perl-pcsc

El paquete pcsc-gempc son drivers de gemalto.
El paquete libpkcs11-dnie es instalado por el paquete libpkcs11-dnie-1.4.0-1.x86_64.rpm.

El paquete pcsc-tools es necesario instalarlo desde las fuente o desde un repositorio. Yo he probado el de repositorio security:chipcard y ha funcionado. NO he mantenido el repositorio después de la instalación

Configuración firefox

Las instrucciones de configuración están en /usr/share/libpkcs11-dnie/instal_dnie/launch.html

En firefox pulsamos un par de veces la tecla "alt" para que aparezca el menú y vamos a Editar/Preferencias/Avanzado/Certificados/Dispositivos de seguridad le damos a cargar, ponemos el nombre que queramos y la ruta /usr/lib64/libpkcs11-dnie.so . De primeras me daba un error diciendo que no podía añadir el módulo, con los paquetes adicionales y el pcsc_scan ejecutandose en una ventana del terminal ha entrado correctamente.

Instalamos el certificado, vamos Editar/Preferencias/Avanzado/Certificados/Ver certificados , pestaña de autoridades, botón importar e importamos /usr/share/libpkcs11-dnie/ac_raiz_dnie.crt , marcamos las tres casillas de confianza.

Podemos probar a cerrar el navegador. Vamos al mismo sitio /Editar/Preferencias/Avanzado/Certificados/Dispositivos de seguridad, si el DNi está metido debe salir algo como "DNI electrónico", si le damos a iniciar sesión nos preguntara el password del DNI

Reinicio del sistema

 Como si fuese un windows es necesario reiniciar el sistema para que todo vaya bien

Cómo probarlo desde la consola

Vamos a la consola y como root ejecutamos pcsc_scan (tiene que estar instalado el paquete pcsc)

#pcsc_scan  
PC/SC device scanner
V 1.5.2 (c) 2001-2017, Ludovic Rousseau <ludovic.rousseau@free.fr>
Using reader plug'n play mechanism
Scanning present readers...
0: Gemalto PC Twin Reader 00 00
 
Mon Oct  9 13:40:40 2017
 Reader 0: Gemalto PC Twin Reader 00 00
  Card state: Card removed, 
 
Seguimos ejecutandolo, al meter el DNI debe de cambiar a algo como esto:

Mon Oct  9 12:43:19 XX17
 Reader 0: Gemalto PC Twin Reader XX XX
  Card state: Card inserted, 
  ATR: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX

ATR: 3B XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
+ TS = 3B --> Direct Convention
+ T0 = XX, Y(1): XX11, K: 15 (historical bytes)
  TA(1) = XX --> Fi=7XX, Di=12, 62 cycles/ETU
    64516 bits/s at 4 MHz, fMax for Fi = 8 MHz => 129XX2 bits/s
  TB(1) = XX --> VPP is not electrically connected
  TC(1) = XX --> Extra guard time: 0
+ Historical bytes: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
  Category indicator byte: XX (compact TLV data object)
    Tag: 6, len: A (pre-issuing data)
      Data: XX XX XX XX XX XX XX XX XX XX
    Mandatory status indicator (3 last bytes)
      LCS (life card cycle): XX (Initialisation state)
      SW: 9000 (Normal processing.)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX
3B XX XX XX XX XX XX XX XX XX XX [12]0 XX XX XX XX XX XX XX XX
 DNI electronico (Spanish electronic ID card)
 http://www.dnielectronico.es
 -
 
Donde la XX son números en hexadecimal.

Probando el DNI en la web

La forma más rápida es https://valide.redsara.es/valide/ , le damos "Validar Certificado", nos dará un aviso de Java, le damos a permitir, pulsamos selecciona certificado, nos pedirá la contraseña del DNI , luego seleccionamos "autenticación". Rellenamos el captcha de seguridad y le damos a validar

Otras referencias:

sábado, 7 de octubre de 2017

GIT: ejemplo de rebase

#Creamos directorio de prueba
 mkdir pruebarebase
 pruebarebase

#inicializar repositorio
 git init .

#añadir archivo 1 + commit
 echo "1" > 1.txt
 git add 1.txt
 git commit -m "1.txt"

#añadir archivo 2 + commit
 echo "2" > 2.txt
 git add 2.txt
 git commit -m "2.txt"

# rama nueva "feature"
 git checkout -b "feature"

# creación de archivo en rama "feature" + commit
 echo "feature" > feature.txt
 git add feature.txt
 git commit -m "feature.txt"

# modificación de archivo en rama "feature" + commit
 echo "feature_modificacion1" >> feature.txt
 git add feature.txt
 git commit -m "modificacion rama"

# cambiamos a la rama principal
 git checkout master


#añadir archivo 3 + commit
 echo "3" > 3.txt
 git add 3.txt
 git commit -m "3.txt"


Árbol hasta este punto:

         - f1 <- f2
       /
 1 <- 2 <--- 3
Queremos fusionar los dos commits de la rama "feature" en una sola, de modo que se mantenga la

Volvemos a la rama feature
git checkout feature

Hacemos un rebase interactivo, partimos del head -1
git rebase -i HEAD~1


en vez de pick ponemos squash en el archivo El árbol resultantes será este:
         - f1
       /
 1 <- 2 <--- 3
En f1 estaŕan los cambios de f1 y de f2

GIT: comando básicos

Configuración rápida

git config --global user.name "pollopolea"
git config --global user.email CORREO_ELECTRONICO

Básico

origin => rama remota, en el servidor del que se ha clonado

git pull => TRAER cambios del servidor

git fetch => hace un pull (trae los cambios) y un merge con lo que tenemos en local

git push => ENVIAR cambios locales al servidor

git mergetool => muestra la herramienta de resolución de conflictos ( normalmente el porgrama meld)

git branch --list => lista las ramas
git branch --list -r => lista las ramas y las remotas
git branch RAMA => crea la RAMA
git branch -b RAMA => crea la RAM y hace un checkout
git branch --contains ID_COMMIT => muestra la rama que contiene el ID_COMMIT

git checkout RAMA => cambia a la rama que necesitamos

git log --pretty=oneline --abbrev-commit  => muestra el log del git

Actualizar repositorio FORK con los últimos cambios del original

Clonamos nuestro FORK, añadirmos el repositorio original del que hicimos el fork (uptream), traemos los cambios del repositorio upstream y hacemos un merge en local,  hacemos un push

git clone git@github.com:pollopolea/core.git
cd core
git remote add upstream https://github.com/owncloud/core.git
git fetch upstream
git pull upstream master
git push

Hacer un rebase

git rebase -i HEAD~1 => hace un rebase con el HEAD - 1 ( podemos poner también directamente el ID del commit) 
git rebase --abort  => aborta el rebase
git rebase --continue => continua un rebase ( normalmente tras solucionar conflictos)

Durante el rebase, con squash eliminamos un commit, que se une al anterior

Eliminar el límite de renombrado de archivos

git config merge.renameLimit 999999
git config --unset merge.renameLimit

gitForzar el cambio de HEAD en una RAMA

git checkout RAMA
git reset --hard IDENTIFICADOR_COMMIT

miércoles, 12 de julio de 2017

GIT: Mantener un fork actualizado en github

Supongmaos que hemos hecho un fork de un repositorio, y queremos que los cambios del repositorio original se guarden en el nuestro. Para sincronizarlos tenemos que hacer lo siguiente.

1- Clonamos en local nuestro repositorio con el fork

git clone git@github.com:USUARIO/REPOSITORIO-FORK.git

2. Añadimos el remoto desde el el repositorio original en nuestro repositorio fork:

cd DirectorioRepositorioFork
git remote add upstream git://github.com/DESARROLADOR-ORIGINAL/REPOSITORIO.git
git fetch upstream

3. Actualizamos el fork con el repositorio original para tener los cambios actualizados

git pull upstream master


4. Subimos los cambios a nuestro fork

git push origin master

Ejemplo concreto:
git clone git@github.com:pollopolea/core.git
cd core
git remote add upstream https://github.com/owncloud/core.git
git fetch upstream

git pull upstream master
git push

jueves, 29 de junio de 2017

Yum con errores ( liblber ) después de desinstalar openldap

Descargamos paquetes y forzamos la instalación
cd tmp wget http://mirror.centos.org/centos/7/os/x86_64/Packages/openldap-2.4.40-13.el7.x86_64.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/openldap-2.4.40-13.el7.x86_64.rpm
rpm --upgrade --oldpackage --replacefiles --replacepkgs openldap-*.el6.x86_64.rpm
yum reinstall openldap

lunes, 5 de junio de 2017

Restaurar archivos de configuración de un paquete en Centos

Si necesitamos recuperar todos archivos de un paquete, por ejemplo los archivos de configuración podemos hacer los siguiente:
rpm -qf /etc/httpd/conf/httpd.conf
httpd-2.4.6-45.el7.centos.x86_64
Luego forzamos la reinstalación del paquete
yum reinstall  httpd-2.4.6-45.el7.centos.x86_64

domingo, 30 de abril de 2017

Instalación de Pgadmin4 en opensuse leap 42.2 mediante PIP

Tras intentar de varias formas, probando de varias maneras: varios repositorios de software http://software.opensuse.org/,  bajando el código código fuente ( no conseguía resolver la dependencia python3-htmlmin).... Esta es una forma en la que he conseguido que funcione bien. La instalación ha sido con opensuse leap 42.2 y PgAdmin 4 v1.4

1- Instalación de dependencias, quizá necesites alguna más dado que en las pruebas tuve que hacer varias instalaciones relacionadas con python:
zypper up
zypper in python-virtualenv python-pip libpq5 libpqxx-5_0 python-devel
2- Instalación mediante pip, recuerda cambia la ruta, en el ejemplo se instalará en ~/Programas/pgadmin4/:

cd ~/Programas/
virtualenv pgadmin4
cd pgadmin4
source bin/activate
wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v1.4/pip/pgadmin4-1.4-py2.py3-none-any.whl
sudo pip install --upgrade pip
sudo pip install pgadmin4-1.4-py2.py3-none-any.whl
3- Ejecución del servidor. En la primera ejecución nos preguntará por un usuario y contraseña, que será el que usemos en posteriores accesos.:
sudo python /usr/lib/python2.7/site-packages/pgadmin4/pgAdmin4.py
4- Acceso a la web, en el navegador ponemos la direccion y como usuario y password, los que hemos puesto en el paso 3:
http://localhost:5050/