Итак, у меня есть малина Pi, которую я настроил как точка доступа с hostapd и isc-dhcp-сервером. Он транслирует SSID, я подключаюсь к нему с помощью своего телефона или ноутбука, перейдите к 192.168.42.1, и он обслуживает страницу, где у меня есть форма для SSID, PSK и Device ID. Идея состоит в том, что он должен затем подключиться к сети с информацией, которую я дал ей, вызывая кучу вызовов подпроцессов, так как это не так.subproccess.call через python cgi script raspberry pi
Это 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>
Содержание start_wifi.py выглядит следующим образом:
#!/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)
У меня есть еще один питон скрипт под названием stopapd.py, который, по существу, все после того, как файл .close() в скрипте set_wifi.py выше. Когда я запускаю его через терминал, он работает нормально. Прекращает работу с сетью, перезаписывает интерфейсы, перезапускает сеть и восстанавливает wlan0, если сеть уже сохранена в wpa_supplicant.conf
Проблема в том, что при выполнении set_wifi.py через cgi первая половина скрипта работает, она записывает devid.txt и wpa_supplicant.conf, но только subproccess.call, что я думаю, правильно ли работает это
cp /etc/network/interfaces-manual /etc/network/interfaces
который изменяет файл интерфейсов от статического DHCP ... не
ни один из других команд похоже, запускается ... но когда я запускаю тот же код, что и stopapd.py с терминала, он работает ... Я не знаю, почему ... помощь будет очень признательна.