add testServer

This commit is contained in:
andreas 2021-10-17 18:17:18 +02:00
parent 271e461be5
commit 8f03ad1373
5 changed files with 126 additions and 7 deletions

View File

@ -31,11 +31,12 @@ String GwConfigHandler::toString() const{
String GwConfigHandler::toJson() const{ String GwConfigHandler::toJson() const{
String rt; String rt;
DynamicJsonDocument jdoc(50); DynamicJsonDocument jdoc(300);
for (int i=0;i<getNumConfig();i++){ for (int i=0;i<getNumConfig();i++){
jdoc[configs[i]->getName()]=configs[i]->asString(); jdoc[configs[i]->getName()]=configs[i]->asCString();
} }
serializeJson(jdoc,rt); serializeJson(jdoc,rt);
logger->logString("configJson: %s",rt.c_str());
return rt; return rt;
} }
GwConfigItem * GwConfigHandler::findConfig(const String name, bool dummy){ GwConfigItem * GwConfigHandler::findConfig(const String name, bool dummy){
@ -61,6 +62,7 @@ bool GwConfigHandler::loadConfig(){
prefs.begin(PREF_NAME,true); prefs.begin(PREF_NAME,true);
for (int i=0;i<getNumConfig();i++){ for (int i=0;i<getNumConfig();i++){
String v=prefs.getString(configs[i]->getName().c_str(),configs[i]->getDefault()); String v=prefs.getString(configs[i]->getName().c_str(),configs[i]->getDefault());
configs[i]->fromString(v);
} }
prefs.end(); prefs.end();
return true; return true;
@ -68,6 +70,7 @@ bool GwConfigHandler::loadConfig(){
bool GwConfigHandler::saveConfig(){ bool GwConfigHandler::saveConfig(){
prefs.begin(PREF_NAME,false); prefs.begin(PREF_NAME,false);
for (int i=0;i<getNumConfig();i++){ for (int i=0;i<getNumConfig();i++){
logger->logString("saving %s=%s",configs[i]->getName().c_str(),configs[i]->asCString());
prefs.putString(configs[i]->getName().c_str(),configs[i]->asString()); prefs.putString(configs[i]->getName().c_str(),configs[i]->asString());
} }
prefs.end(); prefs.end();
@ -80,6 +83,12 @@ bool GwConfigHandler::updateValue(const char *name, const char * value){
logger->logString("update config %s=>%s",name,value); logger->logString("update config %s=>%s",name,value);
i->fromString(value); i->fromString(value);
} }
bool GwConfigHandler::updateValue(String name, String value){
GwConfigItem *i=findConfig(name);
if (i == NULL) return false;
logger->logString("update config %s=>%s",name.c_str(),value.c_str());
i->fromString(value);
}
bool GwConfigHandler::reset(bool save){ bool GwConfigHandler::reset(bool save){
logger->logString("reset config"); logger->logString("reset config");
for (int i=0;i<getNumConfig();i++){ for (int i=0;i<getNumConfig();i++){

View File

@ -65,6 +65,7 @@ class GwConfigHandler{
bool loadConfig(); bool loadConfig();
bool saveConfig(); bool saveConfig();
bool updateValue(const char *name, const char * value); bool updateValue(const char *name, const char * value);
bool updateValue(String name, String value);
bool reset(bool save); bool reset(bool save);
String toString() const; String toString() const;
String toJson() const; String toJson() const;
@ -74,14 +75,14 @@ class GwConfigHandler{
GwConfigInterface * getConfigItem(const String name, bool dummy=false) const; GwConfigInterface * getConfigItem(const String name, bool dummy=false) const;
private: private:
GwConfigItem* configs[5]={ GwConfigItem* configs[5]={
new GwConfigItem(sendUsb,true), new GwConfigItem(sendUsb,"true"),
new GwConfigItem (receiveUsb,false), new GwConfigItem (receiveUsb,"false"),
new GwConfigItem (wifiClient,false), new GwConfigItem (wifiClient,"false"),
new GwConfigItem (wifiSSID,""), new GwConfigItem (wifiSSID,""),
new GwConfigItem (wifiPass,"") new GwConfigItem (wifiPass,"")
}; };
int getNumConfig() const{ int getNumConfig() const{
return sizeof(configs)/sizeof(GwConfigItem*); return 5;
} }
}; };
#endif #endif

View File

@ -17,7 +17,7 @@ void GwWifi::setup(){
IPAddress AP_local_ip(192, 168, 15, 1); // Static address for AP IPAddress AP_local_ip(192, 168, 15, 1); // Static address for AP
IPAddress AP_gateway(192, 168, 15, 1); IPAddress AP_gateway(192, 168, 15, 1);
IPAddress AP_subnet(255, 255, 255, 0); IPAddress AP_subnet(255, 255, 255, 0);
WiFi.mode(WIFI_AP_STA); //enable both AP and client WiFi.mode(WIFI_MODE_APSTA); //enable both AP and client
WiFi.softAP(AP_ssid,AP_password); WiFi.softAP(AP_ssid,AP_password);
delay(100); delay(100);
WiFi.softAPConfig(AP_local_ip, AP_gateway, AP_subnet); WiFi.softAPConfig(AP_local_ip, AP_gateway, AP_subnet);

70
tools/testServer.py Executable file
View File

@ -0,0 +1,70 @@
#! /usr/bin/env python3
import shutil
import sys
import http
import http.server
import urllib.request
import posixpath
import os
class RequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
p=self.path
print("path=%s"%p)
if p.startswith("/api/"):
apiurl=self.server.proxyUrl
url=apiurl+p.replace("/api","")
print("proxy to %s"%url)
with urllib.request.urlopen(url) as response:
self.send_response(http.HTTPStatus.OK)
self.send_header("Content-type", response.getheader("Content-type"))
self.end_headers()
shutil.copyfileobj(response,self.wfile)
return None
self.send_error(http.HTTPStatus.NOT_FOUND, "api not found")
return None
super().do_GET()
def translate_path(self, path):
"""Translate a /-separated PATH to the local filename syntax.
Components that mean special things to the local file system
(e.g. drive or directory names) are ignored. (XXX They should
probably be diagnosed.)
"""
# abandon query parameters
path = path.split('?',1)[0]
path = path.split('#',1)[0]
# Don't forget explicit trailing slash when normalizing. Issue17324
trailing_slash = path.rstrip().endswith('/')
try:
path = urllib.parse.unquote(path, errors='surrogatepass')
except UnicodeDecodeError:
path = urllib.parse.unquote(path)
path = posixpath.normpath(path)
words = path.split('/')
words = filter(None, words)
path = self.server.baseDir
for word in words:
if os.path.dirname(word) or word in (os.curdir, os.pardir):
# Ignore components that are not a simple file/directory name
continue
path = os.path.join(path, word)
if trailing_slash:
path += '/'
return path
def run(baseDir,port,apiUrl,server_class=http.server.HTTPServer, handler_class=RequestHandler):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
httpd.proxyUrl=apiUrl
httpd.baseDir=baseDir
httpd.serve_forever()
if __name__ == '__main__':
if len(sys.argv) != 4:
print("usage: %s basedir port apiurl"%sys.argv[0])
sys.exit(1)
run(sys.argv[1],int(sys.argv[2]),sys.argv[3])

View File

@ -21,7 +21,27 @@
} }
}) })
} }
function resetForm(ev){
if (ev){
ev.preventDefault();
ev.stopPropagation();
}
fetch("/api/config")
.then(function(resp){
return resp.json();
})
.then(function(jsonData){
for (let k in jsonData){
let el=document.querySelector("[name='"+k+"']");
if (el){
let v=jsonData[k];
el.value=v;
}
}
});
}
window.setInterval(update,1000); window.setInterval(update,1000);
resetForm();
</script> </script>
<style type="text/css"> <style type="text/css">
#wrap #wrap
@ -65,6 +85,25 @@ span.label {
<span class="label">wifi client IP</span> <span class="label">wifi client IP</span>
<span class="value" id="clientIP">---</span> <span class="value" id="clientIP">---</span>
</div> </div>
<form action="/api/setConfig">
<div class="row">
<span class="label">wifiClient</span>
<select name="wifiClient">
<option value="true">On</option>
<option value="false" selected="selected">Off</option>
</select>
</div>
<div class="row">
<span class="label">wifiClientPass</span>
<input name="wifiPass" type="text">
</div>
<div class="row">
<span class="label">wifiClientSSID</span>
<input name="wifiSSID" type="text">
</div>
<button onClick="resetForm()">Reset</button>
<button type="submit">Save&Restart</button>
</form>
<button id="reset" onclick="reset();">Reset</button> <button id="reset" onclick="reset();">Reset</button>
</div> </div>
</body> </body>