def test_service_remove_service_that_doesnt_exists(mocker): assert "dummyservice" not in service_status().keys() with raiseYunohostError(mocker, "service_unknown"): service_remove("dummyservice") assert "dummyservice" not in service_status().keys()
def run(self): all_result = service_status() for service, result in sorted(all_result.items()): item = dict( meta={"service": service}, data={ "status": result["status"], "configuration": result["configuration"], }, ) if result["status"] != "running": item["status"] = "ERROR" if result[ "status"] != "unknown" else "WARNING" item["summary"] = "diagnosis_services_bad_status" item["details"] = ["diagnosis_services_bad_status_tip"] elif result["configuration"] == "broken": item["status"] = "WARNING" item["summary"] = "diagnosis_services_conf_broken" item["details"] = result["configuration-details"] else: item["status"] = "SUCCESS" item["summary"] = "diagnosis_services_running" yield item
def monitor_enable(with_stats=False): """ Enable server monitoring Keyword argument: with_stats -- Enable monitoring statistics """ from yunohost.service import (service_status, service_enable, service_start) glances = service_status('glances') if glances['status'] != 'running': service_start('glances') if glances['loaded'] != 'enabled': service_enable('glances') # Install crontab if with_stats: # day: every 5 min # week: every 1 h # month: every 4 h # rules = ('*/5 * * * * root {cmd} day >> /dev/null\n' '3 * * * * root {cmd} week >> /dev/null\n' '6 */4 * * * root {cmd} month >> /dev/null').format( cmd='/usr/bin/yunohost --quiet monitor update-stats') with open(crontab_path, 'w') as f: f.write(rules) logger.success(m18n.n('monitor_enabled'))
def monitor_enable(no_stats=False): """ Enable server monitoring Keyword argument: no_stats -- Disable monitoring statistics """ from yunohost.service import (service_status, service_enable, service_start) glances = service_status('glances') if glances['status'] != 'running': service_start('glances') if glances['loaded'] != 'enabled': service_enable('glances') # Install crontab if not no_stats: cmd = 'yunohost monitor update-stats' # day: every 5 min # week: every 1 h # month: every 4 h # rules = ('*/5 * * * * root %(cmd)s day >> /dev/null\n' + \ '3 * * * * root %(cmd)s week >> /dev/null\n' + \ '6 */4 * * * root %(cmd)s month >> /dev/null') % {'cmd': cmd} os.system("touch %s" % crontab_path) os.system("echo '%s' >%s" % (rules, crontab_path)) msignals.display(m18n.n('monitor_enabled'), 'success')
def _get_glances_api(): """ Retrieve Glances API running on the local server """ try: p = xmlrpclib.ServerProxy(glances_uri) p.system.methodHelp('getAll') except (xmlrpclib.ProtocolError, IOError): pass else: return p from yunohost.service import service_status if service_status('glances')['status'] != 'running': raise MoulinetteError(errno.EPERM, m18n.n('monitor_not_enabled')) raise MoulinetteError(errno.EIO, m18n.n('monitor_glances_con_failed'))
def monitor_disable(): """ Disable server monitoring """ from yunohost.service import (service_status, service_disable, service_stop) glances = service_status('glances') if glances['status'] != 'inactive': service_stop('glances') if glances['loaded'] != 'disabled': try: service_disable('glances') except MoulinetteError as e: logger.warning(e.strerror) # Remove crontab try: os.remove(crontab_path) except: pass logger.success(m18n.n('monitor_disabled'))
def monitor_disable(): """ Disable server monitoring """ from yunohost.service import (service_status, service_disable, service_stop) glances = service_status('glances') if glances['status'] != 'inactive': service_stop('glances') if glances['loaded'] != 'disabled': try: service_disable('glances') except MoulinetteError as e: msignals.display(e.strerror, 'warning') # Remove crontab try: os.remove(crontab_path) except: pass msignals.display(m18n.n('monitor_disabled'), 'success')
def test_service_status_all(): status = service_status() assert "ssh" in status.keys() assert status["ssh"]["status"] == "running"
def test_service_status_unknown_service(mocker): with raiseYunohostError(mocker, "service_unknown"): service_status(["ssh", "doesnotexists"])
def user_info(username): """ Get user informations Keyword argument: username -- Username or mail to get informations """ from yunohost.utils.ldap import _get_ldap_interface ldap = _get_ldap_interface() user_attrs = [ 'cn', 'mail', 'uid', 'maildrop', 'givenName', 'sn', 'mailuserquota' ] if len(username.split('@')) == 2: filter = 'mail=' + username else: filter = 'uid=' + username result = ldap.search('ou=users,dc=yunohost,dc=org', filter, user_attrs) if result: user = result[0] else: raise YunohostError('user_unknown', user=username) result_dict = { 'username': user['uid'][0], 'fullname': user['cn'][0], 'firstname': user['givenName'][0], 'lastname': user['sn'][0], 'mail': user['mail'][0] } if len(user['mail']) > 1: result_dict['mail-aliases'] = user['mail'][1:] if len(user['maildrop']) > 1: result_dict['mail-forward'] = user['maildrop'][1:] if 'mailuserquota' in user: userquota = user['mailuserquota'][0] if isinstance(userquota, int): userquota = str(userquota) # Test if userquota is '0' or '0M' ( quota pattern is ^(\d+[bkMGT])|0$ ) is_limited = not re.match('0[bkMGT]?', userquota) storage_use = '?' if service_status("dovecot")["status"] != "running": logger.warning(m18n.n('mailbox_used_space_dovecot_down')) elif username not in user_permission_info( "mail.main")["corresponding_users"]: logger.warning(m18n.n('mailbox_disabled', user=username)) else: try: cmd = 'doveadm -f flow quota get -u %s' % user['uid'][0] cmd_result = check_output(cmd) except Exception as e: cmd_result = "" logger.warning("Failed to fetch quota info ... : %s " % str(e)) # Exemple of return value for cmd: # """Quota name=User quota Type=STORAGE Value=0 Limit=- %=0 # Quota name=User quota Type=MESSAGE Value=0 Limit=- %=0""" has_value = re.search(r'Value=(\d+)', cmd_result) if has_value: storage_use = int(has_value.group(1)) storage_use = _convertSize(storage_use) if is_limited: has_percent = re.search(r'%=(\d+)', cmd_result) if has_percent: percentage = int(has_percent.group(1)) storage_use += ' (%s%%)' % percentage result_dict['mailbox-quota'] = { 'limit': userquota if is_limited else m18n.n('unlimit'), 'use': storage_use } return result_dict
def user_info(username): """ Get user informations Keyword argument: username -- Username or mail to get informations """ from yunohost.utils.ldap import _get_ldap_interface ldap = _get_ldap_interface() user_attrs = [ "cn", "mail", "uid", "maildrop", "givenName", "sn", "mailuserquota" ] if len(username.split("@")) == 2: filter = "mail=" + username else: filter = "uid=" + username result = ldap.search("ou=users,dc=yunohost,dc=org", filter, user_attrs) if result: user = result[0] else: raise YunohostValidationError("user_unknown", user=username) result_dict = { "username": user["uid"][0], "fullname": user["cn"][0], "firstname": user["givenName"][0], "lastname": user["sn"][0], "mail": user["mail"][0], } if len(user["mail"]) > 1: result_dict["mail-aliases"] = user["mail"][1:] if len(user["maildrop"]) > 1: result_dict["mail-forward"] = user["maildrop"][1:] if "mailuserquota" in user: userquota = user["mailuserquota"][0] if isinstance(userquota, int): userquota = str(userquota) # Test if userquota is '0' or '0M' ( quota pattern is ^(\d+[bkMGT])|0$ ) is_limited = not re.match("0[bkMGT]?", userquota) storage_use = "?" if service_status("dovecot")["status"] != "running": logger.warning(m18n.n("mailbox_used_space_dovecot_down")) elif username not in user_permission_info( "mail.main")["corresponding_users"]: logger.warning(m18n.n("mailbox_disabled", user=username)) else: try: cmd = "doveadm -f flow quota get -u %s" % user["uid"][0] cmd_result = check_output(cmd) except Exception as e: cmd_result = "" logger.warning("Failed to fetch quota info ... : %s " % str(e)) # Exemple of return value for cmd: # """Quota name=User quota Type=STORAGE Value=0 Limit=- %=0 # Quota name=User quota Type=MESSAGE Value=0 Limit=- %=0""" has_value = re.search(r"Value=(\d+)", cmd_result) if has_value: storage_use = int(has_value.group(1)) storage_use = _convertSize(storage_use) if is_limited: has_percent = re.search(r"%=(\d+)", cmd_result) if has_percent: percentage = int(has_percent.group(1)) storage_use += " (%s%%)" % percentage result_dict["mailbox-quota"] = { "limit": userquota if is_limited else m18n.n("unlimit"), "use": storage_use, } return result_dict
def user_info(auth, username): """ Get user informations Keyword argument: username -- Username or mail to get informations """ user_attrs = [ 'cn', 'mail', 'uid', 'maildrop', 'givenName', 'sn', 'mailuserquota' ] if len(username.split('@')) is 2: filter = 'mail=' + username else: filter = 'uid=' + username result = auth.search('ou=users,dc=yunohost,dc=org', filter, user_attrs) if result: user = result[0] else: raise MoulinetteError(errno.EINVAL, m18n.n('user_unknown', user=username)) result_dict = { 'username': user['uid'][0], 'fullname': user['cn'][0], 'firstname': user['givenName'][0], 'lastname': user['sn'][0], 'mail': user['mail'][0] } if len(user['mail']) > 1: result_dict['mail-aliases'] = user['mail'][1:] if len(user['maildrop']) > 1: result_dict['mail-forward'] = user['maildrop'][1:] if 'mailuserquota' in user: userquota = user['mailuserquota'][0] if isinstance(userquota, int): userquota = str(userquota) # Test if userquota is '0' or '0M' ( quota pattern is ^(\d+[bkMGT])|0$ ) is_limited = not re.match('0[bkMGT]?', userquota) storage_use = '?' if service_status("dovecot")["status"] != "running": logger.warning(m18n.n('mailbox_used_space_dovecot_down')) else: cmd = 'doveadm -f flow quota get -u %s' % user['uid'][0] cmd_result = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) # Exemple of return value for cmd: # """Quota name=User quota Type=STORAGE Value=0 Limit=- %=0 # Quota name=User quota Type=MESSAGE Value=0 Limit=- %=0""" has_value = re.search(r'Value=(\d+)', cmd_result) if has_value: storage_use = int(has_value.group(1)) storage_use = _convertSize(storage_use) if is_limited: has_percent = re.search(r'%=(\d+)', cmd_result) if has_percent: percentage = int(has_percent.group(1)) storage_use += ' (%s%%)' % percentage result_dict['mailbox-quota'] = { 'limit': userquota if is_limited else m18n.n('unlimit'), 'use': storage_use } if result: return result_dict else: raise MoulinetteError(167, m18n.n('user_info_failed'))
def test_service_status_single(): status = service_status("ssh") assert "status" in status.keys() assert status["status"] == "running"
def tools_diagnosis(auth, private=False): """ Return global info about current yunohost instance to help debugging """ diagnosis = OrderedDict() # Debian release try: with open('/etc/debian_version', 'r') as f: debian_version = f.read().rstrip() except IOError as e: logger.warning(m18n.n('diagnosis_debian_version_error', error=format(e)), exc_info=1) else: diagnosis['host'] = "Debian %s" % debian_version # Kernel version try: with open('/proc/sys/kernel/osrelease', 'r') as f: kernel_version = f.read().rstrip() except IOError as e: logger.warning(m18n.n('diagnosis_kernel_version_error', error=format(e)), exc_info=1) else: diagnosis['kernel'] = kernel_version # Packages version diagnosis['packages'] = ynh_packages_version() # Server basic monitoring diagnosis['system'] = OrderedDict() try: disks = monitor_disk(units=['filesystem'], human_readable=True) except MoulinetteError as e: logger.warning(m18n.n('diagnosis_monitor_disk_error', error=format(e)), exc_info=1) else: diagnosis['system']['disks'] = {} for disk in disks: diagnosis['system']['disks'][ disk] = 'Mounted on %s, %s (%s free)' % ( disks[disk]['mnt_point'], disks[disk]['size'], disks[disk]['avail']) try: system = monitor_system(units=['cpu', 'memory'], human_readable=True) except MoulinetteError as e: logger.warning(m18n.n('diagnosis_monitor_system_error', error=format(e)), exc_info=1) else: diagnosis['system']['memory'] = { 'ram': '%s (%s free)' % (system['memory']['ram']['total'], system['memory']['ram']['free']), 'swap': '%s (%s free)' % (system['memory']['swap']['total'], system['memory']['swap']['free']), } # Services status services = service_status() diagnosis['services'] = {} for service in services: diagnosis['services'][service] = "%s (%s)" % ( services[service]['status'], services[service]['loaded']) # YNH Applications try: applications = app_list()['apps'] except MoulinetteError as e: diagnosis['applications'] = m18n.n('diagnosis_no_apps') else: diagnosis['applications'] = {} for application in applications: if application['installed']: diagnosis['applications'][application['id']] = application[ 'label'] if application['label'] else application['name'] # Private data if private: diagnosis['private'] = OrderedDict() # Public IP diagnosis['private']['public_ip'] = {} try: diagnosis['private']['public_ip']['IPv4'] = get_public_ip(4) except MoulinetteError as e: pass try: diagnosis['private']['public_ip']['IPv6'] = get_public_ip(6) except MoulinetteError as e: pass # Domains diagnosis['private']['domains'] = domain_list(auth)['domains'] return diagnosis
def test_service_add_real_service(): service_add("networking") assert "networking" in service_status().keys()
def tools_diagnosis(auth, private=False): """ Return global info about current yunohost instance to help debugging """ diagnosis = OrderedDict(); # Debian release try: with open('/etc/debian_version', 'r') as f: debian_version = f.read().rstrip() except IOError as e: logger.warning(m18n.n('diagnosis_debian_version_error', error=format(e)), exc_info=1) else: diagnosis['host'] = "Debian %s" % debian_version # Kernel version try: with open('/proc/sys/kernel/osrelease', 'r') as f: kernel_version = f.read().rstrip() except IOError as e: logger.warning(m18n.n('diagnosis_kernel_version_error', error=format(e)), exc_info=1) else: diagnosis['kernel'] = kernel_version # Packages version diagnosis['packages'] = ynh_packages_version() # Server basic monitoring diagnosis['system'] = OrderedDict() try: disks = monitor_disk(units=['filesystem'], human_readable=True) except MoulinetteError as e: logger.warning(m18n.n('diagnosis_monitor_disk_error', error=format(e)), exc_info=1) else: diagnosis['system']['disks'] = {} for disk in disks: diagnosis['system']['disks'][disk] = 'Mounted on %s, %s (%s free)' % ( disks[disk]['mnt_point'], disks[disk]['size'], disks[disk]['avail'] ) try: system = monitor_system(units=['cpu', 'memory'], human_readable=True) except MoulinetteError as e: logger.warning(m18n.n('diagnosis_monitor_system_error', error=format(e)), exc_info=1) else: diagnosis['system']['memory'] = { 'ram' : '%s (%s free)' % (system['memory']['ram']['total'], system['memory']['ram']['free']), 'swap' : '%s (%s free)' % (system['memory']['swap']['total'], system['memory']['swap']['free']), } # Services status services = service_status() diagnosis['services'] = {} for service in services: diagnosis['services'][service] = "%s (%s)" % (services[service]['status'], services[service]['loaded']) # YNH Applications try: applications = app_list()['apps'] except MoulinetteError as e: diagnosis['applications'] = m18n.n('diagnosis_no_apps') else: diagnosis['applications'] = {} for application in applications: if application['installed']: diagnosis['applications'][application['id']] = application['label'] if application['label'] else application['name'] # Private data if private: diagnosis['private'] = OrderedDict() # Public IP diagnosis['private']['public_ip'] = {} try: diagnosis['private']['public_ip']['IPv4'] = get_public_ip(4) except MoulinetteError as e: pass try: diagnosis['private']['public_ip']['IPv6'] = get_public_ip(6) except MoulinetteError as e: pass # Domains diagnosis['private']['domains'] = domain_list(auth)['domains'] return diagnosis
def test_service_remove(): service_add("dummyservice", description="A dummy service to run tests") assert "dummyservice" in service_status().keys() service_remove("dummyservice") assert "dummyservice" not in service_status().keys()