mirror of https://github.com/dnomd343/kms-server
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							149 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							149 lines
						
					
					
						
							4.2 KiB
						
					
					
				
								#!/usr/bin/env php8
							 | 
						|
								<?php
							 | 
						|
								
							 | 
						|
								$VERSION = 'v1.2.3';
							 | 
						|
								
							 | 
						|
								require_once './src/Daemon.php';
							 | 
						|
								require_once './src/Logger.php';
							 | 
						|
								require_once './src/Process.php';
							 | 
						|
								
							 | 
						|
								$KMS_PORT = 1688; // kms expose port
							 | 
						|
								$HTTP_PORT = 1689; // http server port
							 | 
						|
								
							 | 
						|
								$NGINX = array( // nginx process
							 | 
						|
								    'name' => 'nginx',
							 | 
						|
								    'command' => ['/usr/sbin/nginx'],
							 | 
						|
								    'pidFile' => '/run/nginx.pid',
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								$PHP_FPM = array( // php-fpm process
							 | 
						|
								    'name' => 'php-fpm8',
							 | 
						|
								    'command' => ['/usr/sbin/php-fpm8'],
							 | 
						|
								    'pidFile' => '/run/php-fpm8.pid',
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								$VLMCSD = array( // vlmcsd process
							 | 
						|
								    'name' => 'vlmcsd',
							 | 
						|
								    'command' => ['/usr/bin/vlmcsd', '-e', '-p', '/run/vlmcsd.pid'],
							 | 
						|
								    'pidFile' => '/run/vlmcsd.pid',
							 | 
						|
								);
							 | 
						|
								
							 | 
						|
								function load_nginx_config(int $kms_port, int $http_port): void {
							 | 
						|
								    $nginx_config = "server {
							 | 
						|
								    listen $http_port;
							 | 
						|
								    listen [::]:$http_port ipv6only=on;
							 | 
						|
								
							 | 
						|
								    location /assets {
							 | 
						|
								        root /kms-server;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    location / {
							 | 
						|
								        include fastcgi_params;
							 | 
						|
								        fastcgi_pass unix:/run/php-fpm.sock;
							 | 
						|
								        if (\$http_user_agent ~* (curl|wget)) {
							 | 
						|
								            set \$cli_mode true;
							 | 
						|
								        }
							 | 
						|
								        fastcgi_param KMS_PORT $kms_port;
							 | 
						|
								        fastcgi_param KMS_CLI \$cli_mode;
							 | 
						|
								        fastcgi_param SCRIPT_FILENAME /kms-server/src/Route.php;
							 | 
						|
								    }\n}\n";
							 | 
						|
								    logging::debug("Nginx configure ->\n" . $nginx_config);
							 | 
						|
								    $nginx_file = fopen('/etc/nginx/kms.conf', 'w');
							 | 
						|
								    fwrite($nginx_file, $nginx_config); // save nginx configure file
							 | 
						|
								    fclose($nginx_file);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function load_vlmcsd_command(int $kms_port): void { // add port option for vlmcsd
							 | 
						|
								    global $VLMCSD;
							 | 
						|
								    if ($kms_port != 1688) { // not default kms port
							 | 
						|
								        array_push($VLMCSD['command'], '-P', strval($kms_port));
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function get_param(string $field, string $default): string {
							 | 
						|
								    global $argv;
							 | 
						|
								    if (!in_array($field, $argv)) { // field not exist
							 | 
						|
								        return $default;
							 | 
						|
								    }
							 | 
						|
								    $index = array_search($field, $argv) + 1;
							 | 
						|
								    if ($index == sizeof($argv)) { // reach arguments end
							 | 
						|
								        return $default;
							 | 
						|
								    }
							 | 
						|
								    return $argv[$index]; // return next argument
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function load_params(): void {
							 | 
						|
								    global $argv;
							 | 
						|
								    if (in_array('--debug', $argv)) { // enter debug mode
							 | 
						|
								        logging::$logLevel = logging::DEBUG;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    global $KMS_PORT;
							 | 
						|
								    $KMS_PORT = intval(get_param('--kms-port', strval($KMS_PORT)));
							 | 
						|
								    if ($KMS_PORT < 1 || $KMS_PORT > 65535) { // 1 ~ 65535
							 | 
						|
								        logging::critical('Illegal KMS Port -> ' . $KMS_PORT);
							 | 
						|
								        exit;
							 | 
						|
								    }
							 | 
						|
								    if ($KMS_PORT != 1688) { // not default kms port
							 | 
						|
								        logging::warning('KMS Server Port -> ' . $KMS_PORT);
							 | 
						|
								    } else {
							 | 
						|
								        logging::debug('KMS Server Port -> ' . $KMS_PORT);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    global $HTTP_PORT;
							 | 
						|
								    $HTTP_PORT = intval(get_param('--http-port', strval($HTTP_PORT)));
							 | 
						|
								    if ($HTTP_PORT < 1 || $HTTP_PORT > 65535) { // 1 ~ 65535
							 | 
						|
								        logging::critical('Illegal HTTP Port -> ' . $HTTP_PORT);
							 | 
						|
								        exit;
							 | 
						|
								    }
							 | 
						|
								    if ($HTTP_PORT != 1689) { // not default http port
							 | 
						|
								        logging::warning('HTTP Server Port -> ' . $HTTP_PORT);
							 | 
						|
								    } else {
							 | 
						|
								        logging::debug('HTTP Server Port -> ' . $HTTP_PORT);
							 | 
						|
								    }
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								function start_process(): void { // start sub processes
							 | 
						|
								    global $NGINX, $PHP_FPM, $VLMCSD;
							 | 
						|
								    new Process($NGINX['command']);
							 | 
						|
								    logging::info('Start nginx server...OK');
							 | 
						|
								    new Process($PHP_FPM['command']);
							 | 
						|
								    logging::info('Start php-fpm server...OK');
							 | 
						|
								    new Process($VLMCSD['command']);
							 | 
						|
								    logging::info('Start vlmcsd server...OK');
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								declare(ticks = 1);
							 | 
						|
								pcntl_signal(SIGCHLD, function() { // receive SIGCHLD signal
							 | 
						|
								    pcntl_wait($status, WNOHANG); // avoid zombie process
							 | 
						|
								});
							 | 
						|
								
							 | 
						|
								pcntl_signal(SIGTERM, function() { // receive SIGTERM signal
							 | 
						|
								    global $NGINX, $PHP_FPM, $VLMCSD;
							 | 
						|
								    logging::info('Get SIGTERM -> exit');
							 | 
						|
								    subExit($NGINX, $PHP_FPM, $VLMCSD);
							 | 
						|
								    exit;
							 | 
						|
								});
							 | 
						|
								
							 | 
						|
								pcntl_signal(SIGINT, function() { // receive SIGINT signal
							 | 
						|
								    global $NGINX, $PHP_FPM, $VLMCSD;
							 | 
						|
								    logging::info('Get SIGINT -> exit');
							 | 
						|
								    subExit($NGINX, $PHP_FPM, $VLMCSD);
							 | 
						|
								    exit;
							 | 
						|
								});
							 | 
						|
								
							 | 
						|
								logging::info('Loading kms-server (' . $VERSION . ')');
							 | 
						|
								load_params();
							 | 
						|
								load_vlmcsd_command($KMS_PORT);
							 | 
						|
								load_nginx_config($KMS_PORT, $HTTP_PORT);
							 | 
						|
								
							 | 
						|
								start_process();
							 | 
						|
								logging::info('Enter daemon process');
							 | 
						|
								while (true) { // start daemon
							 | 
						|
								    for ($i = 0; $i < 500; $i++) { // sleep 5s
							 | 
						|
								        msDelay(10); // return main loop every 10ms
							 | 
						|
								    }
							 | 
						|
								    daemon($NGINX);
							 | 
						|
								    daemon($PHP_FPM);
							 | 
						|
								    daemon($VLMCSD);
							 | 
						|
								}
							 | 
						|
								
							 |