diff --git a/ajenti/core.py b/ajenti/core.py index 63f4b73..47deb03 100644 --- a/ajenti/core.py +++ b/ajenti/core.py @@ -58,7 +58,7 @@ def run(): logging.warning('Couldn\'t set default locale') logging.info('Ajenti %s running on platform: %s' % (ajenti.version, ajenti.platform)) - if not ajenti.platform in ['debian', 'centos', 'freebsd']: + if not ajenti.platform in ['debian', 'centos', 'freebsd', 'mageia']: logging.warn('%s is not officially supported!' % ajenti.platform) if ajenti.debug: diff --git a/ajenti/plugins/apache/__init__.py b/ajenti/plugins/apache/__init__.py index d007d38..94a3152 100644 --- a/ajenti/plugins/apache/__init__.py +++ b/ajenti/plugins/apache/__init__.py @@ -10,6 +10,7 @@ info = PluginInfo( dependencies=[ PluginDependency('webserver_common'), BinaryDependency(platform_select( + mageia='httpd', centos='httpd', freebsd='apachectl', default='apache2', diff --git a/ajenti/plugins/apache/main.py b/ajenti/plugins/apache/main.py index b69732f..16fa924 100644 --- a/ajenti/plugins/apache/main.py +++ b/ajenti/plugins/apache/main.py @@ -17,6 +17,7 @@ class Apache (WebserverPlugin): hosts_available_dir = platform_select( debian='/etc/apache2/sites-available', centos='/etc/httpd/conf.d', + mageia='/etc/httpd/conf', freebsd='/usr/local/etc/apache/sites-available', ) hosts_enabled_dir = '/etc/apache2/sites-enabled' @@ -48,5 +49,6 @@ class Apache (WebserverPlugin): self.title = 'Apache' self.category = _('Software') self.icon = 'globe' - if ajenti.platform == 'centos': + if ajenti.platform == 'centos' or \ + ajenti.platform == 'mageia': self.service_name = 'httpd' diff --git a/ajenti/plugins/bind9/main.py b/ajenti/plugins/bind9/main.py index 634bab7..778872f 100644 --- a/ajenti/plugins/bind9/main.py +++ b/ajenti/plugins/bind9/main.py @@ -15,6 +15,7 @@ class BIND9Plugin (SectionPlugin): config_root = platform_select( debian='/etc/bind/', centos='/etc/named/', + mageia='/etc/named/', arch='/var/named/', ) diff --git a/ajenti/plugins/ctdb/main.py b/ajenti/plugins/ctdb/main.py index 3533aa6..2f2b175 100644 --- a/ajenti/plugins/ctdb/main.py +++ b/ajenti/plugins/ctdb/main.py @@ -25,7 +25,8 @@ class CTDB (SectionPlugin): self.config_path = { 'debian': '/etc/default/ctdb', - 'centos': '/etc/sysconfig/ctdb' + 'centos': '/etc/sysconfig/ctdb', + 'mageia': '/etc/sysconfig/ctdb' }[ajenti.platform] self.config = CTDBConfig(path=self.config_path) diff --git a/ajenti/plugins/network/main.py b/ajenti/plugins/network/main.py index 7cc85b6..a110ebc 100755 --- a/ajenti/plugins/network/main.py +++ b/ajenti/plugins/network/main.py @@ -9,7 +9,7 @@ from api import * @plugin class NetworkPlugin (SectionPlugin): - platforms = ['debian', 'centos'] + platforms = ['debian', 'centos', 'mageia'] def init(self): self.title = _('Network') diff --git a/ajenti/plugins/network/nc_centos.py b/ajenti/plugins/network/nc_centos.py index b7e0091..3c06e6c 100755 --- a/ajenti/plugins/network/nc_centos.py +++ b/ajenti/plugins/network/nc_centos.py @@ -18,7 +18,7 @@ optionmap = { @plugin class CentosNetworkConfig (LinuxIfconfig, INetworkConfig): - platforms = ['centos'] + platforms = ['centos', 'mageia'] interfaces = None diff --git a/ajenti/plugins/network/nctp_linux.py b/ajenti/plugins/network/nctp_linux.py index b0ca3ec..415fe7a 100644 --- a/ajenti/plugins/network/nctp_linux.py +++ b/ajenti/plugins/network/nctp_linux.py @@ -10,7 +10,7 @@ from ajenti.ui import * class LinuxIfconfig (object): - platforms = ['debian', 'centos'] + platforms = ['debian', 'centos', 'mageia'] def detect_dev_class(self, iface): ifname = re.compile('[a-z]+').findall(iface.name) diff --git a/ajenti/plugins/nginx/main.py b/ajenti/plugins/nginx/main.py index 8046fe5..c44169a 100644 --- a/ajenti/plugins/nginx/main.py +++ b/ajenti/plugins/nginx/main.py @@ -5,7 +5,7 @@ from ajenti.util import platform_select @plugin class Nginx (WebserverPlugin): - platforms = ['debian', 'centos', 'freebsd', 'arch'] + platforms = ['debian', 'centos', 'freebsd', 'arch', 'mageia'] service_name = 'nginx' service_buttons = [ { @@ -17,6 +17,7 @@ class Nginx (WebserverPlugin): hosts_available_dir = platform_select( debian='/etc/nginx/sites-available', centos='/etc/nginx/conf.d', + mageia='/etc/nginx/conf.d', freebsd='/usr/local/etc/nginx/conf.d', arch='/etc/nginx/sites-available', ) diff --git a/ajenti/plugins/ntpd/main.py b/ajenti/plugins/ntpd/main.py index c95035c..8d6ec2f 100644 --- a/ajenti/plugins/ntpd/main.py +++ b/ajenti/plugins/ntpd/main.py @@ -70,6 +70,7 @@ class NTPDPlugin(SectionPlugin): service_name = platform_select( default='ntp', centos='ntpd', + mageia='ntpd', ) def init(self): diff --git a/ajenti/plugins/packages/__init__.py b/ajenti/plugins/packages/__init__.py index d36bd73..796a60f 100644 --- a/ajenti/plugins/packages/__init__.py +++ b/ajenti/plugins/packages/__init__.py @@ -18,4 +18,5 @@ def init(): import pm_bsd import pm_yum import pm_pacman + import pm_urpmi import installer diff --git a/ajenti/plugins/packages/installer.py b/ajenti/plugins/packages/installer.py index d6f45f0..a2f21f1 100644 --- a/ajenti/plugins/packages/installer.py +++ b/ajenti/plugins/packages/installer.py @@ -79,6 +79,27 @@ db = { 'ipmitool': 'ipmitool', 'cron': 'cronie', }, + 'mageia': { + 'python-module-BeautifulSoup': 'python-beautifulsoup', + 'supervisord': 'supervisor', + 'hddtemp': 'hddtemp', + 'sensors': 'lm_sensors', + 'munin-cron': 'munin', + 'smbd': 'samba', + 'smartctl': 'smartmontools', + 'squid3': 'squid', + 'apache2': 'apache', + 'ctdb': 'ctdb', + 'mysql': 'mariadb', + 'mysqld_safe': 'mariadb-core', + 'psql': 'postgresql', + 'mdadm': 'mdadm', + 'nginx': 'nginx', + 'ipmitool': 'ipmitool', + 'cron': 'cronie', + 'openvpn': 'openvpn', + 'memcached': 'memcached', + }, 'arch': { 'python-module-BeautifulSoup': 'python2-beautifulsoup3', 'supervisord': 'supervisor', diff --git a/ajenti/plugins/packages/main.py b/ajenti/plugins/packages/main.py index 4b449d9..11c7fcc 100644 --- a/ajenti/plugins/packages/main.py +++ b/ajenti/plugins/packages/main.py @@ -8,7 +8,7 @@ from api import PackageManager, PackageInfo @plugin class Packages (SectionPlugin): - platforms = ['debian', 'centos', 'freebsd', 'arch'] + platforms = ['debian', 'centos', 'freebsd', 'arch', 'mageia'] def init(self): self.title = _('Packages') self.icon = 'gift' diff --git a/ajenti/plugins/packages/pm_urpmi.py b/ajenti/plugins/packages/pm_urpmi.py new file mode 100644 index 0000000..5c77f6f --- /dev/null +++ b/ajenti/plugins/packages/pm_urpmi.py @@ -0,0 +1,93 @@ +import subprocess + +from ajenti.api import * +from api import PackageInfo, PackageManager + + +@plugin +@rootcontext +@persistent +class UrpmiPackageManager (PackageManager): + platforms = ['mageia'] + def refresh(self): + try: + out_update = subprocess.check_output(['urpmi.update', '-a']) + except subprocess.CalledProcessError as e: + pass + + try: + out_u = subprocess.check_output(['urpmq', '--auto-select', "-r"]) + self.upgradeable = self._parse_urpmi(out_u) + except subprocess.CalledProcessError as e: + self.upgradeable = [] + + try: + out_a = subprocess.check_output(['urpmq', '--list', "-r"]) + self.all = self._parse_urpmi(out_a) + self.all_dict = dict((x.name, x) for x in self.all) + except subprocess.CalledProcessError as e: + self.all = [] + self.all_dict = {} + + def search(self, query): + if query.strip() == "": + return [] + try: + out_s = subprocess.check_output(['urpmq', "-Y", + "--summary", query]) + except subprocess.CalledProcessError as e: + return [] + + r = [] + for l in out_s.split('\n'): + s = l.strip().split(":", 1) + if len(s) != 2: + continue + summary_list = s[1].rsplit("(",1) + if len(summary_list) != 2: + continue + p = PackageInfo() + p.name = s[0].strip() + p.summary = summary_list[0].strip() + p.version = summary_list[1].rsplit(")",1)[0].strip() + p.state = 'r' + if p.name in self.all_dict and self.all_dict[p.name].state == 'i': + p.state = 'i' + r.append(p) + return r + def get_lists(self): + self.context.launch('terminal', + command='urpmi.update -a ; read -p "Press [enter] to continue"') + + def do(self, actions, callback=lambda: 0): + to_install = [a for a in actions if a.action == 'i'] + to_remove = [a for a in actions if a.action == 'r'] + cmd = '' + if len(to_install) > 0: + cmd += 'urpmi ' + ' '.join(a.name for a in to_install) + if len(to_remove) > 0: + cmd += ' && ' + if len(to_remove) > 0: + cmd += 'urpme ' + ' '.join(a.name for a in to_remove) + if len(to_install) > 0 or len(to_remove) > 0: + cmd += " ; " + cmd += 'read -p "Press [enter] to continue"' + self.context.launch('terminal', command=cmd, callback=callback) + + def _parse_urpmi(self, ss): + r = [] + for s in ss.splitlines(): + s = s.strip().rsplit("-", 2) + if len(s) != 3: + continue + try: + p = PackageInfo() + p.name = s[0] + p.version = "-".join(s[1:]) + p.state = 'i' + r.append(p) + if len(r.keys()) > 2500: + break + except: + pass + return r diff --git a/ajenti/plugins/samba/main.py b/ajenti/plugins/samba/main.py index d8b7532..c74cc52 100644 --- a/ajenti/plugins/samba/main.py +++ b/ajenti/plugins/samba/main.py @@ -22,6 +22,7 @@ class Samba (SectionPlugin): self.find('servicebar').name = platform_select( debian='samba', ubuntu='smbd', + mageia='smbd', centos='smb', default='samba', ) diff --git a/ajenti/plugins/sensors/load.py b/ajenti/plugins/sensors/load.py index 849ce7b..e162570 100644 --- a/ajenti/plugins/sensors/load.py +++ b/ajenti/plugins/sensors/load.py @@ -15,7 +15,7 @@ class BaseLoadSensor (Sensor): @plugin class LinuxLoadSensor (BaseLoadSensor): - platforms = ['debian', 'centos', 'arch'] + platforms = ['debian', 'centos', 'arch', 'mageia'] def measure(self, variant): idx = self.get_variants().index(variant) diff --git a/ajenti/plugins/users/main.py b/ajenti/plugins/users/main.py index 53f89ba..e284080 100644 --- a/ajenti/plugins/users/main.py +++ b/ajenti/plugins/users/main.py @@ -157,7 +157,7 @@ class UsersBackend (object): @plugin class LinuxUsersBackend (UsersBackend): - platforms = ['debian', 'centos', 'arch'] + platforms = ['debian', 'centos', 'arch', 'mageia'] def add_user(self, name): subprocess.call(['useradd', '-s', '/bin/false', name]) diff --git a/ajenti/plugins/iptables/main.py b/ajenti/plugins/iptables/main.py index 44aadd4..02de6cb 100755 --- a/ajenti/plugins/iptables/main.py +++ b/ajenti/plugins/iptables/main.py @@ -50,7 +50,7 @@ class DebianFirewallManager (FirewallManager, BasePlugin): @plugin class CentOSFirewallManager (FirewallManager, BasePlugin): - platforms = ['centos'] + platforms = ['centos', 'mageia'] config_path = '/etc/sysconfig/iptables' config_path_ajenti = '/etc/iptables.up.rules.ajenti' @@ -70,7 +70,7 @@ class ArchFirewallManager (FirewallManager, BasePlugin): @plugin class Firewall (SectionPlugin): - platforms = ['centos', 'debian', 'arch'] + platforms = ['centos', 'debian', 'arch', 'mageia'] manager_class = FirewallManager def init(self):