\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /lib/python2.7/site-packages/clcommon/cpapi/plugins/

Viewing File: ispmanager.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re
import os
import grp
try:
    import MySQLdb
except ImportError:
    MySQLdb = None
from clcommon.cpapi.cpapiexceptions import NoPackage

from clcommon.cpapi.cpapiexceptions import NotSupported, NoDBAccessData

__cpname__ = 'ISPManager'


def detect():
    return os.path.isfile('/usr/local/ispmgr/bin/ispmgr') or os.path.isfile('/usr/local/mgr5/sbin/mgrctl')


ISP_DB_CONF = '/usr/local/ispmgr/etc/ispmgr.conf'

SECTION_PATTERN = r'(\S+) "([^"]+)" {([^}]+)}'
KEYWORDS_PATTERN = r'(\S+)\s+(\S+)'


def conf_pars(sectype, secname=None, seckeys=None, path=ISP_DB_CONF):
    """
    /usr/local/ispmgr/etc/ispmgr.conf parser
    :param sectype: Type sector for example: Service or DbServer or Account
    :param secname: Name sector. May be different
    :param seckeys: Name key for retrieving and filtering
    :param path: path to config file default /usr/local/ispmgr/etc/ispmgr.conf
    :return: list
    """
    seckeys_filter = dict()
    seckeys_extracted = None
    if seckeys:
        seckeys_extracted = list()
        for key_val in seckeys:
            key_val_splited = key_val.split()
            if len(key_val_splited) == 2:
                seckeys_filter.update(dict([key_val_splited]))
                seckeys_extracted.append(key_val_splited[0])
            elif len(key_val_splited) == 1:
                seckeys_extracted.append(key_val_splited[0])
    conf_stream = open(path)
    result_list = list()
    for stype, sname, sbody in re.findall(SECTION_PATTERN, conf_stream.read()):
        blst = re.findall(KEYWORDS_PATTERN, sbody)
        if stype == sectype and secname in (None, secname):
            result = dict([(k, v)
                           for k, v in blst
                           if seckeys_extracted is None or k in seckeys_extracted])

            if set(seckeys_filter.items()).issubset(set(result.items())):
                result_list.append(result)

    conf_stream.close()
    return result_list


def db_access(_conf_path=ISP_DB_CONF):
    access = dict()
    access_list = conf_pars(sectype='DbServer', seckeys=('Hostname', 'Password', 'Type mysql', 'User'), path=_conf_path)
    for access_from_conf in access_list:
        try:
            access['pass'] = access_from_conf['Password']
            access['login'] = access_from_conf['User']
            access['host'] = access_from_conf['Hostname']
            access['db'] = 'mysql'
            return access
        except KeyError:
            pass
    raise NoDBAccessData('Can not find database access data for localhost in config file %s' % (_conf_path,))


def _dbname_dblogin_pairs(access):
    if not MySQLdb:
        raise NoPackage('Can not connect to database; MySQL-python package not installed.')
    dbhost = access.get('host', 'localhost')
    dblogin = access['login']
    dbpass = access['pass']
    db = MySQLdb.connect(host=dbhost, user=dblogin, passwd=dbpass, db='mysql')
    cursor = db.cursor()
    sql = r"SELECT db.Db, db.User FROM db  GROUP BY db.User, db.Db"
    cursor.execute(sql)
    data = cursor.fetchall()
    db.close()
    return data


def cpusers():
    raise NotSupported('Getting all users registered in the Control Panel is not currently supported. '
                       'Is under development.')


def _dbname_cplogin_pairs_iter(cplogin_lst=None, _conf_path=ISP_DB_CONF):
    """
    Extract (database name <=> control panel login) pairs from ISPmanager config file
    :param cplogin_lst:
    :param _conf_path:
    :return:
    """
    conf_stream = open(_conf_path)
    grpid_login_dict = dict([(grp_tuple[2], grp_tuple[0]) for grp_tuple in grp.getgrall()])
    for line_numb, line in enumerate(conf_stream):
        if line.startswith('DbAssign '):
            line_splited = line.split()
            if len(line_splited) >= 3:
                dbname, user_uid = line_splited[2:]
                try:
                    cplogin = grpid_login_dict.get(int(user_uid))
                    if cplogin is None:
                        print('WARNING: can not find group name with id %s; line %d in file %s'
                              % (user_uid, line_numb, _conf_path))
                except ValueError:  # if can not convert user_uid to int
                    print('WARNING: can not pars line %d in file %s' % (line_numb, _conf_path))
                    cplogin = None
                if cplogin and (cplogin_lst is not None or cplogin in cplogin_lst):
                    yield dbname, cplogin
    conf_stream.close()