2015-05-09 2 views
0

Итак, у меня есть малина 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 с терминала, он работает ... Я не знаю, почему ... помощь будет очень признательна.

ответ

0

Это сводит меня с ума, но я продолжал работать над ней, и вот что я придумал ...

В set_wifi.py я закомментирована все после file.close() и добавил

file=open('/home/pi/project/set_wifi_ran.txt','w') 
file.write('set_wifi_ran') 
file.close() 

Тогда у меня есть еще один скрипт работает все время под названием stopapd.py ... он контролирует set_wifi_ran.txt, и если он когда-либо изменения она выполняет subprocess.calls ... который решает все мои проблемы

while True: 
    file=open('/home/pi/project/set_wifi_ran.txt') 
    length=(file.readline()) 
    file.close() 

    if length>0 
     file=open('/home/pi/project/set_wifi_ran.txt','w') 
     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) 

Я уверен, что это не очень элегантный способ сделать это ... Я был бы признателен за любую обратную связь, и мне все равно было бы интересно узнать, почему это не работает через скрипт cgi.

0

sudo будет работать только для пользователей, указанных в файле sudoers (/etc/sudoers). Очень вероятно, что ваш веб-сервер работает с другим пользователем без возможности sudo.

Это объясняет, почему выполняются только команды non sudo.

Либо используйте существующее решение сторожевого таймера, либо добавьте пользователя веб-сервера в файл sudoers. Или используйте пользовательский веб-сервер, работающий как ваш пользователь.