miércoles, 17 de abril de 2019

Notas Docker

Chuleta para docker

Listar todos los contenedores

docker ps -a

Iniciar un contenedor

docker start idContenedor

Iniciar session se se delaro iterativo un contenedor

docker attach idContenedor


martes, 9 de abril de 2019

Certificados en java SSLHandshakeException ValidatorException: PKIX path

Una exepcion común en java sobre todo cuando se implementa codigo que realiza peticiones GET, POST, etc.. a un servidor es la siguiente:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Comunmente esta excepcion se logea cuando la JVM no tiene registrado el certificado en su "cacert", para palear esta exception seguir los siguientes pasos:

1)En el navegador pegar la url a la que se intenta acceder o alguna parecida, lo importante es el host del server por ejemplo https://www.dominio1.com/opcion1/opcion2

2)El navegador es posible que muestre algunas notificaciones diciendo si se quiere confiar en dicho host y que se agrega un certificado, aceptamos todo.

3)Importar el certificado desde el navegador a un fichero.
En firefox escribimos lo siguiente en la barra de navegacion "about:preferences#privacy"
Buscamos la seccion "Certificados" y presionamos en "Ver certificados". Buscamos el certificado referente al dominio "dominio1" y lo exportamos como fichero .crt a una ruta conocida.

4)Desde linea de comandos ejecutamos keytool, keytool es un comando que esta en la ruta de la JVM
"{JVMPath}/bin/" si teneis dado de alta java en el PATH del sistema os deberia de pillar sin problema, si no ir directamente a la ruta donde teneis instalado java a la carpeta bin.

4.1) se ejecuta "keytool -alias unAliasDominio1 -import -keystore {JVMPath}/lib/security/cacerts -file C:\ruta1\ruta2\certificados\dominio1Certificado.crt"

4.2)Os pedira el password del keystore "Enter keystore password:" por defecto es "changeit" sin las comillas (si lo habeis cambiado mal asunto).
"Introduzca la contraseña del almacén de claves:"

{JVMPath} Es la ruta donde tenies instalado java por ejemplo "C:\java\jdk-11.0.2"

4.3) Confirmar la confianza en este certificado
"¿Confiar en este certificado? [no]:  si"


miércoles, 9 de enero de 2019

Recopilatorio de Bash y comandos Linux

COMANDOS
Crear varios directorios a la vez
mkdir -p /opt/folder1/folder2/folder3

Copiar el rsa key del host1 al host2 para no proporcionar la passwor del "usuario" cada vez que se realiza una conexion ssh del host1 al host2
[user@hots1]$ ssh-copy-id -i /home/user/.ssh/id_rsa.pub user@host2

Generar el id_rsa.pub
ssh_keygen


Editor VI
:set number -> muestra el numero de linea en el editor

-------------

:set fileformat=unix
:set fileformat=dos

Aplica el formato unix o dos al fichero actualmente abierto, muy util cuando se muestra el error
Not found #!/bin/bash^M

----------
:set list
Muestra los caracters ocultos en el archivo abierto

BASH
Ejemplo de for 1:
Los espacion son IMPORTANTES.

actions=(opcion1 opcion2 opcion3)
for item in ${actions[@]}; do
  echo "Action: ${item}"
done

Ejemplo for 2:
  for (( a=1; a < 80; a++ )); do
    echo "Iteration ${a}"
  done

IF

Igualar cadenas:Los espacios son IMPORTANTES

 _APP=opcion5
if [[ $_APP = "opcion1" ]]
  then
    echo "opcion 1"
  elif  [[ $_APP = "opcion2" ]]
  then
    echo "opcion 2"
  else
    echo "No es ninguna opcion"
  fi

Doble condicion:
$var
if [[ $var = *"value1"* || $var = *"value2"* ]]
then
  echo "var contiene value1 o value2 "
fi


Existe el directorio:

if [ -d /path/dir1/dir2 ]
then
  echo "Directorio existe"
else
  echo "Directorio NO existe"
fi

Fichero existe:

if [ -f /path/dir1/dir2 ]
then
  echo "Fichero existe"
else
  echo "Fichero NO existe"
fi


Ejemplo case :

typeVar=Z
case $typeVar in
  A)
    echo "opcion A"
  ;;
  B)
    echo "opcion B"
  ;;
  C)
    echo "opcion C"
  ;;
  D)
    echo "opcion D"
  ;;
  *)
    echo "opcion no definida"
  ;;
esac

Ejemplo obtener el PID del script en ejecucion y el pid de invocaciones dentro del mainPID
#!/bin/bash

myFunction(){
  for (( a=1; a<10; a++ )); do
    echo "myFunction iteration ${a}"
    sleep 3
  done
}

myFunction &
myFuncPid=$!
mainPid=$$

for (( a=1; a<10; a++ )); do
  echo "mainPID ${mainPid} funcPid ${myFuncPid} iteration ${a}"
  sleep 5
done





viernes, 13 de noviembre de 2015

Comando WGET funciona y CURL NO :`(

Hace poco tuve que obtener el descriptor de un webservice (wsdl) con autentificación por certificado, pero lo raro es que con wget funcionaba y con curl no!!!!!!!!!!!!! porque!!!!!!!!
Esto era porque el formato de la clave privada del certificado (.PEM) tenia el encabezado
-----BEGIN ENCRYPTED PRIVATE KEY-----

Y al parecer curl no entendía este encabezado y por eso siempre obtenía el error:

curl: (58) Unable to load client cert -8018.

Bueno ademas si no das correctamente la ubicación del certificado puede darte el error:

curl: (35) NSS: client certificate not found: certificado.pem

No basta cambiarle el encabezado directo a mano, hay que generar correctamente la llave primaria, para eso ejecutamos:

openssl rsa -in certificado.pem -out private.key
Enter pass phrase for localhost.wget.pem:

Luego pide la frase mágica, que debemos introducir y se genera el fichero private.key con el encabezado:
-----BEGIN RSA PRIVATE KEY-----
.
.
-----END RSA PRIVATE KEY-----

Esta llave la remplazamos en el fichero certificado.pem y ejecutamos:

curl -k --cert ./certificado.curl.pem https://host:1000/webService?wsdl

Ahora ya no pide la "palabra magica" y obtiene el descriptor del servicio. tomar en cuenta que certificado.curl.pem es el fichero de certificado PEM y "./" es para que lo obtenga de la ubicación actual.


viernes, 26 de diciembre de 2014

Raspberrypi B+ Disco duro 2T no lee

Y estas navidades una raspberry pi B+-

La raspberry pi B+ proporciona una corriende de 600mA en los puertos USB, por seguridad lo que causa problemas al enchufar perifericos que requieren una alimentación mayor, en mi caso un disco duro de 2TB que requiere 1A y 5V.

Para aumentar la corriende a 1A en los puertos USB, se edita el fichero /boot/config.txt en el sistema operativo que hayas intalado en tu SD, yo instale raspbmc, entonces te conectar por ssh a la raspeberry y editas ese fichero.

1)Iniciar raspberry sin conectar el disco duro.

2)Conseguir la ip de la raspberry. En raspmbc settings>system

3)Conectar via ssh a la raspberry. En raspmbc usuario:pi password:raspberry
  ssh pi@192.162.0.18

4) editar el fichero con vi.
sudo vi /boot/config.txt

5)Agregar 2 lineas al final del fichero
max_usb_current=1
safe_mide_gpio=4

6)Guardar los cambios, wq!

7)Reiniciar la raspberry y conectar el disco duro.

El disco duro sin estos cambios trataba de ser montado en el sistema, pero se queda infinitamente haciendo un ruido como de lectura en el disco y no se montaba nada nunca, y eso provoca que se quedara colgado el SO.


martes, 9 de diciembre de 2014

Enviar mensajes a cola

Holas!!!!!!!!!!!!!! Pues eso, ahora un quick code pare enviar mensaje a Colas, version para WebsphereMQ y ActiveMQ.

El marrón de WebsphereMQ es que hay que tener sus librerías que si lo tienes instalado las puedes pillar de donde lo hayas instalado o si no buscar arduamente en la red que estarán colgadas seguramente por algún lugar.

package com.myutils.services;

import javax.jms.Connection;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;

import com.ibm.mq.jms.MQConnectionFactory;
import com.ibm.mq.jms.MQQueue;
import com.ibm.msg.client.wmq.WMQConstants;

public class WebsphereMQService {

private static Logger log4j = Logger.getLogger(WebsphereMQService.class);

public void enviarMessage(String txtMsg){
try{
MQConnectionFactory mq = new MQConnectionFactory();
mq.setTransportType(1);//Se envia como cliente
mq.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
mq.setHostName("SERVIDOR_MQ");//Proporcionado por server
mq.setPort(1616);//Esto puede cambiar, proporcionado por server
mq.setChannel("NOMBRE.CANAL");//Proporcionado por server
mq.setQueueManager("QUEUE.MNG");//Proporcionado por server
Connection c = mq.createConnection("usuario", "password");
MQQueue q = new MQQueue("NOMBRE.QUEUE");//Nombre cola, proporcionado por server
   Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
   MessageProducer producer = s.createProducer(q);
   TextMessage message = s.createTextMessage(txtMsg.trim());
   producer.send(message);
   c.close();
}catch(Exception e){
log4j.error("Exception:", e);
}
}

}

//Proporcionado por server: son datos que nos deben de dar para conexión.


Y ahora para Active MQ.


package com.myutils.services;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.log4j.Logger;

public class ActiveMQService {

private static Logger log4j = Logger.getLogger(ActiveMQService.class);

/**
* Envia mensaje
* @param xml
* @throws BusinessException
*/
public void enviarMensaje(StringBuilder xml, String qName){
try{
ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616");//Servidor
   Connection conn = cf.createConnection();
   conn.start();
   Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
   Destination destination = session.createQueue(qName);//Nombre de cola
   MessageProducer producer = session.createProducer(destination);
   TextMessage message = session.createTextMessage(xml.toString());//Mensaje a enviar
   producer.send(message);
   conn.close();
}catch(Exception e){
log4j.error("Exception.", e);
}
}

}



Esto debería de funcionar y si no ......

martes, 20 de agosto de 2013

Ejecutar procedimiento almacenado en hibernate 4

De vez en cuando hay que ejecutar procedimiento almacenados en hibernate 4 he aqui un ejemplo, en realidad utiliza hibernate como la capa mas alta, al final lo ejecuta por jdbc, y esto es porque hibernate 4 solo ejecuta procedimientos almacenados de forma directa si estos devuelven datos en plan resultset, en caso contrario segun nos cuenta en su pagina se debe de utilizar por jdbc, que le llaman un "Work"

Ejemplo:

Params es una clase para encapsular lo datos entrada salida.

public void executeProcedimientoAlmacenado(final Params params) {
final StringBuilder sql = new StringBuilder("");
sql.append(" call esquema.nombre_procedimiento_almacenado(");
sql.append(" ?,");//IN_param_1
sql.append(" ?,");//IN_param_2
sql.append(" ?)");//OUT_param_1
getSession().doWork(new Work(){

public void execute(Connection connection) throws SQLException {
CallableStatement callStmt = connection.prepareCall(sql.toString());
int indexParam=1;
callStmt.setInt(indexParam++, params.getInParam_1());//1
    callStmt.setInt(indexParam++, params.getInParam_2() !=null ? params.getInParam_2() : Types.NULL);//2
callStmt.registerOutParameter(indexParam++, Types.INTEGER);//3
callStmt.executeUpdate();

params.setOutParam(callStmt.getInt(3)); //El parametro 3 es la salida, y lo pasamos al objecto params
}

});
}

Como se ve se utiliza "Work" que es una ejecución directa jdbc encampsulada por hibernate 4, y el objeto Params contiene los datos de entrada posterioremente se setean los de salida y así desde donde se llama el método el params contiene los resultados.

el getSession() es para obtener la session de hibernate, que se traduce también en sessionFactory.getSession() el sessionFactory es inyectado con Spring al Dao que ejecute los procedimientos almacenados, igual que cualquier otro dao.