def scenario_edit(id): default_json = '{"type":"dom_condition","id":"1","deletable":false}' # laod the json if int(id) == 0: name = "New scenario" jso = default_json dis = 0 else: with app.db.session_scope(): scen = app.db.get_scenario(id) jso = scen.json dis = scen.disabled name = scen.name jso.replace('\n', '').replace('\r', '') # create a form class F(Form): sid = HiddenField("id", default=id) sname = TextField("name", default=name) sdis = BooleanField("disabled", default=dis) sjson = HiddenField("json") submit = SubmitField("Send") pass form = F() if request.method == 'POST' and form.validate(): flash(gettext("Changes saved"), "success") return redirect("/scenario") pass else: # Fetch all known actions actions = [] cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('action.list') res = cli.request('scenario', msg.get(), timeout=10) if res is not None: res = res.get_data() if 'result' in res: res = res['result'] actions = res.keys() # Fetch all known tests tests = [] cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('test.list') res = cli.request('scenario', msg.get(), timeout=10) if res is not None: res = res.get_data() if 'result' in res: res = res['result'] tests = res.keys() # ouput return render_template('scenario_edit.html', mactive="scenario", form=form, name=name, actions=actions, tests=tests, jso=jso)
def client_devices_edit(client_id, did): with app.db.session_scope(): device = app.db.get_device_sql(did) MyForm = model_form(Device, \ base_class=Form, \ db_session=app.db.get_session(), exclude=['params', 'commands', 'sensors', 'address', 'xpl_commands', 'xpl_stats', 'device_type_id', 'client_id', 'client_version']) form = MyForm(request.form, device) if request.method == 'POST' and form.validate(): # save it app.db.update_device(did, \ d_name=request.form['name'], \ d_description=request.form['description'], \ d_reference=request.form['reference']) # message the suer flash(gettext("Device saved"), 'success') # reload stats req = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('reload') resp = req.request('xplgw', msg.get(), 100) # redirect return redirect("/client/{0}/dmg_devices/known".format(client_id)) else: return render_template('client_device_edit.html', form=form, clientid=client_id, mactive="clients", active='devices')
def __init__(self, log=None, trigger=None): AbstractParameter.__init__(self, log, trigger) self.log = log #self.set_type("string") #self.add_expected_entry("sensor_id", "integer", "The sensor id to check") # first, let's get the devices list try: cli = MQSyncReq(zmq.Context()) msg = MQMessage() msg.set_action('device.get') json_devices = cli.request('dbmgr', msg.get(), timeout=10).get()[1] devices = json.loads(json_devices)['devices'] print(devices) sensors_list = [] for dev in devices: name = dev['name'] for sen_idx in dev['sensors']: sen_name = dev['sensors'][sen_idx]['name'] sen_id = dev['sensors'][sen_idx]['id'] sensors_list.append([ '{0} : {1}'.format(name, sen_name), '{0}'.format(sen_id) ]) print(sensors_list) except: self.log.error("Error while getting devices list : {0}".format( traceback.format_exc())) # then, et's configure our sensor id selector :) self.set_type("list") self.add_expected_entry("sensor_id", "list", "The sensor id to check") #list_sensors = [['sensor1', 'sensor2'], ['a', 'A']] self.set_list_of_values("sensor_id", sensors_list)
def request_stop(self): """ Request the plugin to stop """ print(u"Request plugin to stop : '{0}' on '{1}'".format( self.name, self.host)) cli = MQSyncReq(zmq.Context()) msg = MQMessage() msg.set_action('plugin.stop.do') msg.add_data('name', self.name) msg.add_data('host', self.host) result = cli.request("plugin-{0}.{1}".format(self.name, self.host), msg.get(), timeout=30) if result: msgid, content = result.get() content = json.loads(content) print(u"Response : {0}".format(content)) if content['status']: print(u"Plugin stopped") return True else: print(u"Error : plugin not stopped") return False else: raise RuntimeError( "MQ Timeout when requesting to stop the plugin (the plugin didn't stop itself)" )
def delete(self, did): """ @api {del} /device/id Delete a device @apiName delDevice @apiGroup Device @apiParam {Number} id The id of the device to be deleted @apiSuccess {String} none No data is returned @apiSuccessExample Success-Response: HTTTP/1.1 200 OK @apiErrorExample Error-Response: HTTTP/1.1 500 INTERNAL SERVER ERROR """ cli = MQSyncReq(urlHandler.zmq_context) msg = MQMessage() msg.set_action('device.delete') msg.set_data({'did': did}) res = cli.request('dbmgr', msg.get(), timeout=10) if res is not None: data = res.get_data() if data["status"]: return 201, None else: return 500, data["reason"] else: return 500, "DbMgr did not respond on the device.create, check the logs" return 201, None
def __init__(self): Plugin.__init__(self, name='scenario', log_prefix='core_') ### check that needed services are up on MQ side cli = MQSyncReq(zmq.Context()) mq_services = None while mq_services == None or 'xplgw' not in mq_services: mq_services_raw = cli.rawrequest('mmi.services', '', timeout=10) if mq_services_raw != None: mq_services = str(mq_services_raw[0]).replace(" ", "").split(",") self.log.info("Checking for MQ services : {0}".format(mq_services)) if mq_services == None or 'xplgw' not in mq_services: self.log.debug( "Needed MQ services not yet available : waiting") time.sleep(3) self.log.info("Needed MQ services available : continuing startup") ### start the scenario stuff self._backend = ScenarioManager(self.log) self.add_stop_cb(self.end) self.add_stop_cb(self.shutdown) self.log.info( u"Scenario Frontend and Manager initialized, let's wait for some work." ) self.ready()
def __init__(self, log, dbid, name, json, disabled): """ Create the instance @param log : A logger instance @param dbid : The id of this scenario in the db @param json : The json describing the scenario """ self._log = log self._name = name self._json = json self._disabled = disabled self.zmq = zmq.Context() # datatypes self.datatypes = {} cli = MQSyncReq(self.zmq) msg = MQMessage() msg.set_action('datatype.get') res = cli.request('manager', msg.get(), timeout=10) if res is not None: res = res.get_data() if 'datatypes' in res: self.datatypes = res['datatypes'] self._parsed_condition = None self._mapping = {'test': {}, 'action': {}} if not self._disabled: self._instanciate()
def delete_configuration(type, name, host): cli = MQSyncReq(zmq.Context()) msg = MQMessage() msg.set_action('config.delete') msg.add_data('type', type) msg.add_data('host', host) msg.add_data('name', name) result = cli.request('dbmgr', msg.get(), timeout=10) if result: data = result.get_data() if 'status' in data: if not data['status']: print(result.get()) raise RuntimeError( "DbMgr did not return status true on a config.set for {0}-{1}.{2} : {3} = {4}" .format(type, name, host, key, value)) else: return True else: print(result.get()) raise RuntimeError( "DbMgr did not return a status on a config.set for {0}-{1}.{2} : {3} = {4}" .format(type, name, host, key, value)) else: raise RuntimeError( "Timeout while deleting configuration for {0}-{1}.{2}".format( type, name, host))
def WSCommandSend(self, data): cli = MQSyncReq(zmq.Context()) msg = MQMessage() msg.set_action('cmd.send') msg.add_data('cmdid', data['command_id']) msg.add_data('cmdparams', data['parameters']) return cli.request('xplgw', msg.get(), timeout=10).get()
def sendToMQ(self, message): try: ctx = zmq.Context() jsons = json.loads(message) # req/rep if 'mq_request' in jsons and 'data' in jsons: cli = MQSyncReq(ctx) msg = MQMessage() msg.set_action(str(jsons['mq_request'])) msg.set_data(jsons['data']) print(u"REQ : {0}".format(msg.get())) if 'dst' in jsons: dst = str(jsons['dst']) else: dst = 'manager' res = cli.request(dst, msg.get(), timeout=10) if res: print(res.get()) cli.shutdown() del cli # pub elif 'mq_publish' in jsons and 'data' in jsons: self.pub.send_event(jsons['mq_publish'], jsons['data']) except Exception as e: print(u"Error sending mq message: {0}".format(e))
def client_devices_new(client_id): cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('client.detail.get') res = cli.request('manager', msg.get(), timeout=10) if res is not None: detaila = res.get_data() data = detaila[client_id]['data'] else: data = {} if type(data["device_types"]) is not dict: dtypes = {} else: dtypes = list(data["device_types"].keys()) products = {} if "products" in data: for prod in data["products"]: products[prod["name"]] = prod["type"] return render_template('client_device_new.html', device_types=dtypes, products=products, clientid=client_id, mactive="clients", active='devices')
def test_XplCmd(self, parameters={}, statParams=None): """Send an Xpl cmd with statics parameters by request, if necessary start testcase listener for ack message and check if insert in database is ok. """ if self.get_return_confirmation(): schema, data, statResult = self.get_XplStat_fromAck(statParams) th = threading.Thread( None, self.assert_Xpl_Stat_Ack_Wait, "th_test_0110_xpl-ack_from_{0}".format(self.command_name), (schema, data, statResult)) th.start() time.sleep(1) else: print(u"No ack required for {0}".format(self.command_name)) if self._device and self.command_id: cli = MQSyncReq(zmq.Context()) msg = MQMessage() msg.set_action('cmd.send') msg.add_data('cmdid', self.command_id) msg.add_data('cmdparams', parameters) print(u"Send xpl_cmnd {0}".format(self.command_name)) cli.request('xplgw', msg.get(), timeout=10) # if self.get_return_confirmation() : # self.assert_get_last_command_in_db(statResult) # else : # print (u"No ack required for {0}".format(self.command_name)) return True else: return False
def request_startup(self): """ Request the plugin to start over the manager """ print( u"Request plugin startup to the manager for '{0}' on '{1}'".format( self.name, self.host)) cli = MQSyncReq(zmq.Context()) msg = MQMessage() msg.set_action('plugin.start.do') msg.add_data('name', self.name) msg.add_data('host', self.host) result = cli.request('manager', msg.get(), timeout=10) if result: msgid, content = result.get() content = json.loads(content) print(u"Response from the manager : {0}".format(content)) if content['status']: print(u"Plugin started") return True else: print(u"Error : plugin not started") return False else: raise RuntimeError( "MQ Timeout when requesting manager to start the plugin")
def scenario_blocks_actions(): """ Blockly.Blocks['dom_action_log'] = { init: function() { this.setColour(160); this.appendDummyInput() .appendField('Log Message') .appendField(new Blockly.FieldTextInput("<message to log>"), "message"); this.setPreviousStatement(true, "null"); this.setNextStatement(true, "null"); this.setTooltip(''); this.setInputsInline(false); this.contextMenu = false; } }; """ js = "" cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('action.list') res = cli.request('scenario', msg.get(), timeout=10) if res is not None: res = res.get_data() if 'result' in res: res = res['result'] for act, params in res.iteritems(): p = [] jso = "" for par, parv in params['parameters'].iteritems(): papp = "this.appendDummyInput().appendField('{0}')".format( parv['description']) if parv['type'] == 'string': jso = '{0}, "{1}": "\'+ block.getFieldValue(\'{1}\') + \'" '.format( jso, par) papp = "{0}.appendField(new Blockly.FieldTextInput('{1}'), '{2}');".format( papp, parv['default'], par) elif parv['type'] == 'integer': jso = '{0}, "{1}": \'+ block.getFieldValue(\'{1}\') + \' '.format( jso, par) papp = "{0}.appendField(new Blockly.FieldTextInput('{1}'), '{2}');".format( papp, parv['default'], par) else: papp = "{0};".format(papp) p.append(papp) add = """Blockly.Blocks['{0}'] = {{ init: function() {{ this.setHelpUrl(''); this.setColour(160); this.appendDummyInput().appendField("{0}"); {1} this.setPreviousStatement(true, "null"); this.setNextStatement(true, "null"); this.setTooltip('{2}'); this.setInputsInline(false); }} }}; """.format(act, '\n'.join(p), params['description'], jso) js = '{0}\n\r{1}'.format(js, add) return Response(js, content_type='text/javascript; charset=utf-8')
def reload_stats(self): self.log.debug(u"=============== reload stats") req = MQSyncReq(self.zmq) msg = MQMessage() msg.set_action( 'reload' ) resp = req.request('xplgw', msg.get(), 100) self.log.debug(u"Reply from xplgw: {0}".format(resp)) self.log.debug(u"=============== reload stats END")
def scenario_disable(id): cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('scenario.disable') msg.add_data('cid', id) res = cli.request('scenario', msg.get(), timeout=10) flash(gettext(u"Scenario disabled"), u"success") return redirect(u"/scenario") pass
def _load_client_to_xpl_target(self): cli = MQSyncReq(self.zmq) msg = MQMessage() msg.set_action('client.list.get') response = cli.request('manager', msg.get(), timeout=10) if response: self._parse_xpl_target(response.get_data()) else: self.log.error(u"Updating client list was not successfull, no response from manager")
def __init__(self, server_interfaces, server_port): """ Initiate DbHelper, Logs and config Then, start HTTP server and give it initialized data @param server_interfaces : interfaces of HTTP server @param server_port : port of HTTP server """ Plugin.__init__(self, name='admin') # logging initialization self.log.info(u"Admin Server initialisation...") self.log.debug(u"locale : %s %s" % locale.getdefaultlocale()) try: try: cfg_rest = Loader('admin') config_rest = cfg_rest.load() conf_rest = dict(config_rest[1]) self.interfaces = conf_rest['interfaces'] self.port = conf_rest['port'] # if rest_use_ssl = True, set here path for ssl certificate/key self.use_ssl = conf_rest['use_ssl'] self.key_file = conf_rest['ssl_certificate'] self.cert_file = conf_rest['ssl_key'] except KeyError: # default parameters self.interfaces = server_interfaces self.port = server_port self.use_ssl = False self.key_file = "" self.cert_file = "" self.clean_json = False self.log.info(u"Configuration : interfaces:port = %s:%s" % (self.interfaces, self.port)) # get all datatypes cli = MQSyncReq(self.zmq) msg = MQMessage() msg.set_action('datatype.get') res = cli.request('manager', msg.get(), timeout=10) if res is not None: self.datatypes = res.get_data()['datatypes'] else: self.datatypes = {} # Launch server, stats self.log.info(u"Admin Initialisation OK") self.add_stop_cb(self.stop_http) self.server = None self.start_http() # calls the tornado.ioloop.instance().start() ### Component is ready self.ready(0) IOLoop.instance().start() except: self.log.error(u"%s" % self.get_exception())
def orphans_delete(did): with app.db.session_scope(): app.db.del_device(did) # reload stats req = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('reload') resp = req.request('xplgw', msg.get(), 100) flash(gettext("Device deleted"), "success") return redirect("/orphans")
def __init__(self, zmq, log): ''' Init the query system and connect it to xPL network @param zmq : the zMQ context @param log : a Logger instance (usually took from self.log)) ''' self._zmq = zmq self._log = log self._log.debug("Init config query(mq) instance") self.cli = MQSyncReq(self._zmq)
def get_clients_list(): cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('client.list.get') res = cli.request('manager', msg.get(), timeout=10) if res is not None: client_list = res.get_data() else: client_list = {} return client_list
def get_butler_history(): cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('butler.history.get') res = cli.request('butler', msg.get(), timeout=10) if res is not None: history = res.get_data()['history'] else: history = [] return history
def get_client_detail(client_id): cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('client.detail.get') res = cli.request('manager', msg.get(), timeout=10) if res is not None: detaila = res.get_data() detail = detaila[client_id] else: detail = {} return detail
def get_brain_content(client_id): # get data over MQ cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('butler.scripts.get') res = cli.request('butler', msg.get(), timeout=10) if res is not None: data = res.get_data() detail = {} try: detail[client_id] = data[client_id] except KeyError: # this can happen if you install a package and don't do a butler reload! detail[client_id] = None else: detail = {} # sorting detail = json.dumps(detail, sort_keys=True) detail = json.loads(detail, object_pairs_hook=OrderedDict) # do a post processing on content to add html inside for client_id in detail: # we skip the learn file if client_id in ["learn", "not_understood"]: continue if detail[client_id]: for lang in detail[client_id]: idx = 0 for file in detail[client_id][lang]: content = html_escape(detail[client_id][lang][file]) # python objects idx += 1 reg = re.compile(r"> object", re.IGNORECASE) content = reg.sub( "<button class='btn btn-info' onclick=\"$('#python_object_{0}').toggle();\"><span class='glyphicon glyphicon-paperclip' aria-hidden='true'></span> python object</button><div class='python' id='python_object_{0}' style='display: none'>> object" .format(idx), content) reg = re.compile(r"< object", re.IGNORECASE) content = reg.sub("< object</div>", content) # trigger reg = re.compile(r"\+(?P<trigger>.*)", re.IGNORECASE) content = reg.sub("<strong>+\g<trigger></strong>", content) # comments reg = re.compile(r"//(?P<comment>.*)", re.IGNORECASE) content = reg.sub("<em>//\g<comment></em>", content) detail[client_id][lang][file] = content else: detail[client_id] = "" return detail
def get_openzwave_all_products(abort = False): data = {u'data': [], u'error': u''} if not abort : cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('ozwave.openzwave.getallproducts') res = cli.request('plugin-ozwave.{0}'.format(get_sanitized_hostname()), msg.get(), timeout=10) if res is not None: data = res.get_data() else : data['error'] = u'Plugin timeout response.' return data
def get_manager_status(abort = False): data = {u'status': u'dead', u'rfPlayers': [], u'error': u''} if not abort : cli = MQSyncReq(app.zmq_context ) msg = MQMessage() msg.set_action('rfplayer.manager.getstatus') res = cli.request('plugin-rfplayer.{0}'.format(get_sanitized_hostname()), msg.get(), timeout=10) if res is not None: data = res.get_data() else : data['error'] = u'Plugin timeout response.' return data
def trigger_bool_command(dt_type, device, value): try: device_name = device.lower() cli = MQSyncReq(zmq.Context()) msg = MQMessage() msg.set_action('device.get') str_devices = cli.request('dbmgr', msg.get(), timeout=10).get()[1] devices = json.loads(str_devices)['devices'] found = None for a_device in devices: if a_device['name'].lower() == device_name: cid = 0 for a_command in a_device['commands']: pid = 0 for a_param in a_device['commands'][a_command][ 'parameters']: if a_param['data_type'] == dt_type: found = [a_device, a_command, pid] break pid = pid + 1 else: continue cid = cid + 1 break if found: dev = found[0] cid = found[1] pid = found[2] cli = MQSyncReq(zmq.Context()) msg = MQMessage() msg.set_action('cmd.send') msg.add_data('cmdid', dev['commands'][cid]['id']) msg.add_data( 'cmdparams', {dev['commands'][cid]['parameters'][pid]['key']: value}) return cli.request('xplgw', msg.get(), timeout=10).get() else: return None except: print("ERROR : {0}".format(traceback.format_exc())) return None
def _mdp_reply_devices_create_result(self, data): status = True reason = False result = False # get the filled package json params = data.get_data()['data'] # get the json cli = MQSyncReq(self.zmq) msg = MQMessage() msg.set_action('device_types.get') msg.add_data('device_type', params['device_type']) res = cli.request('manager', msg.get(), timeout=10) del cli if res is None: status = False reason = "Manager is not replying to the mq request" pjson = res.get_data() if pjson is None: status = False reason = "No data for {0} found by manager".format( params['device_type']) pjson = pjson[params['device_type']] if pjson is None: status = False reason = "The json for {0} found by manager is empty".format( params['device_type']) if status: # call the add device function res = self._db.add_full_device(params, pjson) if not res: status = False reason = "An error occured while adding the device in database. Please check the file dbmgr.log for more informations" else: status = True reason = False result = res msg = MQMessage() msg.set_action('device.create.result') if reason: msg.add_data('reason', reason) if result: msg.add_data('result', result) msg.add_data('status', status) self.log.debug(msg.get()) self.reply(msg.get()) # send the pub message if status and res: self._pub.send_event('device.update', { "device_id": res['id'], "client_id": res['client_id'] })
def _load_conversions(self): """ Request the client conversion info This is an mq req to manager """ cli = MQSyncReq(self.zmq) msg = MQMessage() msg.set_action('client.conversion.get') response = cli.request('manager', msg.get(), timeout=10) if response: self._parse_conversions(response.get_data()) else: self.log.error(\ u"Updating conversion list failed, no response from manager")
def get_controller_nodes(NetworkID, abort = False): data = { u'nodes': [], u'error': u''} if not abort : cli = MQSyncReq(app.zmq_context) msg = MQMessage() msg.set_action('ozwave.ctrl.nodes') msg.add_data('NetworkID', NetworkID) res = cli.request('plugin-ozwave.{0}'.format(get_sanitized_hostname()), msg.get(), timeout=10) if res is not None: data = res.get_data() else : data['error'] = u'Plugin timeout response.' return data