Foro de elhacker.net

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: DonQuimi en 10 Febrero 2016, 08:59 am



Título: Ayuda con script de inicio
Publicado por: DonQuimi en 10 Febrero 2016, 08:59 am
Buenos dias,

Estoy desarrollando una alarma de pánico (solo pulsar un boton y que suene) utilizando para ello una Raspberry (sistema operativo basado en debian), una red RS485, una aplicación Android para el botón de pánico, para poder activarla desde cualquier parte del mundo, y un microcontrolador PIC para activar la alarma (también modificar estado de luces, etc. Pero esto ya se aparta del tema), y tweeter, para generar registros de actividad.

La questión es que, para sacar un señal de activación de la alarma por el puerto série, y poder ser activada desde un terminal Android, he diseñado un script muy simple que queda escuchando en el puerto 8989, a la espera de recibir por metodo POST una instrucción mandada desde la aplicación Android. Seguidamente el script manda una instrucción por puerto série al PIC que activa la alarma, y también se llama a otro script que publica un aviso del evento en tweeter, pasandole el texto a publicar como argumento.

El script funciona perfectamente si lo ejecuto normalmente haciendo "./tcpalarm.py". Sin embargo, cuando hago que arranque con el sistema (Ya sabeis, "sudo update-rc.d..." también se ejecuta, pero solo parcialmente. Es decir, activa y desactiva la alarma correctamente al recibir la orden desde el smartphone, pero la llamada al script que publica el evento en Tweeter NO funciona o no se ejecuta, no entiendo el porqué...

Quizas algo que desconozco sobre los runtimes? Lo tengo en el 5, modo multiusuario con red.

Os adjunto el codigo de los dos scrits:

Script tcpalarm.py:
Código:
#!/usr/bin/python
# -*- encoding: utf-8 -*-

import os
import sys
import serial
import commands
from flask import Flask, request


#Defino el puerto serie:
p = serial.Serial('/dev/ttyUSB0',9600,timeout=1, stopbits = 1)

#Inicio Flask:
app = Flask(__name__)

#Si activo la alarma:
@app.route("/SOS/ON")
def SOS_ON():
        p.write("SOS_ON!")

        resultado = commands.getoutput('./publicatweet.py "Alarma activada manualmente"')
        print("Estado del tweet:" + resultado)

        if(resultado == 'OK'):
                try:
                        commands.getoutput('./escribeRegistro.py alarmas.txt "Alarma activada manualmente"')
                        print ("Se ha notificado al registro la activación de la alarma")
                except:
                        print ("No se puede escribir en el fichero de registro!")
        elif(resultado == 'ERROR'):
                try:
                        commands.getoutput('./escribeRegistro.py alarmas.txt "Alarma activada manualmente - Error al publicar el tweet"')
                        print ("Se ha notificado al registro la activacióa de la alarma")
                except:
                        print ("No se puede escribir en el fichero de registro!")

        return "SOS_ON"

#Si desactivo la alarma:
@app.route("/SOS/OFF")
def SOS_OFF():
        p.write("SOS_OFF!")

        resultado = commands.getoutput('./publicatweet.py "Alarma desactivada manualmente"')
        print("Estado del tweet:" + resultado)

        if(resultado == 'OK'):
                try:
                        commands.getoutput('./escribeRegistro.py alarmas.txt "Alarma desactivada manualmente"')
                        print ("Se ha notificado al registro la desactivación de la alarma")
                except:
                        print ("No se puede escribir en el fichero de registro!")
        elif(resultado == 'ERROR'):
                try:
                        commands.getoutput('./escribeRegistro.py alarmas.txt "Alarma desactivada manualmente - Error al publicar el tweet"')
                        print ("Se ha notificado al registro la desactivación de la alarma")
                except:
                        print ("No se puede escribir en el fichero de registro!")

        return "SOS_OFF"




if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8989, debug=False)



Script publicatweet.py:
Código:
#!/usr/bin/python
# -*- encoding: utf-8 -*-

import os
import time
import tweepy
import sys

CONSUMER_KEY = '*************************'
CONSUMER_SECRET = '**************************************'
ACCES_KEY = '**************************************************'
ACCES_SECRET = '************************************'

hora = time.strftime("%d/%b/%y %H:%M:%S ")

try:
        #Me identifico en tweeter, y publico el tweet:
        auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        auth.set_access_token(ACCES_KEY, ACCES_SECRET)
        x = tweepy.API(auth)
        x.update_status(status = hora + sys.argv[1])
        print("OK")
except:
        print("ERROR")

Habreis observado que en el script 'tcpalarm.py' tambien se llama, por el mismo metodo, a un script 'escribeRegistro.py'. También funciona correctamente si ejecuto desde la linia de comandos, y tampoco si lo ejecuto al inicio del sistema...

Seguro que la explicación es mucho mas corta que la pregunta ;). Agradeceré mucho vuestra ayuda.

Gracias de antemano!


Título: Re: Ayuda con script de inicio
Publicado por: DonQuimi en 16 Febrero 2016, 13:52 pm
Solucionado!

El problema estaba en la manera en que iniciava el script publicatweet.py, aunque no entiendo como es que a veces funcionava y otras no. En todo caso, el script corregido, por si a alguien le interesa:

Código:
import os
import time
import tweepy
import sys

CONSUMER_KEY = '****************************'
CONSUMER_SECRET = '**************************'
ACCES_KEY = '*********************************'
ACCES_SECRET = '**********************************'

def main(text):
        try:
                hora = time.strftime("%d/%b/%y %H:%M:%S ")
                auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
                auth.set_access_token(ACCES_KEY, ACCES_SECRET)
                x = tweepy.API(auth)
                x.update_status(status = hora + text)
                return "OK"
        except:
                return "ERROR"

if __name__== "__main__":
        main(sys.argv[1])

Como veis, he añadido el bloque
Código:
if __name__== "__main__":
        main(sys.argv[1])

Errores de novatos...

Soy consciente que publicar la hora en el tweet es una redundáncia. Lo hago por un motivo bien concreto y es que, la API de tweeter devuelve error si publicas dos tweets con el mismo texto. Añadiendo al texto horas:minutos:segundos, si que puedo mandar dos veces el mismo mensaje, si me conviene, ya que también uso este script para otras notificaciones, no solo para la activación/desactivación de la alarma.

En todo caso, ahora la alarma se activa correctamente desde un smartphone, incluso desde fuera del la red domestica y, además, publica un tweet que suena en todos los dispositivos moviles que me siguen en tweeter.

Aunque no haya recibido ayuda en este tema, gracias a los que habeis tenido el interés de leerlo!