So I have a Raspberry Pi that I have set up to be an Access Point with hostapd and isc-dhcp-server. It broadcasts an SSID, I connect to it with my phone or laptop, go to 192.168.42.1 and it serves up a page where I have a form for SSID, PSK, and Device ID. The idea is that it should then connect to the network with the information that I have given it by invoking a bunch of subproccess calls, as it is, it doesn't.
This is the index.html:
<html>
<body>
<form enctype="multipart/form-data" action="/cgi-bin/set_wifi.py" method="POST">
ssid: <input type="text" size="70" name="ssid" value=""><br>
pass: <input type="text" size="70" name="pass" value=""><br>
devid: <input type="text" size="70" name="devid" value=""><br>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</form>
</body>
</html>
The content of start_wifi.py is as follows:
#!/usr/bin/python
import cgi
import cgitb
import subprocess
cgitb.enable()
print "Content-type: text/html\n\n"
form=cgi.FieldStorage()
ssid_val=form['ssid'].value
pass_val=form['pass'].value
devid=form['devid'].value
#Write Device ID to devid.text
myfile= open("/home/pi/project/devid.txt","w")
myfile.write(form['devid'].value)
myfile.close()
#Write SSID and PSK to wpa_supplicant.conf
file = open('/etc/wpa_supplicant/wpa_supplicant.conf','a')
file.write('\n\nnetwork={\n ssid="')
file.write(ssid_val)
file.write('"\n psk="')
file.write(pass_val)
file.write('"\n}')
file.close()
subprocess.call("sudo service hostapd stop", shell=True)
subprocess.call("sudo service isc-dhcp-server stop",shell=True)
subprocess.call("sudo ifdown wlan0",shell=True)
subprocess.call("sudo /etc/init.d/networking stop",shell=True)
subprocess.call("cp /etc/network/interfaces-manual /etc/network/interfaces",shell=True)
subprocess.call("sudo /etc/init.d/networking start",shell=True)
subprocess.call("sudo ifup wlan0",shell=True)
I have another python script called stopapd.py which is essentially everything after file.close() in the set_wifi.py script above. When I run it through the terminal it works fine. Stops networking, rewrites interfaces, restarts networking and re-establishes wlan0 if the network is already saved in wpa_supplicant.conf
The problem is that when set_wifi.py executes via cgi, the first half of the script works, it writes to devid.txt and wpa_supplicant.conf, but the only subproccess.call that I think is working correctly is the
cp /etc/network/interfaces-manual /etc/network/interfaces
which changes the interfaces file from static to dhcp...
None of the other commands seem to run...but when I run the same code as stopapd.py from the terminal it works...I don't know why...any help would be greatly appreciated.