Esempio n. 1
0
def create_user(user=None, password=None, key=None):
    if user is None or password is None or key is None:
        return False
    kk = key if isinstance(key, list) else key.split(',')
    for k in kk:
        if k not in apikey.keys_by_id:
            raise ResourceNotFound(f'API key {k}')
    try:
        dbconn = userdb()
        row = dbconn.execute(sql('select k from users where u = :u'),
                             u=user).fetchone()
    except:
        eva.core.report_userdb_error()
    if row:
        raise ResourceAlreadyExists
    try:
        dbconn.execute(sql('insert into users(u, p, k) values (:u, :p, :k)'),
                       u=user,
                       p=crypt_password(password),
                       k=','.join(kk))
        logging.info('User {} created, key: {}'.format(user, ','.join(kk)))
    except:
        eva.core.report_userdb_error()
        return None
    run_hook('create', user, password)
    return {'user': user, 'key_id': key}
Esempio n. 2
0
def modhelp(mod, context):
    try:
        result = serialize_x(_get_ext_module_fname(mod),
                             'LMExt',
                             helpinfo=context)
    except Exception as e:
        raise FunctionFailed(e)
    if result is None:
        raise ResourceNotFound('Help context')
    return result
Esempio n. 3
0
def load_driver(lpi_id, lpi_mod_id, phi_id, lpi_cfg=None, start=True):
    if get_phi(phi_id) is None:
        raise ResourceNotFound(
            'Unable to load LPI, unknown PHI: {}'.format(phi_id))
    if not lpi_id: raise InvalidParameter('LPI id not specified')
    if not re.match("^[A-Za-z0-9_-]*$", lpi_id):
        raise InvalidParameter(
            'LPI {} id contains forbidden symbols'.format(lpi_id))
    try:
        lpi_mod = importlib.import_module('eva.uc.drivers.lpi.' + lpi_mod_id)
        # doesn't work but we hope
        importlib.reload(lpi_mod)
        _api = lpi_mod.__api__
        _author = lpi_mod.__author__
        _version = lpi_mod.__version__
        _description = lpi_mod.__description__
        _license = lpi_mod.__license__
        _logic = lpi_mod.__logic__
        logging.info('LPI loaded %s v%s, author: %s, license: %s' %
                     (lpi_mod_id, _version, _author, _license))
        logging.debug('%s: %s' % (lpi_mod_id, _description))
        if _logic == 'abstract':
            logging.error(
                'Unable to activate LPI %s: ' % lpi_mod_id + \
                'abstract module'
                )
            return False
        if _api > __api__:
            logging.error(
                'Unable to activate LPI %s: ' % lpi_mod_id + \
                'controller driver API version is %s, ' % __api__ + \
                'LPI driver API version is %s' % _api)
            return False
    except Exception as e:
        raise FunctionFailed('unable to load LPI mod {}: {}'.format(
            lpi_mod_id, e))
    lpi = lpi_mod.LPI(lpi_cfg=lpi_cfg, phi_id=phi_id)
    if not lpi.ready:
        raise FunctionFailed('unable to init LPI mod %s' % lpi_mod_id)
    lpi.lpi_id = lpi_id
    lpi.driver_id = phi_id + '.' + lpi_id
    lpi.oid = 'driver:uc/%s/%s' % (eva.core.config.system_name, lpi.driver_id)
    if lpi.driver_id in drivers:
        try:
            drivers[lpi.driver_id]._stop()
        except:
            eva.core.log_traceback()
    drivers[lpi.driver_id] = lpi
    if start:
        try:
            lpi._start()
        except:
            eva.core.log_traceback()
    return lpi
Esempio n. 4
0
def modhelp(mod, context):
    code = 'from eva.lm.extensions.%s import LMExt;' % mod + \
            ' s=LMExt(info_only=True).serialize(helpinfo=\'%s\')' % context
    try:
        d = {}
        exec(code, d)
        result = d.get('s')
    except Exception as e:
        raise FunctionFailed(e)
    if result is None:
        raise ResourceNotFound('Help context not found')
    return result
Esempio n. 5
0
def modhelp_phi(mod, context):
    code = 'from eva.uc.drivers.phi.%s import PHI;' % mod + \
            ' s=PHI(info_only=True).serialize(helpinfo=\'%s\')' % context
    try:
        d = {}
        exec(code, d)
        result = d.get('s')
    except Exception as e:
        raise FunctionFailed(e)
    if result is None:
        raise ResourceNotFound('Help context not found')
    return result
Esempio n. 6
0
def set_user_key(user=None, key=None):
    if user is None or key is None:
        return None
    kk = key if isinstance(key, list) else key.split(',')
    for k in kk:
        if k not in apikey.keys_by_id:
            raise ResourceNotFound(f'API key {k}')
    try:
        dbconn = userdb()
        if dbconn.execute(sql('update users set k = :k where u = :u'),
                          k=','.join(kk),
                          u=user).rowcount:
            logging.info('user {} key {} is set'.format(user, ','.join(kk)))
            return True
    except:
        eva.core.report_userdb_error()
    raise ResourceNotFound
Esempio n. 7
0
def unlink_phi_mod(mod):
    if mod.find('/') != -1 or mod == 'generic_phi':
        return False
    for k, p in phis.copy().items():
        if p.phi_mod_id == mod:
            raise ResourceBusy('PHI module %s is in use, unable to unlink' %
                               mod)
    fname = _get_phi_module_fname(mod, get_system=False)
    try:
        eva.core.prepare_save()
        try:
            os.unlink(fname)
            return True
        finally:
            eva.core.finish_save()
    except FileNotFoundError:
        raise ResourceNotFound(f'PHI module file {fname}')
    except Exception as e:
        raise FunctionFailed('Unable to unlink PHI module {}: {}'.format(
            fname, e))
Esempio n. 8
0
def get_bus(bus_id, timeout=None):
    """
    Get OWFS virtual bus

    Returns:
        OWFS virtual bus object

    Raises:
        eva.exceptions.ResourceNotFound: if the bus doesn't exist
        eva.exceptions.ResourceBusy: if the bus is busy (unable to get within
                                     core timeout)
        RuntimeError: if connection error has been occured
        """
    bus = _get_bus(bus_id, timeout)
    if bus:
        return bus
    elif bus is None:
        raise ResourceNotFound(f'OWFS bus {bus_id} not available or')
    elif bus is False:
        raise RuntimeError(f'OWFS bus {bus_id} connection error')
    elif bus == 0:
        raise ResourceBusy(f'OWFS bus {bus_id} is locked')
Esempio n. 9
0
def get_port(port_id, timeout=None):
    """
    Get Modbus virtual port

    Returns:
        Modbus virtual port object

    Raises:
        eva.exceptions.ResourceNotFound: if the port doesn't exist
        eva.exceptions.ResourceBusy: if the port is busy (unable to get within
                                     core timeout)
        RuntimeError: if connection error has been occured
        """
    port = _get_port(port_id, timeout)
    if port:
        return port
    elif port is None:
        raise ResourceNotFound(f'Modbus port {port_id} not available or')
    elif port is False:
        raise RuntimeError(f'Modbus port {port_id} connection error')
    elif port == 0:
        raise ResourceBusy(f'Modbus port {port_id} is locked')
Esempio n. 10
0
 def set_prop(self, prop, value=None, save=False):
     with key_lock:
         if not self.dynamic or self.master:
             raise FunctionFailed(
                 'Master and static keys can not be changed')
         if prop == 'key':
             if value is None or value == '' or value.find(
                     ':') != -1 or value.find('|') != -1:
                 return False
             if self.key != value:
                 if value in keys:
                     raise ResourceAlreadyExists('API key')
                 regenerate_key(self.key_id, k=value, save=False)
                 self.set_modified(save)
             return True
         elif prop == 'dynamic':
             return False
         elif prop == 'sysfunc':
             val = val_to_boolean(value)
             if val is None:
                 return False
             if self.sysfunc != val:
                 self.sysfunc = val
                 self.set_modified(save)
             return True
         elif prop == 'items':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             if self.item_ids != val:
                 self.item_ids = val
                 self.set_modified(save)
             return True
         elif prop == 'groups':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             if self.groups != val:
                 self.groups = val
                 self.set_modified(save)
             return True
         elif prop == 'items_ro':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             if self.item_ids_ro != val:
                 self.item_ids_ro = val
                 self.set_modified(save)
             return True
         elif prop == 'groups_ro':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             if self.groups_ro != val:
                 self.groups_ro = val
                 self.set_modified(save)
             return True
         elif prop == 'items_deny':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             if self.item_ids_deny != val:
                 self.item_ids_deny = val
                 self.set_modified(save)
             return True
         elif prop == 'groups_deny':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             if self.groups_deny != val:
                 self.groups_deny = val
                 self.set_modified(save)
             return True
         elif prop == 'allow':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             for v in val:
                 if v not in all_allows:
                     return False
             if self.allow != val:
                 self.allow = val
                 self.set_modified(save)
             return True
         elif prop == 'hosts_allow':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = ['0.0.0.0/0']
             val = [IPNetwork(h) for h in val]
             if self.hosts_allow != val:
                 self.hosts_allow = val
                 self.set_modified(save)
             return True
         elif prop == 'hosts_assign':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             val = [IPNetwork(h) for h in val]
             if self.hosts_assign != val:
                 self.hosts_assign = val
                 self.set_modified(save)
             return True
         elif prop == 'pvt':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             if self.pvt_files != val:
                 self.pvt_files = val
                 self.set_modified(save)
             return True
         elif prop == 'rpvt':
             if isinstance(value, list):
                 val = value
             else:
                 if value:
                     val = value.split(',')
                 else:
                     val = []
             if self.rpvt_uris != val:
                 self.rpvt_uris = val
                 self.set_modified(save)
             return True
         elif prop == 'cdata':
             val = [] if value is None else value
             if isinstance(val, str):
                 val = val.split(',')
             res = []
             for v in val:
                 if v not in res:
                     res.append(str(v))
             if self.cdata != res:
                 self.cdata = res
                 self.set_modified(save)
             return True
         raise ResourceNotFound('property ' + prop)
Esempio n. 11
0
 def _file_not_found(fname):
     return ResourceNotFound('file:runtime/{}'.format(fname))