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}
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
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
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
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
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
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))
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')
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')
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)
def _file_not_found(fname): return ResourceNotFound('file:runtime/{}'.format(fname))