Scripts

rutaAlert Script

rutaAlert Script

Quienes trabajamos entre bases de datos ORACLE sobre sistemas variopintos, nos encontramos con que no siempre es fácil acordarse de las rutas de los alert.log, sobre todo cuando tienes que trabajar sobre bbdd que llevan montadas bastante tiempo y la persona que las montó lo hizo a su manera.
También es cierto que muchas otras veces, recordar o incluso «razonar» la ruta del alert.log de las instancias de oracle, puede ser un tema de vagancia mental.

Sea como sea, ya no hace falta perder ni un minuto mas pensando o buscando el alert.log de ninguna de las instancias de oracle gracias a este pequeño script, que junto con el verpmon publicado anteriormente, es uno de los que mas utilizo en el día a día.

La idea básica del script es muy simple… preguntar a la instancia por la ruta del alert.log.

Lo unico que nos pedirá el script es haber definido previamente el ORACLE_SID de la instancia.

Este es el pequeño script:


#!/bin/bash
if [ -z $ORACLE_SID ]
then
echo -e "\nERROR: ORACLE_SID esta sin definir"
else
echo -e "\nSacando ruta del alert para el ORACLE_SID=$ORACLE_SID"
sqlplus -S "/as sysdba" <

Como se puede apreciar, el script es de lo más simple. Salta a la vista que el usuario que lo lance debería poder conectarse con "/as sysdba".

Por supuesto, para que sea realmente util, habría que definirlo con un alias en los ficheros de inicio de sesión en shell para que podamos invocarlo desde donde sea (o con un enlace simbólico, eso queda al gusto del consumidor 🙂 )

Este es un ejemplo de como funciona:

ejemplo de rutaAlert

ejemplo de rutaAlert

leer más

verpmon script

verpmon script

Este script creo que es uno de los que mas he usado en los últimos años, y no porque sea imposible hacer las cosas sin el, que no es así para nada, mas bien es porque desde el momento en que te acostumbras a él, no puedes dejar de usar…

Si bien es cierto que cada vez que entro en un servidor de bbdd con varias instancias de oracle y donde sé que tendré que entrar en una y en otra instancia mas de una vez, lo primero que hago «en plan rapido» es definir este alias:


alias verpmon='ps -efa|grep _pmon|grep -v grep|cut -d "_" -f3'

Eso si, nada mas que tengo un poco de tiempo, lo afino un poco más para que sea mas rapido aun de usar…

Lo más facil es que si quieres ver los pmon de un servidor es que sea para, además de ver las instancias corriendo, ver el ORACLE_SID y definir la variable, asi que ¿No seria muy util que al mismo tiempo que vemos los pmon activos en el servidor nos escribiera la linea completa? Si, es cierto, parece que sea un tema de vagancia extrema, pero volvemos a lo mismo, si tienes una instancia, no tiene sentido usar este script, si tienes dos, podria ser excesiva tanta automatizacion pero si tienes muchas instancias, estas cosas son las que te permiten ganar mucho tiempo al hacer uso de ellas constantemente…

Veamos a que me refiero:

Preparamos el script:


#!/bin/bash
export lasInstancias=`ps -efa | grep ora_pmon|grep -v grep |awk '{split($0,a,"ora_pmon_"); print a[2]}' | grep -v print`
echo -e "Estos son los pmon activos en la maquina...: \n"
ps -efa | grep _pmon | grep -v grep
echo -e "\n\nLineas para el copy/paste:\n"
for instancia in $lasInstancias
do
echo "export ORACLE_SID=$instancia"
done
echo -e "\n\n"

 

Bien, lo guardamos y creamos el correspondiente alias apuntando  a el, y lo guardamos en el entorno de la shell:


echo "alias verpmon='/ruta/al/script/verpmon.sh'" >> $HOME/.bashrc

Ok, ahora cada vez que lancemos:

verp + tabulador + intro… nos apareceran en pantalla todos los pmon activos tal y como aparecian siempre que haciamos el ps correspondiente PERO ahora justo debajo de estos procesos, tendremos varias lineas, una por cada pmon, con la expresion «export ORACLE_SID=» + cada pmon.

Si a esto le sumamos que al hacer doble clic en la linea, no solo nos la selecciona sino que nos la deja copiada en el buffer y con otro toque de raton (Boton izq si es en putty, boton central si es fisicamente en el server) ya la podemos pegar… el resultado es que cambiamos de bbdd, exportando el sid, en 4 toques de teclado y 3 pulsaciones de raton… una vez más lo diré… si al cabo del dia cambiamos de instancias 20 veces…. se ahorra un tiempo enorme.

Tambien es cierto que si siempre tenemos X instancias, es posible que nos interese crear un script por cada una para cargar todas sus variables, pero tiene el inconveniente de que necesitan un mantenimiento, tanto si se elimina la instancia como si se añaden nuevas… con este script y el rutaAlert, citado en otro articulo, estos problemas desaparecen por completo.

Un ejemplo, de la salida del verpmon:
Ejemplo de uso de verpmon

Ejemplo de uso de verpmon

leer más

Auto comprobador de ios 7 con SIKULI

Auto comprobador de ios 7 con SIKULI

Hoy es dia 18 de Septiembre de 2013 y dicen las malas lenguas 🙂 que IOS7 sale hoy. He mirado hace un rato y no era asi, como no tengo muchas ganas de quedarme aqui embobado apretando un botón para ver si hay o no update he recurrido a mi imaginación.

Hace ya tiempo, trabaje con un proyecto muy interesante llamado SIKULI que es un IDE de programacion PERO basado en imágenes, si si, como suena, tu le dices, en esta ventana… tomas una captura de la misma, haces clic aquí… y haces captura del boton. A eso le han sumado un simple lenguaje de programación pero, si ya estas intentando pasar del articulo, no te asustes que es un entorno realmente simple, tanto como:

if exist(AQUI_VA_UNA_IMAGEN):
click(Aqui_va_la_imagen_del_boton)

El codigo se parece bastante a es python (Python scripting is well supported by the SikuliX-IDE (more scripting languages to come)), asi que es bien sencillo. Ahora que ya sabemos que usar, simplemente vamos a añadir el resto de ingredientes: el iTunes y, en mi caso, el VLC. Te preguntarás ¿¿porque?? Pues bien, por varias razones: no tengo musica a mano solo un capitulo de True Blood en formato no iTunes 🙂

Para preparar bien el entorno, dejamos abierto el VLC a un lado y el itunes con la ventana de informacion del telefono abierta. Tened en cuenta que la app podría estar cerrada y nosostros programar que se abra, pero he querido hacerlo en 2 min… y lo he conseguido. Al tema…

Instalamos sikuli: sikuli-setup.jar (La web es: http://www.sikuli.org)

Una vez instalado abrimos itunes y lo dejamos con la parte donde aparece el botón «buscar actualización» visible

Abrimos VLC, cargamos una peli o cancion o lo que queramos

Insisto, nada de esto es necesario. Se podria hacer desde SIKULI, solo lo hago asi por ganar tiempo.

Y con los ingredientes, imagino que ya sabeis cual es el plan 🙂

Si le damos al botón «buscar update» y nos sale el cartelito de que no hay, nada.

Si no sale ese cartel, se pone a reproducir el capitulo de True Blood a todo volumen para avisarme.

Tiene que ser un bucle, mientras salga el cartelito de que no hay update… debe volver a ejecutarse (Hay que meter una espera de 10seg por lo menos para no agobiar a nadie 🙂 )

y comenzamos a programar en SIKULI… a la izq tenemos algunas de las ordenes basicas, podeis jugar con la orden click para ver como es el sistema de las capturas… para probar las creaciones, hay una opcion que es reproducir a camara lenta.

Si quereis complicaros, teneis la docu en la pagina oficial…

Este es el codigo que estoy usando… la verdad no se si funciona completamente, al menos hasta que salga la actualización 🙂 SI FUNCIONA, a la 3era ejecucion seguida he visto que continuaba lanzado y me fui a cenar. No pasaron ni dos minutos y True blood comenzo a sonar a todo volumen… BINGO!!! update detectado 🙂

 

Script de sikuli

Script de sikuli

 

Aunque se pueden guardar los scripts e incluso lanzarlos desde la linea de comandos, en este caso no os lo voy a facilitar… es demasiado simplón y uno tiene su amor propio… de hecho lo publico porque me parece algo curioso y que seguro no sabíais 🙂

Ahora ya teneis todo… a Sikuliar (o como se diga) que yo me voy a cenar tranquilo sabiendo que si sale el update el ordenador comenzará a reproducir el capitulo a todo volumen!!

PD: En la seccion de ejemplos de la web hay verdaderas obras de arte hechas con sikuli… desde un script para jugar al bejeweled hasta descargas masivas de ficheros… y un sinfín de cosas mas… insisto, probadlo que no os arrepentiréis.

 

leer más

Abrir Terminal aqui: Función para Finder que abre Terminal o iTerm2 en la carpeta actual

Abrir Terminal aqui: Función para Finder que abre Terminal o iTerm2 en la carpeta actual

Este script es ideal para los que quieran comenzar a hacer scripts sencillos en applescript ya que realiza tareas bastante comunes como obtener el path de la ventana del finder, comprobar si existe una app mediante el bundle identifier…etc Además que es de lo más útil , todo sea dicho.

El script está pensado para tener un enlace en la barra de herramientas del Finder, para lo que hay que arrastrarlo de forma de manual a él.

Una vez instalado en la Finder Toolbar, nos permitirá abrir la terminal en la misma carpeta donde esté situada la ventana del Finder donde pulsemos sobre el icono. Es mucho más sencillo de lo que parece:

Si en el Finder estas en la carpeta /Users/MiUsuario/Downloads y pulsas el boton que enlaza al script, abriras la termina en esa misma carpeta, no en la carpeta por defecto que se abre siempre en al terminal.

Ahora bien, he agregado una comprobación mas para que, si tenemos instalado en el equipo la aplicación iTerm2, nos abra esta en lugar de la Terminal de OSX.

Hay que decir también que applescript no es un lenguaje más rápido del mundo y si estamos en un Mac bastante viejo y somos unos fanaticos de la inmediated, es posible modificar el script para que nos lance directamente la app que queramos sin realizar ninguna otra comprobación, pero eso os lo dejo a vuestro gusto.

A continuación os dejo el script «tal cual» aunque para que sea realmente útil, es necesario convertirlo en app y llevárselo a la barra del Finder. Por esta razón os doy dos opciones, escoged la que queráis 🙂 :

1.- Bajar la version compilada (enlace al final del articulo)

2.- Copiar el código (mostrado mas abajo) y compilarlo como aplicación.

Después de haber seguido cualquiera de las dos, mi consejo es que os lleveis el «.app» a la carpeta aplicaciones (No porque solo funcione desde allí sino porque será más fácil que no se elimine por error o se mueva) y una vez allí, arrastrarla a la barra superior del Finder, tal y como vemos en la siguiente captura:

 

Se arrastra la app a la Toolbar del finder

 

Se arrastra la app a la Toolbar del finder

Este es el script:
*NOTA: El coloreado del código no es correcto porque applescript no está soportado por el plugin de wordpress y lo he marcado como ActionScript3 pero esto solo afecta a los colores para mostrarlo en WEB.


(*
Abrir Terminal aqui
por Alvaro Anaya
www.archivoslog.es
Version 0.1
*)
-- Lo primero es recoger la direcc de la ventana del Finder
tell application "Finder" to set rutaProcesada to (folder of the front window) as alias
-- Ahora comprobamos si esta instalado el iTerm2 (con el bundle identifier es mas fiable)
try
tell application "Finder" to get application file id "com.googlecode.iterm2"
set existeApp to true
on error
set existeApp to false
end try
-- Ahora si existe, abrimos la ruta en iTerm, de lo contrario, en Terminal
if existeApp is true then
tell application "iTerm"
open rutaProcesada
activate
end tell
else
tell application "Terminal"
open rutaProcesada
activate
end tell
end if

Por supuesto, el icono de la app es modificable al 100%. Por ejemplo, si tomamos el de la misma Terminal, el aspecto que muestra la barra del finder mejora bastante como podemos ver a continuación aunque si tenemos un icono de aspecto similar al de los otros botones de la barra del finder, quedaria mucho mejor, sin duda:

Finder Toolbar con "Abrir terminal aquí" y el icono de Terminal.app

 

Finder Toolbar con «Abrir terminal aquí» y el icono de Terminal.app

Y como siempre… esta es la verison «Todo hecho» para la gente sin tiempo/ganas de «cacharrear». Es el enlace al script ya compilado como .app y con el icono de la terminal. Solo es necesario llevarlo a la carpeta «/Aplicaciones» y desde allí, arrastrarlo a la barra del Finder:

Enlace a «Abrir Terminal Aqui»:

Descargar app compilada

leer más

Mostrar una imagen o película desde applescript con Quicklook

Una de las tareas que, hoy por hoy, no podemos realizar con applescript (Y sin herramientas o aplicaciones de terceros) es mostrar una imagen o reproducir un video. Ciertamente, si bien es posible hacerlo llamado a alguna aplicación que si lo haga, si queremos que nuestro script sea portable y que funcione en cualquier equipo, esto es un problema puesto que no todo el mundo tendrá la aplicación que usemos para tales tareas y/o ganas de instalarla. Otro método que si nos permitiría reproducir el video o mostrar una imagen, sería recurrir al nuevo (Bueno, ya no tan nuevo) applescript studio basado en cocoa pero es algo más complicada la curva de aprendizaje, al menos inicialmente y requiere invertir un tiempo que no siempre tenemos así que si desechamos estas opciones vemos que hoy por hoy no es posible ¿O si?

Una de las características que más uso de OSX es el QuickLock, esa maravillosa ventanita que si tenemos un archivo seleccionado y pulsamos la barra espaciadora, nos muestra su contenido sin importar que sea video, imagen o archivos de texto (Eso sin contar con los plugins que permiten mostrar prácticamente de todo) así que ¿Porque no recurrir a ella desde nuestro script? Está claro que es la solución más rápida y factible que tenemos puesto que no es nada complicado de invocar y sabemos que está en cualquier Mac en el que se ejecute nuestro script así que, una vez más… manos a la obra 🙂

Esta vez es un script lo suficientemente pequeño y sencillo para no tener que ir explicando más profundamente de lo que lo que hacen las lineas de comentarios en el mismo script.

-- Primero definimos el handler
on abreQuicklook(elArchivo)
-- Convertimos el formato de la ruta
set laRuta to quoted form of (POSIX path of elArchivo) as string
-- Llamamos a Quicklook desde la linea de comandos
do shell script ("qlmanage -p " & laRuta)
end abreQuicklook

-- Solicitamos un archivo
set elArchivo to (choose file with prompt "Seleccione una imagen o video…")

-- Llamamos a nuestro hadler pasándole la ruta al archivo
abreQuicklook(elArchivo)

Y ya!! con esto veremos que, con muy pocas lineas, tenemos un script capaz de mostrar contenido multimedia, sin recurrir a ninguna app de terceros, la cuál es posible que no esté instalada en cualquier mac.

leer más

Descomponer una ruta en directorios, nombre de archivo y extensión en Bash

Una tarea que puede ser bastante común a la hora de escribir scripts o aplicaciones que trabajen con el sistema de archivos es la necesidad de descomponer una ruta completa del tipo «/directorio/subdirectorio/…/…/archivo.extension» para obtener por separado el nombre de archivo, la extensión y la ruta de directorios. De hecho, fue una de las necesidades que me ha surgido estos días, escribiendo un Shell Script un tanto grande en el que necesitaba obtener el nombre de un archivo de una ruta completa así como la estructura de directorios hasta el mismo.

Dado que me suele gustar, al escribir scripts de cierto tamaño, dividirlos por bloques de código independientes, voy a publicar este como una solución aislada para solventar el problema de descomponer rutas aunque cuando lo volváis a ver en el script que aún no he terminado aparecerá como una función por la comodidad que representan y porque facilitan mucho la lectura del código en scripts de muchas lineas. Sin más preámbulos, vamos manos a la obra:

Dado que este código ahora es independiente, he realizado algunos cambios como que tome la entrada de datos a modo de parametros tras el nombre del script por lo que la ruta a descomponer, deberá ir tras el nombre del script en lo que seria el parámetro $1, es decir, tendriamos que pasárselo de la siguiente manera:

./script.sh /ruta/que/queramos/descomponer/archivo.extension
Por el mismo motivo, lo he dispuesto de forma que la salida del mismo sea la salida estándar mostrando el valor de cada una de las variables que intervienen en el proceso.

También he comentado las lineas relevantes ya que creo que será mejor explicar cada una de las lineas en el mismo punto donde aparece. Así pues, este es el script:

 



#!/bin/bash
# Script para descomponer una ruta completa a un archivo o directorio, obteniendo
# el nombre de archivo y extensión (si existen) y ruta hasta los mismos
for RutaCompleta in $1
do
# Comenzamos extrayendo la parte derecha desde el ultimo caracter "/", es decir, el archivo
NombreArchivo="${RutaCompleta##*/}"
# Longitud de la ruta es el total de caracteres menos el largo del nombre de archivo
LargoRuta="${#RutaCompleta} - ${#NombreArchivo}"
# Extraermos la ruta desde el caracter 0 hasta el caracter final de largo de ruta
RutaSola="${RutaCompleta:0:$LargoRuta}"
# Lo siguiente es extraer nombre de archivo
NombreSolo="${NombreArchivo%.[^.]*}"
# Extension se obtiene eliminando del nombre completo el nombre mas el punto
Extension="${NombreArchivo:${#NombreSolo} + 1}"
# Las 2 lineas anteriores fallan si no hay extension por lo que es necesario comprobar que no
# se de el caso de que haya extension pero no nombre ya que en ese caso la ext seria el nombre
if [[ -z "$NombreSolo" && -n "$Extension" ]]; then
NombreSolo=".$Extension"
Extension=""
fi
done
# Este es el resultado del script
echo
echo "Este es el resultado del script:"
echo
echo La ruta completa es:
echo $RutaCompleta
echo
echo "Ruta.........: \"$RutaSola\""
echo "Nombre.......: \"$NombreSolo\""
echo "Extension....: \"$Extension\""
echo


Si lo ejecutamos, la salida del mismo, según está, sería similar a esto
:

 


$ ./descomp.sh /dir1/subdir1/subdir2/archivo.txt

Este es el resultado del script:

La ruta completa es:
/dir1/subdir1/subdir2/archivo.txt

Ruta………: «/dir1/subdir1/subdir2/»
Nombre…….: «archivo»
Extension….: «txt»


Ahora bien, hay que tener en cuenta que si lo vamos a utilizar como una función llamada desde otro script o simplemente como un bloque de código incrustado entre las lineas, habría que hacerle algunos cambios, pero dado que lo estoy utilizando en otro script que voy a publicar aquí también, no lo explicaré aún ya que es cuestión de tiempo que me toque hacerlo.


 

 

leer más