class UpdateProvider(Provider): @accepts() @returns(str) def is_update_available(self): temp_updateAvailable = update_cache.get('updateAvailable', timeout=1) if temp_updateAvailable is not None: return temp_updateAvailable elif update_cache.is_valid('updateAvailable'): return temp_updateAvailable else: raise RpcException( errno.EBUSY, ('Update Availability flag is invalidated, an Update Check' ' might be underway. Try again in some time.')) @accepts() @returns(h.array(str)) def obtain_changelog(self): temp_changelog = update_cache.get('changelog', timeout=1) if temp_changelog is not None: return temp_changelog elif update_cache.is_valid('changelog'): return temp_changelog else: raise RpcException( errno.EBUSY, ('Changelog list is invalidated, an Update Check ' 'might be underway. Try again in some time.')) @accepts() @returns(h.array(h.ref('update-ops'))) def get_update_ops(self): temp_updateOperations = update_cache.get('updateOperations', timeout=1) if temp_updateOperations is not None: return temp_updateOperations elif update_cache.is_valid('updateOperations'): return temp_updateOperations else: raise RpcException( errno.EBUSY, ('Update Operations Dict is invalidated, an Update Check ' 'might be underway. Try again in some time.')) @accepts() @returns(h.any_of( h.ref('update-info'), None, )) def update_info(self): if not update_cache.is_valid('updateAvailable'): raise RpcException( errno.EBUSY, ('Update Availability flag is invalidated, an Update Check' ' might be underway. Try again in some time.')) updateAvailable = update_cache.get('updateAvailable', timeout=1) if not updateAvailable: return None updateOperations = update_cache.get('updateOperations', timeout=1) updateNotes = update_cache.get('updateNotes', timeout=1) updateNotice = update_cache.get('updateNotice', timeout=1) changelog = update_cache.get('changelog', timeout=1) return { 'changelog': changelog, 'notes': updateNotes, 'notice': updateNotice, 'operations': updateOperations, } @returns(h.array(h.ref('update-train'))) def trains(self): conf = Configuration.Configuration() conf.LoadTrainsConfig() trains = conf.AvailableTrains() or {} seltrain = self.dispatcher.configstore.get('update.train') data = [] for name in trains.keys(): if name in conf._trains: train = conf._trains.get(name) else: train = Train.Train(name) data.append({ 'name': train.Name(), 'description': train.Description(), 'sequence': train.LastSequence(), 'current': True if name == seltrain else False, }) return data @accepts() @returns(str) def get_current_train(self): conf = Configuration.Configuration() conf.LoadTrainsConfig() return conf.CurrentTrain() @accepts() @returns(h.ref('update')) def get_config(self): return { 'train': self.dispatcher.configstore.get('update.train'), 'check_auto': self.dispatcher.configstore.get('update.check_auto'), 'update_server': Configuration.Configuration().UpdateServerURL(), }
break if not gid: raise RpcException(errno.ENOSPC, 'No free GIDs available') return gid @description("Create an user in the system") @accepts(h.all_of( h.ref('user'), h.required('username', 'group'), h.forbidden('builtin', 'logged-in', 'sessions'), h.object({'password': {'type': 'string'}}), h.any_of( h.required('password'), h.required('unixhash', 'smbhash'), h.required('password_disabled')), )) class UserCreateTask(Task): def describe(self, user): return "Adding user {0}".format(user['username']) def verify(self, user): errors = [] for code, message in check_unixname(user['username']): errors.append(('name', code, message)) if self.datastore.exists('users', ('username', '=', user['username'])): raise VerifyException(errno.EEXIST, 'User with given name already exists')
@accepts(str) class ZpoolDestroyTask(ZpoolBaseTask): def run(self, name): try: zfs = libzfs.ZFS() zfs.destroy(name) except libzfs.ZFSException, err: raise TaskException(errno.EFAULT, str(err)) @accepts( str, h.any_of( h.ref('zfs-topology'), None ), h.any_of( h.array(h.ref('zfs-vdev-extension')), None ) ) class ZpoolExtendTask(ZpoolBaseTask): def __init__(self, dispatcher, datastore): super(ZpoolExtendTask, self).__init__(dispatcher, datastore) self.pool = None self.started = False def run(self, pool, new_vdevs, updated_vdevs): try: self.pool = pool
if not gid: raise RpcException(errno.ENOSPC, 'No free GIDs available') return gid @description("Create an user in the system") @accepts( h.all_of( h.ref('user'), h.required('username', 'group'), h.forbidden('builtin', 'logged-in', 'sessions'), h.object({'password': { 'type': 'string' }}), h.any_of(h.required('password'), h.required('unixhash', 'smbhash'), h.required('password_disabled')), )) class UserCreateTask(Task): def describe(self, user): return "Adding user {0}".format(user['username']) def verify(self, user): errors = [] for code, message in check_unixname(user['username']): errors.append(('name', code, message)) if self.datastore.exists('users', ('username', '=', user['username'])): raise VerifyException(errno.EEXIST, 'User with given name already exists')
prop.value = value except libzfs.ZFSException, err: raise TaskException(errno.EFAULT, str(err)) @accepts(str) class ZpoolDestroyTask(ZpoolBaseTask): def run(self, name): try: zfs = libzfs.ZFS() zfs.destroy(name) except libzfs.ZFSException, err: raise TaskException(errno.EFAULT, str(err)) @accepts(str, h.any_of(h.ref('zfs-topology'), None), h.any_of(h.array(h.ref('zfs-vdev-extension')), None)) class ZpoolExtendTask(ZpoolBaseTask): def __init__(self, dispatcher, datastore): super(ZpoolExtendTask, self).__init__(dispatcher, datastore) self.pool = None self.started = False def run(self, pool, new_vdevs, updated_vdevs): try: self.pool = pool zfs = libzfs.ZFS() pool = zfs.get(pool) if new_vdevs: nvroot = convert_topology(zfs, new_vdevs)
class DeviceInfoPlugin(Provider): @description("Returns list of available device classes") @returns(h.array(str)) def get_classes(self): return ["disk", "network", "cpu"] @description("Returns list of devices from given class") @accepts(str) @returns( h.any_of(h.ref('disk-device'), h.ref('network-device'), h.ref('cpu-device'))) def get_devices(self, dev_class): method = "_get_class_{0}".format(dev_class) if hasattr(self, method): return getattr(self, method)() return None def _get_class_disk(self): result = [] geom.scan() for child in geom.class_by_name('DISK').geoms: result.append({ "path": os.path.join("/dev", child.name), "name": child.name, "mediasize": child.provider.mediasize, "description": child.provider.config['descr'] }) return result def _get_class_multipath(self): result = [] geom.scan() cls = geom.class_by_name('MULTIPATH') if not cls: return [] for child in cls.geoms: result.append({ "path": os.path.join("/dev", child.name), "name": child.name, "mediasize": child.provider.mediasize, "members": [c.provider.name for c in child.consumers] }) return result def _get_class_network(self): result = [] for i in netif.list_interfaces().keys(): if i.startswith('lo'): continue desc = get_sysctl(re.sub('(\w+)([0-9]+)', 'dev.\\1.\\2.%desc', i)) result.append({'name': i, 'description': desc}) return result def _get_class_cpu(self): pass