0.12_22 commit
[bse.git] / localinst.perl
1 #!/usr/bin/perl -w
2 use strict;
3 #use File::Tree;
4 use File::Copy;
5 use lib 't';
6 use BSE::Test ();
7
8 my $dist = shift or die "Usage: $0 distdir [leavedb]";
9 my $leavedb = shift or 0;
10 my $instbase = shift || BSE::Test::base_dir() || die "No base_dir";
11
12 my $mysql = BSE::Test::mysql_name;
13
14 #  if (-e "$instbase/cgi-bin/modules/Constants.pm"
15 #      && !-e "$instbase/Constants.pm") {
16 #    system "cp $instbase/cgi-bin/modules/Constants.pm $instbase/Constants.pm"
17 #  }
18
19 system("rm -rf $instbase/cgi-bin")
20   and die "Cannot remove cgi-bin";
21 system "rm -rf $instbase/data"
22   and die "Cannot remove data";
23 system "rm -f $instbase/htdocs/{*.html,a/*.html,shop/*.html,images/*.jpg}"
24   and die "Cannot remove htdocs";
25
26 system "cp -rf $dist/site/cgi-bin $instbase"
27   and die "Cannot copy cgi-bin";
28
29 system "cp -rf $dist/site/htdocs $instbase"
30   and die "Cannot copy htdocs";
31 system "cp -rf $dist/site/templates $instbase"
32   and die "Cannot copy templates";
33 system "cp -rf $dist/site/data $instbase"
34   and die "Cannot copy data";
35 system "cp -rf $dist/site/util $instbase";
36
37 print "Updating conf\n";
38 # try to update Constants.pm
39 open CON, "< $instbase/cgi-bin/modules/Constants.pm"
40   or die "Cannot open Constants.pm";
41 my $con = do { local $/; <CON> };
42 close CON;
43
44 my $dbuser = BSE::Test::test_dbuser();
45 my $dbpass = BSE::Test::test_dbpass();
46
47 $con =~ s/(^\$DSN = ')[^']*/$1 . BSE::Test::test_dsn()/me;
48 $con =~ s/(^\$DBCLASS = ')[^']*/$1 . BSE::Test::test_dbclass()/me;
49 $con =~ s/(^\$UN = ')[^']*/$1$dbuser/m;
50 $con =~ s/(^\$PW = ')[^']*/$1$dbpass/m;
51 $con =~ s/(^\$BASEDIR = ')[^']+/$1 . BSE::Test::base_dir/me;
52 #$con =~ s/(^\$URLBASE = ["'])[^'"]+/$1 . BSE::Test::base_url/me;
53 #$con =~ s/(^\$SECURLBASE = ["'])[^'"]+/$1 . BSE::Test::test_securl/me;
54 $con =~ s/(^\$SESSION_CLASS = [\"\'])[^\'\"]+/$1 . BSE::Test::test_sessionclass()/me;
55 open CON, "> $instbase/cgi-bin/modules/Constants.pm"
56   or die "Cannot open Constants.pm for write: $!";
57 print CON $con;
58 close CON;
59
60 # rebuild the config file
61 # first load values from the test.cfg file
62 my $conffile = BSE::Test::test_conffile();
63 my %conf;
64 $conf{site}{name} = "Test Server";
65 $conf{site}{url} = BSE::Test::base_url();
66 $conf{site}{secureurl} = BSE::Test::base_securl();
67 my $uploads = "$instbase/uploads";
68 $conf{paths}{downloads} = $uploads;
69 my $templates = "$instbase/templates";
70 $conf{paths}{templates} = $templates;
71 open TESTCONF, "< $conffile"
72   or die "Could not open config file $conffile: $!";
73 while (<TESTCONF>) {
74   chomp;
75   /^\s*(\w[^=]*\w)\.(\w+)\s*=\s*(.*\S)\s*$/ or next;
76   $conf{lc $1}{lc $2} = $3;
77 }
78
79 $uploads = $conf{paths}{downloads};
80 # fix bse.cfg
81 open CFG, "< $instbase/cgi-bin/bse.cfg"
82   or die "Cannot open $instbase/cgi-bin/bse.cfg: $!";
83 my $section = "";
84 my @cfg;
85 while (<CFG>) {
86   chomp;
87   if (/^\[(.*)\]\s*$/) {
88     my $newsect = lc $1;
89     if ($conf{$section} && keys %{$conf{$section}}) {
90       for my $key (sort keys %{$conf{$section}}) {
91         push @cfg, "$key=$conf{$section}{$key}";
92       }
93       delete $conf{$section};
94     }
95     $section = $newsect;
96   }
97   elsif (/^\s*(\w+)\s*=\s*.*$/ && exists $conf{$section}{lc $1}) {
98     my $key = lc $1;
99     print "found $section.$key\n";
100     $_ = "$key=$conf{$section}{$key}";
101     delete $conf{$section}{$key};
102   }
103   push @cfg, $_;
104 }
105 if ($conf{$section} && keys %{$conf{$section}}) {
106   for my $key (sort keys %{$conf{$section}}) {
107     push @cfg, "$key=$conf{$section}{$key}";
108   }
109   delete $conf{$section};
110 }
111 for my $sect (keys %conf) {
112   if ($conf{$sect} && keys %{$conf{$sect}}) {
113     push @cfg, "[$sect]";
114     for my $key (sort keys %{$conf{$sect}}) {
115       push @cfg, "$key=$conf{$sect}{$key}";
116     }
117     push @cfg, "";
118   }
119 }
120 close CFG;
121
122 open CFG, "> $instbase/cgi-bin/bse.cfg"
123   or die "Cannot create $instbase/cgi-bin/bse.cfg: $!";
124 for my $line (@cfg) {
125   print CFG $line, "\n";
126 }
127 close CFG;
128
129 -d $uploads 
130   or mkdir $uploads, 0777 
131   or die "Cannot find or create upload directory: $!";
132
133
134 # build the database
135 unless ($leavedb) {
136   my $dsn = BSE::Test::test_dsn();
137   if ($dsn =~ /:mysql:(?:database=)?(\w+)/) {
138     my $db = $1;
139     system "$mysql -u$dbuser -p$dbpass $db <$dist/schema/bse.sql"
140       and die "Cannot initialize database";
141     system "cd $instbase/util ; perl initial.pl"
142       and die "Cannot load database";
143   }
144   else {
145     print "WARNING: cannot install to $dsn database\n";
146   }
147 }
148
149