Ejemplo n.º 1
0
 def __init__(self):
     self.m = Manager()
     self.config = ServicesConfig("services")
     self.units = []
Ejemplo n.º 2
0
class ServiceManager(object):
    __metaclass__ = SingletonN

    def __init__(self):
        self.m = Manager()
        self.config = ServicesConfig("services")
        self.units = []

    def get_plugin_services(self, plugin):
        if plugin in self.config.services:
            return self.config.services[plugin]
        else:
            return []

    def is_plugin_service(self, service):
        """
        Return true if service is managed by the MMC
        """
        service = service.rstrip(".service")
        for plugin in self.config.services:
            if service in self.config.services[plugin]:
                return True
        return False

    def list_plugins_services(self):
        """
        Returns list of services ordered by MMC plugins
        """
        list = {}
        plugins = PluginManager().getEnabledPluginNames()
        for plugin in plugins:
            for plugin_services, services in self.config.services.items():
                if plugin == plugin_services and services:
                    list[plugin] = []
                    for service in services:
                        if service not in self.config.blacklist:
                            list[plugin].append(self.get_unit_info(service))
                    list[plugin] = sorted(list[plugin],
                                          key=lambda s: s['id'].lower())
        return list

    def has_inactive_plugins_services(self):
        """
        Return True if one of the plugin's services
        is not active
        """
        for plugin, services in self.list_plugins_services().items():
            for service in services:
                if service['active_state'] not in ("active", "unavailable"):
                    return True
        return False

    def list_others_services(self, filter=None):
        """
        Returns list of services not managed by MMC plugins
        """
        list = []
        for unit in self.list():
            if not self.is_plugin_service(unit['id']) and \
               unit['id'].endswith(".service") and \
               unit['unit_file_state'] != "static":
                if filter and any(
                        v for k, v in unit.items() if filter in str(v)):
                    list.append(unit)
                if not filter:
                    list.append(unit)
        list = sorted(list, key=lambda s: s['id'].lower())
        return list

    def list(self):
        if not self.units:
            self.units = self.m.list_units()
        units = []
        for unit in self.units:
            unit = self.serialize_unit(unit)
            if unit['id'].split(".")[0] not in self.config.blacklist:
                units.append(unit)
        units = sorted(units, key=lambda u: u['id'].lower())
        return units

    def get_unit(self, service):
        service = service.replace(".service", "", 1)
        for unit in self.units:
            if unit.properties.Id == '%s.service' % service:
                return unit
        return False

    def get_unit_info(self, service):
        service = service.replace(".service", "", 1)
        unit = self.get_unit(service)
        return self.serialize_unit(unit, service)

    def serialize_unit(self, unit, service=""):
        if unit:
            return {
                'id': str(unit.properties.Id),
                'description': str(unit.properties.Description),
                'active_state': str(unit.properties.ActiveState),
                'can_start': bool(unit.properties.CanStart),
                'can_stop': bool(unit.properties.CanStop),
                'can_reload': bool(unit.properties.CanReload),
                'unit_file_state': str(unit.properties.UnitFileState),
            }
        else:
            return {
                'id': service + ".service",
                'description': service,
                'active_state': "unavailable",
                'can_start': False,
                'can_stop': False,
                'can_reload': False,
                'unit_file_state': "unavailable",
            }

    def start(self, service):
        unit = self.get_unit(service)
        unit.start('fail')
        return True

    def stop(self, service):
        unit = self.get_unit(service)
        unit.stop('fail')
        return True

    def restart(self, service):
        unit = self.get_unit(service)
        unit.restart('fail')
        return True

    def reload(self, service):
        unit = self.get_unit(service)
        unit.reload('fail')
        return True

    def status(self, service):
        unit = self.get_unit(service)
        return (str(unit.properties.LoadState),
                str(unit.properties.ActiveState),
                str(unit.properties.SubState))

    def log(self, service="", filter=""):
        service = service.replace(".service", "", 1)
        result = []
        service_filter = ""
        fields = ("PRIORITY", "_HOSTNAME", "TIMESTAMP", "_UID", "_GID", "_PID",
                  "MESSAGE", "_SYSTEMD_UNIT")
        if service:
            service_filter += '_SYSTEMD_UNIT=%s.service' % service
        code, out, err = shlaunch(
            '%s -n 500 -o json %s' %
            (self.config.journalctl_path, service_filter))
        out = json.loads("".join(out))
        for message in out:
            if "MESSAGE" in message and isinstance(message["MESSAGE"],
                                                   basestring):
                if "_SOURCE_REALTIME_TIMESTAMP" in message:
                    message["TIMESTAMP"] = int(
                        int(message["_SOURCE_REALTIME_TIMESTAMP"]) / 1000000)
                else:
                    message["TIMESTAMP"] = False
                # remove unneeded fields
                for key, value in message.copy().items():
                    if key not in fields:
                        del message[key]
                if filter and any(filter in str(v)
                                  for k, v in message.items()):
                    result.append(message)
                if not filter:
                    result.append(message)
        return result[::-1]
Ejemplo n.º 3
0
class ServiceManager(object):
    __metaclass__ = SingletonN

    def __init__(self):
        self.m = Manager()
        self.config = ServicesConfig("services")
        self.units = []

    def get_plugin_services(self, plugin):
        if plugin in self.config.services:
            return self.config.services[plugin]
        else:
            return []

    def is_plugin_service(self, service):
        """
        Return true if service is managed by the MMC
        """
        service = service.rstrip(".service")
        for plugin in self.config.services:
            if service in self.config.services[plugin]:
                return True
        return False

    def list_plugins_services(self):
        """
        Returns list of services ordered by MMC plugins
        """
        list = {}
        for plugin, services in self.config.services.items():
            list[plugin] = []
            for service in services:
                list[plugin].append(self.get_unit_info(service))
            list[plugin] = sorted(list[plugin], key=itemgetter('id'))
        return list

    def list_others_services(self, filter = None):
        """
        Returns list of services not managed by MMC plugins
        """
        list = []
        for unit in self.list():
            if not self.is_plugin_service(unit['id']) and \
               unit['id'].endswith(".service") and \
               unit['unit_file_state'] != "static":
                if filter and any(v for k,v in unit.items() if filter in str(v)):
                    list.append(unit)
                if not filter:
                    list.append(unit)
        list = sorted(list, key=itemgetter('id'))
        return list

    def list(self):
        if not self.units:
            self.units = self.m.list_units()
        units = []
        for unit in self.units:
            units.append(self.serialize_unit(unit))
        list = sorted(units, key=itemgetter('id'))
        return list

    def get_unit(self, service):
        service = service.replace(".service", "", 1)
        for unit in self.units:
            if unit.properties.Id == '%s.service' % service:
                return unit
        return False

    def get_unit_info(self, service):
        service = service.replace(".service", "", 1)
        unit = self.get_unit(service)
        return self.serialize_unit(unit, service)

    def serialize_unit(self, unit, service = ""):
        if unit:
            return {'id': str(unit.properties.Id),
                    'description': str(unit.properties.Description),
                    'active_state': str(unit.properties.ActiveState),
                    'can_start': bool(unit.properties.CanStart),
                    'can_stop': bool(unit.properties.CanStop),
                    'can_reload': bool(unit.properties.CanReload),
                    'unit_file_state': str(unit.properties.UnitFileState),
                   }
        else:
            return {'id': service + ".service",
                    'description': service,
                    'active_state': "unavailable",
                    'can_start': False,
                    'can_stop': False,
                    'can_reload': False,
                    'unit_file_state': "unavailable",
                   }

    def start(self, service):
        unit = self.get_unit(service)
        unit.start('fail')
        return True

    def stop(self, service):
        unit = self.get_unit(service)
        unit.stop('fail')
        return True

    def restart(self, service):
        unit = self.get_unit(service)
        unit.restart('fail')
        return True

    def reload(self, service):
        unit = self.get_unit(service)
        unit.reload('fail')
        return True

    def status(self, service):
        unit = self.get_unit(service)
        return (str(unit.properties.LoadState),
                str(unit.properties.ActiveState),
                str(unit.properties.SubState))

    def log(self, service = "", filter = ""):
        service = service.replace(".service", "", 1)
        result = []
        service_filter = ""
        fields = ("PRIORITY", "_HOSTNAME", "TIMESTAMP", "_UID", "_GID", "_PID", "MESSAGE", "_SYSTEMD_UNIT")
        if service:
            service_filter += '_SYSTEMD_UNIT=%s.service' % service
        code, out, err = shlaunch('%s -n 500 -o json %s' % (self.config.journalctl_path, service_filter))
        out = json.loads("".join(out))
        for message in out:
            if "MESSAGE" in message and isinstance(message["MESSAGE"], basestring):
                if "_SOURCE_REALTIME_TIMESTAMP" in message:
                    message["TIMESTAMP"] = int(int(message["_SOURCE_REALTIME_TIMESTAMP"]) / 1000000)
                else:
                    message["TIMESTAMP"] = False
                # remove unneeded fields
                for key, value in message.copy().items():
                    if key not in fields:
                        del message[key]
                if filter and any(filter in str(v) for k,v in message.items()):
                    result.append(message)
                if not filter:
                    result.append(message)
        return result[::-1]
Ejemplo n.º 4
0
 def __init__(self):
     self.m = Manager()
     self.config = ServicesConfig("services")
     self.units = []
Ejemplo n.º 5
0
from fnmatch import fnmatch
from sys import exit
from time import time

from systemd_dbus.exceptions import SystemdError
from systemd_dbus.manager import Manager
from systemd_dbus.service import Service
from systemd_dbus.timer import Timer

logging.basicConfig(
    format='%(levelname)-8s [%(filename)s:%(lineno)d] %(message)s')
logger = logging.getLogger(__name__)

now = time()

systemd_manager = Manager()


class Codes(object):
    OK = 0
    WARNING = 1
    CRITICAL = 2
    UNKNOWN = 3


class SystemdUnit:
    """
    Systemd unit

    This class implements wraper around systemd_dbus.unit.Unit with supporting
    of every unit type