class OpenVPNWidget(Plugin): """OpenVPN Widget @ivar _b: Backend instance""" implements(apis.dashboard.IWidget) icon = "/dl/openvpn/icon.png" name = "OpenVPN" title = "OpenVPN" style = "normal" def __init__(self, *args, **kwargs): self._b = OpenVPNBackend(self.app) def get_ui(self, cfg, id=None): s = self._b.getstats() ui = self.app.inflate("openvpn:widget") ui.find("nclients").set("text", s["nclients"]) ui.find("bytesin").set("text", str_fsize(float(s["bytesin"]))) ui.find("bytesout").set("text", str_fsize(float(s["bytesout"]))) return ui def get_config_dialog(self): return None def handle(self, event, params, cfg, vars=None): pass def process_config(self, vars): pass
class URLHandler(object): """ Base class that handles HTTP requests based on its methods decorated with :func:url """ implements(IURLHandler) def _get_url_handler(self, uri): for cls in self.__class__.mro(): if '_urls' in dir(cls): for uri_re in cls._urls.keys(): if uri_re.match(uri): return cls._urls[uri_re] return None def match_url(self, req): """ Returns True if class (or any parent class) could handle URL """ if self._get_url_handler(req.get('PATH_INFO')) is not None: return True return False def url_handler(self, req, start_response): handler = self._get_url_handler(req.get('PATH_INFO')) if handler is None: return try: handler = self.__getattribute__(handler) except AttributeError: return return handler(req, start_response)
class CronConfig (Plugin): implements(IConfigurable) name = 'Cron' id = 'cron' def list_files(self): return ['/var/spool/cron/*/*']
class HDDTempWidget(Plugin): implements(apis.dashboard.IWidget) title = 'HDD Temperature' icon = '/dl/hddtemp/icon.png' name = 'HDD Temperature' style = 'linear' def get_ui(self, cfg, id=None): m = HDDTempMeter(self.app).prepare(cfg) self.title = cfg return UI.Label(text='%.2f °C' % m.get_value()) def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): m = HDDTempMeter(self.app) dlg = self.app.inflate('hddtemp:widget-config') for s in m.list_disks(): dlg.append('list', UI.SelectOption( value=s, text=s, )) return dlg def process_config(self, vars): return vars.getvalue('disk', None)
class HealthWidget(Plugin): implements(apis.dashboard.IWidget) title = 'Health' icon = '/dl/health/icon.png' name = 'Health monitor' style = 'linear' def get_ui(self, cfg, id=None): self.mon = ComponentManager.get().find('health-monitor') text = {'good': 'GOOD', 'susp': 'WARNING', 'dang': 'DANGER'} stat = {'good': 'info', 'susp': 'warn', 'dang': 'err'} ostat = 'good' for m in sorted(self.mon.get(), key=lambda x: x.name): st = self.mon.get()[m] if st == 'susp' and ostat == 'good': ostat = st if st == 'dang': ostat = st ui = self.app.inflate('health:widget') ui.find('overall').text = text[ostat] ui.find('overall')['class'] = 'status-cell-%s' % stat[ostat] return ui def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): pass def process_config(self, vars): pass
class LoadWidget(Plugin): implements(IDashboardWidget) def get_ui(self): stat = self.app.get_backend(apis.sysstat.ISysStat) w = UI.Widget( UI.HContainer(UI.Image(file='/dl/loadavg/widget.png'), UI.Label(text='System load:', bold=True), UI.Label(text=' / '.join(stat.get_load())))) return w
class SVWidget(Plugin): implements(apis.dashboard.IWidget) icon = '/dl/supervisor/icon.png' name = 'Supervisor process' title = None style = 'linear' def __init__(self): self.iface = None def get_ui(self, cfg, id=None): mgr = SVClient(self.app) running = False for x in mgr.status(): if x['name'] == cfg and x['status'] == 'RUNNING': running = True self.title = cfg self.icon = '/dl/core/ui/stock/service-' + ('run.png' if running else 'stop.png') ui = self.app.inflate('supervisor:widget') if running: ui.remove('start') ui.find('stop').set('id', id+'/stop') ui.find('restart').set('id', id+'/restart') else: ui.remove('stop') ui.remove('restart') ui.find('start').set('id', id+'/start') return ui def handle(self, event, params, cfg, vars=None): mgr = SVClient(self.app) if params[0] == 'start': mgr.start(cfg) if params[0] == 'stop': mgr.stop(cfg) if params[0] == 'restart': mgr.restart(cfg) def get_config_dialog(self): mgr = SVClient(self.app) dlg = self.app.inflate('supervisor:widget-config') for s in mgr.status(): dlg.append('list', UI.SelectOption( value=s['name'], text=s['name'], )) return dlg def process_config(self, vars): return vars.getvalue('svc', None)
class PowerWidget(Plugin): implements(IDashboardWidget) def get_ui(self): w = UI.Widget( UI.HContainer( UI.Image(file='/dl/power/widget.png'), UI.Label(text='Uptime:', bold=True), UI.Label(text=get_uptime()) ) ) return w
class CoreFunctions(Plugin): implements(IXSLTFunctionProvider) def get_funcs(self): return { 'attr': attr, 'iif': iif, 'b64': b64, 'jsesc': jsesc, 'idesc': idesc, 'css': css, 'id': id }
class ServiceWidget(Plugin): implements(apis.dashboard.IWidget) icon = '/dl/services/icon.png' name = 'Service control' title = None style = 'linear' def __init__(self): self.iface = None def get_ui(self, cfg, id=None): mgr = self.app.get_backend(apis.services.IServiceManager) running = mgr.get_status(cfg) == 'running' self.title = cfg self.icon = '/dl/core/ui/stock/service-' + ('run.png' if running else 'stop.png') ui = self.app.inflate('services:widget') if running: ui.remove('start') ui.find('stop').set('id', id + '/stop') ui.find('restart').set('id', id + '/restart') else: ui.remove('stop') ui.remove('restart') ui.find('start').set('id', id + '/start') return ui def handle(self, event, params, cfg, vars=None): mgr = self.app.get_backend(apis.services.IServiceManager) if params[0] == 'start': mgr.start(cfg) if params[0] == 'stop': mgr.stop(cfg) if params[0] == 'restart': mgr.restart(cfg) def get_config_dialog(self): mgr = self.app.get_backend(apis.services.IServiceManager) dlg = self.app.inflate('services:widget-config') for s in sorted(mgr.list_all()): dlg.append('list', UI.SelectOption( value=s.name, text=s.name, )) return dlg def process_config(self, vars): return vars.getvalue('svc', None)
class ShellProgress(Plugin): implements(IProgressBoxProvider) title = 'Shell' icon = '/dl/shell/icon_small.png' can_abort = True def __init__(self): self.proc = self.app.session.get('ShellPlugin-_process') def has_progress(self): return self.proc.is_running() def get_progress(self): return self.proc.cmdline def abort(self): self.proc.kill()
class UzuriProgress(Plugin): implements(IProgressBoxProvider) title = 'Uzuri' icon = '/dl/uzuri/icon_small.png' can_abort = True def __init__(self): self.master = self.app.session.get('UzuriMasterPlugin-_master') def has_progress(self): return self.master.is_busy() def get_progress(self): return self.master.worker.output def abort(self): self.master.worker.kill()
class PackageManagerProgress(Plugin): implements(IProgressBoxProvider) title = 'Packages' icon = '/dl/pkgman/icon_small.png' can_abort = True def __init__(self): self.mgr = self.app.get_backend(apis.pkgman.IPackageManager) def has_progress(self): return self.mgr.is_busy() def get_progress(self): return self.mgr.get_busy_status() def abort(self): self.mgr.abort()
class PowerWidget(Plugin): implements(apis.dashboard.IWidget) title = 'Uptime' icon = '/dl/power/widget.png' name = 'Uptime' style = 'linear' def get_ui(self, cfg, id=None): return UI.Label(text=get_uptime()) def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): return None def process_config(self, vars): pass
class NetworkWidget(Plugin): implements(IDashboardWidget) def get_ui(self): cfg = self.app.get_backend(INetworkConfig) t = UI.LayoutTable() w = UI.Widget(t) for x in cfg.interfaces: i = cfg.interfaces[x] t.append( UI.LayoutTableRow(UI.Image(file='/dl/network/%s.png' % ('up' if i.up else 'down')), UI.Label(text=i.name), UI.Label(text=cfg.get_ip(i)), spacing=4)) return w
class MuninWidget(Plugin): implements(apis.dashboard.IWidget) title = 'Munin' icon = '/dl/munin/icon.png' name = 'Munin graph' style = 'normal' hidden = True def get_ui(self, cfg, id=None): self.title = cfg['title'] return UI.Image(file=cfg['url'], width=330) def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): return None def process_config(self, event, params, vars): pass
class ConfMgrHook (Plugin): """ Handy base class in case you don't want to reimplement all hook methods. """ implements(IConfMgrHook) abstract = True def pre_load(self, cfg, path): pass def post_load(self, cfg, path, data): return data def pre_save(self, cfg, path, data): return data def post_save(self, cfg, path): pass def finished(self, cfg): pass
class MemWidget(Plugin): implements(IDashboardWidget) def get_ui(self): stat = self.app.get_backend(apis.sysstat.ISysStat) ru, rt = stat.get_ram() su, st = stat.get_swap() w = UI.Widget( UI.LayoutTable( UI.LayoutTableRow(UI.Image(file='/dl/loadavg/widget_mem.png'), UI.Label(text='RAM:', bold=True), UI.ProgressBar(value=ru, max=rt, width=100), UI.Label(text="%sM / %sM" % (ru, rt)), spacing=4), UI.LayoutTableRow(UI.Image(file='/dl/loadavg/widget_swap.png'), UI.Label(text='Swap:', bold=True), UI.ProgressBar(value=su, max=st, width=100) if int(st) != 0 else None, UI.Label(text="%sM / %sM" % (su, st)), spacing=4))) return w
class CpuWidget(Plugin): implements(apis.dashboard.IWidget) title = 'CPU Usage' icon = '/dl/cpu/icon.png' name = 'CPU Usage' style = 'normal' def get_ui(self, cfg, id=None): m = Cpu(self.app).prepare(cfg) return UI.HContainer( UI.ProgressBar(value=m.get_value(), max=m.get_max(), width=220), UI.Label(text=str(m.get_value())+'%'), ) def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): return None def process_config(self, vars): pass
class RamWidget(Plugin): implements(apis.dashboard.IWidget) title = 'RAM' icon = '/dl/sysload/widget_mem.png' name = 'Memory' style = 'normal' def get_ui(self, cfg, id=None): stat = self.app.get_backend(apis.sysstat.ISysStat) ru, rt = stat.get_ram() return UI.HContainer( UI.ProgressBar(value=ru, max=rt, width=220), UI.Label(text=str_fsize(ru)), ) def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): return None def process_config(self, vars): pass
class SwapWidget(Plugin): implements(apis.dashboard.IWidget) title = 'Swap' icon = '/dl/sysload/widget_swap.png' name = 'Swap' style = 'normal' def get_ui(self, cfg, id=None): stat = self.app.get_backend(apis.sysstat.ISysStat) su, st = stat.get_swap() return UI.HContainer( UI.ProgressBar(value=su, max=int(st) + 1, width=220), UI.Label(text=str_fsize(su)), ) def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): return None def process_config(self, vars): pass
class NewsWidget(Plugin): implements(apis.dashboard.IWidget) title = 'Project news' icon = '/dl/core/ui/stock/news.png' name = 'Project news' style = 'normal' def get_ui(self, cfg, id=None): ui = self.app.inflate('core:news') feed = Updater.get().get_feed() if feed is not None: for i in feed[:3]: ui.append('list', UI.CustomHTML(html='<li>%s</li>'%i['text'])) return ui def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): return None def process_config(self, event, params, vars): pass
class NetworkWidget(Plugin): implements(apis.dashboard.IWidget) icon = '/dl/network/down.png' name = 'Network monitor' title = None style = 'normal' def __init__(self): self.iface = None def get_ui(self, cfg, id=None): self.iface = cfg self.title = 'Network interface: %s' % cfg be = self.app.get_backend(INetworkConfig) if not cfg in be.interfaces: return UI.Label(text='Interface not found') i = be.interfaces[cfg] self.icon = '/dl/network/%s.png' % ('up' if i.up else 'down') ui = self.app.inflate('network:widget') ui.find('ip').set('text', be.get_ip(i)) ui.find('in').set('text', str_fsize(be.get_rx(i))) ui.find('out').set('text', str_fsize(be.get_tx(i))) return ui def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): be = self.app.get_backend(INetworkConfig) dlg = self.app.inflate('network:widget-config') for i in be.interfaces: dlg.append('list', UI.Radio(value=i, text=i, name='iface')) return dlg def process_config(self, vars): return vars.getvalue('iface', None)
class LoadWidget(Plugin): implements(apis.dashboard.IWidget) title = 'System load' icon = '/dl/sysload/widget.png' name = 'System load' style = 'linear' def get_ui(self, cfg, id=None): stat = self.app.get_backend(apis.sysstat.ISysStat) ui = self.app.inflate('sysload:load') load = stat.get_load() ui.find('1m').set('text', load[0]) ui.find('5m').set('text', load[1]) ui.find('15m').set('text', load[2]) return ui def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): return None def process_config(self, event, params, vars): pass
class DiskUsageWidget(Plugin): implements(apis.dashboard.IWidget) title = 'Disk Usage' icon = '/dl/hddstat/icon.png' name = 'Disk Usage' style = 'normal' def get_ui(self, cfg, id=None): if cfg == None: cfg = "total" m = DiskUsageMeter(self.app).prepare(cfg) return UI.HContainer( UI.ProgressBar(value=m.get_value(cfg), max=m.get_max(), width=220), UI.Label(text=str('%s : %d %%' % (cfg, m.get_value(cfg)))), ) def handle(self, event, params, cfg, vars=None): pass def get_config_dialog(self): mgr = self.app.get_backend(apis.services.IServiceManager) dlg = self.app.inflate('hddstat:widget-config') u = shell('df --total').split('\n')[1:-2]; u.append ('total') for y in u: s = y.split() s = s.pop() dlg.append('list', UI.SelectOption( value=s, text=s, )) return dlg def process_config(self, vars): return vars.getvalue('svc', None)