don't generate invoices for COMP customers
[freeside.git] / sql-ledger / setup.pl
1 #!/usr/bin/perl
2 #
3 ######################################################################
4 # SQL-Ledger, Accounting Software Installer
5 # Copyright (c) 2002, Dieter Simader
6 #
7 #   Email: dsimader@sql-ledger.org
8 #     Web: http://www.sql-ledger.org
9 #
10 #######################################################################
11
12 $| = 1;
13
14 if ($ENV{HTTP_USER_AGENT}) {
15   print "
16 This does not work yet!
17 use $0 from the command line";
18   exit;
19 }
20
21 $lynx = `lynx -version`;      # if LWP is not installed use lynx
22 $gzip = `gzip -V 2>&1`;            # gz decompression utility
23 $tar = `tar --version 2>&1`;       # tar archiver
24 $latex = `latex -version`;
25
26 @source = ( "http://unc.dl.sourceforge.net/sourceforge/sql-ledger",
27             "http://www.sql-ledger.org/source",
28             "http://abacus.sql-ledger.org/source" );
29
30 $userspath = "users";         # default for new installation
31
32 eval { require "sql-ledger.conf"; };
33
34 $filename = shift;
35
36 # is LWP installed
37 eval { require LWP::Simple; };
38 $lwp = !($@);
39
40 unless ($lwp || $lynx || $filename) {
41   die "You must have either lynx or LWP installed
42 or specify a filename.
43 perl $0 filename\n";
44 }
45
46 if ($filename) {
47   # extract version
48   die "Not a SQL-Ledger archive\n" if ($filename !~ /^sql-ledger/);
49   
50   $version = $filename;
51   $version =~ s/sql-ledger-(\d+\.\d+\.\d+).*$/$1/;
52
53   $newinstall = 1;
54 }
55   
56 if (!$filename && -f "VERSION") {
57   # get installed version from VERSION file
58   open(FH, "VERSION");
59   @a = <FH>;
60   close(FH);
61   $version = $a[0];
62   chomp $version;
63
64   $newinstall = !$version;
65 } else {
66   $newinstall = 1;
67 }
68
69
70 $webowner = $<;
71 $webgroup = $(;
72
73 if ($httpd = `find /etc /usr/local/etc -type f -name 'httpd.conf'`) {
74   chomp $httpd;
75   $webowner = `grep "^User " $httpd`;
76   $webgroup = `grep "^Group " $httpd`;
77   $serverroot = `grep "^ServerRoot " $httpd`;
78
79   chomp $webowner;
80   chomp $webgroup;
81   chomp $serverroot;
82   
83   ($null, $webowner) = split / /, $webowner;
84   ($null, $webgroup) = split / /, $webgroup;
85   ($null, $serverroot) = split / /, $serverroot;
86
87   $serverroot =~ s/"//g;
88   
89 }
90
91 system("tput clear");
92
93 if ($filename) {
94   $install = "\ninstall $version from (f)ile\n";
95 }
96
97 # check for latest version
98 &get_latest_version;
99
100 if (!$newinstall) {
101
102   $install .= "\n(r)einstall $version\n";
103   
104 }
105
106 if ($version && $latest_version) {
107   if (!$filename && $version ne $latest_version) {
108     if (substr($version, 0, rindex($version, ".")) eq substr($latest_version, 0, rindex($latest_version, "."))) {
109       $install .= "\n(u)pgrade to $latest_version\n";
110     }
111   }
112 }
113
114
115 $install .= "\n(i)nstall $latest_version (from Internet)\n" if $latest_version;
116
117 $install .= "\n(d)ownload $latest_version (no installation)" unless $filename;
118
119   print qq|
120
121
122                SQL-Ledger Accounting Software Installation
123
124
125
126 $install
127
128
129 Enter: |;
130
131 $a = <STDIN>;
132 chomp $a;
133
134 exit unless $a;
135 $a = lc $a;
136
137   if ($newinstall && ($a =~ /(i|r|f)/)) {
138
139     print qq|\nEnter httpd owner [$webowner] : |;
140     $web = <STDIN>;
141     chomp $web;
142     $webowner = $web if $web;
143
144     print qq|\nEnter httpd group [$webgroup] : |;
145     $web = <STDIN>;
146     chomp $web;
147     $webgroup = $web if $web;
148     
149   }
150
151 if ($a eq 'd') {
152   &download;
153 }
154 if ($a eq 'i') {
155   &install;
156 }
157 if ($a eq 'r') {
158   $latest_version = $version;
159   &install;
160 }
161 if ($a eq 'u') {
162   &upgrade;
163 }
164
165 if ($a eq 'f') {
166   &install;
167 }
168
169 exit;
170 # end main
171
172
173 sub download {
174
175   &get_source_code;
176
177 }
178
179
180 sub get_latest_version {
181   
182   print "Checking for latest version number .... ";
183
184   if ($filename) {
185     print "skipping, filename supplied\n";
186     return;
187   }
188
189   if ($lwp) {
190     foreach $source (@source) {
191       $host = $source;
192       $host =~ s/(\w\/).*/$1/g;
193       chop $host;
194       print "\nTrying $host ... ";
195
196       $latest_version = LWP::Simple::get("$source/latest_version");
197       
198       if ($latest_version) {
199         last;
200       } else {
201         print "not found";
202       }
203     }
204   } else {
205     if (!$lynx) {
206       print "\nYou must have either lynx or LWP installed";
207       exit 1;
208     }
209
210     foreach $source (@source) {
211       $host = $source;
212       $host =~ s/(\w\/).*/$1/g;
213       chop $host;
214       print "\nTrying $host ... ";
215       $ok = `lynx -dump -head $source/latest_version`;
216       if ($ok = ($ok =~ s/HTTP.*?200 OK//g)) {
217         $latest_version = `lynx -dump $source/latest_version`;
218         chomp $latest_version;
219         last;
220       } else {
221         print "not found";
222       }
223     }
224     die unless $ok;
225   }
226
227   chomp $latest_version;
228   if ($latest_version) {
229     print "ok\n";
230     1;
231   }
232
233 }
234
235
236 sub get_source_code {
237
238   $err = 0;
239  
240   if ($latest_version) {
241     # download it
242     $latest_version = "sql-ledger-${latest_version}.tar.gz";
243     
244     print "\nStatus\n";
245     print "Downloading $latest_version .... ";
246
247     foreach $source (@source) {
248       $host = $source;
249       $host =~ s/(\w\/).*/$1/g;
250       chop $host;
251       print "\nTrying $host .... ";
252     
253       if ($lwp) {
254         $err = LWP::Simple::getstore("$source/$latest_version", "$latest_version");
255         $err -= 200;
256       } else {
257         $ok = `lynx -dump -head $source/$latest_version`;
258         $err = !($ok =~ s/HTTP.*?200 OK//);
259
260         if (!$err) {
261           $err = system("lynx -dump $source/$latest_version > $latest_version");
262         }
263       }
264
265       last unless $err;
266
267     }
268     
269   } else {
270     $err = -1;
271   }
272   
273   if ($err) {
274     die "Cannot get $latest_version";
275   } else {
276     print "ok\n";
277   }
278
279   $latest_version;
280
281 }
282
283
284 sub install {
285
286   if ($filename) {
287     $latest_version = $filename;
288   } else {
289     $latest_version = &get_source_code;
290   }
291
292   &decompress;
293
294   if ($upgrade) {
295     print qq|
296
297 Don't forget to upgrade the datasets!
298
299 Load the admin panel in your web browser
300 |;
301   }
302
303   if ($newinstall) {
304     # if this is not root, check if user is part of $webgroup
305     if ($>) {
306       if ($permset = ($) =~ getgrnam $webgroup)) {
307         `chown -R :$webgroup *`;
308       }
309     } else {
310       `chown -R $webowner:$webgroup *`;
311     }
312     
313     chmod 0771, 'users', 'templates';
314
315     open(FH, "sql-ledger.conf.default");
316     @f = <FH>;
317     close(FH);
318     unless ($latex) {
319       grep { s/^\$latex.*/\$latex = 0;/ } @f;
320     }
321     open(FH, ">sql-ledger.conf");
322     print FH @f;
323     close(FH);
324
325     $alias = $absolutealias = $ENV{'PWD'};
326     $alias =~ s/.*\///g;
327     
328     $httpddir = `dirname $httpd`;
329     chomp $httpddir;
330     $filename = "sql-ledger-httpd.conf";
331
332     # do we have write permission?
333     if (!open(FH, ">>$httpddir/$filename")) {
334       open(FH, ">$filename");
335       $norw = 1;
336     }
337
338     $directives = qq|
339 Alias /$alias/ $absolutealias/
340 <Directory $absolutealias>
341   AllowOverride All
342   AddHandler cgi-script .pl
343   Options ExecCGI Includes FollowSymlinks
344   Order Allow,Deny
345   Allow from All
346 </Directory>
347
348 <Directory $absolutealias/users>
349   Order Deny,Allow
350   Deny from All
351 </Directory>
352   
353 |;
354
355     print FH $directives;
356     close(FH);
357     
358     print qq|
359 This is a new installation.
360
361 |;
362
363     if ($norw) {
364       print qq|
365 Webserver directives were written to $filename
366       
367 Copy $filename to $httpddir and add
368 |;
369
370       # strip serverroot off httpddir
371       $httpddir =~ s/$serverroot\///;
372
373       print qq|
374 Include $httpddir/$filename
375
376 to $httpd
377
378 Don't forget to restart your webserver!
379 |;
380
381       if (!$permset) {
382         print qq|
383 WARNING: permissions for templates and users directory
384 could not be set. Login as root and set permissions
385
386 # chown $webowner:$webgroup users templates
387 # chmod 771 users templates
388
389 |;
390       }
391
392     } else {
393       
394       if (!(`grep "^# SQL-Ledger" $httpd`)) {
395         # append Include directive
396         $httpddir =~ s/$serverroot\///;
397
398         open(FH, ">>$httpd");
399
400         print FH qq|
401
402 # SQL-Ledger
403 Include $httpddir/$filename
404 |;
405         close(FH);
406         
407         print qq|
408 Webserver directives were written to
409
410   $httpddir/$filename
411 |;
412       }
413     }
414
415     if (!$>) {
416       # send SIGHUP to httpd
417       $pid = `cat /var/run/httpd.pid`;
418       chomp $pid;
419       system("kill -s HUP $pid") if $pid;
420     }
421   }
422
423   unlink "sql-ledger.conf.default";
424
425   &cleanup;
426
427   while ($a !~ /(Y|N)/) {
428     print qq|\nDisplay README (Y/n) : |;
429     $a = <STDIN>;
430     chomp $a;
431     $a = ($a) ? uc $a : 'Y';
432     
433     if ($a eq 'Y') {
434       @args = ("more", "doc/README");
435       system(@args);
436     }
437   }
438   
439 }
440
441
442 sub decompress {
443   
444   die "Error: gzip not installed\n" unless ($gzip);
445   die "Error: tar not installed\n" unless ($tar);
446   
447   &create_lockfile;
448
449   # ungzip and extract source code
450   print "Decompressing $latest_version ... ";
451     
452   if (system("gzip -df $latest_version")) {
453     print "Error: Could not decompress $latest_version\n";
454     &remove_lockfile;
455     exit;
456   } else {
457     print "done\n";
458   }
459
460   # strip gz from latest_version
461   $latest_version =~ s/\.gz//;
462   
463   # now untar it
464   print "Unpacking $latest_version ... ";
465   if (system("tar -xf $latest_version")) {
466     print "Error: Could not unpack $latest_version\n";
467     &remove_lockfile;
468     exit;
469   } else {
470     # now we have a copy in sql-ledger
471     if (system("tar -cf $latest_version -C sql-ledger .")) {
472       print "Error: Could not create archive for $latest_version\n";
473       &remove_lockfile;
474       exit;
475     } else {
476       if (system("tar -xf $latest_version")) {
477         print "Error: Could not unpack $latest_version\n";
478         &remove_lockfile;
479         exit;
480       } else {
481         print "done\n";
482         print "cleaning up ... ";
483         `rm -rf sql-ledger`;
484         print "done\n";
485       }
486     }
487   }
488 }
489
490
491 sub create_lockfile {
492
493   if (-d "$userspath") {
494     open(FH, ">$userspath/nologin");
495     close(FH);
496     $upgrade = 1;
497   }
498   
499 }
500
501
502 sub cleanup {
503
504   unlink "$latest_version";
505   unlink "$userspath/members.default" if (-f "$userspath/members.default");
506
507   &remove_lockfile;
508   
509 }
510
511
512 sub remove_lockfile { unlink "$userspath/nologin" if (-f "$userspath/nologin") };
513
514
515 sub upgrade {
516
517   $latest_version = &get_patch;
518
519   &decompress;
520  
521   &cleanup;
522   
523   # if this is not root, check if user is part of $webgroup
524   if ($>) {
525     if ($permset = ($) =~ getgrnam $webgroup)) {
526       `chown -R :$webgroup *`;
527     }
528   } else {
529     `chown -R $webowner:$webgroup *`;
530   }
531   
532   chmod 0771, 'users', 'templates';
533
534
535   print qq|
536
537 Don't forget to upgrade your datasets and read
538 the upgrade file in the doc directory.
539
540 |;
541
542 }
543
544
545
546 sub get_patch {
547
548   $err = 0;
549  
550   if ($version) {
551     # download the patch
552     $patchfile = "patch-${latest_version}.tar.gz";
553     
554     print "Status\n";
555     print "Downloading $patchfile .... ";
556     
557     foreach $source (@source) {
558       $host = $source;
559       $host =~ s/(\w\/).*/$1/g;
560       chop $host;
561       print "\nTrying $host .... ";
562     
563       if ($lwp) {
564         $err = LWP::Simple::getstore("$source/$patchfile", "$patchfile");
565         $err -= 200;
566       } else {
567         $ok = `lynx -dump -head $source/$patchfile`;
568         $err = !($ok =~ /HTTP.*?200 OK/);
569         
570         if (!$err) {
571           $err = system("lynx -dump $source/$patchfile > $patchfile");
572         }
573       }
574
575       last unless $err;
576       
577     }
578     
579   } else {
580     $err = -1;
581   }
582   
583   if ($err) {
584     print "Cannot get $patchfile\n";
585     exit;
586   } else {
587     print "ok\n";
588   }
589
590   $patchfile;
591
592 }
593
594