/opt/dedrads
NameSizeModeActions
account_review/-0555rm
check_software_mods/-0555rm
cms_tools/-0555rm
etc/-0555rm
extras/-0555rm
mailparse/-0555rm
mysql/-0555rm
nlp_scripts/-0555rm
oldrads/-0555rm
perl/-0555rm
provision/-0555rm
python/-0555rm
suspended/-0555rm
__pycache__/-0555rm
account-review7990555editdlrm
allfw62590555editdlrm
alp.py165530555editdlrm
autossl_sync62670555editdlrm
check_apache92050555editdlrm
check_bandwidth45460555editdlrm
check_boxtrapper16840555editdlrm
check_cpu122120555editdlrm
check_crons18270555editdlrm
check_dcpumon19730555editdlrm
check_dns18270555editdlrm
check_domlogs610555editdlrm
check_exim37310555editdlrm
check_hacks226040555editdlrm
check_imap52490555editdlrm
check_io66350555editdlrm
check_max_children163410555editdlrm
check_mem16600555editdlrm
check_misc15100555editdlrm
check_pacct52010555editdlrm
check_php43440555editdlrm
check_pop322950555editdlrm
check_prov.py47140555editdlrm
check_server6960555editdlrm
check_size4900555editdlrm
check_software98490555editdlrm
check_spamd24260555editdlrm
check_traffic19330555editdlrm
check_user18870555editdlrm
clean_exim.py63900555editdlrm
clusterfix53430555editdlrm
cmspass.py39700555editdlrm
cms_check.py98250555editdlrm
cms_counter.py367340555editdlrm
cms_creds7130555editdlrm
cms_dumpdb44850555editdlrm
cms_pw14160555editdlrm
cpanel-api70400555editdlrm
cpanel_postgres_manager.py290040555editdlrm
cpmerge46310555editdlrm
cpumon21950555editdlrm
dcpumon.pl12390555editdlrm
dedcheck181270555editdlrm
dns-sync143860555editdlrm
docroot.py44250555editdlrm
du-tree74500555editdlrm
envinfo.py66330555editdlrm
exclude_rbl.py52490555editdlrm
extract-vhost26910555editdlrm
filescan35660555editdlrm
find_warez14600555editdlrm
first_setup.py191200555editdlrm
fixwpcron.py48220555editdlrm
fix_dns_cluster3530555editdlrm
goaccess12177200555editdlrm
hostsfilemods44670555editdlrm
imap_io23230555editdlrm
innodb_converter.py93430555editdlrm
killall9115300555editdlrm
killdns9410555editdlrm
lastcommcache.sh13740555editdlrm
legal_lock_down.sh74500555editdlrm
lil-cpanel520020555editdlrm
listacct45750555editdlrm
mailscan45440555editdlrm
mail_sources.py74070555editdlrm
megaclisas-status386640555editdlrm
migrate2central.sh144180555editdlrm
modify-account406310555editdlrm
modsec_disable.py114610555editdlrm
monarxctl89120555editdlrm
msp.pl277140555editdlrm
mysql_dstat4740555editdlrm
mysql_selector.py731020555editdlrm
nlp45820555editdlrm
procscrape18630555editdlrm
quarantine110830555editdlrm
radsfunctions.sh8630555editdlrm
recent-cp161480555editdlrm
remote_dump183470555editdlrm
reset_cpanel32050555editdlrm
server-load21920555editdlrm
show-conns201050555editdlrm
show-conns-adv.py546670555editdlrm
sparta.py3824980555editdlrm
sqltop271290555editdlrm
telcheck24110555editdlrm
temprootreset1860555editdlrm
unsuspend_user13070555editdlrm
unsusprunner.sh18400555editdlrm
updatednsadmin5260555editdlrm
update_spf149720555editdlrm
upgrade-check92160555editdlrm
vhost_data.py62210555editdlrm
wp-xray.sh858160555editdlrm
Edit: /opt/dedrads/cmspass.py (3970B)
#!/usr/lib/rads/venv/bin/python3 """Scans a cPanel account for WordPress and Joomla! configuration files, then uses whmapi1 to reset database passwords to match what was found in them. This script logs to /var/log/messages""" import subprocess import re import sys from argparse import ArgumentParser from pathlib import Path import rads import logging from logging.handlers import SysLogHandler from cpapis import whmapi1, CpAPIError WP_CONF = re.compile(r"DB_(USER|PASSWORD).*['\"](.+)['\"]") JM_CONF = re.compile(r"\b(user|password) = '(.+)'") def setup_logging() -> logging.Logger: logger = logging.getLogger('cmspass.py') logger.setLevel(logging.DEBUG) out_fmt = logging.Formatter(fmt='%(levelname)s: %(message)s') log_fmt = logging.Formatter(fmt='cmspass.py: %(levelname)s: %(message)s') stdout = logging.StreamHandler(stream=sys.stdout) stdout.setFormatter(out_fmt) stdout.setLevel(logging.DEBUG) logger.addHandler(stdout) syslog = SysLogHandler(address='/dev/log') syslog.setFormatter(log_fmt) syslog.setLevel(logging.WARNING) logger.addHandler(syslog) return logger def conf_parse(regex: re.Pattern, path: Path) -> tuple[str | None, str | None]: """Will parse db conf variables""" db_user, db_pass = None, None with open(path, encoding='utf-8') as file: for line in file: if match := regex.search(line): key, val = match.groups() key: str val: str if key.lower() == 'user': db_user = val elif key.lower() == 'password': db_pass = val return db_user, db_pass def set_pass(logger: logging.Logger, cpuser: str, db_user: str, db_pass: str): """Will pass the reset variables to the cPanel API""" if db_user is None or db_pass is None: return try: whmapi1( 'set_mysql_password', args={'cpuser': cpuser, 'user': db_user, 'password': db_pass}, check=True, ) except CpAPIError as exc: logger.error("Failed to reset password for %s: %s", db_user, exc) else: logger.warning("Reset password for %s", db_user) def parse_args() -> str: """Will parse input for user and ensure the user exists""" parser = ArgumentParser(description=__doc__) parser.add_argument('-u', '--user', required=True, help='cPanel username') user = parser.parse_args().user if not rads.cpuser_safe(user): sys.exit(f"{user} does not exist or is restricted") return user def find_files(homedir: str) -> list[Path]: """Find all config files""" # fmt: off cmd = [ 'find', homedir, '-not', '(', '-path', f"{homedir}/mail", '-prune', ')', '(', '-name', 'wp-config.php', '-o', '-name', 'configuration.php', ')', '-type', 'f', '-print0', ] # fmt: on ret = subprocess.run( cmd, stdout=subprocess.PIPE, encoding='utf-8', check=False ) return [Path(x) for x in ret.stdout.split('\0') if x] def conf_is_joomla(path: Path): if path.name != 'configuration.php': return False with open(path, encoding='utf-8') as conf: for line in conf: if 'class JConfig' in line: return True return False def main(): user = parse_args() logger = setup_logging() try: homedir = rads.get_homedir(user) except rads.CpuserError as exc: sys.exit(exc) for path in find_files(homedir): db_user, db_pass = None, None if path.name == 'wp-config.php': logger.debug('Scanning %s', path) db_user, db_pass = conf_parse(WP_CONF, path) elif conf_is_joomla(path): logger.debug('Scanning %s', path) db_user, db_pass = conf_parse(JM_CONF, path) if db_user and db_pass: set_pass(logger, user, db_user, db_pass) if __name__ == "__main__": main()