Setup:
- Raspberry Pi
- nginx web server
- PHP5 & PHP-CLI installed
My Python script "lights.py" is really cool because it turns on/off lights in my living room through a relay connected to an Arduino Uno [then connected to the Pi via USB]. I know I could've used the Pi's GPIO pins, I just didn't. That doesn't matter here anyway.
I wanted to be able to activate the script from a web browser through the site hosted by my Pi, so I have /var/wwww/test/lights.php containing this code:
<?php
exec('python lights.py');
?>
Simple, no? Well, when I browse to that page in a browser, nothing shows up (expected) but the lights don't change state (unexpected). However, at the command line, logged in as user Pi, I can run "php /var/wwww/test/lights.php" and it works just fine!
I imagine this is because nginx seems to use this user called www-data to do stuff, so maybe its a permissions issue? Now I'm wandering into unknown territory for me ... I tried "su - www-data" to see if I could attempt the script as that user, but it asks for a password, which I never set up (and a blank password didn't work).
Any help here is greatly appreciated.
UPDATE - Here is "ls -la /var/www/test/lights*"
-rw-r--r-- 1 www-data root 37 Feb 1 23:56 /var/www/test/lights.php
-rwxr-xr-x 1 www-data root 129 Feb 1 23:51 /var/www/test/lights.py
SECOND UPDATE - Check it:
pi@raspberrypi ~ $ sudo su - www-data
$ pwd
/var/www
$ php ./test/lights.php
python: can't open file 'lights.py': [Errno 2] No such file or directory
$ python ./test/lights.py
Traceback (most recent call last):
File "./test/lights.py", line 4, in <module>
ser = serial.Serial('/dev/ttyACM0', 9600)
File "/usr/local/lib/python2.7/dist-packages/serial/serialutil.py", line 260, in __init__
self.open()
File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 276, in open
raise SerialException("could not open port %s: %s" % (self._port, msg))
serial.serialutil.SerialException: could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'
That '/dev/ttyACM0' device is my Arduino connection, so it appears the user "www-data" doesn't have access to run that Python script, since it can't output to that file. Am I able to "chmod" that device?
THIRD UPDATE - I feel like we're almost at the end!
Using "ls -g /dev/ttyACM0" I found that it is owned by group "dialout." Using "grep dialout /etc/group" I found that only user "Pi" is assigned to it. Therefore, I added www-data to that group with "usermod -a -G dialout www-data"
Now, check it:
pi@raspberrypi ~ $ sudo su - www-data
$ cd test
$ php lights.php
$ python lights.py
$
Both the PHP and Python script work, and the lights went on and off! BUT loading the web page "lights.php" from a browser still doesn't do anything!
FOURTH UPDATE I changed the PHP file to this:
<?php
exec('python lights.py', $output, $return);
print "Output:";
print $output;
print "<br />";
print "Return:";
print $return;
?>
From what I gather, that's the proper way to get some debug info from the exec() statement. Here's the output when I refresh the webpage:
Output:Array
Return:1
Does that help me at all?