Mini Shell

Direktori : /proc/self/root/opt/sharedrads/guds_modules/
Upload File :
Current File : //proc/self/root/opt/sharedrads/guds_modules/change.py

from typing import TYPE_CHECKING
import time
from datetime import timedelta, datetime
import sqlite3
from tabulate import tabulate
from cpapis import whmapi1, CpAPIError

if TYPE_CHECKING:
    from disk_cleanup import DiskCleaner


def run_disk_change(cleaner: 'DiskCleaner') -> None:
    """Displays change in disk usage on a per-user basis"""
    date_format = "%b%d%Y"
    today = time.strftime(date_format)
    days = int(cleaner.days)

    try:
        cleaner.logger.debug(
            'action=run_disk_change sqlite3.connect status=connecting to '
            '/etc/rads/quotas.db'
        )
        conn = sqlite3.connect('/etc/rads/quotas.db')
        cur = conn.cursor()
    except sqlite3.Error as e:
        cleaner.logger.error(
            'action=run_disk_change sqlite3.connect error=%s', e
        )
        return

    try:
        cleaner.logger.debug(
            'action=run_disk_change sqlite3.execute '
            'status=creating table %s',
            today,
        )
        cur.execute(f"drop table if exists '{today}'")
        cur.execute(f"create table '{today}' (diskused integer, user text)")
    except sqlite3.Error as e:
        cleaner.logger.error(
            'action=run_disk_change sqlite3.execute error=%s', e
        )
        return

    try:
        cleaner.logger.debug(
            'action=run_disk_change whmapi1 listaccts '
            'status=connecting to whmapi1'
        )
        quota_data = whmapi1('listaccts', {"want": 'user,diskused'}, check=True)
    except CpAPIError as e:
        cleaner.logger.error(
            'action=run_disk_change whmapi1 listaccts error=%s', e
        )
        return

    try:
        cleaner.logger.debug(
            'action=run_disk_change sqlite3.execute '
            'status=populating table %s',
            today,
        )
        for user in quota_data['data']['acct']:
            cur.execute(f"insert into '{today}' values (:diskused,:user)", user)
    except sqlite3.Error as e:
        cleaner.logger.error(
            'action=run_disk_change sqlite3.execute error=%s', e
        )
        return

    conn.commit()

    # Get a list of all the tables in /etc/rads/quotas.db
    try:
        cleaner.logger.debug(
            'action=run_disk_change sqlite3.execute '
            'status=querying /etc/rads/quotas.db'
        )
        cur.execute("SELECT name FROM sqlite_master WHERE type='table'")
        tables = cur.fetchall()
    except sqlite3.Error as exc:
        cleaner.logger.info(
            "action=run_disk_change sqlite3.execute error=%s", exc
        )
        return

    user_days_ago = datetime.strftime(
        datetime.today() - timedelta(days), date_format
    )

    # See if data exists in /etc/rads/quotas.db for the day the user
    # requested to compare against
    if user_days_ago not in [table[0] for table in tables]:
        cleaner.logger.warning(
            'action=run_disk_change user_days_ago '
            'status=unavailable date requested'
        )
        try:
            user_days_ago = tables[len(tables) - 2][0]
        except IndexError as exc:
            cleaner.logger.error(
                'action=run_disk_change user_days_ago error=%s', exc
            )
            return

    # Query /etc/rads/quotas.db to determine 10 users with
    # the highest change in disk usage
    try:
        cleaner.logger.debug(
            'action=run_disk_change sqlite3.execute status=querying '
            '/etc/rads/quotas.db'
        )
        cur.execute(
            'SELECT {0}.user,{0}.diskused,{1}.diskused,'
            '({1}.diskused - {0}.diskused) AS diskchange '
            'FROM {0} INNER JOIN {1} ON {0}.user={1}.user '
            'ORDER BY diskchange '
            'DESC limit 10'.format(user_days_ago, today)
        )
    except sqlite3.OperationalError as e:
        cleaner.logger.error(
            'action=run_disk_change sqlite3.execute error=%s', e
        )
        return

    table = []
    headers = ["User", user_days_ago, today, "Disk Change"]

    cleaner.logger.debug(
        'action=run_disk_change display status=populating table'
    )
    for row in cur:
        table.append(row)

    cleaner.logger.debug('action=run_disk_change display status=display table')
    print(tabulate(table, headers, tablefmt="fancy_grid"))

    try:
        cleaner.logger.debug(
            'action=run_disk_change sqlite3.close status=closing '
            'sqlite3 connection'
        )
        conn.close()
    except sqlite3.Error as e:
        cleaner.logger.error('action=run_disk_change sqlite3.close error=%s', e)

Zerion Mini Shell 1.0