HEX
Server: LiteSpeed
System: Linux houston.panomity.com 6.8.0-100-generic #100-Ubuntu SMP PREEMPT_DYNAMIC Tue Jan 13 16:40:06 UTC 2026 x86_64
User: nudepix (1011)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //usr/local/cyberpanel/plogical/bandwidthReset.py
#!/usr/local/CyberCP/bin/python
import sys
sys.path.append('/usr/local/CyberCP')
import os
import json
from plogical import CyberCPLogFileWriter as logging
from websiteFunctions.models import Websites, ChildDomains

class BandwidthReset:
    """
    Bandwidth reset utility for CyberPanel
    Resets monthly bandwidth usage for all websites and child domains
    """
    
    @staticmethod
    def resetWebsiteBandwidth():
        """
        Reset bandwidth usage for all websites and child domains
        """
        try:
            logging.CyberCPLogFileWriter.writeToFile("Starting monthly bandwidth reset...")
            
            # Reset main websites
            websites = Websites.objects.all()
            reset_count = 0
            
            for website in websites:
                try:
                    # Load current config
                    try:
                        config = json.loads(website.config)
                    except:
                        config = {}
                    
                    # Reset bandwidth data
                    config['bwInMB'] = 0
                    config['bwUsage'] = 0
                    
                    # Save updated config
                    website.config = json.dumps(config)
                    website.save()
                    
                    reset_count += 1
                    logging.CyberCPLogFileWriter.writeToFile(f"Reset bandwidth for website: {website.domain}")
                    
                except Exception as e:
                    logging.CyberCPLogFileWriter.writeToFile(f"Error resetting bandwidth for website {website.domain}: {str(e)}")
            
            # Reset child domains
            child_domains = ChildDomains.objects.all()
            
            for child in child_domains:
                try:
                    # Load current config
                    try:
                        config = json.loads(child.config)
                    except:
                        config = {}
                    
                    # Reset bandwidth data
                    config['bwInMB'] = 0
                    config['bwUsage'] = 0
                    
                    # Save updated config
                    child.config = json.dumps(config)
                    child.save()
                    
                    reset_count += 1
                    logging.CyberCPLogFileWriter.writeToFile(f"Reset bandwidth for child domain: {child.domain}")
                    
                except Exception as e:
                    logging.CyberCPLogFileWriter.writeToFile(f"Error resetting bandwidth for child domain {child.domain}: {str(e)}")
            
            # Clean up bandwidth metadata files
            BandwidthReset.cleanupBandwidthMetadata()
            
            logging.CyberCPLogFileWriter.writeToFile(f"Monthly bandwidth reset completed. Reset {reset_count} domains.")
            return True
            
        except Exception as e:
            logging.CyberCPLogFileWriter.writeToFile(f"Error in monthly bandwidth reset: {str(e)}")
            return False
    
    @staticmethod
    def cleanupBandwidthMetadata():
        """
        Clean up bandwidth metadata files
        """
        try:
            import glob
            
            # Clean up main bandwidth metadata files
            metadata_files = glob.glob("/home/cyberpanel/*.bwmeta")
            for file_path in metadata_files:
                try:
                    # Reset the metadata file to 0 usage
                    with open(file_path, 'w') as f:
                        f.write("0\n0\n")
                    os.chmod(file_path, 0o600)
                    logging.CyberCPLogFileWriter.writeToFile(f"Reset metadata file: {file_path}")
                except Exception as e:
                    logging.CyberCPLogFileWriter.writeToFile(f"Error resetting metadata file {file_path}: {str(e)}")
            
            # Clean up domain-specific bandwidth metadata files
            domain_metadata_files = glob.glob("/home/*/logs/bwmeta")
            for file_path in domain_metadata_files:
                try:
                    # Reset the metadata file to 0 usage
                    with open(file_path, 'w') as f:
                        f.write("0\n0\n")
                    os.chmod(file_path, 0o600)
                    logging.CyberCPLogFileWriter.writeToFile(f"Reset domain metadata file: {file_path}")
                except Exception as e:
                    logging.CyberCPLogFileWriter.writeToFile(f"Error resetting domain metadata file {file_path}: {str(e)}")
                    
        except Exception as e:
            logging.CyberCPLogFileWriter.writeToFile(f"Error cleaning up bandwidth metadata: {str(e)}")
    
    @staticmethod
    def resetSpecificDomain(domain_name):
        """
        Reset bandwidth for a specific domain
        """
        try:
            # Try to find as main website
            try:
                website = Websites.objects.get(domain=domain_name)
                try:
                    config = json.loads(website.config)
                except:
                    config = {}
                
                config['bwInMB'] = 0
                config['bwUsage'] = 0
                website.config = json.dumps(config)
                website.save()
                
                logging.CyberCPLogFileWriter.writeToFile(f"Reset bandwidth for website: {domain_name}")
                return True
                
            except Websites.DoesNotExist:
                pass
            
            # Try to find as child domain
            try:
                child = ChildDomains.objects.get(domain=domain_name)
                try:
                    config = json.loads(child.config)
                except:
                    config = {}
                
                config['bwInMB'] = 0
                config['bwUsage'] = 0
                child.config = json.dumps(config)
                child.save()
                
                logging.CyberCPLogFileWriter.writeToFile(f"Reset bandwidth for child domain: {domain_name}")
                return True
                
            except ChildDomains.DoesNotExist:
                logging.CyberCPLogFileWriter.writeToFile(f"Domain not found: {domain_name}")
                return False
                
        except Exception as e:
            logging.CyberCPLogFileWriter.writeToFile(f"Error resetting bandwidth for domain {domain_name}: {str(e)}")
            return False

def main():
    import argparse
    
    parser = argparse.ArgumentParser(description='CyberPanel Bandwidth Reset Utility')
    parser.add_argument('--reset-all', action='store_true', help='Reset bandwidth for all domains')
    parser.add_argument('--domain', help='Reset bandwidth for specific domain')
    parser.add_argument('--cleanup-metadata', action='store_true', help='Clean up bandwidth metadata files only')
    
    args = parser.parse_args()
    
    if args.reset_all:
        BandwidthReset.resetWebsiteBandwidth()
    elif args.domain:
        BandwidthReset.resetSpecificDomain(args.domain)
    elif args.cleanup_metadata:
        BandwidthReset.cleanupBandwidthMetadata()
    else:
        print("Please specify an action: --reset-all, --domain <domain_name>, or --cleanup-metadata")
        sys.exit(1)

if __name__ == "__main__":
    main()