Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Linux - Raspy php esegue codice python
Forum - Linux - Raspy php esegue codice python

Avatar
archemi (Normal User)
Pro


Messaggi: 64
Iscritto: 08/01/2014

Segnala al moderatore
Postato alle 23:18
Lunedì, 01/05/2017
Ciao a tutti

Ho un raspberry con un sensore di "motion detection"
Per gestire la possibilità di accenderlo e spegnerlo ho una pagina web con uno switch.
Una pagina web in php su un server apache attiva e disattiva

Codice sorgente - presumibilmente Linux

  1. <?php
  2.     // file attiva.php
  3.     exec('sudo -u www-data python /var/www/html/tel/motion.py start');
  4. ?>



Dal server web non fa partire il daemon runner python ma se mando un comando qualunque funziona (esempio) per cui il problema è nel far partire il file pyhton
Codice sorgente - presumibilmente Plain Text

  1. exec('echo "start" > active');



il mio file sudo visudo è configurato così:
Codice sorgente - presumibilmente Plain Text

  1. www-data ALL=NOPASSWD: /usr/bin/python, /var/www/html/tel/motion.py, /var/www/html/invia.php



il file invece python che fa partire mi manda un'email quando rileva un movimento:
Codice sorgente - presumibilmente Python

  1. #!/usr/bin/python
  2. from gpiozero import MotionSensor
  3. from datetime import datetime
  4. import time
  5. import os
  6. import smtplib
  7. from email.mime.text import MIMEText
  8. from email.mime.image import MIMEImage
  9. from email.mime.multipart import MIMEMultipart
  10. from daemon import runner
  11.  
  12. class App():
  13.     def __init__(self):
  14.         self.stdin_path = '/dev/null'
  15.         self.stdout_path = '/dev/tty'
  16.         self.stderr_path = '/dev/tty'
  17.         self.pidfile_path = '/tmp/foo.pid'
  18.         self.pidfile_timeout = 5
  19.     def run(self):
  20.         print("Attivazione sensore movimento")
  21.  
  22.         pir = MotionSensor(4)
  23.         contatore = 0
  24.         time.sleep(1)
  25.  
  26.         print("Sensore pronto")
  27.         while True:
  28.             if pir.motion_detected:
  29.                 contatore += 1
  30.                
  31.                 #Console
  32.                 print("Movimento rilevato : "+str(contatore))
  33.                
  34.                 #email
  35.                
  36.                 msg = MIMEMultipart()
  37.                 msg['Subject'] = 'telecamera movimento'
  38.                 msg['From'] = 'xx@gmail.com'
  39.                 msg['To'] = 'xx@gmail.com'
  40.                 text = MIMEText("Movimento rilevato alle "+datetime.now().strftime("%H.%M.%S del %d/%m/%Y"))
  41.                 msg.attach(text)
  42.                                
  43.                 s = smtplib.SMTP('smtp.gmail.com', 587)
  44.                 s.ehlo()
  45.                 s.starttls()
  46.                 s.ehlo()
  47.                 s.login('xx@gmail.com', 'psw')
  48.                 try:
  49.                     s.sendmail('xx@gmail.com', 'xx@gmail.com', msg.as_string())
  50.                     print("Email inviata")
  51.                 except:
  52.                     print("Email non inviata")
  53.                 s.quit()
  54.                
  55.                 time.sleep(2)
  56.             time.sleep(0.1)
  57.  
  58. app = App()
  59. daemon_runner = runner.DaemonRunner(app)
  60. daemon_runner.do_action()



Anche lo script se lo mando da solo funziona (se non lo faccio partire come sudo non va)
Codice sorgente - presumibilmente Plain Text

  1. sudo python motion.py start



Il tutto funziona da terminale se mando il comando
Codice sorgente - presumibilmente Plain Text

  1. php active.php



Se invece mando dal sito web NON FUNZIONA!!! PERCHE??? Tutto il giorno e non ho risolto nulla...
Codice sorgente - presumibilmente Plain Text

  1. ...sito web.../attiva.php



Come posso fare? ci sto impazzendo
Grazie per qualunque genere di aiuto

Ultima modifica effettuata da archemi il 01/05/2017 alle 23:40
PM Quote
Avatar
archemi (Normal User)
Pro


Messaggi: 64
Iscritto: 08/01/2014

Segnala al moderatore
Postato alle 0:09
Martedì, 02/05/2017
Se metto
Codice sorgente - presumibilmente Plain Text

  1. <?php
  2.         $out = shell_exec('sudo -u www-data python /var/www/html/tel/motion.py start 2>&1');
  3.         print_r($out);
  4. ?>



Questo è l'output che mi da:
Sorry, user www-data is not allowed to execute '/usr/bin/python /var/www/html/tel/motion.py start' as www-data on pi.

Anche cambiando nel visudo queste impostazioni non cambia nulla
Codice sorgente - presumibilmente Plain Text

  1. www-data ALL=NOPASSWD: ALL



se faccio un ls -l
-rwxrwxrwx 1 www-data www-data  211 mai    2 00:05 attiva.php
drwxrwxrwx 2 www-data www-data 4096 mai    1 16:55 css
-rwxrw-rw- 1 www-data www-data   78 mai    1 23:26 disattiva.php
-rwxrw-rw- 1 www-data www-data 1186 mai    1 16:40 index.php
-rwxrwxrwx 1 www-data www-data 2380 mai    1 22:02 motion.py

Ultima modifica effettuata da archemi il 02/05/2017 alle 0:10
PM Quote
Avatar
archemi (Normal User)
Pro


Messaggi: 64
Iscritto: 08/01/2014

Segnala al moderatore
Postato alle 0:37
Martedì, 02/05/2017
Ho risolto
il problema stava in questa dichiarazione nel file python (evidentemente funziona con l'utente del ssh ma non con www-data)

Codice sorgente - presumibilmente Plain Text

  1. #self.stdout_path = '/dev/tty'
  2. #self.stderr_path = '/dev/tty'
  3.  
  4. self.stdout_path = '/var/www/html/tel/tty'
  5. self.stderr_path = '/var/www/html/tel/tty'



e visudo
Codice sorgente - presumibilmente Plain Text

  1. www-data ALL=(ALL:ALL) NOPASSWD:ALL



PM Quote