Handle hostnames with upper-case letters
[webmin.git] / dhcpd / save_iface.cgi
1 #!/usr/local/bin/perl
2 # save_ifaces.cgi
3 # Save network interfaces on which the DHCP server is started
4
5 require './dhcpd-lib.pl';
6 %access = &get_module_acl();
7 $access{'noconfig'} && &error($text{'iface_ecannot'});
8 &ReadParse();
9
10 # Save in config file
11 @iface = split(/\s+|\0/, $in{'iface'});
12 @iface || &error($text{'iface_enone'});
13 $iface = join(" ", @iface);
14 $config{'interfaces'} = join(" ", @iface);
15 &write_file("$module_config_directory/config", \%config);
16
17 if ($config{'interfaces_type'} eq 'mandrake') {
18         if (-r "/etc/conf.linuxconf") {
19                 # Write to Mandrake linuxconf file
20                 local $lref = &read_file_lines("/etc/conf.linuxconf");
21                 for($i=0; $i<@$lref; $i++) {
22                         $secline = $i if ($lref->[$i] =~ /\[dhcpd\]/);
23                         $ifaceline = $i if ($lref->[$i] =~ /DHCP.interface/);
24                         }
25                 $line = "DHCP.interface $iface";
26                 if (defined($ifaceline)) {
27                         $lref->[$ifaceline] = $line;
28                         }
29                 elsif (defined($secline)) {
30                         splice(@$lref, $secline+1, 0, $line);
31                         }
32                 else {
33                         push(@$lref, "[dhcpd]", $line);
34                         }
35                 &flush_file_lines();
36                 }
37         else {
38                 # Write to sysconfig file
39                 &read_env_file("/etc/sysconfig/dhcpd", \%dhcpd);
40                 $dhcpd{'INTERFACES'} = $iface;
41                 &write_env_file("/etc/sysconfig/dhcpd", \%dhcpd);
42                 }
43         }
44 elsif ($config{'interfaces_type'} eq 'redhat') {
45         # Write to the Redhat environment file
46         &read_env_file("/etc/sysconfig/dhcpd", \%dhcpd);
47         $dhcpd{'DHCPDARGS'} = $iface;
48         &write_env_file("/etc/sysconfig/dhcpd", \%dhcpd);
49         }
50 elsif ($config{'interfaces_type'} eq 'suse') {
51         # Write to the SuSE/United environment file
52         &read_env_file("/etc/sysconfig/dhcpd", \%dhcpd);
53         $dhcpd{'DHCPD_INTERFACE'} = $iface;
54         &write_env_file("/etc/sysconfig/dhcpd", \%dhcpd);
55         }
56 elsif ($config{'interfaces_type'} eq 'debian') {
57         if (-r "/etc/default/isc-dhcp-server") {
58                 # Write to Debian 6.0 environment file
59                 &read_env_file("/etc/default/isc-dhcp-server", \%dhcpd);
60                 $dhcpd{'INTERFACES'} = $iface;
61                 &write_env_file("/etc/default/isc-dhcp-server", \%dhcpd);
62                 }
63         elsif (-r "/etc/default/dhcp") {
64                 # Write to Debian environment file
65                 &read_env_file("/etc/default/dhcp", \%dhcpd);
66                 $dhcpd{'INTERFACES'} = $iface;
67                 &write_env_file("/etc/default/dhcp", \%dhcpd);
68                 }
69         elsif (-r "/etc/default/dhcp3-server") {
70                 # Write to Debian DHCPd 3 environment file
71                 &read_env_file("/etc/default/dhcp3-server", \%dhcpd);
72                 $dhcpd{'INTERFACES'} = $iface;
73                 &write_env_file("/etc/default/dhcp3-server", \%dhcpd);
74                 }
75         else {
76                 # Write to the debian init script
77                 $lref = &read_file_lines("/etc/init.d/dhcp");
78                 for($i=0; $i<@$lref; $i++) {
79                         if ($lref->[$i] =~ /INTERFACES\s*=\s*'([^']+)'/ ||
80                             $lref->[$i] =~ /INTERFACES\s*=\s*"([^"]+)"/ ||
81                             $lref->[$i] =~ /INTERFACES\s*=\s*(\S+)/) {
82                                 $lref->[$i] = "INTERFACES=\"$iface\"";
83                                 }
84                         }
85                 &flush_file_lines("/etc/init.d/dhcp");
86                 }
87         }
88 elsif ($config{'interfaces_type'} eq 'caldera') {
89         # Interfaces are set in the Caldera daemons directory file
90         &read_env_file("/etc/sysconfig/daemons/dhcpd", \%dhcpd);
91         @other = grep { !/^(lo|[a-z]+\d+)$/ } split(/\s+/, $dhcpd{'OPTIONS'});
92         $dhcpd{'OPTIONS'} = join(" ", @other).($iface ? " $iface" : "");
93         &write_env_file("/etc/sysconfig/daemons/dhcpd", \%dhcpd);
94         }
95 elsif ($config{'interfaces_type'} eq 'gentoo') {
96         # Interfaces are set in a file on Gentoo
97         &read_env_file("/etc/conf.d/dhcp", \%dhcp);
98         $dhcp{'IFACE'} = $iface;
99         &write_env_file("/etc/conf.d/dhcp", \%dhcp);
100         }
101
102 &redirect("");
103