1) && $argv[1] == "-v") { $verbose = true; $anon = true; } if ($cli && ($argc > 1) && $argv[1] == "-vv") { $verbose = true; } $var = (array)@parse_ini_file('/var/local/emhttp/var.ini'); $nginx = (array)@parse_ini_file('/var/local/emhttp/nginx.ini'); $is69 = version_compare(_var($var,'version'),"6.9.9","<"); $reloadNginx = false; $dnserr = false; $icon_warn = "⚠️ "; $icon_ok = "✅ "; $myservers_flash_cfg_path='/boot/config/plugins/dynamix.my.servers/myservers.cfg'; $myservers = (array)@parse_ini_file($myservers_flash_cfg_path,true); // ensure some vars are defined here so we don't have to test them later if (empty($myservers['remote']['apikey'])) { $myservers['remote']['apikey'] = ""; } if (empty($myservers['remote']['wanaccess'])) { $myservers['remote']['wanaccess'] = "no"; } if (empty($myservers['remote']['wanport'])) { $myservers['remote']['wanport'] = 443; } // remoteaccess, externalport if ($cli) { $remoteaccess = empty($nginx['NGINX_WANFQDN']) ? 'no' : 'yes'; $externalport = $myservers['remote']['wanport']; } else { $remoteaccess = _var($_POST,'remoteaccess','no'); $externalport = intval(_var($_POST,'externalport',443)); if ($remoteaccess != 'yes') { $remoteaccess = 'no'; } if ($externalport < 1 || $externalport > 65535) { $externalport = 443; } if ($myservers['remote']['wanaccess'] != $remoteaccess) { // update the wanaccess ini value $orig = file_exists($myservers_flash_cfg_path) ? parse_ini_file($myservers_flash_cfg_path,true) : []; if (!$orig) { $orig = ['remote' => $myservers['remote']]; } $orig['remote']['wanaccess'] = $remoteaccess; $text = ''; foreach ($orig as $section => $block) { $pairs = ""; foreach ($block as $key => $value) if (strlen($value)) $pairs .= "$key=\"$value\"\n"; if ($pairs) $text .= "[$section]\n".$pairs; } if ($text) file_put_contents($myservers_flash_cfg_path, $text); // need nginx reload $reloadNginx = true; } } $isRegistered = !empty($myservers['remote']['username']); // protocols, hostnames, ports $internalprotocol = 'http'; $internalport = _var($nginx,'NGINX_PORT'); $internalhostname = _var($nginx,'NGINX_LANMDNS'); $externalprotocol = 'https'; // keyserver will expand *.hash.myunraid.net or add www to hash.unraid.net as needed $externalhostname = _var($nginx,'NGINX_CERTNAME'); $isLegacyCert = preg_match('/.*\.unraid\.net$/', _var($nginx,'NGINX_CERTNAME')); $isWildcardCert = preg_match('/.*\.myunraid\.net$/', _var($nginx,'NGINX_CERTNAME')); $internalip = _var($nginx,'NGINX_LANIP'); if (_var($nginx,'NGINX_USESSL')=='yes') { // When NGINX_USESSL is 'yes' in 6.9, it could be using either Server_unraid_bundle.pem or certificate_bundle.pem // When NGINX_USESSL is 'yes' in 6.10, it is is using Server_unraid_bundle.pem $internalprotocol = 'https'; $internalport = _var($nginx,'NGINX_PORTSSL'); if ($is69 && _var($nginx,'NGINX_CERTNAME')) { // this is from certificate_bundle.pem $internalhostname = _var($nginx,'NGINX_CERTNAME'); } } if (_var($nginx,'NGINX_USESSL')=='auto') { // NGINX_USESSL cannot be 'auto' in 6.9, it is either 'yes' or 'no' // When NGINX_USESSL is 'auto' in 6.10, it is using certificate_bundle.pem $internalprotocol = 'https'; $internalport = _var($nginx,'NGINX_PORTSSL'); // keyserver will expand *.hash.myunraid.net as needed $internalhostname = _var($nginx,'NGINX_CERTNAME'); } // My Servers version $plgversion = file_exists("/var/log/plugins/dynamix.unraid.net.plg") ? trim(exec('/usr/local/sbin/plugin version /var/log/plugins/dynamix.unraid.net.plg 2>/dev/null')) : (file_exists("/var/log/plugins/dynamix.unraid.net.staging.plg") ? trim(exec('/usr/local/sbin/plugin version /var/log/plugins/dynamix.unraid.net.staging.plg 2>/dev/null')) : 'base-'._var($var,'version')); // only proceed when when signed in or when legacy unraid.net SSL certificate exists if (!$isRegistered && !$isLegacyCert) { response_complete(406, ['error' => _('Nothing to do')]); } // keyfile $keyfile = empty($var['regFILE']) ? false : @file_get_contents($var['regFILE']); if ($keyfile === false) { response_complete(406, ['error' => _('Registration key required')]); } $keyfile = @base64_encode($keyfile); // build post array $post = [ 'keyfile' => $keyfile, 'plgversion' => $plgversion ]; if ($isLegacyCert) { // sign in not required to maintain local ddns for unraid.net cert // enable local ddns regardless of use_ssl value $post['internalip'] = $internalip; // if host.unraid.net does not resolve to the internalip and DNS Rebind Protection is disabled, disable caching if (host_lookup_ip(generate_internal_host(_var($nginx,'NGINX_CERTNAME'), $post['internalip'])) != $post['internalip'] && rebindDisabled()) $dnserr = true; } if ($isRegistered) { // if signed in, send data needed to maintain My Servers Dashboard $post['internalhostname'] = $internalhostname; $post['internalport'] = $internalport; $post['internalprotocol'] = $internalprotocol; $post['remoteaccess'] = $remoteaccess; $post['servercomment'] = _var($var,'COMMENT'); $post['servername'] = _var($var,'NAME'); if ($isWildcardCert) { // keyserver needs the internalip to generate the local access url $post['internalip'] = $internalip; } if ($remoteaccess == 'yes') { // include wanip in the cache file so we can track if it changes $post['_wanip'] = trim(@file_get_contents("https://wanip4.unraid.net/")); $post['externalhostname'] = $externalhostname; $post['externalport'] = $externalport; $post['externalprotocol'] = $externalprotocol; // if wanip.hash.myunraid.net or www.hash.unraid.net does not resolve to the wanip, disable caching if (host_lookup_ip(generate_external_host($post['externalhostname'], $post['_wanip'])) != $post['_wanip']) $dnserr = true; } } // if remoteaccess is enabled in 6.10.0-rc3+ and WANIP has changed since nginx started, reload nginx if (_var($post,'_wanip') != _var($nginx,'NGINX_WANIP') && version_compare(_var($var,'version'),"6.10.0-rc2",">")) $reloadNginx = true; // if remoteaccess is currently disabled (perhaps because a wanip was not available when nginx was started) // BUT the system is configured to have it enabled AND a wanip is now available // then reload nginx if ($remoteaccess == 'no' && _var($nginx,'NGINX_WANACCESS') == 'yes' && !empty(trim(@file_get_contents("https://wanip4.unraid.net/")))) $reloadNginx = true; if ($reloadNginx) { exec("/etc/rc.d/rc.nginx reload &>/dev/null"); } // maxage is 36 hours $maxage = 36*60*60; if ($dnserr || $verbose) $maxage = 0; $datafile = "/tmp/UpdateDNS.txt"; $datafiletmp = "/tmp/UpdateDNS.txt.new"; $dataprev = @file_get_contents($datafile) ?: ''; $datanew = implode("\n",$post)."\n"; if ($datanew == $dataprev && (time()-filemtime($datafile) < $maxage)) { response_complete(204, null, _('No change to report')); } file_put_contents($datafiletmp,$datanew); rename($datafiletmp, $datafile); // do not submit the wanip, it will be captured from the submission if needed for remote access unset($post['_wanip']); // report necessary server details to limetech for DNS updates $ch = curl_init('https://keys.lime-technology.com/account/server/register'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); if ( ($result === false) || ($httpcode != "200") ) { // delete cache file to retry submission on next run @unlink($datafile); response_complete($httpcode ?? "500", ['error' => $error]); } response_complete($httpcode, $result, _('success')); ?>