#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ OS Compatibility Test Script for Test Plugin Tests the plugin on different operating systems """ import os import sys import subprocess import platform import json from pathlib import Path # Add the plugin directory to Python path plugin_dir = Path(__file__).parent sys.path.insert(0, str(plugin_dir)) from os_config import OSConfig class OSCompatibilityTester: """Test OS compatibility for the Test Plugin""" def __init__(self): self.os_config = OSConfig() self.test_results = {} def run_all_tests(self): """Run all compatibility tests""" print("šŸ” Testing OS Compatibility for CyberPanel Test Plugin") print("=" * 60) # Test 1: OS Detection self.test_os_detection() # Test 2: Python Detection self.test_python_detection() # Test 3: Package Manager Detection self.test_package_manager_detection() # Test 4: Service Manager Detection self.test_service_manager_detection() # Test 5: Web Server Detection self.test_web_server_detection() # Test 6: File Permissions self.test_file_permissions() # Test 7: Network Connectivity self.test_network_connectivity() # Test 8: CyberPanel Integration self.test_cyberpanel_integration() # Display results self.display_results() return self.test_results def test_os_detection(self): """Test OS detection functionality""" print("\nšŸ“‹ Testing OS Detection...") try: os_info = self.os_config.get_os_info() is_supported = self.os_config.is_supported_os() self.test_results['os_detection'] = { 'status': 'PASS', 'os_name': os_info['name'], 'os_version': os_info['version'], 'os_arch': os_info['architecture'], 'is_supported': is_supported, 'platform': os_info['platform'] } print(f" āœ… OS: {os_info['name']} {os_info['version']} ({os_info['architecture']})") print(f" āœ… Supported: {is_supported}") except Exception as e: self.test_results['os_detection'] = { 'status': 'FAIL', 'error': str(e) } print(f" āŒ Error: {e}") def test_python_detection(self): """Test Python detection and version""" print("\nšŸ Testing Python Detection...") try: python_path = self.os_config.python_path pip_path = self.os_config.pip_path # Test Python version result = subprocess.run([python_path, '--version'], capture_output=True, text=True, timeout=10) if result.returncode == 0: version = result.stdout.strip() version_num = version.split()[1] major, minor = map(int, version_num.split('.')[:2]) is_compatible = major == 3 and minor >= 6 self.test_results['python_detection'] = { 'status': 'PASS' if is_compatible else 'WARN', 'python_path': python_path, 'pip_path': pip_path, 'version': version, 'is_compatible': is_compatible } print(f" āœ… Python: {version}") print(f" āœ… Path: {python_path}") print(f" āœ… Pip: {pip_path}") print(f" {'āœ…' if is_compatible else 'āš ļø'} Compatible: {is_compatible}") else: raise Exception("Python not working properly") except Exception as e: self.test_results['python_detection'] = { 'status': 'FAIL', 'error': str(e) } print(f" āŒ Error: {e}") def test_package_manager_detection(self): """Test package manager detection""" print("\nšŸ“¦ Testing Package Manager Detection...") try: package_manager = self.os_config.package_manager config = self.os_config.get_os_specific_config() # Test if package manager is available if package_manager in ['apt-get', 'apt']: test_cmd = ['apt', '--version'] elif package_manager == 'dnf': test_cmd = ['dnf', '--version'] elif package_manager == 'yum': test_cmd = ['yum', '--version'] else: test_cmd = None is_available = True if test_cmd: try: result = subprocess.run(test_cmd, capture_output=True, text=True, timeout=5) is_available = result.returncode == 0 except: is_available = False self.test_results['package_manager'] = { 'status': 'PASS' if is_available else 'WARN', 'package_manager': package_manager, 'is_available': is_available, 'config': config } print(f" āœ… Package Manager: {package_manager}") print(f" {'āœ…' if is_available else 'āš ļø'} Available: {is_available}") except Exception as e: self.test_results['package_manager'] = { 'status': 'FAIL', 'error': str(e) } print(f" āŒ Error: {e}") def test_service_manager_detection(self): """Test service manager detection""" print("\nšŸ”§ Testing Service Manager Detection...") try: service_manager = self.os_config.service_manager web_server = self.os_config.web_server # Test if service manager is available if service_manager == 'systemctl': test_cmd = ['systemctl', '--version'] elif service_manager == 'service': test_cmd = ['service', '--version'] else: test_cmd = None is_available = True if test_cmd: try: result = subprocess.run(test_cmd, capture_output=True, text=True, timeout=5) is_available = result.returncode == 0 except: is_available = False self.test_results['service_manager'] = { 'status': 'PASS' if is_available else 'WARN', 'service_manager': service_manager, 'web_server': web_server, 'is_available': is_available } print(f" āœ… Service Manager: {service_manager}") print(f" āœ… Web Server: {web_server}") print(f" {'āœ…' if is_available else 'āš ļø'} Available: {is_available}") except Exception as e: self.test_results['service_manager'] = { 'status': 'FAIL', 'error': str(e) } print(f" āŒ Error: {e}") def test_web_server_detection(self): """Test web server detection""" print("\n🌐 Testing Web Server Detection...") try: web_server = self.os_config.web_server # Check if web server is installed if web_server == 'apache2': config_paths = ['/etc/apache2/apache2.conf', '/etc/apache2/httpd.conf'] else: # httpd config_paths = ['/etc/httpd/conf/httpd.conf', '/etc/httpd/conf.d'] is_installed = any(os.path.exists(path) for path in config_paths) self.test_results['web_server'] = { 'status': 'PASS' if is_installed else 'WARN', 'web_server': web_server, 'is_installed': is_installed, 'config_paths': config_paths } print(f" āœ… Web Server: {web_server}") print(f" {'āœ…' if is_installed else 'āš ļø'} Installed: {is_installed}") except Exception as e: self.test_results['web_server'] = { 'status': 'FAIL', 'error': str(e) } print(f" āŒ Error: {e}") def test_file_permissions(self): """Test file permissions and ownership""" print("\nšŸ” Testing File Permissions...") try: # Test if we can create files in plugin directory plugin_dir = "/home/cyberpanel/plugins" cyberpanel_dir = "/usr/local/CyberCP" can_create_plugin_dir = True can_create_cyberpanel_dir = True try: os.makedirs(plugin_dir, exist_ok=True) except PermissionError: can_create_plugin_dir = False try: os.makedirs(f"{cyberpanel_dir}/test", exist_ok=True) os.rmdir(f"{cyberpanel_dir}/test") except PermissionError: can_create_cyberpanel_dir = False self.test_results['file_permissions'] = { 'status': 'PASS' if can_create_plugin_dir and can_create_cyberpanel_dir else 'WARN', 'can_create_plugin_dir': can_create_plugin_dir, 'can_create_cyberpanel_dir': can_create_cyberpanel_dir, 'plugin_dir': plugin_dir, 'cyberpanel_dir': cyberpanel_dir } print(f" {'āœ…' if can_create_plugin_dir else 'āš ļø'} Plugin Directory: {plugin_dir}") print(f" {'āœ…' if can_create_cyberpanel_dir else 'āš ļø'} CyberPanel Directory: {cyberpanel_dir}") except Exception as e: self.test_results['file_permissions'] = { 'status': 'FAIL', 'error': str(e) } print(f" āŒ Error: {e}") def test_network_connectivity(self): """Test network connectivity""" print("\nšŸŒ Testing Network Connectivity...") try: # Test GitHub connectivity github_result = subprocess.run(['curl', '-s', '--connect-timeout', '10', 'https://github.com'], capture_output=True, text=True, timeout=15) github_available = github_result.returncode == 0 # Test general internet connectivity internet_result = subprocess.run(['curl', '-s', '--connect-timeout', '10', 'https://www.google.com'], capture_output=True, text=True, timeout=15) internet_available = internet_result.returncode == 0 self.test_results['network_connectivity'] = { 'status': 'PASS' if github_available and internet_available else 'WARN', 'github_available': github_available, 'internet_available': internet_available } print(f" {'āœ…' if github_available else 'āš ļø'} GitHub: {github_available}") print(f" {'āœ…' if internet_available else 'āš ļø'} Internet: {internet_available}") except Exception as e: self.test_results['network_connectivity'] = { 'status': 'FAIL', 'error': str(e) } print(f" āŒ Error: {e}") def test_cyberpanel_integration(self): """Test CyberPanel integration""" print("\n⚔ Testing CyberPanel Integration...") try: cyberpanel_dir = "/usr/local/CyberCP" # Check if CyberPanel is installed cyberpanel_installed = os.path.exists(cyberpanel_dir) # Check if Django settings exist settings_file = f"{cyberpanel_dir}/cyberpanel/settings.py" settings_exist = os.path.exists(settings_file) # Check if URLs file exists urls_file = f"{cyberpanel_dir}/cyberpanel/urls.py" urls_exist = os.path.exists(urls_file) # Check if lscpd service exists lscpd_exists = os.path.exists("/usr/local/lscp/bin/lscpd") self.test_results['cyberpanel_integration'] = { 'status': 'PASS' if cyberpanel_installed and settings_exist and urls_exist else 'WARN', 'cyberpanel_installed': cyberpanel_installed, 'settings_exist': settings_exist, 'urls_exist': urls_exist, 'lscpd_exists': lscpd_exists } print(f" {'āœ…' if cyberpanel_installed else 'āš ļø'} CyberPanel Installed: {cyberpanel_installed}") print(f" {'āœ…' if settings_exist else 'āš ļø'} Settings File: {settings_exist}") print(f" {'āœ…' if urls_exist else 'āš ļø'} URLs File: {urls_exist}") print(f" {'āœ…' if lscpd_exists else 'āš ļø'} LSCPD Service: {lscpd_exists}") except Exception as e: self.test_results['cyberpanel_integration'] = { 'status': 'FAIL', 'error': str(e) } print(f" āŒ Error: {e}") def display_results(self): """Display test results summary""" print("\n" + "=" * 60) print("šŸ“Š COMPATIBILITY TEST RESULTS") print("=" * 60) total_tests = len(self.test_results) passed_tests = sum(1 for result in self.test_results.values() if result['status'] == 'PASS') warned_tests = sum(1 for result in self.test_results.values() if result['status'] == 'WARN') failed_tests = sum(1 for result in self.test_results.values() if result['status'] == 'FAIL') print(f"Total Tests: {total_tests}") print(f"āœ… Passed: {passed_tests}") print(f"āš ļø Warnings: {warned_tests}") print(f"āŒ Failed: {failed_tests}") if failed_tests == 0: print("\nšŸŽ‰ All tests passed! The plugin is compatible with this OS.") elif warned_tests > 0 and failed_tests == 0: print("\nāš ļø Some warnings detected. The plugin should work but may need attention.") else: print("\nāŒ Some tests failed. The plugin may not work properly on this OS.") # Show detailed results print("\nšŸ“‹ Detailed Results:") for test_name, result in self.test_results.items(): status_icon = {'PASS': 'āœ…', 'WARN': 'āš ļø', 'FAIL': 'āŒ'}[result['status']] print(f" {status_icon} {test_name.replace('_', ' ').title()}: {result['status']}") if 'error' in result: print(f" Error: {result['error']}") # Generate compatibility report self.generate_compatibility_report() def generate_compatibility_report(self): """Generate a compatibility report file""" try: report = { 'timestamp': time.time(), 'os_info': self.os_config.get_os_info(), 'test_results': self.test_results, 'compatibility_score': self.calculate_compatibility_score() } report_file = "compatibility_report.json" with open(report_file, 'w') as f: json.dump(report, f, indent=2) print(f"\nšŸ“„ Compatibility report saved to: {report_file}") except Exception as e: print(f"\nāš ļø Could not save compatibility report: {e}") def calculate_compatibility_score(self): """Calculate overall compatibility score""" total_tests = len(self.test_results) if total_tests == 0: return 0 score = 0 for result in self.test_results.values(): if result['status'] == 'PASS': score += 1 elif result['status'] == 'WARN': score += 0.5 return round((score / total_tests) * 100, 1) def main(): """Main function""" tester = OSCompatibilityTester() results = tester.run_all_tests() # Exit with appropriate code failed_tests = sum(1 for result in results.values() if result['status'] == 'FAIL') if failed_tests > 0: sys.exit(1) else: sys.exit(0) if __name__ == "__main__": main()