summaryrefslogtreecommitdiff
path: root/setup.pl
blob: 2f8cb2076e3f3daa3ba97b1c50c9d448abd06106 (plain)
  1. #!/usr/bin/perl
  2. #
  3. ######################################################################
  4. # LedgerSMB Small Medium Business Accounting Software Installer
  5. # Copyright (c) 2002, Dieter Simader
  6. #
  7. # Web: http://sourceforge.net/projects/ledger-smb/
  8. #
  9. #######################################################################
  10. print "This script should not be used with LedgerSMB in this release.\n\n";
  11. exit;
  12. $| = 1;
  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. $lynx = `lynx -version`; # if LWP is not installed use lynx
  20. $gzip = `gzip -V 2>&1`; # gz decompression utility
  21. $tar = `tar --version 2>&1`; # tar archiver
  22. $latex = `latex -version`;
  23. %checkversion = ( www => 3, abacus => 4, pluto => 5, neptune => 8 );
  24. %source = (
  25. 1 => { url => "http://voxel.dl.sourceforge.net/sourceforge/sql-ledger", site => "New York, U.S.A", locale => us },
  26. 2 => { url => "http://easynews.dl.sourceforge.net/sourceforge/sql-ledger", site => "Arizona, U.S.A", locale => us },
  27. 3 => { url => "http://www.sql-ledger.com/source", site => "California, U.S.A", locale => us },
  28. 4 => { url => "http://abacus.sql-ledger.com/source", site => "Toronto, Canada", locale => ca },
  29. 5 => { url => "http://pluto.sql-ledger.com/source", site => "Edmonton, Canada", locale => ca },
  30. 6 => { url => "http://ufpr.dl.sourceforge.net/sourceforge/sql-ledger", site =>"Brazil", locale => br },
  31. 7 => { url => "http://surfnet.dl.sourceforge.net/sourceforge/sql-ledger", site => "The Netherlands", locale => nl },
  32. 8 => { url => "http://neptune.sql-ledger.com/source", site => "Ireland", locale => ie },
  33. 9 => { url => "http://kent.dl.sourceforge.net/sourceforge/sql-ledger", site => "U.K", locale => uk },
  34. 10 => { url => "http://ovh.dl.sourceforge.net/sourceforge/sql-ledger", site => "France", locale => fr },
  35. 11 => { url => "http://mesh.dl.sourceforge.net/sourceforge/sql-ledger", site => "Germany", locale => de },
  36. 12 => { url => "http://citkit.dl.sourceforge.net/sourceforge/sql-ledger", site => "Russia", locale => ru },
  37. 13 => { url => "http://optusnet.dl.sourceforge.net/sourceforge/sql-ledger", site => "Sydney, Australia", locale => au },
  38. 14 => { url => "http://nchc.dl.sourceforge.net/sourceforge/sql-ledger", site => "Taiwan", locale => tw },
  39. 15 => { url => "http://jaist.dl.sourceforge.net/sourceforge/sql-ledger", site => "Japan", locale => jp }
  40. );
  41. $userspath = "users"; # default for new installation
  42. eval { require "ledger-smb.conf"; };
  43. $filename = shift;
  44. chomp $filename;
  45. $newinstall = 1;
  46. # is LWP installed
  47. eval { require LWP::Simple; };
  48. $lwp = !($@);
  49. unless ($lwp || $lynx || $filename) {
  50. die "You must have either lynx or LWP installed or specify a filename.
  51. perl $0 <filename>\n";
  52. }
  53. if ($filename) {
  54. # extract version
  55. die "Not a LedgerSMB archive\n" if ($filename !~ /^sql-ledger/);
  56. $version = $filename;
  57. $version =~ s/sql-ledger-(\d+\.\d+\.\d+).*$/$1/;
  58. }
  59. if (-f "VERSION") {
  60. # get installed version from VERSION file
  61. open(FH, "VERSION");
  62. @a = <FH>;
  63. close(FH);
  64. $version = $a[0];
  65. chomp $version;
  66. $newinstall = !$version;
  67. if (! -f "ledger-smb.conf") {
  68. $newinstall = 1;
  69. }
  70. }
  71. $webowner = "nobody";
  72. $webgroup = "nogroup";
  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. chomp $webowner;
  78. chomp $webgroup;
  79. ($null, $webowner) = split / /, $webowner;
  80. ($null, $webgroup) = split / /, $webgroup;
  81. }
  82. if ($confd = `find /etc /usr/local/etc -type d -name 'apache*/conf.d'`) {
  83. chomp $confd;
  84. }
  85. system("tput clear");
  86. if ($filename) {
  87. $install = "\ninstall $version from (f)ile\n";
  88. }
  89. # check for latest version
  90. &get_latest_version;
  91. chomp $latest_version;
  92. if (!$newinstall) {
  93. $install .= "\n(r)einstall $version\n";
  94. }
  95. if ($version && $latest_version) {
  96. if ($version lt $latest_version) {
  97. $install .= "\n(u)pgrade to $latest_version\n";
  98. }
  99. }
  100. $install .= "\n(i)nstall $latest_version (from Internet)\n" if $latest_version;
  101. $install .= "\n(d)ownload $latest_version (no installation)" unless $filename;
  102. print qq|
  103. LedgerSMB Accounting and ERP Installation
  104. $install
  105. Enter: |;
  106. $a = <STDIN>;
  107. chomp $a;
  108. exit unless $a;
  109. $a = lc $a;
  110. if ($a !~ /d/) {
  111. print qq|\nEnter httpd owner [$webowner] : |;
  112. $web = <STDIN>;
  113. chomp $web;
  114. $webowner = $web if $web;
  115. print qq|\nEnter httpd group [$webgroup] : |;
  116. $web = <STDIN>;
  117. chomp $web;
  118. $webgroup = $web if $web;
  119. }
  120. if ($a ne 'f') {
  121. system("tput clear");
  122. # choose site
  123. foreach $item (sort { $a <=> $b } keys %source) {
  124. $i++;
  125. print qq|$i. $source{$item}{site}\n|;
  126. }
  127. $site = "1";
  128. print qq|\nChoose Location [$site] : |;
  129. $b = <STDIN>;
  130. chomp $b;
  131. $site = $b if $b;
  132. }
  133. if ($a eq 'd') {
  134. &download;
  135. }
  136. if ($a =~ /(i|u)/) {
  137. &install;
  138. }
  139. if ($a eq 'r') {
  140. $latest_version = $version;
  141. &install;
  142. }
  143. if ($a eq 'f') {
  144. &install;
  145. }
  146. exit;
  147. # end main
  148. sub download {
  149. &get_source_code;
  150. }
  151. sub get_latest_version {
  152. print "Checking for latest version number .... ";
  153. if ($filename) {
  154. print "skipping, filename supplied\n";
  155. return;
  156. }
  157. if ($lwp) {
  158. foreach $source (qw(pluto www abacus neptune)) {
  159. $url = $source{$checkversion{$source}}{url};
  160. print "\n$source{$checkversion{$source}}{site} ... ";
  161. $latest_version = LWP::Simple::get("$url/latest_version");
  162. if ($latest_version) {
  163. last;
  164. } else {
  165. print "not found";
  166. }
  167. }
  168. } else {
  169. if (!$lynx) {
  170. print "\nYou must have either lynx or LWP installed";
  171. exit 1;
  172. }
  173. foreach $source (qw(pluto www abacus neptune)) {
  174. $url = $source{$checkversion{$source}}{url};
  175. print "\n$source{$checkversion{$source}}{site} ... ";
  176. $ok = `lynx -dump -head $url/latest_version`;
  177. if ($ok = ($ok =~ s/HTTP.*?200 //)) {
  178. $latest_version = `lynx -dump $url/latest_version`;
  179. last;
  180. } else {
  181. print "not found";
  182. }
  183. }
  184. die unless $ok;
  185. }
  186. if ($latest_version) {
  187. print "ok\n";
  188. 1;
  189. }
  190. }
  191. sub get_source_code {
  192. $err = 0;
  193. @order = ();
  194. push @order, $site;
  195. for (sort { $a <=> $b } keys %source) {
  196. push @order, $_;
  197. }
  198. if ($latest_version) {
  199. # download it
  200. chomp $latest_version;
  201. $latest_version = "sql-ledger-${latest_version}.tar.gz";
  202. print "\nStatus\n";
  203. print "Downloading $latest_version .... ";
  204. foreach $key (@order) {
  205. print "\n$source{$key}{site} .... ";
  206. if ($lwp) {
  207. $err = LWP::Simple::getstore("$source{$key}{url}/$latest_version", "$latest_version");
  208. $err -= 200;
  209. } else {
  210. $ok = `lynx -dump -head $source{$key}{url}/$latest_version`;
  211. $err = !($ok =~ s/HTTP.*?200 //);
  212. if (!$err) {
  213. $err = system("lynx -dump $source{$key}{url}/$latest_version > $latest_version");
  214. }
  215. }
  216. if ($err) {
  217. print "failed!";
  218. } else {
  219. last;
  220. }
  221. }
  222. } else {
  223. $err = -1;
  224. }
  225. if ($err) {
  226. die "Cannot get $latest_version";
  227. } else {
  228. print "ok!\n";
  229. }
  230. $latest_version;
  231. }
  232. sub install {
  233. if ($filename) {
  234. $latest_version = $filename;
  235. } else {
  236. $latest_version = &get_source_code;
  237. }
  238. &decompress;
  239. if ($newinstall) {
  240. open(FH, "ledger-smb.conf.default");
  241. @f = <FH>;
  242. close(FH);
  243. unless ($latex) {
  244. grep { s/^\$latex.*/\$latex = 0;/ } @f;
  245. }
  246. open(FH, ">ledger-smb.conf");
  247. print FH @f;
  248. close(FH);
  249. $alias = $absolutealias = $ENV{'PWD'};
  250. $alias =~ s/.*\///g;
  251. $httpddir = `dirname $httpd`;
  252. if ($confd) {
  253. $httpddir = $confd;
  254. }
  255. chomp $httpddir;
  256. $filename = "sql-ledger-httpd.conf";
  257. # do we have write permission?
  258. if (!open(FH, ">>$httpddir/$filename")) {
  259. open(FH, ">$filename");
  260. $norw = 1;
  261. }
  262. $directives = qq|
  263. Alias /$alias $absolutealias/
  264. <Directory $absolutealias>
  265. AllowOverride All
  266. AddHandler cgi-script .pl
  267. Options ExecCGI Includes FollowSymlinks
  268. Order Allow,Deny
  269. Allow from All
  270. </Directory>
  271. <Directory $absolutealias/users>
  272. Order Deny,Allow
  273. Deny from All
  274. </Directory>
  275. |;
  276. print FH $directives;
  277. close(FH);
  278. print qq|
  279. This is a new installation.
  280. |;
  281. if ($norw) {
  282. print qq|
  283. Webserver directives were written to $filename
  284. Copy $filename to $httpddir
  285. |;
  286. if (!$confd) {
  287. print qq| and add
  288. # SQL-Ledger
  289. Include $httpddir/$filename
  290. to $httpd
  291. |;
  292. }
  293. print qq| and restart your webserver!\n|;
  294. if (!$permset) {
  295. print qq|
  296. WARNING: permissions for templates, users, css and spool directory
  297. could not be set. Login as root and set permissions
  298. # chown -hR :$webgroup users templates css spool
  299. # chmod 771 users templates css spool
  300. |;
  301. }
  302. } else {
  303. print qq|
  304. Webserver directives were written to
  305. $httpddir/$filename
  306. |;
  307. if (!$confd) {
  308. if (!(`grep "^# SQL-Ledger" $httpd`)) {
  309. open(FH, ">>$httpd");
  310. print FH qq|
  311. # SQL-Ledger
  312. Include $httpddir/$filename
  313. |;
  314. close(FH);
  315. }
  316. }
  317. if (!$>) {
  318. # send SIGHUP to httpd
  319. if ($f = `find /var -type f -name 'httpd.pid'`) {
  320. $pid = `cat $f`;
  321. chomp $pid;
  322. if ($pid) {
  323. system("kill -s HUP $pid");
  324. }
  325. }
  326. }
  327. }
  328. }
  329. # if this is not root, check if user is part of $webgroup
  330. if ($>) {
  331. if ($permset = ($) =~ getgrnam $webgroup)) {
  332. `chown -hR :$webgroup users templates css spool`;
  333. chmod 0771, 'users', 'templates', 'css', 'spool';
  334. `chown :$webgroup ledger-smb.conf`;
  335. }
  336. } else {
  337. # root
  338. `chown -hR 0:0 *`;
  339. `chown -hR $webowner:$webgroup users templates css spool`;
  340. chmod 0771, 'users', 'templates', 'css', 'spool';
  341. `chown $webowner:$webgroup ledger-smb.conf`;
  342. }
  343. chmod 0644, 'ledger-smb.conf';
  344. unlink "ledger-smb.conf.default";
  345. &cleanup;
  346. while ($a !~ /(Y|N)/) {
  347. print qq|\nDisplay README (Y/n) : |;
  348. $a = <STDIN>;
  349. chomp $a;
  350. $a = ($a) ? uc $a : 'Y';
  351. if ($a eq 'Y') {
  352. @args = ("more", "doc/README");
  353. system(@args);
  354. }
  355. }
  356. }
  357. sub decompress {
  358. die "Error: gzip not installed\n" unless ($gzip);
  359. die "Error: tar not installed\n" unless ($tar);
  360. &create_lockfile;
  361. # ungzip and extract source code
  362. print "Decompressing $latest_version ... ";
  363. if (system("gzip -df $latest_version")) {
  364. print "Error: Could not decompress $latest_version\n";
  365. &remove_lockfile;
  366. exit;
  367. } else {
  368. print "done\n";
  369. }
  370. # strip gz from latest_version
  371. $latest_version =~ s/\.gz//;
  372. # now untar it
  373. print "Unpacking $latest_version ... ";
  374. if (system("tar -xf $latest_version")) {
  375. print "Error: Could not unpack $latest_version\n";
  376. &remove_lockfile;
  377. exit;
  378. } else {
  379. # now we have a copy in sql-ledger
  380. if (system("tar -cf $latest_version -C sql-ledger .")) {
  381. print "Error: Could not create archive for $latest_version\n";
  382. &remove_lockfile;
  383. exit;
  384. } else {
  385. if (system("tar -xf $latest_version")) {
  386. print "Error: Could not unpack $latest_version\n";
  387. &remove_lockfile;
  388. exit;
  389. } else {
  390. print "done\n";
  391. print "cleaning up ... ";
  392. `rm -rf sql-ledger`;
  393. print "done\n";
  394. }
  395. }
  396. }
  397. }
  398. sub create_lockfile {
  399. if (-d "$userspath") {
  400. open(FH, ">$userspath/nologin");
  401. close(FH);
  402. }
  403. }
  404. sub cleanup {
  405. unlink "$latest_version";
  406. unlink "$userspath/members.default" if (-f "$userspath/members.default");
  407. &remove_lockfile;
  408. }
  409. sub remove_lockfile { unlink "$userspath/nologin" if (-f "$userspath/nologin") };