Subversion Repositories vnag

Rev

Rev 47 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
40 daniel-mar 1
<?php /* <ViaThinkSoftSignature>
57 daniel-mar 2
YU84r4UF1RQYMGABCCGu0MB2mvfy3E9RC4oCgHx+trADi3ukDqRO/pQV+NqbQUgWm
3
M7brafd901QAYEjRv1U3cqwChtRpLthnkHFWrISIuesN+ztweQ0ZJpzK3U5t3gN1d
4
Cp6z3x69BrgC8lmdsZVHn5OKUmneMK+5dEEvlAhXp4y+fsvrAtkqajxfi9lNm4bSU
5
TD4OEknecfUj95+5d9exG3ml4UlI6VGDHeIz2GHG1sPy+3zA60eV1Y2xnQS12p9QF
6
TZEevtPWG3IqGzsBKZ5OJkeWFi4g5N+eYGZIcQrlV44Qv3gFfj/jGgb1lo/1JuGNA
7
VVhE8JJqfuQrus1xtEOU5I22FFoNrcRYmqdaTRQ/VzWbLbkc07efqA+5gpqgL0gc0
8
7Y2XwdSoHouXJ3z9OiLvcOntnRmtELyVL3V43MvyfrUtB74q1VL2GfFzMiiDrtZ9I
9
kJQ5+OJeD8b2QEn6Ug85So4Pn6Fvmj1oloK7H4kGg/j6TK+s8D30TnsLSLwlr8PgJ
10
NMeaIm6ctfA+0za3FGICzmmi7bupNWxHTwppeFEGIFoOXQQbYHQSKpSymkBWhaa9N
11
bOXWe+5zapwtM6HNxBomYAeSa5q45TuE8/+Fz2KrvP7oxNVQMO0Vd14PVf5oyPctv
12
nmTQwGBft5//WZKAK96srAQPBwySbUGEgJDOc5FboVWPUbGG/zNkfXrYohcexkv1l
13
JlihNcLd2/ZnYrvo8ZMfToCGBo8Ie39D34GC3taCMQ73W9TOp446MdndVeIFV4NnA
14
VhMddt5cYzrWiS4DfLaCdwvjMmrhvmWiDuSz2syTVlB1dfMSE/kUBQGPdeqj0T9DL
15
fVJ3pBYoQ2SnbM65xk3OzPhokuXghM2ViF9laaelD5NIF93xA4EJGxFW5Qx5GYRjY
16
AZLjbipIRHvje+5U2Tc46V8XrOjbT3HKJcdwBPDDTHljDZwttXcGjeJj6wJI72hHm
17
W9Mjhag8rUwab5Z5c6jE+fuqsE4CAaqADoCuu/GYRjt0bYzoJSoQkX3yJvDf0P6gd
18
sIeL079kvHsTPrWegItcL6HzMMQOs8ej63qjFCX6rLzlghxgAHX4g6GiCTL5eRk9I
19
TStX3wM5+gyNboUqs3cR1pU2fIlnbWOZy5aEaUDlDWw6OjUvr4ZHmExnAWdMfdUnY
20
3mbBb5DHM1ccd0dMvouowi3sOKGPeRVQh09BADaSzhVF7xq6t6mYfB16pTejboFkw
21
3fHjYuiSGwsX9ldnhj0QhjO5eKJmQPmWdLCs1bpG3od26aX+Dwxs2gKk2Hk943stv
22
L2L7y4yxqO76zPbI660m8JgS/Z9B006pJvJg0wa1u/mXL39mtD8l3clqPJLWZ8KDq
23
g==
40 daniel-mar 24
</ViaThinkSoftSignature> */ ?>
25
<?php
26
 
27
/*
28
 * VNag - Nagios Framework for PHP
29
 * Developed by Daniel Marschall, ViaThinkSoft <www.viathinksoft.com>
30
 * Licensed under the terms of the Apache 2.0 license
31
 *
57 daniel-mar 32
 * Revision 2022-09-12
40 daniel-mar 33
 */
34
 
35
declare(ticks=1);
36
 
37
class MinecraftJavaVersionCheck extends VNag {
38
        protected $argSystemDir = null;
39
 
40
        public function __construct() {
41
                parent::__construct();
42
 
43
                $this->registerExpectedStandardArguments('Vvht');
44
 
45
                $this->getHelpManager()->setPluginName('check_minecraft_java_version');
46
                $this->getHelpManager()->setVersion('1.0');
47
                $this->getHelpManager()->setShortDescription('This plugin checks if a local Minecraft for Java server has the latest version installed.');
48
                $this->getHelpManager()->setCopyright('Copyright (C) 2011-$CURYEAR$ Daniel Marschall, ViaThinkSoft.');
49
                $this->getHelpManager()->setSyntax('$SCRIPTNAME$ [-d <directory>]');
50
                $this->getHelpManager()->setFootNotes('If you encounter bugs, please contact ViaThinkSoft at www.viathinksoft.com');
51
 
52
                // Individual (non-standard) arguments:
53
                $this->addExpectedArgument($this->argSystemDir = new VNagArgument('d', 'directory', VNagArgument::VALUE_REQUIRED, 'serverPath', 'The local directory where your Minecraft for Java server.jar is located.'));
54
        }
55
 
56
        protected function get_latest_minecraft_version() {
57
                $headers = array(
58
                        // These headers are important! Otherwise the request will be blocked by AkamaiGhost
59
                        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36",
60
                        "Accept-Language: de-DE,de;q=0.9,en-DE;q=0.8,en;q=0.7,en-US;q=0.6",
61
                        "Accept-Encoding: none"
62
                );
63
                // curl 'https://www.minecraft.net/en-us/download/server' \
64
                //      -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36' \
65
                //      -H 'accept-language: de-DE,de;q=0.9,en-DE;q=0.8,en;q=0.7,en-US;q=0.6' \
66
                //      --compressed
67
                $ch = curl_init();
68
                curl_setopt($ch, CURLOPT_URL,"https://www.minecraft.net/en-us/download/server"); // TODO: make locale configurable?
69
                curl_setopt($ch, CURLOPT_POST, 0);
70
                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
71
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
72
                $cont = curl_exec($ch);
73
                curl_close($ch);
74
 
47 daniel-mar 75
                if (!$cont) throw new Exception("Cannot detect latest available Minecraft version (HTTPS request failed)");
76
 
40 daniel-mar 77
                preg_match_all('@minecraft_server\\.(.+)\\.jar@U', $cont, $m);
78
 
47 daniel-mar 79
                if (!isset($m[1][0])) throw new Exception("Cannot detect latest available Minecraft version (regex pattern mismatch)");
80
 
40 daniel-mar 81
                return $m[1][0];
82
        }
83
 
84
        protected function get_installed_minecraft_version($local_path) {
85
                if (substr($local_path,-4) == '.jar') {
86
                        $files = glob($local_path);
87
                } else {
88
                        $files = glob($local_path.'/server.jar');
89
                }
90
 
91
                if (count($files) == 0) throw new Exception("No server.jar found at $local_path");
92
                if (count($files) > 1) throw new Exception("More than one server.jar found at $local_path");
93
                $server_jar = $files[0];
94
 
95
                $cmd = "unzip -p ".escapeshellarg($server_jar)." version.json";
96
 
97
                $out = array();
98
                $ec = -1;
99
                exec($cmd, $out, $ec);
100
                if ($ec != 0) throw new Exception("Cannot unzip version.json");
101
 
102
                $json = implode("\n",$out);
103
 
104
                return (string)json_decode($json,true)['name'];
105
        }
106
 
107
        protected function cbRun($optional_args=array()) {
108
                $system_dir = $this->argSystemDir->getValue(); // note: can contain wildcards
109
                $cur_ver = $this->get_installed_minecraft_version($system_dir);
110
 
111
                $new_ver = $this->get_latest_minecraft_version();
112
 
57 daniel-mar 113
                if (version_compare($cur_ver,$new_ver) >= 0) {
40 daniel-mar 114
                        $this->setStatus(VNag::STATUS_OK);
115
                        $this->setHeadline("Minecraft version $cur_ver is the latest available version for your Minecraft for Java server installation at $system_dir", true);
116
                } else {
117
                        $this->setStatus(VNag::STATUS_WARNING);
118
                        $this->setHeadline("Minecraft version $cur_ver is outdated. Newer version is $new_ver for installation at $system_dir", true);
119
                }
120
        }
121
}