Sindbad~EG File Manager

Current Path : /opt/dedrads/
Upload File :
Current File : //opt/dedrads/check_prov.py

#!/usr/lib/rads/venv/bin/python3
# Check some things to make sure the vps provisioning went well
# 6/19/2017 Nathan <nathans@inmotionhosting.com>

import sys
import os
import socket
import dns.resolver

# pylint: disable=no-name-in-module
from netifaces import interfaces, ifaddresses, AF_INET
import rads

LOG_FILE = '/root/prov_log'


def ip4_addresses():
    """List ipv4 addresses setup on this system"""
    ip_list = []
    for interface in interfaces():
        if AF_INET in ifaddresses(interface):
            for link in ifaddresses(interface)[AF_INET]:
                ip_list.append(link['addr'])
    return ip_list


def get_mainip():
    """This should only be run on brand new vps. so there will be 2 IP's.
    The main IP and a local address"""
    main_ip = None
    with open('/etc/wwwacct.conf', encoding='utf-8') as f:
        for line in f.readlines():
            if not line.strip():
                continue
            if line.split()[0] == 'ADDR':
                main_ip = line.split()[1]
    return main_ip


def check_dns():
    """Check that forward and reverse DNS is setup properly"""
    sys.tracebacklimit = 0
    vps_hostname = socket.getfqdn()
    vps_ips = ip4_addresses()
    # Forward DNS
    try:
        hostname_ip = socket.gethostbyname(vps_hostname)
        print(vps_hostname + " resolves to " + hostname_ip)
    except Exception as e:
        print("A record for hostname not found")
        print(e)
        return False
    # Get the main IP of the server
    main_ip = None
    for ip in vps_ips:
        if ip == hostname_ip:
            main_ip = ip
        else:
            pass
    if main_ip == hostname_ip:
        print(main_ip + " resolves to " + vps_hostname)
        return True
    print("Reverse DNS either doesn't match or is not present")
    return False


def check_mailip():
    """Ripped this straight from google. it does the trick"""
    my_ip = get_mainip()
    # Spamhaus zen
    bls = [
        "zen.spamhaus.org",
        "spam.abuse.ch",
        "cbl.abuseat.org",
        "virbl.dnsbl.bit.nl",
        "dnsbl.inps.de",
        "ix.dnsbl.manitu.net",
        "dnsbl.sorbs.net",
        "bl.spamcop.net",
        "xbl.spamhaus.org",
        "pbl.spamhaus.org",
        "db.wpbl.info",
    ]

    listings = []
    for bl in bls:
        try:
            my_resolver = dns.resolver.Resolver()
            query = '.'.join(reversed(str(my_ip).split("."))) + "." + bl
            answers = my_resolver.resolve(query, "A")
            answer_txt = my_resolver.resolve(query, "TXT")
            listings.append(
                'IP: %s IS listed in %s (%s: %s)'
                % (my_ip, bl, answers[0], answer_txt[0])
            )
        except dns.resolver.NXDOMAIN:
            # print 'IP: %s is NOT listed in %s' %(myIP, bl)
            pass
    if len(listings) > 0:
        return False
    return True


def check_user_setup():
    """Check if the reseller user was setup during provisioning"""
    user_list = []
    for _, _, files in os.walk("/var/cpanel/users"):
        for file in files:
            user_list.append(file)
    try:
        user_list.remove('system')
    except Exception:
        pass
    if len(user_list) < 1:
        print("Reseller user not setup properly")
        return False
    print(user_list[0] + " setup as reseller user")
    return True


def create_task(subject: str, body: str):
    try:
        rads.make_ticket(dest='sadmin@imhadmin.net', subject=subject, body=body)
    except rads.TicketError as exc:
        print(f"Failed to create ticket - {exc}", file=sys.stderr)
    else:
        print("T2S notified")


DNS_SETUP_ERROR = (
    "One or more of the DNS setup checks failed. Please check that both "
    "forward and reverse DNS is setup properly for this VPS container"
)
MAIL_IP_ERROR = (
    "The container was setup with a blacklisted or otherwise bad mail IP. "
    "Please review the mail ip of the server and rotate/delist as needed"
)
USER_SETUP_ERROR = (
    "The reseller user was not found on this server after provisioning. Please "
    "check why, and setup user if needed"
)


def main():
    subject = socket.getfqdn() + " provisioning check failure"
    if not check_dns():
        print("DNS checks failed")
        create_task(subject, DNS_SETUP_ERROR)
    else:
        print("DNS checks passed")
    if not check_mailip():
        print("Mail IP checks failed")
        create_task(subject, MAIL_IP_ERROR)
    else:
        print("Mail IP checks passed")
    if not check_user_setup():
        print('User setup checks failed')
        create_task(subject, USER_SETUP_ERROR)
    else:
        print('User setup checks passsed')


if __name__ == "__main__":
    main()

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists