From 3d0cb99c70dd9714655cf26893504e4bd007b036 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 24 Jun 2016 17:08:24 +0200 Subject: [locations] Support CIDR notion (start field), tweak templates a bit --- modules-available/locations/clientscript.js | 66 ++++++++++++++++++++ modules-available/locations/page.inc.php | 72 ++++++++++++++++++---- .../locations/templates/location-subnets.html | 34 +++++----- .../locations/templates/locations.html | 27 ++++---- modules-available/locations/templates/subnets.html | 6 +- 5 files changed, 164 insertions(+), 41 deletions(-) create mode 100644 modules-available/locations/clientscript.js (limited to 'modules-available/locations') diff --git a/modules-available/locations/clientscript.js b/modules-available/locations/clientscript.js new file mode 100644 index 00000000..ad3e6c43 --- /dev/null +++ b/modules-available/locations/clientscript.js @@ -0,0 +1,66 @@ +function ip2long(IP) { + var i = 0; + IP = IP.match(/^([1-9]\d*|0[0-7]*|0x[\da-f]+)(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?(?:\.([1-9]\d*|0[0-7]*|0x[\da-f]+))?$/i); + if (!IP) { + return false; + } + IP.push(0, 0, 0, 0); + for (i = 1; i < 5; i += 1) { + IP[i] = parseInt(IP[i]) || 0; + if (IP[i] < 0 || IP[i] > 255) + return false; + } + return IP[1] * 16777216 + IP[2] * 65536 + IP[3] * 256 + IP[4] * 1; +} + +function long2ip(a) { + return [ + a >>> 24, + 255 & a >>> 16, + 255 & a >>> 8, + 255 & a + ].join('.'); +} + +function cidrToRange(cidr) { + var range = [2]; + cidr = cidr.split('/'); + var cidr_1 = parseInt(cidr[1]); + if (cidr_1 <= 0 || cidr_1 > 32) + return false; + var param = ip2long(cidr[0]); + if (param === false) + return false; + range[0] = long2ip((param) & ((-1 << (32 - cidr_1)))); + var start = ip2long(range[0]); + range[1] = long2ip(start + Math.pow(2, (32 - cidr_1)) - 1); + return range; +} + +/** + * Add listener to start IP input; when it loses focus, see if we have a + * CIDR notation and fill out start+end field. + */ +function slxAttachCidr() { + $('.cidrmagic').each(function () { + var t = $(this); + var s = t.find('input.cidrstart'); + var e = t.find('input.cidrend'); + if (!s || !e) + return; + t.removeClass('cidrmagic'); + s.focusout(function () { + var val = s.val(); + if (val.match(/^[0-9]+\.[0-9]+(\.[0-9]+(\.[0-9]+)?)?\/[0-9]{2}$/)) { + var res = cidrToRange(val); + if (res === false) + return; + s.val(res[0]); + e.val(res[1]); + } + }); + }); +} + +// Attach +slxAttachCidr(); \ No newline at end of file diff --git a/modules-available/locations/page.inc.php b/modules-available/locations/page.inc.php index de724350..f747592f 100644 --- a/modules-available/locations/page.inc.php +++ b/modules-available/locations/page.inc.php @@ -21,8 +21,43 @@ class Page_Locations extends Page $this->updateLocation(); } elseif ($this->action === 'addlocations') { $this->addLocations(); + } elseif ($this->action === 'updatesubnets') { + $this->updateSubnets(); } } + + private function updateSubnets() + { + $count = 0; + $starts = Request::post('startaddr', false); + $ends = Request::post('endaddr', false); + $locs = Request::post('location', false); + if (!is_array($starts) || !is_array($ends) || !is_array($locs)) { + Message::addError('main.empty-field'); + Util::redirect('?do=Locations'); + } + $existingLocs = Location::getLocationsAssoc(); + $stmt = Database::prepare("UPDATE subnet SET startaddr = :startLong, endaddr = :endLong, locationid = :loc WHERE subnetid = :subnetid"); + foreach ($starts as $subnetid => $start) { + if (!isset($ends[$subnetid]) || !isset($locs[$subnetid])) + continue; + $loc = (int)$locs[$subnetid]; + $end = $ends[$subnetid]; + if (!isset($existingLocs[$loc])) { + Message::addError('main.value-invalid', 'locationid', $loc); + continue; + } + $range = $this->rangeToLongVerbose($start, $end); + if ($range === false) + continue; + list($startLong, $endLong) = $range; + if ($stmt->execute(compact('startLong', 'endLong', 'loc', 'subnetid'))) { + $count += $stmt->rowCount(); + } + } + Message::addSuccess('updated-x-entries', $count); + Util::redirect('?do=Locations'); + } private function addLocations() { @@ -147,7 +182,7 @@ class Page_Locations extends Page Message::addSuccess('location-updated', $newName); } } - + private function updateLocationSubnets() { // Deletion first @@ -177,18 +212,10 @@ class Page_Locations extends Page foreach ($starts as $key => $start) { if (!isset($ends[$key]) || !is_numeric($key)) continue; $end = $ends[$key]; - list($startLong, $endLong) = $this->rangeToLong($start, $end); - if ($startLong === false) { - Message::addWarning('main.value-invalid', 'start addr', $start); - } - if ($endLong === false) { - Message::addWarning('main.value-invalid', 'end addr', $start); - } - if ($startLong === false || $endLong === false) continue; - if ($startLong > $endLong) { - Message::addWarning('main.value-invalid', 'range', $start . ' - ' . $end); + $range = $this->rangeToLongVerbose($start, $end); + if ($range === false) continue; - } + list($startLong, $endLong) = $range; if ($stmt->execute(array('id' => $key, 'start' => $startLong, 'end' => $endLong))) { $count += $stmt->rowCount(); } @@ -390,6 +417,7 @@ class Page_Locations extends Page . ' INNER JOIN sat.lecture_x_location ll ON (l.lectureid = ll.lectureid AND ll.locationid = :lid)', array('lid' => $locationId)); $data['lectures'] = $lectures['cnt']; + $data['haveDozmod'] = true; } // Get clients matching this location's subnet(s) $count = $online = $used = 0; @@ -407,6 +435,7 @@ class Page_Locations extends Page } } } + $data['haveStatistics'] = true; } $data['machines'] = $count; $data['machines_online'] = $online; @@ -432,4 +461,23 @@ class Page_Locations extends Page return array($startLong, $endLong); } + private function rangeToLongVerbose($start, $end) + { + $result = $this->rangeToLong($start, $end); + list($startLong, $endLong) = $result; + if ($startLong === false) { + Message::addWarning('main.value-invalid', 'start addr', $start); + } + if ($endLong === false) { + Message::addWarning('main.value-invalid', 'end addr', $start); + } + if ($startLong === false || $endLong === false) + return false; + if ($startLong > $endLong) { + Message::addWarning('main.value-invalid', 'range', $start . ' - ' . $end); + return false; + } + return $result; + } + } diff --git a/modules-available/locations/templates/location-subnets.html b/modules-available/locations/templates/location-subnets.html index b0353416..23035002 100644 --- a/modules-available/locations/templates/location-subnets.html +++ b/modules-available/locations/templates/location-subnets.html @@ -43,31 +43,35 @@ {{#list}} - + {{subnetid}} - - + + {{/list}} - + - - - +
+
+ +
+
{{lang_locationInfo}}
+ {{#haveDozmod}} +
+ {{lang_referencingLectures}}: {{lectures}} +
+ {{/haveDozmod}} + {{#haveStatistics}} +
+ {{lang_matchingMachines}}: {{machines}} / {{machines_online}} / {{machines_used}} ({{used_percent}}%) +
+ {{/haveStatistics}} -
-
{{lang_locationInfo}}
-
- {{lang_referencingLectures}}: {{lectures}} -
-
- {{lang_matchingMachines}}: {{machines}} / {{machines_online}} / {{machines_used}} ({{used_percent}}%) -
\ No newline at end of file diff --git a/modules-available/locations/templates/locations.html b/modules-available/locations/templates/locations.html index 2971105b..1fb60926 100644 --- a/modules-available/locations/templates/locations.html +++ b/modules-available/locations/templates/locations.html @@ -6,13 +6,15 @@ - - - {{#havesysconfig}} + + - {{/havesysconfig}} {{#list}} @@ -37,13 +39,13 @@ {{/havebaseconfig}} @@ -123,23 +125,26 @@ function slxOpenLocation(e, lid) { } return; } - var td = $('').attr('id', 'location-details-' + lid); tr.append(td); $(e).closest('tr').addClass('active slx-bold').after(tr); - td.load('?do=Locations&action=showlocation&locationid=' + lid); + td.load('?do=Locations&action=showlocation&locationid=' + lid, function() { + slxAttachCidr(); + }); slxLastLocation = tr; } function slxAddSubnetRow(e, lid) { var tr = $('#loc-sub-' + lid); - tr.before('\ + tr.before('\ \ - \ - \ + \ + \ \ '); slxAddCounter++; + slxAttachCidr(); } function slxConfirm() { diff --git a/modules-available/locations/templates/subnets.html b/modules-available/locations/templates/subnets.html index 2294f42b..0320e333 100644 --- a/modules-available/locations/templates/subnets.html +++ b/modules-available/locations/templates/subnets.html @@ -14,10 +14,10 @@ {{#list}} - + - - + +
{{lang_locationName}}{{#havestatistics}}{{lang_machineCount}}{{/havestatistics}}{{lang_editConfigVariables}} + {{#havestatistics}}{{lang_machineCount}}{{/havestatistics}} + + {{#havebaseconfig}}{{lang_editConfigVariables}}{{/havebaseconfig}} + - {{#havebaseconfig}}{{lang_sysConfig}}{{/havebaseconfig}} + {{#havesysconfig}}{{lang_sysConfig}}{{/havesysconfig}}
+ {{#havesysconfig}}
{{configName}}   - {{#havesysconfig}} {{/havesysconfig}}
').attr('colspan', '2').css('padding', '0px 0px 12px'); + var td = $('').attr('colspan', '4').css('padding', '0px 0px 12px'); var tr = $('
#
{{lang_location}}
{{subnetid}}