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