| Server IP : 185.88.153.241 / Your IP : 216.73.217.115 Web Server : LiteSpeed System : Linux server312.bertina.biz 3.10.0-962.3.2.lve1.5.88.el7.x86_64 #1 SMP Fri Sep 26 14:06:42 UTC 2025 x86_64 User : ( 1405) PHP Version : 7.0.33 Disable Function : mail, apache_child_terminate, apache_setenv, define_syslog_variables, escapeshellarg, escapeshellcmd, exec, fp, highlight_file, ini_alter, ini_restore, inject_code, mysql_pconnect, openlog, passthru, phpAds_remoteInfo, phpAds_XmlRpc, phpAds_xmlrpcDecode, phpAds_xmlrpcEncode, popen, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, proc_close, proc_get_status, proc_nice, proc_open, proc_terminate, shell_exec, syslog, system, xmlrpc_entity_decode, show_source,dl,leak,crack_check,crack_closedict,crack_getlastmessage,crack_opendict,symlink,link,escapeshellarg,parse_ini_file, ln, show_source, pclose, parse_perms, mysql_list_dbs,stream_select,mysql_list_dbs,socket_select,socket_create,socket_create_listen,socket_create_pair,socket_listen,socket_accept,socket_bind,socket_strerror,socket_clear_error,socket_close,socket_connect,socket_get_option,socket_getpeername,socket_getsockname,socket_last_error,socket_read,socket_recv,socket_recvfrom,socket_send,socket_sendto,socket_set_block,socket_set_nonblock,socket_set_option,socket_shutdown,socket_write,readlink,pfsockopen,pcntl_exec,pcntl_fork,pcntl_signal,pcntl_waitpid,pcntl_wexitstatus, pcntl_wifexited, pcntl_wifsignaled, pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,fpassthru, posix_access, posix_ctermid, posix_errno, posix_get_last_error, posix_getcwd, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgrp, posix_getpwnam, posix_getpwuid, posix_getrlimit, posix_getsid, posix_initgroups, posix_isatty, posix_mknod, posix_setegid, posix_seteuid, posix_strerror, posix_times, posix_ttyname, diskfreespace, disk_free_space, disk_total_space, sys_getloadavg,get_current_user MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /lib/python2.7/site-packages/clcommon/cpapi/plugins/ |
Upload File : |
#!/usr/bin/python
# -*- coding: utf-8 -*-
__cpname__ = 'DirectAdmin'
def detect():
return os.path.isfile('/usr/local/directadmin/directadmin') or \
os.path.isfile('/usr/local/directadmin/custombuild/build')
import os
import glob
import re
from clcommon.clconfpars import load as loadconfig
from clcommon.cpapi.cpapiexceptions import NoDBAccessData, CpApiTypeError
from clcommon.cpapi.plugins.universal import _dblogin_cplogin_pairs
from clcommon import ClPwd
DA_DB_CONF = '/usr/local/directadmin/conf/mysql.conf'
DA_USERS_PATH = '/usr/local/directadmin/data/users'
USER_CONF = 'user.conf'
RESELLERS_LIST = '/usr/local/directadmin/data/admin/reseller.list'
USER_PATTERN = re.compile(r'.+/(.+)/%s' % re.escape(USER_CONF))
USERCONF_PARAM_MAP = {
'dns': 'domain',
'package': 'package',
'mail': 'email',
'locale': 'language',
'cplogin': 'name',
'reseller': 'reseller'
}
def db_access(_conf_path=DA_DB_CONF):
access = dict()
try:
login_data = loadconfig(_conf_path)
access['login'] = login_data['user']
access['pass'] = login_data['passwd']
except IOError, err:
raise NoDBAccessData('Can not open file with data to database access; ' + str(err))
except KeyError:
raise NoDBAccessData('Can not get database access data from file %s' % (_conf_path,))
return access
def cpusers(_path=DA_USERS_PATH):
match_list = [USER_PATTERN.match(path) for path in glob.glob(os.path.join(_path, '*', USER_CONF))]
users_list = [match.group(1) for match in match_list if match]
return tuple(users_list)
def resellers(_resellers_path=RESELLERS_LIST):
stream = open(_resellers_path)
resellers_list = map(str.strip, stream.readlines())
stream.close()
return tuple(resellers_list)
def dblogin_cplogin_pairs(cplogin_lst=None, with_system_users=False):
access = db_access()
data = _dblogin_cplogin_pairs(cplogin_lst=cplogin_lst, access=access)
return data
def cpinfo(cpuser=None, keyls=('cplogin', 'package', 'mail', 'reseller', 'dns', 'locale'),
_path=DA_USERS_PATH):
returned = list()
if isinstance(cpuser, (str, unicode)):
cpusers_list = [cpuser]
elif isinstance(cpuser, (list, tuple)):
cpusers_list = tuple(cpuser)
elif cpuser is None:
match_list = [USER_PATTERN.match(path) for path in glob.iglob(os.path.join(_path, '*', USER_CONF))]
cpusers_list = [match.group(1) for match in match_list if match]
else:
raise CpApiTypeError(funcname='cpinfo', supportettypes='str|unicode|list|tuple',
received_type=type(cpuser).__name__)
# generate user reseller map
user_reseller_map = dict()
reseller_list_stream = open(RESELLERS_LIST)
for reseller_login in reseller_list_stream:
reseller_cpuser_list = open(os.path.join(os.path.join(_path, reseller_login.strip(), 'users.list')))
user_reseller_map.update(dict([(user_name, reseller_login) for user_name in reseller_cpuser_list
if user_name in cpusers_list]))
reseller_cpuser_list.close()
for cpuser in cpusers_list:
cpuser_data = loadconfig(os.path.join(_path, cpuser, 'user.conf'))
cpuser_data['reseller'] = user_reseller_map.get(cpuser) # insert reseller login
cpuser_data_lst = tuple([cpuser_data.get(USERCONF_PARAM_MAP.get(key)) for key in keyls])
if cpuser_data_lst not in returned:
returned.append(cpuser_data_lst)
return returned
def homedirs(_sysusers=None, _path=DA_USERS_PATH):
"""
Detects and returns list of folders contained the home dirs of users of the DirectAdmin
:param str|None _sysusers: for testing
:param str|None _path: for testing
:return: list of folders, which are parent of home dirs of users of the panel
"""
homedirs = []
clpwd = ClPwd()
users_dict = clpwd.get_user_dict()
# for testing only
if isinstance(_sysusers, (list, tuple)):
class pw(object):
def __init__(self, name, dir):
self.pw_name = name
self.pw_dir = dir
users_dict = {}
for (name,dir) in _sysusers:
users_dict[name] = pw(name, dir)
for user_name in users_dict:
conf_file = _path + '/' + user_name + '/user.conf'
if os.path.exists(conf_file):
homedir = os.path.dirname(users_dict[user_name].pw_dir)
if homedir not in homedirs:
homedirs.append(homedir)
return homedirs