r4073 minor change in UI for recent change: VST form commit on ENTER and hints on...
[racktables] / popup.php
1 <?php
2 ob_start();
3 try {
4
5 require 'inc/interface.php';
6 require 'inc/init.php';
7
8 // Return a list of rack IDs, which are P or less positions
9 // far from the given rack in its row.
10 function getProximateRacks ($rack_id, $proximity = 0)
11 {
12 $rack = spotEntity ('rack', $rack_id);
13 $rackList = listCells ('rack', $rack['row_id']);
14 doubleLink ($rackList);
15 $ret = array ($rack_id);
16 $todo = $proximity;
17 $cur_item = $rackList[$rack_id];
18 while ($todo and array_key_exists ('prev_key', $cur_item))
19 {
20 $cur_item = $rackList[$cur_item['prev_key']];
21 $ret[] = $cur_item['id'];
22 $todo--;
23 }
24 $todo = $proximity;
25 $cur_item = $rackList[$rack_id];
26 while ($todo and array_key_exists ('next_key', $cur_item))
27 {
28 $cur_item = $rackList[$cur_item['next_key']];
29 $ret[] = $cur_item['id'];
30 $todo--;
31 }
32 return $ret;
33 }
34
35 function findSparePorts ($port_id, $only_racks = array())
36 {
37 $qparams = array ($port_id, $port_id);
38 $query = "SELECT id, object_id, name FROM Port WHERE " .
39 "id <> ? " .
40 "AND type IN (SELECT type2 FROM PortCompat WHERE type1 = (SELECT type FROM Port WHERE id = ?)) " .
41 "AND reservation_comment IS NULL " .
42 "AND id NOT IN (SELECT porta FROM Link) " .
43 "AND id NOT IN (SELECT portb FROM Link) ";
44 if (count ($only_racks))
45 {
46 $query .= 'AND object_id IN (SELECT DISTINCT object_id FROM RackSpace WHERE rack_id IN (' .
47 questionMarks (count ($only_racks)) . '))';
48 $qparams = array_merge ($qparams, $only_racks);
49 }
50 $query .= ' ORDER BY object_id, name';
51 $result = usePreparedSelectBlade ($query, $qparams);
52 // avoid nested queries
53 $rows = $result->fetchAll (PDO::FETCH_ASSOC);
54 unset ($result);
55 $ret = array();
56 foreach (array_keys ($rows) as $rkey)
57 {
58 $object = spotEntity ('object', $rows[$rkey]['object_id']);
59 $ret[$rows[$rkey]['id']] = $object['dname'] . ' ' . $rows[$rkey]['name'];
60 unset ($rows[$rkey]);
61 }
62 natsort($ret);
63 return $ret;
64 }
65
66 function sortObjectAddressesAndNames ($a, $b)
67 {
68 $objname_cmp = sortTokenize($a['object_name'], $b['object_name']);
69 if ($objname_cmp == 0)
70 {
71 $name_a = (isset ($a['port_name'])) ? $a['port_name'] : '';
72 $name_b = (isset ($b['port_name'])) ? $b['port_name'] : '';
73 $objname_cmp = sortTokenize($name_a, $name_b);
74 if ($objname_cmp == 0)
75 sortTokenize($a['ip'], $b['ip']);
76 return $objname_cmp;
77 }
78 return $objname_cmp;
79 }
80
81 header ('Content-Type: text/html; charset=UTF-8');
82 ?>
83 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
84 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" style="height: 100%;">
85 <head>
86 <?php
87 echo "<title>RackTables pop-up</title>\n";
88 printPageHeaders();
89 echo '</head><body style="height: 100%;">';
90 assertStringArg ('helper');
91 switch ($_REQUEST['helper'])
92 {
93 case 'portlist':
94 $pageno = 'depot';
95 $tabno = 'default';
96 fixContext();
97 if (!permitted())
98 renderAccessDenied();
99 assertUIntArg ('port');
100 assertStringArg ('in_rack');
101 $localchoice = $_REQUEST['in_rack'] == 'y';
102 $port_id = $_REQUEST['port'];
103 echo '<div style="background-color: #f0f0f0; border: 1px solid #3c78b5; padding: 10px; height: 100%; text-align: center; margin: 5px;"><h2>';
104 echo $localchoice ?
105 ('Nearest spare ports (<a href="popup.php?helper=portlist&port=' . $port_id . '&in_rack=n">show all</a>)') :
106 ('All spare ports (<a href="popup.php?helper=portlist&port=' . $port_id . '&in_rack=y">show nearest</a>)');
107 echo '</h2><form action="javascript:;" id="portform">';
108 $only_racks = array();
109 global $sic;
110 $port_info = getPortInfo ($sic['port']);
111 if ($_REQUEST['in_rack'] == 'y' and $port_info['object_id'])
112 {
113 $object = spotEntity ('object', $port_info['object_id']);
114 if ($object['rack_id'])
115 $only_racks = getProximateRacks ($object['rack_id'], getConfigVar ('PROXIMITY_RANGE'));
116 }
117 $spare_ports = findSparePorts ($port_id, $only_racks);
118
119 printSelect ($spare_ports, array ('name' => 'ports', 'size' => getConfigVar ('MAXSELSIZE')));
120 echo '<br>';
121 echo "Cable ID: <input type=text id=cable>";
122 echo '<br>';
123 echo "<input type='submit' value='Link' onclick='".
124 "if (getElementById(\"ports\").value != \"\") {".
125 " opener.location=\"process.php?page=object&tab=ports&op=linkPort&object_id=${port_info['object_id']}&port_id=$port_id&remote_port_id=\"+getElementById(\"ports\").value+\"&cable=\"+getElementById(\"cable\").value; ".
126 " window.close();}'>";
127 echo '</form></div>';
128 break;
129 case 'inet4list':
130 $pageno = 'ipv4space';
131 $tabno = 'default';
132 fixContext();
133 if (!permitted())
134 renderAccessDenied();
135 echo '<div style="background-color: #f0f0f0; border: 1px solid #3c78b5; padding: 10px; height: 100%; text-align: center; margin: 5px;">';
136 echo '<h2>Choose a port:</h2><br><br>';
137 echo '<form action="javascript:;">';
138 echo '<input type=hidden id=ip>';
139 echo '<select size=' . getConfigVar ('MAXSELSIZE') . ' id=addresses>';
140 $addresses = getAllIPv4Allocations();
141 usort ($addresses, 'sortObjectAddressesAndNames');
142 foreach ($addresses as $address)
143 echo "<option value='${address['ip']}' onclick='getElementById(\"ip\").value=\"${address['ip']}\";'>" .
144 "${address['object_name']} ${address['name']} ${address['ip']}</option>\n";
145 echo '</select><br><br>';
146 echo "<input type=submit value='Proceed' onclick='".
147 "if (getElementById(\"ip\")!=\"\") {".
148 " opener.document.getElementById(\"remoteip\").value=getElementById(\"ip\").value;".
149 " window.close();}'>";
150 echo '</form></div>';
151 break;
152 default:
153 throw new InvalidRequestArgException ('helper', $_REQUEST['helper']);
154 }
155 ?>
156 </body>
157 </html>
158 <?php
159 ob_end_flush();
160 }
161 catch (Exception $e)
162 {
163 ob_end_clean();
164 printException($e);
165 }
166 ?>