Handle hostnames with upper-case letters
[webmin.git] / vgetty / vgetty-lib.pl
1 # vgetty-lib.pl
2 # Common functions for editing the vgetty config files
3 # XXX options under ring_type 
4 # XXX DTMF command shells http://vocp.sourceforge.net/
5 # XXX DTMF terminals http://telephonectld.sourceforge.net/
6
7 BEGIN { push(@INC, ".."); };
8 use WebminCore;
9 &init_config();
10
11 # vgetty_inittabs()
12 # Returns a list of inittab entries for mgetty, with options parsed
13 sub vgetty_inittabs
14 {
15 local @rv;
16 foreach $i (&inittab::parse_inittab()) {
17         if ($i->{'process'} =~ /^(\S*vgetty)\s*(.*)\s+((\/.*)?tty\S+)(\s+(\S+))?$/) {
18                 $i->{'vgetty'} = $1;
19                 $i->{'args'} = $2;
20                 $i->{'tty'} = $3;
21                 $i->{'ttydefs'} = $6;
22                 push(@rv, $i);
23                 }
24         elsif ($i->{'process'} =~ /^(\S*mgetty)\s*(.*)\s+((\/.*)?tty\S+)/) {
25                 $i->{'mgetty'} = $1;
26                 $i->{'tty'} = $3;
27                 push(@rv, $i);
28                 }
29         }
30 return @rv;
31 }
32
33 # get_config()
34 # Parse the vgetty config file into a series of directives
35 sub get_config
36 {
37 local @rv;
38 local $lnum = 0;
39 open(CONFIG, $config{'vgetty_config'});
40 while(<CONFIG>) {
41         s/\r|\n//g;
42         s/#.*$//;
43         local @v;
44         while(/^\s*"([^"]*)"(.*)/ ||
45               /^\s*'([^']*)'(.*)/ ||
46               /^\s*(\S+)(.*)/) {
47                 push(@v, $1);
48                 $_ = $2;
49                 }
50         if (@v) {
51                 push(@rv, { 'line' => $lnum,
52                             'index' => scalar(@rv),
53                             'name' => shift(@v),
54                             'values' => \@v });
55                 }
56         $lnum++;
57         }
58 close(CONFIG);
59 return @rv;
60 }
61
62 # find(name, &config)
63 # Finds one more more config entries with the given name
64 sub find
65 {
66 local ($c, @rv);
67 foreach $c (@{$_[1]}) {
68         push(@rv, $c) if (lc($c->{'name'}) eq lc($_[0]));
69         }
70 return wantarray ? @rv : $rv[0];
71 }
72
73 # find_value(name, &config)
74 sub find_value
75 {
76 local @v = &find($_[0], $_[1]);
77 return undef if (!@v);
78 return wantarray ? @{$v[0]->{'values'}} : $v[0]->{'values'}->[0];
79 }
80
81 # tty_opt_file(base, tty)
82 sub tty_opt_file
83 {
84 local $tf = $_[1];
85 $tf =~ s/^\/dev\///;
86 $tf =~ s/\//\./g;
87 $tf = "$_[0].$tf";
88 return $tf;
89 }
90
91 # answer_mode_input(value, name)
92 sub answer_mode_input
93 {
94 local @modes = ( '', 'voice', 'fax', 'data' );
95 local @am = split(/:/, $_[0]);
96 local ($i, $rv);
97 for($i=0; $i<3; $i++) {
98         $rv .= "<select name=$_[1]_$i>\n";
99         foreach $m (@modes) {
100                 $rv .= sprintf "<option value='%s' %s>%s\n",
101                     $m, $am[$i] eq $m ? "selected" : "", $text{"vgetty_ans_$m"};
102                 }
103         $rv .= "</select>&nbsp;";
104         }
105 return $rv;
106 }
107
108 # parse_answer_mode(name)
109 sub parse_answer_mode
110 {
111 local (@rv, $i, $m);
112 for($i=0; defined($m = $in{"$_[0]_$i"}); $i++) {
113         push(@rv, $m) if ($m);
114         }
115 return join(":", @rv);
116 }
117
118 # receive_dir(&config)
119 sub receive_dir
120 {
121 local $vdir = &find_value("voice_dir", \@conf);
122 local $rdir = &find_value("receive_dir", \@conf);
123 return $rdir =~ /^\// ? $rdir : "$vdir/$rdir";
124 }
125
126 # messages_dir(&config)
127 sub messages_dir
128 {
129 local $vdir = &find_value("voice_dir", \@conf);
130 local $rdir = &find_value("message_dir", \@conf);
131 return $rdir =~ /^\// ? $rdir : "$vdir/$rdir";
132 }
133
134 # messages_index(&config)
135 sub messages_index
136 {
137 local $dir = &messages_dir($_[0]);
138 local $ifile = &find_value("message_list", \@conf);
139 return "$dir/$ifile";
140 }
141
142 # rmd_file_info(file)
143 sub rmd_file_info
144 {
145 local $out = `rmdfile '$_[0]' 2>&1`;
146 return undef if ($?);
147 local @st = stat($_[0]);
148 $_[0] =~ /\/([^\/]+)$/;
149 local $rv = { 'file' => "$1",
150               'path' => $_[0],
151               'size' => $st[7],
152               'date' => $st[9],
153               'speed' => $out =~ /speed:\s+(\d+)/i ? "$1" : undef,
154               'type' => $out =~ /type\s+is:\s+"([^"]+)"/i ? "$1" : undef,
155               'bits' => $out =~ /sample:\s+(\d+)/i ? "$1" : undef
156             };
157 return $rv;
158 }
159
160 # list_rmd_formats()
161 sub list_rmd_formats
162 {
163 local @rv;
164 open(RMD, "pvftormd -L 2>&1 |");
165 while(<RMD>) {
166         if (/^\s+\-\s+(\S+)\s+([0-9, ]+)\s+(.*)/) {
167                 local $code = $1;
168                 local $bits = $2;
169                 local $desc = $3;
170                 $bits =~ s/\s//g;
171                 foreach $b (split(/,/, $bits)) {
172                         push(@rv, { 'code' => $code,
173                                     'bits' => $b,
174                                     'desc' => &text('pvfdesc',
175                                                     "$code ($desc)", $b),
176                                     'index' => scalar(@rv) });
177                         }
178                 }
179         }
180 close(RMD);
181 return @rv;
182 }
183
184 # save_directive(&config, name, value)
185 sub save_directive
186 {
187 local $lref = &read_file_lines($config{'vgetty_config'});
188 local $old = &find($_[1], $_[0]);
189 if ($old) {
190         $lref->[$old->{'line'}] = "$_[1] $_[2]";
191         }
192 else {
193         push(@$lref, "$_[1] $_[2]");
194         }
195 }
196
197 # apply_configuration()
198 # Apply the vgetty serial port configuration. Returns undef on success, or an
199 # error message on failure
200 sub apply_configuration
201 {
202 local $out = &backquote_logged("telinit q 2>&1 </dev/null");
203 return "<tt>$out</tt>" if ($?);
204 &system_logged("killall vgetty");
205 return undef;
206 }
207
208 1;
209