radius attributes & default/fixed values should work again now
[freeside.git] / httemplate / edit / svc_acct.cgi
1 <%
2 #<!-- $Id: svc_acct.cgi,v 1.7 2001-09-11 23:44:01 ivan Exp $ -->
3
4 use strict;
5 use vars qw( $conf $cgi @shells $action $svcnum $svc_acct $pkgnum $svcpart
6              $part_svc $svc $otaker $username $password $ulen $ulen2 $p1
7              $popnum $domsvc $uid $gid $finger $dir $shell $quota $slipip
8              @svc_domain );
9 use CGI;
10 use CGI::Carp qw(fatalsToBrowser);
11 use FS::UID qw(cgisuidsetup getotaker);
12 use FS::CGI qw(header popurl);
13 use FS::Record qw(qsearch qsearchs fields);
14 use FS::svc_acct;
15 use FS::Conf;
16 use FS::raddb;
17
18 $cgi = new CGI;
19 &cgisuidsetup($cgi);
20
21 $conf = new FS::Conf;
22 @shells = $conf->config('shells');
23
24 if ( $cgi->param('error') ) {
25   $svc_acct = new FS::svc_acct ( {
26     map { $_, scalar($cgi->param($_)) } fields('svc_acct')
27   } );
28   $svcnum = $svc_acct->svcnum;
29   $pkgnum = $cgi->param('pkgnum');
30   $svcpart = $cgi->param('svcpart');
31   $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart});
32   die "No part_svc entry!" unless $part_svc;
33 } else {
34   my($query) = $cgi->keywords;
35   if ( $query =~ /^(\d+)$/ ) { #editing
36     $svcnum=$1;
37     $svc_acct=qsearchs('svc_acct',{'svcnum'=>$svcnum})
38       or die "Unknown (svc_acct) svcnum!";
39
40     my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum})
41       or die "Unknown (cust_svc) svcnum!";
42
43     $pkgnum=$cust_svc->pkgnum;
44     $svcpart=$cust_svc->svcpart;
45
46     $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart});
47     die "No part_svc entry!" unless $part_svc;
48
49   } else { #adding
50
51     $svc_acct = new FS::svc_acct({}); 
52
53     foreach $_ (split(/-/,$query)) {
54       $pkgnum=$1 if /^pkgnum(\d+)$/;
55       $svcpart=$1 if /^svcpart(\d+)$/;
56     }
57     $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart});
58     die "No part_svc entry!" unless $part_svc;
59
60     $svcnum='';
61
62     #set gecos
63     my($cust_pkg)=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum});
64     if ($cust_pkg) {
65       my($cust_main)=qsearchs('cust_main',{'custnum'=> $cust_pkg->custnum } );
66       $svc_acct->setfield('finger',
67         $cust_main->getfield('first') . " " . $cust_main->getfield('last')
68       ) ;
69     }
70
71     #set fixed and default fields from part_svc
72     foreach my $part_svc_column (
73       grep { $_->columnflag } $part_svc->all_part_svc_column
74     ) {
75       $svc_acct->setfield( $part_svc_column->columnname,
76                            $part_svc_column->columnvalue,
77                          );
78     }
79
80   }
81 }
82 $action = $svcnum ? 'Edit' : 'Add';
83
84 $svc = $part_svc->getfield('svc');
85
86 $otaker = getotaker;
87
88 $username = $svc_acct->username;
89 if ( $svc_acct->_password ) {
90   if ( $conf->exists('showpasswords') ) {
91     $password = $svc_acct->_password;
92   } else {
93     $password = "*HIDDEN*";
94   }
95 } else {
96   $password = '';
97 }
98
99 $ulen = $svc_acct->dbdef_table->column('username')->length;
100 $ulen2 = $ulen+2;
101
102 $p1 = popurl(1);
103 print $cgi->header( '-expires' => 'now' ), header("$action $svc account");
104
105 print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $cgi->param('error'),
106       "</FONT>"
107   if $cgi->param('error');
108
109 print <<END;
110     <FORM ACTION="${p1}process/svc_acct.cgi" METHOD=POST>
111       <INPUT TYPE="hidden" NAME="svcnum" VALUE="$svcnum">
112       <INPUT TYPE="hidden" NAME="pkgnum" VALUE="$pkgnum">
113       <INPUT TYPE="hidden" NAME="svcpart" VALUE="$svcpart">
114 Username: 
115 <INPUT TYPE="text" NAME="username" VALUE="$username" SIZE=$ulen2 MAXLENGTH=$ulen>
116 <BR>Password: 
117 <INPUT TYPE="text" NAME="_password" VALUE="$password" SIZE=10 MAXLENGTH=8> 
118 (blank to generate)
119 END
120
121 #domain
122 $domsvc = $svc_acct->domsvc || 0;
123 if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'F' ) {
124   print qq!<INPUT TYPE="hidden" NAME="domsvc" VALUE="$domsvc">!;
125 } else { 
126   my @svc_domain = ();
127   if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'D' ) {
128     my $svc_domain = qsearchs('svc_domain', {
129       'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue,
130     } );
131     if ( $svc_domain ) {
132       push @svc_domain, $svc_domain;
133     } else {
134       warn "unknown svc_domain.svcnum for part_svc_column domsvc: ".
135            $part_svc->part_svc_column('domsvc')->columnvalue;
136     }
137   }
138   my $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $pkgnum } );
139   if ($cust_pkg) {
140     my @cust_svc =
141       map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
142           qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum } );
143     foreach my $cust_svc ( @cust_svc ) {
144       my $svc_domain =
145         qsearchs('svc_domain', { 'svcnum' => $cust_svc->svcnum } );
146       push @svc_domain, $svc_domain if $svc_domain;
147     }
148   } else {
149     @svc_domain = qsearch('svc_domain', {} );
150   }
151   print qq!<BR>Domain: <SELECT NAME="domsvc" SIZE=1>\n!;
152   foreach my $svc_domain ( sort { $a->domain cmp $b->domain } @svc_domain ) {
153     print qq!<OPTION VALUE="!, $svc_domain->svcnum, qq!"!,
154           $svc_domain->svcnum == $domsvc ? ' SELECTED' : '',
155           ">", $svc_domain->domain, "\n"
156       ;
157   }
158   print "</SELECT>";
159 }
160
161 #pop
162 $popnum = $svc_acct->popnum || 0;
163 if ( $part_svc->part_svc_column('popnum')->columnflag eq "F" ) {
164   print qq!<INPUT TYPE="hidden" NAME="popnum" VALUE="$popnum">!;
165 } else { 
166   print qq!<BR>POP: <SELECT NAME="popnum" SIZE=1><OPTION>\n!;
167   my($svc_acct_pop);
168   foreach $svc_acct_pop ( qsearch ('svc_acct_pop',{} ) ) {
169   print "<OPTION", $svc_acct_pop->popnum == $popnum ? ' SELECTED' : '', ">", 
170         $svc_acct_pop->popnum, ": ", 
171         $svc_acct_pop->city, ", ",
172         $svc_acct_pop->state,
173         " (", $svc_acct_pop->ac, ")/",
174         $svc_acct_pop->exch, "\n"
175       ;
176   }
177   print "</SELECT>";
178 }
179
180 ($uid,$gid,$finger,$dir)=(
181   $svc_acct->uid,
182   $svc_acct->gid,
183   $svc_acct->finger,
184   $svc_acct->dir,
185 );
186
187 print <<END;
188 <INPUT TYPE="hidden" NAME="uid" VALUE="$uid">
189 <INPUT TYPE="hidden" NAME="gid" VALUE="$gid">
190 <BR>GECOS: <INPUT TYPE="text" NAME="finger" VALUE="$finger">
191 <INPUT TYPE="hidden" NAME="dir" VALUE="$dir">
192 END
193
194 $shell = $svc_acct->shell;
195 if ( $part_svc->part_svc_column('shell')->columnflag eq "F" ) {
196   print qq!<INPUT TYPE="hidden" NAME="shell" VALUE="$shell">!;
197 } else {
198   print qq!<BR>Shell: <SELECT NAME="shell" SIZE=1>!;
199   my($etc_shell);
200   foreach $etc_shell (@shells) {
201     print "<OPTION", $etc_shell eq $shell ? ' SELECTED' : '', ">",
202           $etc_shell, "\n";
203   }
204   print "</SELECT>";
205 }
206
207 ($quota,$slipip)=(
208   $svc_acct->quota,
209   $svc_acct->slipip,
210 );
211
212 print qq!<INPUT TYPE="hidden" NAME="quota" VALUE="$quota">!;
213
214 if ( $part_svc->part_svc_column('slipip')->columnflag eq "F" ) {
215   print qq!<INPUT TYPE="hidden" NAME="slipip" VALUE="$slipip">!;
216 } else {
217   print qq!<BR>IP: <INPUT TYPE="text" NAME="slipip" VALUE="$slipip">!;
218 }
219
220 foreach my $r ( grep { /^r(adius|[cr])_/ } fields('svc_acct') ) {
221   $r =~ /^^r(adius|[cr])_(.+)$/ or next; #?
222   my $a = $2;
223   if ( $part_svc->part_svc_column($r)->columnflag eq 'F' ) {
224     print qq!<INPUT TYPE="hidden" NAME="$r" VALUE="!.
225           $svc_acct->getfield($r). '">';
226   } else {
227     print qq!<BR>$FS::raddb::attrib{$a}: <INPUT TYPE="text" NAME="$r" VALUE="!.
228           $svc_acct->getfield($r). '">';
229   }
230 }
231
232 #submit
233 print qq!<P><INPUT TYPE="submit" VALUE="Submit">!; 
234
235 print <<END;
236     </FORM>
237   </BODY>
238 </HTML>
239 END
240
241 %>