source: trunk/lib/OpenGuides/Build.pm @ 1116

Last change on this file since 1116 was 1116, checked in by Dominic Hargreaves, 14 years ago

Ensure that all modules we ship are versioned. (references #232)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.7 KB
Line 
1package OpenGuides::Build;
2
3use strict;
4
5use vars qw( $VERSION );
6$VERSION = '0.01';
7
8use Module::Build;
9use OpenGuides::Config;
10use base 'Module::Build';
11
12sub ACTION_install {
13    my $self = shift;
14    $self->SUPER::ACTION_install;
15    $self->ACTION_install_extras;
16
17    eval "use Config::Tiny";
18    die "Config::Tiny is required to set up this application.\n" if $@;
19
20    my $config = OpenGuides::Config->new( file => "wiki.conf" );
21
22    # Initialise the database if necessary.
23    my $dbname = $config->dbname;
24    my $dbuser = $config->dbuser;
25    my $dbpass = $config->dbpass;
26    my $dbhost = $config->dbhost;
27    my $dbtype = $config->dbtype;
28
29    my %cgi_wiki_exts = ( postgres => "Pg",
30                          mysql    => "MySQL",
31                          sqlite   => "SQLite" );
32
33    my $cgi_wiki_module = "Wiki::Toolkit::Setup::" . $cgi_wiki_exts{$dbtype};
34    eval "require $cgi_wiki_module";
35    die "There was a problem: $@" if $@;
36
37    print "Checking database schema...\n";
38    {
39        no strict 'refs';
40        &{$cgi_wiki_module . "::setup"}( $dbname, $dbuser, $dbpass, $dbhost );
41    }
42}
43
44sub ACTION_fakeinstall {
45    my $self = shift;
46    $self->SUPER::ACTION_fakeinstall;
47    $self->ACTION_install_extras( fake => 1 );
48    print "Checking database schema...\n";
49}
50
51sub ACTION_install_extras {
52    my ($self, %args) = @_;
53    my $FAKE = $args{fake} || 0;
54
55    eval "use Config::Tiny";
56    die "Config::Tiny is required to set up this application.\n" if $@;
57
58    my $config = OpenGuides::Config->new( file => "wiki.conf" );
59
60    # Install the scripts where we were told to.
61    my $install_directory    = $config->install_directory;
62    my $script_name          = $config->script_name;
63    my $template_path        = $config->template_path;
64    my $custom_template_path = $config->custom_template_path;
65    my $custom_lib_path      = $config->custom_lib_path;
66    my $static_path          = $config->static_path;
67    my @extra_scripts        = @{ $self->config_data( "__extra_scripts" ) };
68    my @templates            = @{ $self->config_data( "__templates" ) };
69    my @static_files         = @{ $self->config_data( "__static_files" ) };
70
71    print "Installing scripts to $install_directory:\n";
72    # Allow for blank script_name - assume "index.cgi".
73        my $script_filename = $script_name || "index.cgi";
74    if ( $FAKE ) {
75        print "wiki.cgi -> $install_directory/$script_filename (FAKE)\n";
76    } else {
77        if ( $script_filename ne "wiki.cgi" ) {
78            File::Copy::copy("wiki.cgi", $script_filename)
79                or die "Can't copy('wiki.cgi', '$script_filename'): $!";
80        }
81        my $copy = $self->copy_if_modified(
82                                            $script_filename,
83                                            $install_directory
84                                          );
85        if ( $copy ) {
86            $self->fix_shebang_line($copy);
87            $self->make_executable($copy);
88            $self->add_custom_lib_path( $copy, $custom_lib_path )
89              if $custom_lib_path;
90        } else {
91            print "Skipping $install_directory/$script_filename (unchanged)\n";
92        }
93        print "(Really: wiki.cgi -> $install_directory/$script_filename)\n"
94            unless $script_filename eq "wiki.cgi";
95    }
96
97    if ( $FAKE ) {
98        print "Trying to ensure that wiki.conf is protected.\n";
99    } else {
100        my $mentionswikidotconf = 0;
101        print "Trying to ensure that wiki.conf is protected by .htaccess.. ";
102        if (-f "$install_directory/.htaccess") {
103            if (open HTACCESS, "$install_directory/.htaccess") {
104                while (<HTACCESS>) {
105                    if (/wiki\.conf/) {
106                        $mentionswikidotconf = 1;
107                    }
108                }
109                close HTACCESS;
110            } else {
111                warn "Could not open $install_directory/.htaccess for reading: $!";
112            }
113        }
114        if ($mentionswikidotconf == 0) {
115            if (open HTACCESS, ">>$install_directory/.htaccess") {
116                print HTACCESS "# Added by OpenGuides installer\n";
117                print HTACCESS "<Files wiki.conf>\ndeny from all\n</Files>";
118                close HTACCESS;
119                print "apparent success. You should check that this is working!\n";
120            } else {
121                warn "Could not open $install_directory/.htaccess for writing: $!";
122            }
123        } else {
124            print ".htaccess appears to already mention wiki.conf.\n";
125        }
126    }
127
128    foreach my $script ( @extra_scripts ) {
129        if ( $FAKE ) {
130            print "$script -> $install_directory/$script (FAKE)\n";
131        } else {
132            my $copy = $self->copy_if_modified( $script, $install_directory );
133            if ( $copy ) {
134                $self->fix_shebang_line($copy);
135                $self->make_executable($copy) unless $script eq "wiki.conf";
136                $self->add_custom_lib_path( $copy, $custom_lib_path )
137                  if $custom_lib_path;
138            } else {
139                print "Skipping $install_directory/$script (unchanged)\n";
140            }
141        }
142    }
143
144    print "Installing templates to $template_path:\n";
145    foreach my $template ( @templates ) {
146        if ( $FAKE ) {
147            print "templates/$template -> $template_path/$template (FAKE)\n";
148            } else {
149                $self->copy_if_modified(from => "templates/$template", to_dir => $template_path, flatten => 1)
150                or print "Skipping $template_path/$template (unchanged)\n";
151        }
152    }
153    if ( $FAKE ) {
154        print "Making $custom_template_path.\n";
155    } else {
156        unless (-d $custom_template_path) {
157            print "Creating directory $custom_template_path.\n";
158            mkdir $custom_template_path or warn "Could not make $custom_template_path";
159        }
160    }
161
162    print "Installing static files to $static_path:\n";
163    foreach my $static_file ( @static_files ) {
164        if ( $FAKE ) {
165            print "static/$static_file -> $static_path/$static_file (FAKE)\n";
166        } else {
167            $self->copy_if_modified(from => "static/$static_file", to_dir => $static_path, flatten => 1)
168                or print "Skipping $static_path/$static_file (unchanged)\n";
169        }
170    }
171}
172
173sub add_custom_lib_path {
174    my ($self, $copy, $lib_path) = @_;
175    local $/ = undef;
176    open my $fh, $copy or die $!;
177    my $content = <$fh>;
178    close $fh or die $!;
179    $content =~ s|use strict;|use strict\;\nuse lib qw( $lib_path )\;|s;
180
181    # Make sure we can write to the file before we try to (see perldoc -f stat)
182    my @file_info = stat( $copy );
183    my $orig_mode = $file_info[2] & 07777;
184    chmod( $orig_mode | 0222, $copy )
185        or warn "Couldn't make $copy writeable: $!";
186    open $fh, ">$copy" or die $!;
187    print $fh $content;
188    close $fh or die $!;
189    chmod( $orig_mode, $copy )
190        or warn "Couldn't restore permissions on $copy: $!";
191
192    return 1;
193}
194
1951;
Note: See TracBrowser for help on using the repository browser.