Commit 894ff02a authored by nextime's avatar nextime

send a SETTIME when an invalid packet is received

parent ddf5881a
...@@ -302,9 +302,10 @@ class domotikaService(service.Service): ...@@ -302,9 +302,10 @@ class domotikaService(service.Service):
self.sendCommand(str(st), msgtype=C.IKAP_MSG_ACTION, ctx=C.IKAP_CTX_STATUS, act=C.IKAP_ACT_CHANGE, ipdst=ipdst) self.sendCommand(str(st), msgtype=C.IKAP_MSG_ACTION, ctx=C.IKAP_CTX_STATUS, act=C.IKAP_ACT_CHANGE, ipdst=ipdst)
def broadcastTime(self): def broadcastTime(self, ipdst="255.255.255.255"):
log.debug("Broadcasting Time...") if self.config.get("general", "timeserver").lower() in ['yes','y','1','true', 'on']:
self.sendCommand("SETTIME", arg=struct.pack("<L", int(time.time())), act=C.IKAP_ACT_BOARD, ctx=C.IKAP_CTX_SYSTEM, msgtype=C.IKAP_MSG_ACTION) log.debug("Broadcasting Time to "+str(ipdst))
self.sendCommand("SETTIME", arg=struct.pack("<L", int(time.time())), act=C.IKAP_ACT_BOARD, ctx=C.IKAP_CTX_SYSTEM, msgtype=C.IKAP_MSG_ACTION, ipdst=ipdst)
def initializePlugins(self): def initializePlugins(self):
...@@ -2357,6 +2358,9 @@ class domotikaService(service.Service): ...@@ -2357,6 +2358,9 @@ class domotikaService(service.Service):
def plugin_on_execute(cmd): def plugin_on_execute(cmd):
self.executeAction(cmd) self.executeAction(cmd)
def domika_on_broadcastTime(self, ipdst="255.255.255.255"):
self.broadcastTime(ipdst)
def domika_on_updateWebPort(self, src, host, webport, port, ptype): def domika_on_updateWebPort(self, src, host, webport, port, ptype):
return dmdb.updateWebPort(src, host, webport) return dmdb.updateWebPort(src, host, webport)
......
...@@ -194,7 +194,8 @@ class DomIkaBaseProtocol(object): ...@@ -194,7 +194,8 @@ class DomIkaBaseProtocol(object):
if dst.startswith("DEBUG.INPUT.CHANGED.TO") or dst.startswith("DEBUG.RELAY.CHANGED.TO"): if dst.startswith("DEBUG.INPUT.CHANGED.TO") or dst.startswith("DEBUG.RELAY.CHANGED.TO"):
arg=struct.unpack('B', arg[0])[0] arg=struct.unpack('B', arg[0])[0]
elif self.ikahdr.msgtype==C.IKAP_MSG_NOTIFY and dst.startswith("BOOTED."): elif self.ikahdr.msgtype==C.IKAP_MSG_NOTIFY and dst.startswith("BOOTED."):
self.sendCommand("SETTIME", arg=struct.pack("<L", int(time.time())), act=C.IKAP_ACT_BOARD, ctx=C.IKAP_CTX_SYSTEM, msgtype=C.IKAP_MSG_ACTION, ipdst=host) self.core.broadcastTime(host)
#self.sendCommand("SETTIME", arg=struct.pack("<L", int(time.time())), act=C.IKAP_ACT_BOARD, ctx=C.IKAP_CTX_SYSTEM, msgtype=C.IKAP_MSG_ACTION, ipdst=host)
elif self.ikahdr.msgtype==C.IKAP_MSG_NOTIFY and self.ikahdr.ctx==C.IKAP_CTX_SYSTEM and dst=='RELAY.AMPERE.LIMIT': elif self.ikahdr.msgtype==C.IKAP_MSG_NOTIFY and self.ikahdr.ctx==C.IKAP_CTX_SYSTEM and dst=='RELAY.AMPERE.LIMIT':
try: try:
log.info("Relay "+str(struct.unpack("<B", arg[1])[0])+" has gone in overrun at "+str(float(struct.unpack("<B", arg[0])[0])/10.0)+" Ampere") log.info("Relay "+str(struct.unpack("<B", arg[1])[0])+" has gone in overrun at "+str(float(struct.unpack("<B", arg[0])[0])/10.0)+" Ampere")
...@@ -356,6 +357,8 @@ class DomIkaBaseProtocol(object): ...@@ -356,6 +357,8 @@ class DomIkaBaseProtocol(object):
self.core.manageIncomingPacket(self.ikahdr, src, dst, arg, host, port, ptype, argdict, data) self.core.manageIncomingPacket(self.ikahdr, src, dst, arg, host, port, ptype, argdict, data)
else: else:
log.error("INVALID PACKET TIME FROM "+str(host)+" - packet time: "+str(self.ikahdr.epoch)+" now: "+str(time.time())) log.error("INVALID PACKET TIME FROM "+str(host)+" - packet time: "+str(self.ikahdr.epoch)+" now: "+str(time.time()))
# XXX Set a min time between resend the time broadcasting to avoid DoS?
self.core.broadcastTime(host)
self.invalidPacket() self.invalidPacket()
else: else:
log.error("INVALID PACKET (second check) FROM "+str(host)) log.error("INVALID PACKET (second check) FROM "+str(host))
...@@ -448,7 +451,8 @@ class DomIkaTCP(Int8StringReceiver, DomIkaBaseProtocol): ...@@ -448,7 +451,8 @@ class DomIkaTCP(Int8StringReceiver, DomIkaBaseProtocol):
self.disconnected=False self.disconnected=False
self.sendCommand("IOSTATUS.NOW", arg=C.IKAP_BROADCAST, act=C.IKAP_ACT_BOARD, self.sendCommand("IOSTATUS.NOW", arg=C.IKAP_BROADCAST, act=C.IKAP_ACT_BOARD,
ctx=C.IKAP_CTX_SYSTEM, msgtype=C.IKAP_MSG_REQUESTCONF) ctx=C.IKAP_CTX_SYSTEM, msgtype=C.IKAP_MSG_REQUESTCONF)
self.sendCommand("SETTIME", arg=struct.pack("<L", int(time.time())), act=C.IKAP_ACT_BOARD, ctx=C.IKAP_CTX_SYSTEM, msgtype=C.IKAP_MSG_ACTION) #self.sendCommand("SETTIME", arg=struct.pack("<L", int(time.time())), act=C.IKAP_ACT_BOARD, ctx=C.IKAP_CTX_SYSTEM, msgtype=C.IKAP_MSG_ACTION)
self.core.broadcastTime()
def invalidPacket(self): def invalidPacket(self):
try: try:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment