def scene(aDict): """Function docstring for scene TBD Args: - node (required) - scene (required) - op (optional) - 'run'/'off' - status (optional) Output: """ try: ret = {} node = SC['nodes'][aDict['node']] if aDict.get('op'): ret['op'] = "RunScene" if aDict.get('op') == "run" else "SceneOff" res = rest_call( "%s?id=action&serviceId=urn:micasaverde-com:serviceId:HomeAutomationGateway1&action=%s&SceneNum=%s" % (node, ret['op'], aDict['scene'])) ret['info'] = "OK" if (res['code'] == 200) else "FAILED" elif aDict.get('status'): scenes = rest_call("%s?id=sdata" % node)['data']['scenes'] for scene in scenes: if scene['id'] == aDict['scene']: ret['info'] = scene break else: ret = rest_call("%s?id=scene&action=list&scene=%s" % (node, aDict['scene']))['data'] except Exception as e: ret = e[0] return ret
def device_info(aDict): """Function docstring for device_info TBD Args: - node (required) - id (required) - op (optional) - category (optional) - service (optional) - variable (optional) - value (optional) Output: """ ret = {'op': None} op = aDict.pop("op", None) try: node = SC['nodes'][aDict['node']] if op == 'update': ret['op'] = {} if aDict['category'] == '2' and aDict[ 'service'] == 'urn:upnp-org:serviceId:Dimming1' and aDict[ 'variable'] == 'LoadLevelTarget': ret['op']['response'] = rest_call( "%s?id=action&output_format=json&DeviceNum=%s&serviceId=urn:upnp-org:serviceId:Dimming1&action=SetLoadLevelTarget&newLoadlevelTarget=%s" % (node, aDict['id'], aDict['value']))['data'] response = ret['op']['response'].get( 'u:SetLoadLevelTargetResponse') if response: from time import sleep sleep(1) ret['op']['job'] = response.get('JobID') ret['op']['result'] = rest_call( "%s?id=jobstatus&job=%s&plugin=zwave" % (node, response.get('JobID')))['data'] res = rest_call("%s?id=status&DeviceNum=%s" % (node, aDict['id']))['data'] info = res['Device_Num_%s' % aDict['id']]['states'] for x in info: try: service = x['service'].split(':') if service[1] <> 'micasaverde-com': entry = ret.get(x['service'], {}) entry[x['variable']] = x['value'] ret[x['service']] = entry except: pass except Exception as e: ret = e[0] return ret
def rest(aDict): """Function docstring for rest TBD Args: - token (required) - service (optional) - call (optional) - href (optional) - arguments (optional) - method (optional) Output: """ try: if aDict.get('href'): ret = rest_call(aDict.get('href'), aDict.get('arguments'), aDict.get('method','GET'), { 'X-Auth-Token':aDict['token'] }) else: with DB() as db: db.do("SELECT node, service_port, service_url FROM openstack_tokens LEFT JOIN openstack_services ON openstack_tokens.id = openstack_services.id WHERE openstack_tokens.token = '%s' AND service = '%s'"%(aDict['token'],aDict.get('service'))) data = db.get_row() controller = Device(data['node'],aDict['token']) ret = controller.call(data['service_port'], data['service_url'] + aDict['call'], aDict.get('arguments'), aDict.get('method','GET')) ret['result'] = 'OK' if not ret.get('result') else ret.get('result') except Exception as e: ret = e[0] return ret
def database_backup(aDict): """Function docstring for database_backup. Does Database Backup to file Args: - filename (required) Output: """ ret = {'filename': aDict['filename']} from zdcp.SettingsContainer import SC if SC['system']['id'] == 'master': from mysql import dump data = dump({'mode': 'database'})['output'] else: from zdcp.core.common import rest_call res = rest_call("%s?mysql_dump" % SC['system']['master'], {'mode': 'database'}) if res['info'].get("x-api-res") == "OK": data = res['data']['output'] else: data = [] try: with open(ret['filename'], 'w+') as f: output = "\n".join(data) f.write(output.encode("utf-8")) ret['result'] = 'OK' except Exception as err: ret['error'] = str(err) ret['result'] = 'NOT_OK' return ret
def settings_save(aDict): """Function docstring for settings_save TBD Args: Output: """ from zdcp.core.common import rest_call from zdcp.SettingsContainer import SC ret = {'config_file': SC['system']['config_file']} try: settings = {} with open(ret['config_file']) as sfile: temp = loads(sfile.read()) for section, content in temp.iteritems(): for key, params in content.iteritems(): if not settings.get(section): settings[section] = {} settings[section][key] = params['value'] settings['system']['config_file'] = ret['config_file'] if settings['system']['id'] == 'master': with DB() as db: db.do( "SELECT section,parameter,value FROM settings WHERE node = 'master'" ) data = db.get_rows() db.do( "SELECT 'nodes' AS section, node AS parameter, url AS value FROM nodes" ) data.extend(db.get_rows()) for setting in data: section = setting.pop('section') if not settings.get(section): settings[section] = {} settings[section][setting['parameter']] = setting['value'] else: try: master = rest_call( "%s?system_settings_fetch" % settings['system']['master'], {'node': settings['system']['id']})['data'] except: pass else: for section, content in master.iteritems(): if settings.get(section): settings[section].update(content) else: settings[section] = content container = ospath.abspath( ospath.join(ospath.dirname(__file__), '..', 'SettingsContainer.py')) with open(container, 'w') as f: f.write("SC=%s\n" % dumps(settings)) ret['result'] = 'OK' except Exception as e: ret['result'] = 'NOT_OK' ret['error'] = str(e) return ret
def rest_full(self, aURL, aAPI, aArgs=None, aMethod=None, aHeader=None, aTimeout=20): from zdcp.core.common import rest_call return rest_call("%s?%s" % (aURL, aAPI) if aAPI else aURL, aArgs, aMethod, aHeader, True, aTimeout)
def server(aNodeID): from os import getenv, path as ospath, environ from sys import stdout, stdin, path as syspath from json import loads, dumps from importlib import import_module query, output, api, args, mod, fun, additional = getenv( "QUERY_STRING"), 'null', None, None, None, None, {} (api, _, extra) = query.partition('&') (mod, _, fun) = api.partition('_') try: data = stdin.read() args = loads(data) if len(data) > 0 else {} if extra: for part in extra.split("&"): (k, void, v) = part.partition('=') additional[k] = v # Node is always master for system calls node = additional.get('node', aNodeID if not mod == 'system' else 'master') stdout.write("X-API-Node:%s\r\n" % node) from zdcp.core.logger import rest as log log(node, api, dumps(args), extra) if node == aNodeID: module = import_module("zdcp.rest.%s" % mod) module.__add_globals__({ 'ospath': ospath, 'loads': loads, 'dumps': dumps, 'import_module': import_module }) output = dumps(getattr(module, fun, None)(args)) stdout.write("X-API-Res:OK\r\n") else: from zdcp.core.common import rest_call from zdcp.SettingsContainer import SC try: res = rest_call("%s?%s" % (SC['nodes'][node], query), args) except Exception as err: raise Exception(err) else: output = dumps(res['data']) stdout.write("X-API-Res:%s\r\n" % res['info']['x-api-res']) except Exception as e: stdout.write("X-API-Res:ERROR\r\n") stdout.write("X-API-Args:%s\r\n" % args) stdout.write("X-API-Info:%s\r\n" % str(e)) stdout.write("X-API-Xcpt:%s\r\n" % type(e).__name__) stdout.write("X-API-Method:%s\r\n" % environ['REQUEST_METHOD']) stdout.write("X-API-Function:%s\r\n" % api) stdout.write("Content-Type: application/json\r\n") stdout.write("Access-Control-Allow-Origin: *\r\n") stdout.flush() stdout.write("\r\n") stdout.write(output)
def href(self, aURL, aArgs=None, aMethod=None, aHeader=None): from zdcp.core.common import rest_call head = {'Authorization': self._token} try: head.update(aHeader) except: pass try: res = rest_call(aURL, aArgs, aMethod, head) except Exception as e: res = e[0] return res
def href(aDict): """Function docstring for call. Basically creates a controller instance and send a (nested) rest_call Args: - href (required) - token (required) - arguments (optional) - method (optional) Output: """ try: ret = rest_call(aDict.get('href'), aDict.get('arguments'), aDict.get('method','GET'), { 'X-Auth-Token':aDict['token'] }) except Exception as e: ret = e[0] return ret
def status(aDict): """Function docstring for status TBD Args: - node (required) Output: """ try: node = SC['nodes'][aDict['node']] ret = rest_call("%s?id=sdata" % node)['data'] except Exception as e: ret = e[0] return ret
def auth(self, aAuth): from zdcp.core.common import rest_call try: auth = { 'auth': { 'scope': { 'project': { "name": aAuth.get('project', "admin"), "domain": { 'name': 'Default' } } }, 'identity': { 'methods': ['password'], "password": { "user": { "name": aAuth['username'], "domain": { "name": "Default" }, "password": aAuth['password'] } } } } } url = "%s:5000/v3/auth/tokens" % (self._node) res = rest_call(url, auth) # If sock code is created (201), not ok (200) - we can expect to find a token if res['code'] == 201: token = res.pop('data', {})['token'] self._token = res['info'].get('x-subject-token') self._expire = token['expires_at'] self._project = token['project']['name'] self._project_id = token['project']['id'] catalog = {} for svc in token['catalog']: catalog[svc['name']] = svc self._catalog = catalog res['auth'] = 'OK' else: res['auth'] = 'NOT_OK' except Exception as e: res = e[0] res['auth'] = 'NOT_OK' return res
def auth(self, aAuth): from zdcp.core.common import rest_call, basic_auth self._token = basic_auth(aAuth['username'], aAuth['password'])['Authorization'] try: if aAuth.get('mode', 'full') == 'full': ret = rest_call("%s/me" % self._node, None, None, {'Authorization': self._token}) ret.pop('data', None) ret.pop('node', None) else: ret = {} except Exception as e: ret = e[0] ret['auth'] = 'NOT_OK' else: ret['auth'] = 'OK' return ret
def auth(self, aAuth): from zdcp.core.common import rest_call try: auth = {'UserName': aAuth.get('username'), 'Password': aAuth.get('password'), 'AuthType':'openstack' } url = "%s:7000/appformix/controller/v2.0/%s"%(self._node,"auth_credentials") print url res = rest_call(url,auth) # If sock code is ok (200) - we can expect to find a token if res['code'] == 200: token = res.pop('data',{})['Token'] self._token = token['tokenId'] self._expire = token['expiresAt'] res['auth'] = 'OK' else: res['auth'] = 'NOT_OK' except Exception as e: res = e[0] return res
def infra(aDict): """Function docstring for infra TBD Args: - node (required) Output: """ try: ret = {} node = SC['nodes'][aDict['node']] info = rest_call("%s?id=sdata" % node)['data'] ret['sections'] = {d['id']: d['name'] for d in info['sections']} ret['rooms'] = {d['id']: d for d in info['rooms']} ret['categories'] = {d['id']: d['name'] for d in info['categories']} ret['scenes'] = {d['id']: d for d in info['scenes']} except Exception as e: ret = e[0] return ret
def devices(aDict): """Function docstring for devices TBD Args: - node (required) - room (optional) Output: """ try: ret = {} node = SC['nodes'][aDict['node']] info = rest_call("%s?id=sdata" % node)['data'] ret['devices'] = info['devices'] if not aDict.get('room') else [ x for x in info['devices'] if x['room'] == int(aDict.get('room')) ] ret['categories'] = {d['id']: d['name'] for d in info['categories']} ret['rooms'] = {d['id']: d['name'] for d in info['rooms']} except Exception as e: ret = e[0] return ret
def rest_call(self, aAPI, aArgs=None): from zdcp.core.common import rest_call return rest_call("%s?%s" % (self._rest_url, aAPI), aArgs, aTimeout=60)['data']
except Exception as e: stdout.write("\nError in setting up database, make sure that configured user has access:\n\n") stdout.write("CREATE USER '%s'@'localhost' IDENTIFIED BY '%s';\n"%(settings['system']['db_user'],settings['system']['db_pass'])) stdout.write("GRANT ALL PRIVILEGES ON %s.* TO '%s'@'localhost';\n"%(settings['system']['db_name'],settings['system']['db_user'])) stdout.write("FLUSH PRIVILEGES;\n\n") stdout.flush() raise Exception("DB past error (%s)"%str(e)) else: ########################################## NON-MASTER REST ######################################## # # Fetch and update settings from central repo # from zdcp.core.common import rest_call try: res['register'] = rest_call("%s?system_node_register"%settings['system']['master'],{'node':settings['system']['id'],'url':settings['system']['rest'],'system':"1" if modes.get('rest') else '0','www':"1" if modes.get('front') else '0'})['data'] except Exception as e: res['register'] = str(e) try: master = rest_call("%s?system_settings_fetch"%settings['system']['master'],{'node':settings['system']['id']})['data'] except: pass else: for section,content in master.iteritems(): if settings.get(section): settings[section].update(content) else: settings[section] = content # # Write settings containers # container = ospath.abspath(ospath.join(ospath.dirname(__file__),'SettingsContainer.py')) try: with open(container,'w') as f:
def href(self,aURL, aArgs = None, aMethod = None, aHeader = None): from zdcp.core.common import rest_call head = { 'X-Auth-Token':self._token, 'X-Auth-Type':'openstack' } try: head.update(aHeader) except: pass return rest_call(aURL,aArgs, aMethod, head)