Import of revision 19971210+
[mspang/plceo1.git] / quota.pl
1 #
2 # Date                        Modification
3 # ----          ----                ------------
4 # 94/11/20      Alex Brodsky        Split off from main ceo file
5 # 95/11/28      Nikita Borisov      Added W96 quota special
6 # 96/01/18      Nikita Borisov      Reworked how people buying 12 megs are
7 #                                   charged
8 # 96/03/19      Nikita Borisov      Removed W96 quota special
9 # sometime later   ""  ""               Put the W96 quota special back
10 # 96/10/23              Nikita Borisov          Use dbmtie instead of fakedbm
11 #
12
13
14 sub quotamenu
15 {
16     local($menu);
17     local($useCAP) = $CAPTERM;
18     if ($NEXTTERMQUOTA)
19     {
20         $useCAP = $NEXTTERM;
21         $useCAP =~ tr/a-z/A-Z/;
22     }
23     $menu = <<EOM;
24
25 Choose an option:
26   (B)uy quota for $useCAP term
27   (V)iew quota list
28   (M)ain menu
29
30 (B,V,M): 
31 EOM
32
33     @opts = ('bdobuyquota','vdoquotalist','mmainmenu');
34     $choice = &domenu($menu, @opts);
35     return $choice;
36 }
37
38 sub dobuyquota
39 {
40     local($useQLOG) = $QUOTALOG;
41     if ($NEXTTERMQUOTA)
42     {
43         $useQLOG = $NEXTQUOTALOG;
44     }
45     print "\nEnter your userid: ";
46     local($userid,$cardnum,$mustadd);
47     local ($thename, $theidnum, $theuserid);
48     chop($userid = <STDIN>);
49     $userid =~ s/[^\w-]//g;
50         $userid =~ s/^(.{8}).*/$1/;
51     if ($userid eq "")
52     {
53         print "\n${beep}No userid supplied - aborting.\n\n";
54         return;
55     }
56     $uid = (getpwnam($userid))[2];
57     $uid = (&getmfcfpwnam($userid))[2] unless $uid > 0;
58         unless ($uid > 0)
59         {
60                 ## Try to look up in the accounts to be created file
61                 open (ACCTODO, $USERTODO);
62                 while (<ACCTODO>)
63                 {
64                         @todoF = split(' ');
65                         $uid = 60001 if $todoF[1] eq $userid;
66                 }
67                 close(ACCTODO);
68         }
69     unless ($uid > 0)
70     {
71         print "\n${beep}That userid does not exist - aborting.\n\n";
72         return;
73     }
74
75     ## Look up the card number for that userid
76     dbmopen(QUOT,$QUOTADB,0600) || do
77     {
78         print "\n${beep}Unable to open quota database: $!\n";
79         return;
80     };
81     if (defined $QUOT{$userid})
82     {
83         $cardnum = $QUOT{$userid};
84         ($thename, $theidnum, $theuserid) = split(/;/,$QUOT{$cardnum});
85                 $theuserid =~ s/^(.{8}).*$/$1/;
86         warn "Card number $cardnum is for userid $theuserid\n" unless
87                 $theuserid eq $userid;
88         dbmclose(QUOT);
89         $mustadd = 0;
90     }
91     else
92     {
93         $cardnum=0;
94         foreach $i (sort {$a<=>$b} grep(/^\d+$/, keys %QUOT))
95         {
96             last if $i != $cardnum;
97             $cardnum++;
98         }
99         dbmclose(QUOT);
100         $thename = "";
101         if (eval { dbmtie($MEMDB,\%MEM) })
102         {
103             @poss = grep(/$userid/,values %MEM);
104             foreach $p (@poss)
105             {
106                 if ($userid eq substr((split(/;/,$p))[4],0,8))
107                 {
108                     $thename = (split(/;/,$p))[0];
109                     $theidnum = (split(/;/,$p))[1];
110                 }
111             }
112             dbmuntie(\%MEM);
113         }
114         $mustadd = 1;
115         if ($thename eq "")
116         {
117             &Editscreen(<<EOS);
118 Please enter the following information.
119
120 Name      : 
121 Student ID: 
122 EOS
123             &VI;
124             ($thename, $theidnum) = split("\n",&Filterscreen);
125             if ($thename eq "")
126             {
127                 print "\n${beep}No name supplied - aborting\n\n";
128                 return;
129             }
130         }
131     }
132
133     print "\nInfo for card #$cardnum:\n\n";
134     print "Name      : $thename\n";
135     print "Student ID: $theidnum\n";
136     print "Userid    : $userid\n\n";
137
138     # Find how much quota they have, and how much is left
139     open (QLOG, $useQLOG) || do
140     {
141         print "\n${beep}Unable to open quota log file: $!\n";
142         return;
143     };
144     $qhave = 0; $qleft = 0;
145     while(<QLOG>)
146     {
147         next if /^\s*$/;
148         next if /^\s*#/;
149         warn "Bad format in quota log:\n$_" unless /^[^;]*;([^;]*);\d*;([-\d]*);([-\d]*)$/;
150         $qleft = $3;
151         $qhave = $2 if $userid eq substr($1,0,8);
152     }
153     close(QLOG);
154     print "User $userid currently has $qhave MB of space on the CSC disk.\n";
155     print "There are $qleft MB remaining.\n";
156     while(1)
157     {
158         print "\nHow much more to buy (in MB)? ";
159         $qadd = <STDIN>;
160         $qadd =~ s/\..*//;
161         $qadd =~ s/\D//g;
162         if ($qadd <= 0)
163         {
164             print "\n${beep}No quota requested - aborting.\n";
165             return;
166         }
167         if ($qadd > $qleft)
168         {
169             print "\n${beep}Only $qleft MB are available.\n";
170             next;
171         }
172         last;
173     }
174
175     ## Compute cost
176     $cost = $COSTPERMEG * $qadd;
177 ## W96 and beyond 10 meg rule 
178 ## S97 and beyond 20 meg rule 
179         do {
180           $cost = $COSTPERNUMMEG * int($qadd / $MEGNUMSPECIAL);
181           $cost += $COSTPERMEG * ($qadd % $MEGNUMSPECIAL);
182           open(QLOG2, ">>$QUOTASPCLLOG") && do {
183                 print QLOG2 "$date;$userid;$qadd;$cost\n";
184                 close(QLOG2);
185           }
186     } if ($qadd >= $MEGNUMSPECIAL);
187     $cost += $ADMINCHARGE if $qadd < $NOADMINIFOVER || $NOADMINIFOVER == 0;
188
189     chop($date = `date`);
190     $tq = $qadd + $qhave;
191
192     open(QLOG, ">>$useQLOG") || do
193     {
194         print "\n${beep}Unable to write quota log: $!\n";
195         return;
196     };
197     print QLOG "$date;$userid;$qadd;$tq;", $qleft - $qadd, "\n";
198     close(QLOG);
199
200     if ($mustadd)
201     {
202         dbmopen(QDB,$QUOTADB,0644) || do
203         {
204             print "\n${beep}Unable to open quota database.\n";
205             return;
206         };
207         $QDB{$cardnum}="$thename;$theidnum;$userid";
208         $QDB{$userid}=$cardnum;
209         dbmclose(QDB);
210     }
211
212     &Backup($useQLOG);
213
214     $pcost = sprintf("%.2f", $cost);
215     &UpdateCashlog($pcost, "$qadd MB quota for $userid");
216
217     open (TODO, ">>$QUOTATODO");
218     print TODO "$userid\t$tq\n";
219     close(TODO);
220         chmod(0660, $QUOTATODO);
221
222 #rcp .mostrecent csc_disk@descartes:.mostrecent
223 #rsh descartes -l csc_disk 'cat .mostrecent >> records/todo'
224
225     &Gopher_Quota;
226 }
227
228
229 sub doquotalist
230 {
231     local($useQUOTALOG) = $QUOTALOG;
232     if ($NEXTTERMQUOTA)
233     {
234         $useQUOTALOG = $NEXTQUOTALOG;
235     }
236     open (QLOG, $useQUOTALOG) || do
237     {
238         print "\n${beep}Unable to open quota log file: $!\n";
239         return;
240     };
241     dbmopen(QUOTA,$QUOTADB,0600) || do
242     {
243         print "\n${beep}Unable to open quota database: $!\n";
244         close(QLOG);
245         return;
246     };
247     %Quota = ();
248     while(<QLOG>)
249     {
250         next if (/^\s*$/ || /^\s*#/);
251         ($qdate, $quid, $qamt, $qtot, $qleft) = split(/;/);
252         next if $quid eq "csc\@math";
253         $Quota{$QUOTA{$quid}} = $qtot;
254     }
255     close(QLOG);
256     $qleft =~ s/\D//g;
257     open (SCRQUOTA, ">$editfile") || do
258     {
259         print "\n${beep}Unable to open output file: $!\n";
260         return;
261     };
262     select(SCRQUOTA);
263     $-=0;
264     $= = $ROWS - 1;
265     ##$_ = `stty size`; ($=) = /^(\d+)/; $= -= 2;
266     foreach $qnum (sort {$a<=>$b} keys %Quota)
267     {
268         ($qname, $qsid, $quid) = split(/;/,$QUOTA{$qnum});
269         $qqta = $Quota{$qnum};
270         write;
271     }
272     dbmclose(QUOTA);
273     print "\nQuota remaining: $qleft MB\n";
274     select(STDOUT);
275     close(SCRQUOTA);
276     &MORE;
277 }
278
279 1;