30 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
32 s.connect((
'8.8.8.8', 53))
33 host = s.getsockname()[0]
40 def __init__(self, port=8000, coap_port=5683, login=None, password=None, passwdfile=None, configfile=None, scriptfile=None):
44 manager.addDeviceInstance(
"GPIO", self.
gpio, [])
46 if configfile !=
None:
47 logger.info(
"Loading configuration from %s" % configfile)
48 config =
Config(configfile)
52 self.gpio.addSetups(config.items(
"GPIO"))
53 self.gpio.addResets(config.items(
"~GPIO"))
56 devices = config.items(
"DEVICES")
57 for (name, params)
in devices:
58 values = params.split(
" ")
62 while i < len(values):
63 (arg, val) = values[i].split(
":")
66 manager.addDevice(name, driver, args)
69 if scriptfile !=
None:
70 scriptname = scriptfile.split(
"/")[-1].split(
".")[0]
71 loader.loadScript(scriptname, scriptfile, self.
restHandler)
73 scripts = config.items(
"SCRIPTS")
74 for (name, source)
in scripts:
77 self.restHandler.device_mapping = config.getboolean(
"REST",
"device-mapping",
True)
78 self.gpio.post_value = config.getboolean(
"REST",
"gpio-post-value",
True)
79 self.gpio.post_function = config.getboolean(
"REST",
"gpio-post-function",
True)
80 exports = config.get(
"REST",
"gpio-export",
None)
82 self.gpio.export = [int(s)
for s
in exports.split(
",")]
83 self.restHandler.export = self.gpio.export
85 http_port = config.getint(
"HTTP",
"port", port)
86 http_enabled = config.getboolean(
"HTTP",
"enabled", http_port > 0)
87 http_passwdfile = config.get(
"HTTP",
"passwd-file", passwdfile)
88 context = config.get(
"HTTP",
"context",
None)
89 docroot = config.get(
"HTTP",
"doc-root",
None)
90 index = config.get(
"HTTP",
"welcome-file",
None)
92 coap_port = config.getint(
"COAP",
"port", coap_port)
93 coap_enabled = config.getboolean(
"COAP",
"enabled", coap_port > 0)
94 coap_multicast = config.getboolean(
"COAP",
"multicast", coap_enabled)
96 routes = config.items(
"ROUTES")
97 for (source, destination)
in routes:
98 self.restHandler.addRoute(source, destination)
101 if http_passwdfile !=
None:
102 if os.path.exists(http_passwdfile):
103 f = open(http_passwdfile)
104 auth = f.read().strip(
" \r\n")
107 logger.info(
"Access protected using %s" % http_passwdfile)
109 logger.info(
"Passwd file %s is empty" % http_passwdfile)
111 logger.error(
"Passwd file %s not found" % http_passwdfile)
113 elif login !=
None or password !=
None:
114 auth = crypto.encryptCredentials(login, password)
115 logger.info(
"Access protected using login/password")
117 if auth ==
None or len(auth) == 0:
118 logger.warn(
"Access unprotected")
120 realm = config.get(
"HTTP",
"prompt",
None)
130 self.coap_server.enableMulticast()
135 self.restHandler.addMacro(macro)
139 self.http_server.stop()
141 self.coap_server.stop()
142 loader.unloadScripts()
143 manager.closeDevices()