diff options
author | Simon Rettberg | 2017-10-10 17:40:51 +0200 |
---|---|---|
committer | Simon Rettberg | 2017-10-10 17:40:51 +0200 |
commit | 0041e188f7ef4c936eb08f26e08f229e7ce1b550 (patch) | |
tree | 52f2cb90e2b44c1325bbc8a65b47b3c088750929 /modules-available/dnbd3/inc/dnbd3util.inc.php | |
parent | [dnbd3] New module for managing dnbd3 servers - WIP (diff) | |
download | slx-admin-0041e188f7ef4c936eb08f26e08f229e7ce1b550.tar.gz slx-admin-0041e188f7ef4c936eb08f26e08f229e7ce1b550.tar.xz slx-admin-0041e188f7ef4c936eb08f26e08f229e7ce1b550.zip |
[dnbd3] More progress, manage location restrictions for proxies
Diffstat (limited to 'modules-available/dnbd3/inc/dnbd3util.inc.php')
-rw-r--r-- | modules-available/dnbd3/inc/dnbd3util.inc.php | 96 |
1 files changed, 95 insertions, 1 deletions
diff --git a/modules-available/dnbd3/inc/dnbd3util.inc.php b/modules-available/dnbd3/inc/dnbd3util.inc.php index b04583b8..48e887b3 100644 --- a/modules-available/dnbd3/inc/dnbd3util.inc.php +++ b/modules-available/dnbd3/inc/dnbd3util.inc.php @@ -5,6 +5,7 @@ class Dnbd3Util { public static function updateServerStatus() { $dynClients = RunMode::getForMode('dnbd3', 'proxy', false, true); + $satServerIp = Property::getServerIp(); $servers = array(); $res = Database::simpleQuery('SELECT s.serverid, s.machineuuid, s.fixedip, s.lastup, s.lastdown, m.clientip FROM dnbd3_server s @@ -17,7 +18,7 @@ class Dnbd3Util { } else { continue; // Huh? } - if (!is_null($row['machineuuid'])) { + if (!is_null($row['machineuuid']) || $row['clientip'] === $satServerIp) { unset($dynClients[$row['machineuuid']]); } $server = array( @@ -32,6 +33,10 @@ class Dnbd3Util { array('machineuuid' => $client['machineuuid'])); // Missing from $servers now but we'll handle them in the next run, so don't bother } + // Same for this server - we use the special fixedip '<self>' for it and need to prevent we don't have the + // IP address of the server itself in the list. + Database::exec('DELETE FROM dnbd3_server WHERE fixedip = :serverip', array('serverip' => $satServerIp)); + Database::exec("INSERT IGNORE INTO dnbd3_server (fixedip) VALUES ('<self>')"); // Now query them all $NOW = time(); foreach ($servers as $server) { @@ -59,4 +64,93 @@ class Dnbd3Util { } } + /** + * A client is booting that has runmode dnbd3 proxy - set config vars accordingly. + * + * @param string $machineUuid + * @param string $mode always 'proxy' + * @param string $modeData + */ + public static function runmodeConfigHook($machineUuid, $mode, $modeData) + { + // Get all directly assigned locations + $res = Database::simpleQuery('SELECT locationid FROM dnbd3_server + INNER JOIN dnbd3_server_x_location USING (serverid) + WHERE machineuuid = :uuid', + array('uuid' => $machineUuid)); + $assignedLocs = $res->fetchAll(PDO::FETCH_ASSOC); + if (!empty($assignedLocs)) { + // Get all sub-locations too + $recursiveLocs = $assignedLocs; + $locations = Location::getLocationsAssoc(); + foreach ($assignedLocs as $l) { + if (isset($locations[$l])) { + $recursiveLocs = array_merge($recursiveLocs, $locations[$l]['children']); + } + } + $res = Database::simpleQuery('SELECT startaddr, endaddr FROM subnet WHERE locationid IN (:locs)', + array('locs' => $recursiveLocs)); + // Got subnets, build whitelist + $opt = ''; + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + $opt .= ' ' . self::range2Cidr($row['startaddr'], $row['endaddr']); + } + if (!empty($opt)) { + ConfigHolder::add('SLX_DNBD3_WHITELIST', $opt, 1000); + } + } + // Send list of other proxy servers + $res = Database::simpleQuery('SELECT s.fixedip, m.clientip, sxl.locationid FROM dnbd3_server s + LEFT JOIN machine m USING (machineuuid) + LEFT JOIN dnbd3_server_x_location sxl USING (serverid) + WHERE s.machineuuid <> :uuid OR s.machineuuid IS NULL', array('uuid' => $machineUuid)); + $public = array(); + $private = array(); + while ($row = $res->fetch(PDO::FETCH_ASSOC)) { + $ip = $row['clientip'] ? $row['clientip'] : $row['fixedip']; + if ($ip === '<self>') { + continue; + } + if (is_null($row['locationid'])) { + if (!array_key_exists($ip, $private)) { + $public[$ip] = $ip; + } + } else { + $private[$ip] = $ip; + } + } + if (!empty($public)) { + ConfigHolder::add('SLX_DNBD3_PUBLIC', implode(' ', $public)); + } + if (!empty($private)) { + ConfigHolder::add('SLX_DNBD3_PRIVATE', implode(' ', $private)); + } + ConfigHolder::add('SLX_ADDONS', '', 1000); + } + + /** + * Get smallest subnet in CIDR notation that covers the given range. + * The subnet denoted by the CIDR notation might actually be larger + * than the range described by $start and $end. + * + * @param int $start start address + * @param int $end end address + * @return string CIDR notation + */ + private static function range2Cidr($start, $end) + { + $bin = decbin($start ^ $end); + if ($bin === '0') + return $start; + $mask = 32 - strlen($bin); + return $start . '/' . $mask; + } + +} + +class Dnbd3ProxyConfig +{ + + public $a; + }
\ No newline at end of file |