Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
 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)
Пример #7
0
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)
Пример #8
0
 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
Пример #9
0
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
Пример #10
0
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
Пример #11
0
 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
Пример #12
0
 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
Пример #13
0
 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
Пример #14
0
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
Пример #15
0
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
Пример #16
0
 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']
Пример #17
0
 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:
Пример #18
0
 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)