mirror of
https://github.com/webmin/webmin.git
synced 2026-09-14 09:30:39 +01:00
Added popup IP chooser
This commit is contained in:
@@ -137,6 +137,7 @@ elsif (@subnets) {
|
||||
}
|
||||
$rv .= &ui_table_row($text{'form_ip'},
|
||||
&ui_textbox("ip", $fixed ? $fixed->{'values'}->[0] : undef, 20).
|
||||
($new ? " ".&ip_chooser_button("ip") : "").
|
||||
" ".$text{'form_subnet'}." ".
|
||||
&ui_select("subnet", $parsub ? $parsub->{'values'}->[0] : '',
|
||||
[ $parsub ? ( ) : ( [ '', $text{'form_nosubnet'} ] ),
|
||||
@@ -231,5 +232,11 @@ else {
|
||||
return $err;
|
||||
}
|
||||
|
||||
# ip_chooser_button(field)
|
||||
sub ip_chooser_button
|
||||
{
|
||||
return "<input type=button onClick='ifield = form.$_[0]; chooser = window.open(\"ip_chooser.cgi\", \"chooser\", \"toolbar=no,menubar=no,scrollbars=yes,resizable=yes,width=300,height=600\"); chooser.ifield = ifield; window.ifield = ifield' value=\"...\">\n";
|
||||
}
|
||||
|
||||
1;
|
||||
|
||||
|
||||
64
dhcp-dns/ip_chooser.cgi
Normal file
64
dhcp-dns/ip_chooser.cgi
Normal file
@@ -0,0 +1,64 @@
|
||||
#!/usr/local/bin/perl
|
||||
# Show a list of free IPs in all subnets
|
||||
|
||||
require './dhcp-dns-lib.pl';
|
||||
&popup_header($text{'chooser_title'});
|
||||
&foreign_require("net", "net-lib.pl");
|
||||
|
||||
# Build map of all IPs
|
||||
@subnets = &list_dhcp_subnets();
|
||||
@hosts = &list_dhcp_hosts();
|
||||
foreach $s (@subnets) {
|
||||
$sip = $s->{'values'}->[0];
|
||||
$smask = $s->{'values'}->[2];
|
||||
$sipnum = &net::ip_to_integer($sip);
|
||||
$smasknum = &net::ip_to_integer($smask);
|
||||
$basenum = $sipnum & $smasknum;
|
||||
$topnum = $basenum + ~$smasknum - 1;
|
||||
for($i=$basenum; $i<=$topnum; $i++) {
|
||||
$poss{&net::integer_to_ip($i)} = $s;
|
||||
}
|
||||
}
|
||||
|
||||
# Find those that are free
|
||||
foreach $h (@hosts) {
|
||||
$fixed = &dhcpd::find("fixed-address", $h->{'members'});
|
||||
if ($fixed) {
|
||||
$used{&to_ipaddress($fixed->{'values'}->[0])} = 1;
|
||||
}
|
||||
}
|
||||
foreach $ip (keys %poss) {
|
||||
if (!$used{$ip}) {
|
||||
push(@avail, $ip);
|
||||
}
|
||||
}
|
||||
@avail = sort { @a = split(/\./, $a);
|
||||
@b = split(/\./, $b);
|
||||
$a[0] <=> $b[0] || $a[1] <=> $b[1] ||
|
||||
$a[2] <=> $b[2] || $a[3] <=> $b[3] } @avail;
|
||||
|
||||
print <<EOF;
|
||||
<script>
|
||||
function select(ip)
|
||||
{
|
||||
top.opener.ifield.value = ip;
|
||||
top.close();
|
||||
return false;
|
||||
}
|
||||
</script>
|
||||
EOF
|
||||
if (@avail) {
|
||||
print &ui_columns_start([ $text{'chooser_ip'} ], 100);
|
||||
foreach $ip (@avail) {
|
||||
print &ui_columns_row([
|
||||
"<a href='' onClick='return select(\"$ip\")'>$ip</a>"
|
||||
]);
|
||||
}
|
||||
print &ui_columns_end();
|
||||
}
|
||||
else {
|
||||
print "<b>$text{'chooser_none'}</b><p>\n";
|
||||
}
|
||||
|
||||
&popup_footer();
|
||||
|
||||
Reference in New Issue
Block a user