# cygwin-lib.pl # Networking functions for cygwin # # TODO: # * detect when netsh isn't available # * save domain list # * save domainname my $logfile = "/dev/null"; #my $logfile = "/tmp/debugwb"; #define variables that modify the behavior of the .cgi scripts #that are different than any other OS. $noos_support_add_ifcs = 1; #Windows doesn't supporting adding interfaces $noos_support_delete_ifcs = 1; #Windows doesn't supporting deleting interfaces $always_apply_ifcs = 1; #Changes made to interfaces are always applied $routes_active_now = 1; #Changes made to routes are always applied #Note: some changes Windows requires a reboot, some don't. #TODO2: determine which changes require a reboot. # active_interfaces() # Returns a list of currently ifconfig'd interfaces # ifc keys: 'name','fullname','virtual','address','netmask','broadcast', # 'ether','mtu','up','edit','index','dhcp' sub active_interfaces { local(@rv, @lines, $line); &open_execute_command(IFC, "ipconfig /all", 1, 1); while (<IFC>) { s/\r|\n//g; push(@lines, $_); } close(IFC); #Need to get the list of boottime interfaces, because ipconfig /all #doesn't return ipaddr if cable is disconnected my @bootifs = boot_interfaces(); my %ifc = (); foreach $line (@lines) { if ($line =~ /Ethernet adapter (.*):/) { my $name = $1; if (defined($ifc{'name'})) { #save the previous one $ifc{'index'} = scalar(@rv); local ($a1, $a2, $a3, $a4) = ($1, $2, $3, $4); if ($ifc{'address'}) { $ifc{'netmask'} =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/; $ifc{'broadcast'} = sprintf("%d.%d.%d.%d", ($a1 | ~int($1))&0xff, ($a2 | ~int($2))&0xff, ($a3 | ~int($3))&0xff, ($a4 | ~int($4))&0xff); } my %tmp = %ifc; push(@rv, \%tmp); } %ifc = (); $ifc{'name'} = $ifc{'fullname'} = $name; } elsif ($line =~ /Media State.*: (.*)/) { $ifc{'up'} = ($1 !~ /Disconnected/); foreach (@bootifs) { if ($_->{'name'} eq $ifc{'name'}) { $ifc{'dhcp'} = $_->{'dhcp'}; $ifc{'address'} = $_->{'address'}; $ifc{'netmask'} = $_->{'netmask'}; } } } elsif ($line =~ /Description.*: (.*) \#(\d+)\s*$/) { $ifc{'desc'} = $1; $ifc{'index'} = $2; } elsif ($line =~ /Description.*: (.*)$/) { $ifc{'desc'} = $1; chop($ifc{'desc'}); $ifc{'num'} = 1; } elsif ($line =~ /Physical Address.*: (.+)$/) { $ifc{'ether'} = $1; $ifc{'ether'} =~ s/-/:/g; } elsif ($line =~ /IP Address.*: (.+)$/) { $ifc{'address'} = $1; $ifc{'up'} = 1 if ! defined $ifc{'up'}; } elsif ($line =~ /Subnet Mask.*: (.+)$/) { $ifc{'netmask'} = $1; } elsif ($line =~ /Default Gateway.*: (.+)$/) { #this is used for the router subroutines below $ifc{'gateway'} = $1; } elsif ($line =~ /DHCP Enabled.*: (.+)$/) { $ifc{'dhcp'} = ($1 =~ /Yes/); } } if (defined($ifc{'name'})) { #save the last one $ifc{'index'} = scalar(@rv); local ($a1, $a2, $a3, $a4) = ($1, $2, $3, $4); if ($ifc{'address'}) { $ifc{'netmask'} =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/; $ifc{'broadcast'} = sprintf("%d.%d.%d.%d", ($a1 | ~int($1))&0xff, ($a2 | ~int($2))&0xff, ($a3 | ~int($3))&0xff, ($a4 | ~int($4))&0xff); } my %tmp = %ifc; push(@rv, \%tmp); } return @rv; } # activate_interface(&details) # Create or modify an interface sub activate_interface { save_interface($@); #Windows doesn't support adding or removing interfaces } # apply_interface(&details) # Save changes to an interface active now sub apply_interface { save_interface($@); } # deactivate_interface(&details) # Deactivate an interface sub deactivate_interface { #TODO2: determine how to deactivate an interface } # boot_interfaces() # Returns a list of interfaces brought up at boot time sub boot_interfaces { my @rv = (); #It doesn't seem to really help to display the loopback since #there's no mechanism in Windows to edit it. # push(@rv, { 'name' => 'lo0', # 'fullname' => 'lo0', # 'address' => '127.0.0.1', # 'netmask' => '255.0.0.0', # 'up' => 1, # 'edit' => 0 }); my (@lines, $l); &open_execute_command(IFC, "netsh interface ip dump", 1); while (<IFC>) { s/\r|\n//g; push(@lines, $_); } close(IFC); #my %ifc = (); foreach $l (@lines) { #TODO2: handle this message: #"Cannot access configuration. # Connection UI or someone else is accessing it." if ($l =~ /^set address name = "(.*)" source = dhcp/) { local %ifc; $ifc{'fullname'} = $ifc{'name'} = $1; $ifc{'index'} = scalar(@rv); $ifc{'edit'}++; $ifc{'dhcp'} = 1; $ifc{'up'} = 1; push(@rv, \%ifc); } elsif ($l =~ /^set address name = "(.*)" source = static addr = ([\d\.]+) mask = ([\d\.]+)/) { local %ifc; $ifc{'fullname'} = $ifc{'name'} = $1; $ifc{'address'} = $2; $ifc{'netmask'} = $3; $ifc{'index'} = scalar(@rv); $ifc{'edit'}++; $ifc{'address'} =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/; local ($a1, $a2, $a3, $a4) = ($1, $2, $3, $4); $ifc{'netmask'} =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/; $ifc{'broadcast'} = sprintf("%d.%d.%d.%d", ($a1 | ~int($1))&0xff, ($a2 | ~int($2))&0xff, ($a3 | ~int($3))&0xff, ($a4 | ~int($4))&0xff); $ifc{'dhcp'} = 0; $ifc{'up'} = 1; push(@rv, \%ifc); } elsif ($l =~ /^set address name = "(.*)" gateway = ([\d\.]+) gwmetric = (\d)/) { foreach (@rv) { if ($_->{'name'} eq $1) { $_->{'gateway'} = $2; $_->{'gwmetric'} = $3; } } } } return @rv; } # save_interface(&details) # Create or update a boot-time interface sub save_interface { my $ifc = $_[0]; my $cmd = "netsh interface ip set address name = \"" . "$ifc->{'name'}\" source = "; if ($ifc->{'dhcp'}) { $cmd .= "dhcp"; } else { $cmd .= "static addr = $ifc->{'address'} mask = $ifc->{'netmask'}"; } system_logged("$cmd >$logfile 2>&1"); } # delete_interface(&details) # Delete a boot-time interface sub delete_interface { #Windows doesn't support adding or removing interfaces } # iface_type(name) # Returns a human-readable interface type name sub iface_type { #TODO2 #return "Fast Ethernet" if #return "Token Ring" if #return "PPP" if return "Loopback" if $_[0] =~ /^lo0$/; return "Ethernet"; } # iface_hardware(name) # Does some interface have an editable hardware address sub iface_hardware { #TODO2: PPP return $_[0] !~ /^(lo\d)$/; } # can_edit(what) # Can some boot-time interface parameter be edited? sub can_edit { return $_[0] =~ /^(dhcp|netmask)$/; } sub can_broadcast_def { return 0; } # valid_boot_address(address) # Is some address valid for a bootup interface sub valid_boot_address { return &to_ipaddress($_[0]) ? 1 : 0; } # get_dns_config() # Returns a hashtable containing keys nameserver, domain, order sub get_dns_config { my @lines = (); my $dns = {'domain' => []}; my $i = 0; if (&open_execute_command(CMD, "ipconfig /all", 1)) { my $doing_domain = 0; while (<CMD>) { s/[\n\r]//g; if ($doing_domain) { if (/(Ethernet adapter|:)/) { $doing_domain = 0; } elsif (/^\s*([^:]+\.[^:]+)$/) { push(@{$dns->{"domain"}}, $1); } } if (/Primary DNS Suffix.*: (.*)/) { push(@{$dns->{"domain"}}, $1); } elsif (/DNS Suffix Search List.*: (.*)/) { $doing_domain = 1; push(@{$dns->{"domain"}}, $1); } elsif (/^Ethernet adapter (.*):/) { $dns->{"name"}[$i++] = $1; } } close(CMD); } if (&open_execute_command(CMD, "netsh interface ip show dns", 1)) { my $doing_nameserver = 0; my $i = -1; my $key = "nameserver"; while (<CMD>) { s/\r|\n//g; if ($doing_nameserver) { if (/(Configuration for interface|:)/) { $doing_nameserver = 0; } elsif (/^\s*([\d\.]+)/) { push(@{$dns->{$key}}, $1); } } if (/Configuration for interface "(.*)"/) { $dns->{'name'}[++$i] = $1; $key = "nameserver"; $key .= $i if $i > 0; } elsif (/Statically Configured DNS Servers:\s*([\d\.]+)/) { push(@{$dns->{$key}}, $1); $doing_nameserver = 1; } } close(CMD); } return $dns; } # save_dns_config(&config) # Configures the DNS settings sub save_dns_config { my $dns = $_[0]; for ($i=0; $i < @{$dns->{'name'}}; $i++) { my $key = "nameserver"; $key .= $i if $i > 0; if (@{$dns->{$key}}) { my $cmd_fmt = "netsh interface ip %s dns name = \"" . $dns->{'name'}[$i] . "\"%s addr = %s"; my $addr = pop(@{$dns->{$key}}); my $cmd = sprintf($cmd_fmt, "set", " source = static", $addr); &system_logged("$cmd >$logfile 2>&1"); #add the new ones (any old list of adds was erased by the set cmd) foreach (@{$dns->{$key}}) { $cmd = sprintf($cmd_fmt, "add", "", $_); &system_logged("$cmd >$logfile 2>&1"); } } else { #set it to be obtained automatically my $cmd = "netsh interface ip set dns name = \"" . $dns->{'name'}[$i] . "\" source = dhcp"; &system_logged("$cmd >$logfile 2>&1"); #any old list of adds was erased by the set cmd } } #TODO: support saving the domain list #if ($_[0]->{'domain'}) { } $max_dns_servers = 16; #more is possible, but this is realistic # order_input(&dns) # Returns HTML for selecting the name resolution order sub order_input { #TODO2 } # parse_order(&dns) # Parses the form created by order_input() sub parse_order { #TODO2 } # get_hostname() sub get_hostname { return &get_system_hostname(); } # save_hostname(name) sub save_hostname { &system_logged("hostname $_[0] >/dev/null 2>&1"); undef(@main::get_system_hostname); # clear cache } # get_domainname() sub get_domainname { #TODO: determine how to get return ""; } # save_domainname(domain) sub save_domainname { #TODO: determine how to set } sub routing_config_files { return map { $_->{'file'} } &boot_interfaces(); } sub routing_input { # show default router(s) input my @if = boot_interfaces(); my $i = 0; foreach (@if) { next if $_->{'address'} eq "127.0.0.1"; my $none_or_dhcp = defined($ifc{'gateway'}) ? 0 : 1; my $desc = $_->{'name'} . ($_->{'dhcp'}? "" : " ($_->{'address'})"); print &ui_table_row("$desc $text{'routes_default'}", &ui_radio("gateway${i}_def", $none_or_dhcp, [ [ 1, $text{'routes_none'} ], [ 0, $text{'routes_gateway'}." ". &ui_textbox("gateway$i", $_->{'gateway'}, 15)." ". $text{'routes_gwmetric'}." ". &ui_textbox("gwmetric$i", $_->{'gwmetric'}, 4) ] ]). &ui_hidden("ifname${i}", $_->{'name'})); $i++; } } sub parse_routing { my $i = 0; my @if = boot_interfaces(); while (defined($in{"gateway${i}_def"})) { my $name = $in{"ifname$i"}; my $gateway = $in{"gateway$i"}; my $gwmetric = $in{"gwmetric$i"}; foreach (@if) { if ($_->{'name'} eq $name) { if (! $in{"gateway${i}_def"}) { if ($gateway != $_->{'gateway'} || $gwmetric != $_->{'gwmetric'}) { &check_ipaddress($gateway) || &error(&text('routes_egateway', &html_escape($gateway))); my $cmd = "netsh interface ip set address name = \"" . $_->{'name'} . "\" gateway = $gateway " . "gwmetric = $gwmetric"; system_logged("$cmd > $logfile 2>&1"); } } else { if (defined($_->{'gateway'})) { my $cmd = "netsh interface ip delete address name = \"" . $_->{'name'} . "\" gateway = $_->{'gateway'}"; system_logged("$cmd > $logfile 2>&1"); } } } } $i++; } } # supports_address6([&iface]) # Returns 1 if managing IPv6 interfaces is supported sub supports_address6 { local ($iface) = @_; return 0; } 1;
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
images | Folder | 0755 |
|
|
lang | Folder | 0755 |
|
|
CHANGELOG | File | 5.55 KB | 0644 |
|
acl_security.pl | File | 3.08 KB | 0755 |
|
apply.cgi | File | 184 B | 0755 |
|
backup_config.pl | File | 1005 B | 0755 |
|
cgi_args.pl | File | 752 B | 0755 |
|
cobalt-linux-lib.pl | File | 32.85 KB | 0755 |
|
coherent-linux-lib.pl | File | 32.85 KB | 0755 |
|
config | File | 48 B | 0644 |
|
config-ALL-linux | File | 48 B | 0644 |
|
config-cygwin | File | 82 B | 0644 |
|
config-freebsd | File | 48 B | 0644 |
|
config-macos | File | 48 B | 0644 |
|
config-netbsd | File | 48 B | 0644 |
|
config-openbsd | File | 48 B | 0644 |
|
config-solaris | File | 79 B | 0644 |
|
config-syno-linux | File | 48 B | 0644 |
|
config-unixware | File | 48 B | 0644 |
|
config-windows | File | 78 B | 0644 |
|
config.info | File | 193 B | 0644 |
|
config.info.ca | File | 241 B | 0644 |
|
config.info.cs | File | 205 B | 0644 |
|
config.info.de | File | 219 B | 0644 |
|
config.info.es | File | 175 B | 0644 |
|
config.info.fa | File | 255 B | 0644 |
|
config.info.fr | File | 246 B | 0644 |
|
config.info.hu | File | 0 B | 0644 |
|
config.info.ja | File | 68 B | 0644 |
|
config.info.nl | File | 197 B | 0644 |
|
config.info.no | File | 208 B | 0644 |
|
config.info.pl | File | 240 B | 0644 |
|
config.info.pt_BR | File | 229 B | 0644 |
|
config.info.ru | File | 361 B | 0644 |
|
config.info.sk | File | 225 B | 0644 |
|
config.info.sv | File | 42 B | 0644 |
|
config.info.tr | File | 65 B | 0644 |
|
config.info.uk | File | 87 B | 0644 |
|
config.info.zh | File | 43 B | 0644 |
|
config.info.zh_TW | File | 44 B | 0644 |
|
create_route.cgi | File | 1004 B | 0755 |
|
cygwin-lib.pl | File | 11.28 KB | 0755 |
|
debian-linux-lib.pl | File | 33.58 KB | 0755 |
|
defaultacl | File | 114 B | 0644 |
|
delete_aifcs.cgi | File | 537 B | 0755 |
|
delete_bifcs.cgi | File | 1.44 KB | 0755 |
|
delete_hosts.cgi | File | 523 B | 0755 |
|
delete_ipnodes.cgi | File | 542 B | 0755 |
|
delete_routes.cgi | File | 458 B | 0755 |
|
edit_aifc.cgi | File | 5.09 KB | 0755 |
|
edit_bifc.cgi | File | 10.42 KB | 0755 |
|
edit_host.cgi | File | 1.13 KB | 0755 |
|
edit_ipnode.cgi | File | 1.04 KB | 0755 |
|
edit_range.cgi | File | 1.34 KB | 0755 |
|
freebsd-lib.pl | File | 19.22 KB | 0755 |
|
gentoo-linux-lib.pl | File | 8.47 KB | 0755 |
|
index.cgi | File | 1.25 KB | 0755 |
|
interface_chooser.cgi | File | 3.8 KB | 0755 |
|
linux-lib.pl | File | 27.58 KB | 0755 |
|
list_dns.cgi | File | 2.3 KB | 0755 |
|
list_hosts.cgi | File | 1.36 KB | 0755 |
|
list_ifcs.cgi | File | 7.96 KB | 0755 |
|
list_ipnodes.cgi | File | 1.07 KB | 0755 |
|
list_routes.cgi | File | 3.38 KB | 0755 |
|
log_parser.pl | File | 1.24 KB | 0755 |
|
macos-lib.pl | File | 11.57 KB | 0755 |
|
mandrake-linux-lib.pl | File | 32.85 KB | 0755 |
|
mod_aifc.cgi | File | 720 B | 0755 |
|
module.info | File | 485 B | 0644 |
|
module.info.af | File | 0 B | 0644 |
|
module.info.af.auto | File | 123 B | 0644 |
|
module.info.ar | File | 0 B | 0644 |
|
module.info.ar.auto | File | 170 B | 0644 |
|
module.info.be | File | 0 B | 0644 |
|
module.info.be.auto | File | 226 B | 0644 |
|
module.info.bg | File | 0 B | 0644 |
|
module.info.bg.auto | File | 261 B | 0644 |
|
module.info.ca | File | 127 B | 0644 |
|
module.info.ca.auto | File | 25 B | 0644 |
|
module.info.cs | File | 27 B | 0644 |
|
module.info.cs.auto | File | 111 B | 0644 |
|
module.info.da | File | 0 B | 0644 |
|
module.info.da.auto | File | 129 B | 0644 |
|
module.info.de | File | 121 B | 0644 |
|
module.info.de.auto | File | 19 B | 0644 |
|
module.info.el | File | 0 B | 0644 |
|
module.info.el.auto | File | 229 B | 0644 |
|
module.info.es | File | 30 B | 0644 |
|
module.info.es.auto | File | 116 B | 0644 |
|
module.info.eu | File | 0 B | 0644 |
|
module.info.eu.auto | File | 142 B | 0644 |
|
module.info.fa | File | 0 B | 0644 |
|
module.info.fa.auto | File | 194 B | 0644 |
|
module.info.fi | File | 0 B | 0644 |
|
module.info.fi.auto | File | 145 B | 0644 |
|
module.info.fr | File | 30 B | 0644 |
|
module.info.fr.auto | File | 128 B | 0644 |
|
module.info.he | File | 0 B | 0644 |
|
module.info.he.auto | File | 161 B | 0644 |
|
module.info.hr | File | 0 B | 0644 |
|
module.info.hr.auto | File | 148 B | 0644 |
|
module.info.hu | File | 34 B | 0644 |
|
module.info.hu.auto | File | 148 B | 0644 |
|
module.info.it | File | 28 B | 0644 |
|
module.info.it.auto | File | 112 B | 0644 |
|
module.info.ja | File | 33 B | 0644 |
|
module.info.ja.auto | File | 153 B | 0644 |
|
module.info.ko | File | 28 B | 0644 |
|
module.info.ko.auto | File | 105 B | 0644 |
|
module.info.lt | File | 0 B | 0644 |
|
module.info.lt.auto | File | 157 B | 0644 |
|
module.info.lv | File | 0 B | 0644 |
|
module.info.lv.auto | File | 157 B | 0644 |
|
module.info.ms | File | 136 B | 0644 |
|
module.info.ms.auto | File | 18 B | 0644 |
|
module.info.mt | File | 0 B | 0644 |
|
module.info.mt.auto | File | 144 B | 0644 |
|
module.info.nl | File | 29 B | 0644 |
|
module.info.nl.auto | File | 105 B | 0644 |
|
module.info.no | File | 31 B | 0644 |
|
module.info.no.auto | File | 99 B | 0644 |
|
module.info.pl | File | 122 B | 0644 |
|
module.info.pl.auto | File | 19 B | 0644 |
|
module.info.pt | File | 31 B | 0644 |
|
module.info.pt.auto | File | 125 B | 0644 |
|
module.info.pt_BR | File | 34 B | 0644 |
|
module.info.pt_BR.auto | File | 131 B | 0644 |
|
module.info.ro | File | 0 B | 0644 |
|
module.info.ro.auto | File | 143 B | 0644 |
|
module.info.ru | File | 36 B | 0644 |
|
module.info.ru.auto | File | 167 B | 0644 |
|
module.info.sk | File | 28 B | 0644 |
|
module.info.sk.auto | File | 113 B | 0644 |
|
module.info.sl | File | 0 B | 0644 |
|
module.info.sl.auto | File | 140 B | 0644 |
|
module.info.sv | File | 31 B | 0644 |
|
module.info.sv.auto | File | 103 B | 0644 |
|
module.info.th | File | 0 B | 0644 |
|
module.info.th.auto | File | 327 B | 0644 |
|
module.info.tr | File | 30 B | 0644 |
|
module.info.tr.auto | File | 130 B | 0644 |
|
module.info.uk | File | 0 B | 0644 |
|
module.info.uk.auto | File | 223 B | 0644 |
|
module.info.ur | File | 0 B | 0644 |
|
module.info.ur.auto | File | 210 B | 0644 |
|
module.info.vi | File | 0 B | 0644 |
|
module.info.vi.auto | File | 170 B | 0644 |
|
module.info.zh | File | 21 B | 0644 |
|
module.info.zh.auto | File | 90 B | 0644 |
|
module.info.zh_TW | File | 24 B | 0644 |
|
module.info.zh_TW.auto | File | 96 B | 0644 |
|
msc-linux-lib.pl | File | 32.85 KB | 0755 |
|
net-lib.pl | File | 12 KB | 0755 |
|
netbsd-lib.pl | File | 19.22 KB | 0755 |
|
netplan-lib.pl | File | 21.01 KB | 0644 |
|
open-linux-lib.pl | File | 7.2 KB | 0755 |
|
openbsd-lib.pl | File | 12.6 KB | 0755 |
|
openmamba-linux-lib.pl | File | 32.85 KB | 0755 |
|
pardus-linux-lib.pl | File | 32.85 KB | 0755 |
|
rbac-mapping | File | 180 B | 0644 |
|
rc.inet1 | File | 1.95 KB | 0644 |
|
redhat-linux-lib.pl | File | 32.85 KB | 0755 |
|
save_aifc.cgi | File | 5.78 KB | 0755 |
|
save_bifc.cgi | File | 10.12 KB | 0755 |
|
save_dns.cgi | File | 3.65 KB | 0755 |
|
save_host.cgi | File | 1.18 KB | 0755 |
|
save_ipnode.cgi | File | 1.26 KB | 0755 |
|
save_range.cgi | File | 1.42 KB | 0755 |
|
save_routes.cgi | File | 283 B | 0755 |
|
slackware-linux-9.1-ALL-lib.pl | File | 7.85 KB | 0755 |
|
slackware-linux-lib.pl | File | 6.71 KB | 0755 |
|
solaris-lib.pl | File | 20.79 KB | 0755 |
|
suse-linux-8.0-lib.pl | File | 7.31 KB | 0755 |
|
suse-linux-8.2-lib.pl | File | 7.31 KB | 0755 |
|
suse-linux-9.0-lib.pl | File | 8.74 KB | 0755 |
|
suse-linux-9.1-lib.pl | File | 8.74 KB | 0755 |
|
suse-linux-9.2-ALL-lib.pl | File | 11.23 KB | 0755 |
|
suse-linux-lib.pl | File | 9.08 KB | 0755 |
|
system_info.pl | File | 2.42 KB | 0644 |
|
trustix-linux-lib.pl | File | 32.85 KB | 0755 |
|
turbo-linux-lib.pl | File | 32.85 KB | 0755 |
|
united-linux-lib.pl | File | 7.31 KB | 0755 |
|
unixware-lib.pl | File | 9.9 KB | 0755 |
|
windows-lib.pl | File | 11.28 KB | 0755 |
|