Handle hostnames with upper-case letters
[webmin.git] / ldap-client / switch-lib.pl
1 # Functions for parsing nsswitch.conf
2
3 $nsswitch_config_file = $config{'nsswitch_conf'} || "/etc/nsswitch.conf";
4
5 # get_nsswitch_config()
6 # Returns an array ref of information from nsswitch.conf
7 sub get_nsswitch_config
8 {
9 if (!scalar(@get_nsswitch_cache)) {
10         @get_nsswitch_cache = ( );
11         local $lnum = 0;
12         open(CONF, $nsswitch_config_file);
13         while(<CONF>) {
14                 s/\r|\n//g;
15                 s/#.*$//;
16                 if (/^\s*(\S+)\s*:\s*(.*)/) {
17                         # Found a switch config file
18                         local $switch = { 'name' => $1,
19                                           'line' => $lnum };
20                         local $servs = $2;
21                         local @srcs = ( );
22                         while($servs =~ /\S/) {
23                                 if ($servs =~ /^\s*\[([^\]]*)\](.*)/) {
24                                         # Actions for some source
25                                         $servs = $2;
26                                         foreach $av (split(/\s+/, $1)) {
27                                                 local ($a, $v) = split(/=/,$av);
28                                                 $srcs[$#srcs]->{lc($a)} =lc($v);
29                                                 }
30                                         }
31                                 elsif ($servs =~ /^\s*(\S+)(.*)/) {
32                                         # A source
33                                         push(@srcs, { 'src' => $1 });
34                                         $servs = $2;
35                                         }
36                                 }
37                         $switch->{'srcs'} = \@srcs;
38                         push(@get_nsswitch_cache, $switch);
39                         }
40                 $lnum++;
41                 }
42         close(CONF);
43         }
44 return \@get_nsswitch_cache;
45 }
46
47 # save_nsswitch_config(&switch)
48 # Update one service
49 sub save_nsswitch_config
50 {
51 local ($switch) = @_;
52 local $lref = &read_file_lines($nsswitch_config_file);
53 local $line = "$switch->{'name'}:";
54 foreach my $s (@{$switch->{'srcs'}}) {
55         $line .= " ".$s->{'src'};
56         local @acts;
57         foreach my $st (keys %$s) {
58                 if ($st ne "src") {
59                         push(@acts, uc($st)."=".$s->{$st});
60                         }
61                 }
62         if (@acts) {
63                 $line .= " [".join(" ", @acts)."]";
64                 }
65         }
66 $lref->[$switch->{'line'}] = $line;
67 &flush_file_lines($nsswitch_config_file);
68 }
69
70 # list_switch_sources()
71 # Returns a list of valid nsswitch.conf sources for this OS, and a map from
72 # sources to allowed services
73 sub list_switch_sources
74 {
75 if ($gconfig{'os_type'} =~ /-linux$/) {
76         # All Linux variants
77         return ( [ 'files', 'nisplus', 'nis', 'compat', 'dns', 'db',
78                    'hesiod', 'ldap' ],
79                  { 'dns' => [ 'hosts' ],
80                    'compat' => [ 'passwd', 'shadow', 'group' ] } );
81         }
82 elsif ($gconfig{'os_type'} eq 'solaris' && $gconfig{'os_version'} < 8) {
83         # Older Solaris
84         return ( [ 'files', 'nis', 'nisplus', 'compat', 'dns' ],
85                  { 'dns' => [ 'hosts' ],
86                    'compat' => [ 'passwd', 'group' ] } );
87         }
88 elsif ($gconfig{'os_type'} eq 'solaris' && $gconfig{'os_version'} >= 8) {
89         # Newer Solaris
90         return ( [ 'files', 'nis', 'nisplus', 'compat', 'dns', 'ldap',
91                    'user', 'xfn' ],
92                  { 'dns' => [ 'hosts' ],
93                    'compat' => [ 'passwd', 'group' ],
94                    'user' => [ 'printers' ],
95                    'xfn' => [ 'printers' ] } );
96         }
97 elsif ($gconfig{'os_type'} eq 'aix') {
98         # IBM AIX
99         return ( [ 'files', 'nis', 'nisplus', 'compat', 'dns', 'ldap',
100                    'user', 'xfn' ],
101                  { 'dns' => [ 'hosts' ],
102                    'compat' => [ 'passwd', 'group' ],
103                    'user' => [ 'printers' ],
104                    'xfn' => [ 'printers' ] } );
105         }
106 elsif ($gconfig{'os_type'} eq 'unixware') {
107         # All Linux variants
108         return ( [ 'files', 'dns', 'nis', 'nisplus' ],
109                  { 'dns' => [ 'hosts' ] } );
110         }
111 else {
112         # Punt!
113         return ( [ 'files', 'dns', 'nis', 'nisplus' ] );
114         }
115 }
116
117 sub list_switch_statuses
118 {
119 return ( 'success', 'notfound', 'unavail', 'tryagain' );
120 }
121
122 sub list_switch_actions
123 {
124 return ( 'return', 'continue' );
125 }
126
127 1;
128