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.
57 lines
1.7 KiB
57 lines
1.7 KiB
<?php
|
|
|
|
enum VlmcsResult {
|
|
case OK; // target server works fine
|
|
case NOT_KMS; // target not a kms server
|
|
case UNREACHED; // target not reachable
|
|
case ERROR; // something error
|
|
}
|
|
|
|
/**
|
|
* Run a program and capture its stdout.
|
|
*
|
|
* @throws Exception
|
|
*/
|
|
function runProcess(array $command): string {
|
|
$desc = array(
|
|
0 => ['pipe', 'r'], // stdin
|
|
1 => ['pipe', 'w'], // stdout
|
|
2 => ['pipe', 'w'], // stderr
|
|
);
|
|
$process = proc_open($command, $desc, $pipes, null, array()); // start process
|
|
if (!is_resource($process)) {
|
|
throw new Exception('process running failed');
|
|
}
|
|
while(proc_get_status($process)['running']) { // wait process exit
|
|
usleep(50); // delay 50ms
|
|
}
|
|
return stream_get_contents($pipes[1]); // fetch stdout
|
|
}
|
|
|
|
function vlmcsCheck(string $host, int $port): VlmcsResult {
|
|
$host = str_contains($host, ':') ? "[$host]" : $host; // ipv6 host add bracket
|
|
try {
|
|
$content = runProcess(['vlmcs', $host . ':' . $port]);
|
|
} catch (Exception) {
|
|
return VlmcsResult::ERROR;
|
|
}
|
|
|
|
preg_match_all('/Sending activation request \(KMS V6\)/', $content, $match);
|
|
if (count($match[0]) != 0) {
|
|
return VlmcsResult::OK; // kms server works fine
|
|
}
|
|
preg_match_all('/Connecting to .* successful/', $content, $match);
|
|
if (count($match[0]) != 0) {
|
|
return VlmcsResult::NOT_KMS; // server connected but not working
|
|
} else {
|
|
return VlmcsResult::UNREACHED; // kms server connect failed
|
|
}
|
|
}
|
|
|
|
//$t = vlmcsCheck('1.1.1.1', 1688);
|
|
//$t = vlmcsCheck('kms.343.re', 1688);
|
|
$t = vlmcsCheck('8.210.148.24', 1688);
|
|
$t = vlmcsCheck('8.210.148.24', 1689);
|
|
//$t = vlmcsCheck('0.0.0.0.', 1688);
|
|
//$t = vlmcsCheck('baidu.com', 1688);
|
|
var_dump($t);
|
|
|