Mini Shell
Direktori : /opt/sharedrads/ |
|
Current File : //opt/sharedrads/suspend_domain |
#!/opt/imh-python/bin/python3
"""IMH/HUB ShareRADs - suspend_domain.py"""
# Writen by Michael B michaelb@inmotionhostin.com
import sys
import pwd
import syslog
from argparse import ArgumentParser
from pathlib import Path
import os
import time
from cpapis import whmapi1
LOG_FILE = '/var/log/suspension.log'
def logdate():
"""Format date for suspension log"""
return time.strftime("%Y-%m-%d:%H:%M:%S %Z", time.localtime(time.time()))
def log_suspension(domain, susp_type, comment):
"""Log domain suspension"""
procname = os.path.basename(sys.argv[0])
sudo_user = os.getenv("SUDO_USER")
blame = get_calling_username()
entry = 'Domain: {} [{}] {}: "{}"'.format(
domain, susp_type.upper(), blame, comment or '-'
)
syslog.openlog(procname)
syslog.syslog(entry)
with open(LOG_FILE, 'a', encoding='utf-8') as log_f:
log_f.write(f'{logdate()} {sudo_user}: {entry}\n')
def get_calling_username():
"""Get username which ran this script"""
try:
blame = '{}:{}'.format(
os.getlogin(), pwd.getpwuid(os.geteuid()).pw_name
)
except OSError:
blame = pwd.getpwuid(os.geteuid()).pw_name
return blame
def suspend_domain(docroot: str, domain: str):
"""Suspend a domain via .htaccess"""
path = os.path.join(docroot, '.htaccess')
if os.path.isfile(path):
os.rename(path, '%s.suspended' % path)
print(".htaccess found. Moving and placing suspension .htaccess")
else:
Path(path + ".suspended").touch(mode=0o644)
with open(path, 'w', encoding='utf-8') as hta_f:
hta_f.write("RedirectMatch .* http://%s/unavailable.html\n" % domain)
log_suspension(domain, "suspended", 'via suspend_domain')
print("Domain %s has been suspended." % domain)
def unsuspend_domain(docroot: str, domain: str):
"""Unsuspend a domain via .htaccess"""
path = os.path.join(docroot, '.htaccess')
if os.path.isfile(path + ".suspended"):
os.remove(path)
os.rename(path + ".suspended", path)
log_suspension(domain, "unsuspended", 'via suspend_domain')
else:
print("Domain %s doesn't appear to be suspended" % domain)
print("Domain %s has been unsuspended" % domain)
def parse_args() -> tuple[bool, list[str]]:
parser = ArgumentParser(description=__doc__)
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(
"-s", "--suspend", nargs='+', help="Suspends the domain listed"
)
group.add_argument(
"-u", "--unsuspend", nargs='+', help="Unsuspends the domain specified"
)
args = parser.parse_args()
if args.suspend:
return True, args.suspend
return False, args.unsuspend
def main():
"""Main logic of suspend_domain"""
suspend, domains = parse_args()
rcode = 0
for domain in domains:
try:
api = whmapi1('domainuserdata', {'domain': domain}, check=True)
domainroot = api['data']['userdata']['documentroot']
except Exception as exc:
print(exc, file=sys.stderr)
print(
f'Unable to get documentroot for {domain} from whmapi1',
file=sys.stderr,
)
rcode = 2
continue
if suspend:
suspend_domain(domainroot, domain)
else:
unsuspend_domain(domainroot, domain)
sys.exit(rcode)
if __name__ == '__main__':
main()
Zerion Mini Shell 1.0