lunes, 12 de mayo de 2014

Raspberry Pi. Interruptor apagado - Control GPIO

Este post intenta abordar la necesidad que me surgió, de poder hacer un apagado ordenado de la RaspBerry.

No era viable conectarme a la misma para realizar el apagado, ni tampoco apagar de power en cada ocasión ya que eran demasiadas y corría el riesgo de dejar el sistema inconsistente.

Una de las alternativas es la de conectar la Rasp al mundo, para lo que tenemos los puetos "general purpose input output" o GPIO.

De cara al montaje siguiente, hay que tener presente que, tenemos dos implementaciones de GPIO. REV1 y REV2. Debemos adaptarlo a la nuestra, ya que hay 3 diferencias en los nombres (marcados en azul)

Nota: En mi caso GPIO Rev.1 (Pin5 --> GPIO1)

El script hace básicamente lo siguiente....
Conectamos un interruptor al pin 5 (definido como de entrada y con valor 1) y al pin 6 (GND... con valor 0), cuando activamos~(cortorcicuitamos) el interruptor, el pin 5 de entrada recibe el 0 que tenemos en GND y cambia su valor a "0"comprobamos este valor y si es "0", lanzamos el shutdown o el script deseado.

El montaje queda así.... "cutre" pero completamente operativo.


El script es el siguiente:

Se puede descargar aquí

Nota2: Un poco de teoria...
Los puertos GPIO no son accesibles hasta que se han exportado al espacio de usuario. Hasta ese momento solo el Kernel puede acceder a ellos. Por lo que es necesario el export antes de poder definir la dirección IN/OUT o el valor.
Ejemplo.
root@RASP1:/sys/class/gpio# ls -als                                             ..                                                    
0 --w-------  1 root root 4096 may 12 01:23 export                             
0 lrwxrwxrwx  1 root root  0 may 12 01:23 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
0 --w-------  1 root root 4096 may 12 01:23 unexport
-----------------------------------
                                                    
root@RASP1:/sys/class/gpio# echo "5" > ./export
root@RASP1:/sys/class/gpio# ls -als
..
0 --w------- 1 root root 4096 may 12 01:24 export
0 lrwxrwxrwx  1 root root  0 may 12 01:24 gpio5 -> ../../devices/virtual/gpio/gpio5
0 lrwxrwxrwx  1 root root    0 may 12 01:23 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
0 --w-------  1 root root 4096 may 12 01:23 unexport
-----------------------------------                                                    
root@RASP1:/sys/class/gpio# echo "5" > ./unexport
root@RASP1:/sys/class/gpio# ls -als
..
0 --w-------  1 root root 4096 may 12 01:24 export
0 lrwxrwxrwx  1 root root    0 may 12 01:23 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
0 --w-------  1 root root 4096 may 12 01:24 unexport  

Con este montaje se hizo un centro de descargas, donde tras verificar la descarga vía transmission, se realiza un apagado ordenado se saca el pen, se "usa" la descarga.
Aunque lo verdaderamente interesante es la posibilidad de dotar a la RaspBerry de "interruptores" que realicen tareas.... Copias, checkeos, arrancar servicios...






domingo, 4 de mayo de 2014

Referencia Indirecta - Bash

Este post es más una nota que un post como tal, por su extensión y sobre todo por su función.....

Hace un par de semanas necesité hacer uso del concepto de punteros en bash.
La verdad es que no se si lo había usado anteriormente, lo que si sé, es que no recordaba como hacerlo, de ahí esta nota.

El concepto se llama habitualmente referencia indirecta.

Simplemente pretendo dejar plasmada la sintaxis a modo de recordatorio, así que no me extenderé nada.....

Podemos referenciar variables de dos modos... directa o indirectamente.

Antes de BASH v.2
A="cadena resultante"
B="A"
-------------------------
echo $A
.......cadena resultante
-------------------------
echo $B
.......A
-------------------------
eval C=\$$B
echo $C
.......cadena resultante


Desde BASH v.2
A="cadena resultante"
B="A"
-------------------------
echo $A
.......cadena resultante
-------------------------
echo $B
.......A
-------------------------
echo ${!B}
.......cadena resultante

Podemos acceder al contenido de la variable A, haciendo uso de su propia referencia o de la referencia que contiene la variable B.

La referencia la obtuve del siguiente artículo.
Aquí un artículo donde se detalla perfectamente este concepto.

sábado, 29 de marzo de 2014

Arduino y Pruebas de concepto - Control vía web

Hoy, a petición de un amigo, he recuperado una prueba de concepto que hice tiempo atrás sobre arduino.

Se trata de controlar salidas de arduino vía web, sirviendo un pequeño form.

Pretendía aplicar esto para domotizar la casa, pero por distintos motivos no seguí con el proyecto.

Así que por si le sirve a alguien...
Descarga aquí

Este script, tiene un par de años mínimo y por supuesto obtuve codigo de distintas fuentes para realizar la prueba. Siento no poder citarlos ya que no los recuerdo.




martes, 17 de diciembre de 2013

Mysql - Procedimiento "Create Database" sin ser admin.

Hace unos días se me planteo la necesidad de que usuarios no administradores pudiesen crear bbdd's en un server mysql y que además ganasen privilegios sobre las mismas.

Lo que se nos ocurrió fue lo siguiente, quizás(seguro) no sea la mejor solución pero funciona bien. Así que ahí la dejo... por si le sirve a alguien.

Para poder crear bbdd con usuarios no administradores se ha creado un "Procedimiento almacenado " en una bbdd creada específicamente para almacenar este u otros procedures.
En este caso la he llamado "gestion".

1.- Con usuario "root" creamos la bbdd donde almacenaremos el procedure.
mysql>create database gestion;

2.- Dentro de esta bbdd cargamos el procedure
mysql>use gestion;

(En la consola pegamos el procedure del final de la nota. Negrita)
     mysql> DELIMITER //
     mysql> CREATE PROCEDURE CreateAppDB(
         ->     IN db_name VARCHAR(50))
         -> BEGIN
         ->     DECLARE myvar VARCHAR(32);
         ->
         ->     -- Create database
         ->
(En la creación de la bbdd añadimos un prefijo "ext_" para tener controladas las bbdd que creen los usuarios.)
        
->     SET @s = CONCAT('CREATE DATABASE ext_', db_name);
         ->     PREPARE stmt FROM @s;
         ->     EXECUTE stmt;
         ->     DEALLOCATE PREPARE stmt;
         ->
         ->     -- Grant permissions
(Aqui obtenemos el usuario que esta lanzando el procedure sin la parte "@XXX" que completaremos con @%, esto se almacena en "myvar")         ->     SELECT LEFT(USER(), LOCATE('@',USER()) - 1) INTO myvar;
         ->     SELECT myvar;
         ->
         ->     SET @s = CONCAT('GRANT ALL ON ext_', db_name, '.* TO ', myvar, '@''%''');
         ->     PREPARE stmt FROM @s;
         ->     EXECUTE stmt;
         ->     DEALLOCATE PREPARE stmt;
         -> END//

     Query OK, 0 rows affected (0.00 sec)

     mysql> DELIMITER ;
     mysql>

3.- Al usuario que se le quiera dar la posibilidad de crear bbdd se le dará permisos de ejecución sobre la bbdd gestión y sobre el procedure.

(Nota. Si el usuario no conecta desde localhost las definiciones de usuario siguientes cambian)

mysql> grant execute on procedure gestion.CreateAppDB to 'USER'@'localhost' identified by 'XXXXXX';
Query OK, 0 rows affected (0.01 sec)
----
mysql> grant execute on gestion.* to 'USER'@'localhost' identified by 'XXXXXX';
Query OK, 0 rows affected (0.00 sec)

4.- Conectamos con este usuario y lanzamos el procedimiento.
#mysql -u USER -p gestion
mysql>call gestion.CreateAppDB('nombre_bbdd'); 

5.- Tenemos creada una bbdd "ext_nomreb_bbdd" con permisos para el usuario "USER@%"


DROP PROCEDURE IF EXISTS CreateAppDB;
DELIMITER //
CREATE PROCEDURE CreateAppDB(
    IN db_name VARCHAR(50))
BEGIN
    DECLARE myvar VARCHAR(32);

    -- Create database

    SET @s = CONCAT('CREATE DATABASE ext_', db_name);
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    -- Grant permissions
    SELECT LEFT(USER(), LOCATE('@',USER()) - 1) INTO myvar;
    SELECT myvar;
   
    SET @s = CONCAT('GRANT ALL ON ext_', db_name, '.* TO ', myvar, '@''%''');
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END//
DELIMITER ;

La idea original sale de este post, sobre el cual se han hecho pequeñas modificaciones.

jueves, 1 de marzo de 2012

Marzo negro




Quizás pienses que esto no sirve de nada y que es absurdo, pero desde luego es bastante simple de de verificar..., simplemente hay que intentarlo y esperar a ver si hay resultados.

La verdad es que está teniendo bastante difusión en distintas plataformas, Blogs, Twitter, FaceBook, Tuenti....

Por mi parte hay esta el aviso, y si sirve de algo mejor.