Skip to content

Commit

Permalink
Signal handlers for graceful shutdown, re-read config on SIGUSR1 plus…
Browse files Browse the repository at this point in the history
… fix timeout bugs
  • Loading branch information
Evan Langlois committed Jun 12, 2018
1 parent b73281b commit 72f3755
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 21 deletions.
61 changes: 45 additions & 16 deletions server.py
Expand Up @@ -23,6 +23,10 @@ def get_request(self):
pass
return result

def server_bind(self):
HTTPServer.server_bind(self)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)


class Handler(BaseHTTPRequestHandler):
def _set_headers(self):
Expand All @@ -48,7 +52,8 @@ def do_GET(self):
if RestrictAccess and self.client_address[0] not in RestrictAccess:
return self.access_denied()
return self.messageHandler()
except NameError:
except NameError as e:
print ("Error: %s" % e)
self.password_required()
except NameError: #- No security specified
self.messageHandler()
Expand All @@ -66,7 +71,6 @@ def do_POST(self):
else:
print ("TRY %s != %s" % (GlobalPassword, password))
except NameError:
print ("NameError")
return self.password_required()
print ("LSE %s != %s" % (GlobalPassword, parameters['password']))
self.password_required()
Expand Down Expand Up @@ -331,33 +335,34 @@ def start(server_class=Server, handler_class=Handler, port=8080, listen='0.0.0.0
server_address = (listen, port)
httpd = server_class(server_address, handler_class)
httpd.timeout = timeout
print ('Starting broadlink-rest server on %s:%s ...' % (listen,port))
httpd.serve_forever()


if __name__ == "__main__":

settingsFile = configparser.ConfigParser()
settingsFile.optionxform = str
settingsFile.read(settings.settingsINI)
print ('\nStarting broadlink-rest server on %s:%s ...' % (listen,port))
while not InterruptRequested:
httpd.handle_request()

def readSettingsFile():
global devices
global DeviceByName
global GlobalTimeout
global RestrictedAccess
global RestrictAccess
global LearnFrom
global OverwriteProtected
global GlobalPassword
global GlobalTimeout
global settingsFile

# A few defaults
GlobalTimeout = 2
DiscoverTimeout = 5
serverPort = 8080
Autodetect = False
OverwriteProtected = True
listen_address = '0.0.0.0'
broadcast_address = '255.255.255.255'

settingsFile = configparser.ConfigParser()
settingsFile.optionxform = str
settingsFile.read(settings.settingsINI)

Dev = settings.Dev
GlobalTimeout = settings.GlobalTimeout
DiscoverTimeout = settings.DiscoverTimeout

# Override them
if settingsFile.has_option('General', 'password'):
Expand Down Expand Up @@ -449,5 +454,29 @@ def start(server_class=Server, handler_class=Handler, port=8080, listen='0.0.0.0
devices.append(device)
print ("%s: Found %s on %s (%s)" % (devname, device.type, str(device.host[0]), device.mac))
DeviceByName[devname] = device
return { "port": serverPort, "listen": listen_address, "timeout": GlobalTimeout }

def SigUsr1(signum, frame):
print ("\nReloading configuration ...")
global InterruptRequested
InterruptRequested = True

start(port=serverPort,listen=listen_address,timeout=GlobalTimeout)
def SigInt(signum, frame):
print ("\nShuting down server ...")
global ShutdownRequested
global InterruptRequested
ShutdownRequested = True
InterruptRequested = True

if __name__ == "__main__":
global ShutdownRequested
global InteruptRequested
ShutdownRequested = False
signal.signal(signal.SIGUSR1,SigUsr1)
signal.signal(signal.SIGINT,SigInt)
while not ShutdownRequested:
serverParams = readSettingsFile()
InterruptRequested = False
start(**serverParams)
if not ShutdownRequested:
reload(settings)
4 changes: 2 additions & 2 deletions settings.ini
@@ -1,12 +1,12 @@
[General]
Timeout = 2
Timeout = 4
serverPort = 8080
serverAddress = 192.168.12.200
Autodetect = 6

[Commands]

[LivingRoom-BlackBean]
[LivingRoom]
IPAddress = 192.168.12.171
MACAddress = b4:43:0d:f9:16:11
Device = 0x2737
Expand Down
5 changes: 2 additions & 3 deletions settings.py
Expand Up @@ -9,10 +9,9 @@
settings = configparser.ConfigParser()
settings.read(settingsINI)

DiscoverTimeout = GlobalTimeout = 5
if settings.has_option('General', 'Timeout'):
DiscoverTimeout = Timeout = settings.get('General', 'Timeout')
else:
DiscoverTimeout = Timeout = 5
DiscoverTimeout = GlobalTimeout = int(settings.get('General', 'Timeout').strip())

DevList = []
Dev = defaultdict(dict)
Expand Down

0 comments on commit 72f3755

Please sign in to comment.