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