| 1 | package onserver; | 
|---|
| 2 | use strict; | 
|---|
| 3 | use Exporter; | 
|---|
| 4 | use Sys::Hostname; | 
|---|
| 5 | use File::Spec::Functions; | 
|---|
| 6 | use File::Basename; | 
|---|
| 7 | use Socket; | 
|---|
| 8 | use Cwd qw(abs_path); | 
|---|
| 9 | use POSIX qw(strftime); | 
|---|
| 10 | use LWP::UserAgent; | 
|---|
| 11 | use URI; | 
|---|
| 12 | our @ISA = qw(Exporter); | 
|---|
| 13 | our @EXPORT = qw(setup totmp fetch_uri print_login_info press_enter $server $tmp $USER $HOME $scriptsdir $sname $deploy $addrend $base_uri $ua $admin_username $requires_sql $addrlast $sqlhost $sqluser $sqlpass $sqldb $admin_password $scriptsdev $human $email); | 
|---|
| 14 |  | 
|---|
| 15 | our $server = "scripts.mit.edu"; | 
|---|
| 16 |  | 
|---|
| 17 | our ($tmp, $USER, $HOME, $scriptsdir, $sname, $deploy, $addrend, $base_uri, $ua, $admin_username, $requires_sql, $addrlast, $sqlhost, $sqluser, $sqlpass, $sqldb, $admin_password, $scriptsdev, $human, $email); | 
|---|
| 18 |  | 
|---|
| 19 | $tmp = ".scripts-tmp"; | 
|---|
| 20 | sub totmp { | 
|---|
| 21 |   open(FILE, ">$tmp"); | 
|---|
| 22 |   print FILE $_[0]; | 
|---|
| 23 |   close(FILE); | 
|---|
| 24 | } | 
|---|
| 25 |  | 
|---|
| 26 | $ua = LWP::UserAgent->new; | 
|---|
| 27 | push @{$ua->requests_redirectable}, 'POST'; | 
|---|
| 28 |  | 
|---|
| 29 | sub fetch_uri { | 
|---|
| 30 |     my ($uri, $get, $post) = @_; | 
|---|
| 31 |     my $u = URI->new($uri); | 
|---|
| 32 |     my $req; | 
|---|
| 33 |     if (defined $post) { | 
|---|
| 34 |         $u->query_form($post); | 
|---|
| 35 |         my $content = $u->query; | 
|---|
| 36 |         $u->query_form($get); | 
|---|
| 37 |         $req = HTTP::Request->new(POST => $u->abs($base_uri)); | 
|---|
| 38 |         $req->content_type('application/x-www-form-urlencoded'); | 
|---|
| 39 |         $req->content($content); | 
|---|
| 40 |     } else { | 
|---|
| 41 |         $u->query_form($get) if (defined $get); | 
|---|
| 42 |         $req = HTTP::Request->new(GET => $u->abs($base_uri)); | 
|---|
| 43 |     } | 
|---|
| 44 |     my $res = $ua->request($req); | 
|---|
| 45 |     if ($res->is_success) { | 
|---|
| 46 |         return $res->content; | 
|---|
| 47 |     } else { | 
|---|
| 48 |         print STDERR "Error fetching configuration page: ", $res->status_line, "\n"; | 
|---|
| 49 |         return undef; | 
|---|
| 50 |     } | 
|---|
| 51 | } | 
|---|
| 52 |  | 
|---|
| 53 | sub print_login_info { | 
|---|
| 54 |   print "\nYou will be able to log in to $sname using the following:\n"; | 
|---|
| 55 |   print "  username: $admin_username\n"; | 
|---|
| 56 |   print "  password: $admin_password\n"; | 
|---|
| 57 | } | 
|---|
| 58 |  | 
|---|
| 59 | sub getclienthostname { | 
|---|
| 60 |     if (my $sshclient = $ENV{"SSH_CLIENT"}) { | 
|---|
| 61 |         my ($clientip) = split(' ', $sshclient); | 
|---|
| 62 |         my $hostname = gethostbyaddr(inet_aton($clientip), AF_INET); | 
|---|
| 63 |         return $hostname || $clientip; | 
|---|
| 64 |     } else { | 
|---|
| 65 |         return hostname(); | 
|---|
| 66 |     } | 
|---|
| 67 | } | 
|---|
| 68 |  | 
|---|
| 69 | sub press_enter { | 
|---|
| 70 |   local $/ = "\n"; | 
|---|
| 71 |   print "Press [enter] to continue with the install."; | 
|---|
| 72 |   my $enter = <STDIN>;  | 
|---|
| 73 | } | 
|---|
| 74 |  | 
|---|
| 75 | sub setup { | 
|---|
| 76 |   $ENV{PATH} = '/bin:/usr/bin'; | 
|---|
| 77 |   $USER = $ENV{USER}; | 
|---|
| 78 |   $HOME = $ENV{HOME}; | 
|---|
| 79 |   $scriptsdir = $HOME; | 
|---|
| 80 |   $scriptsdir =~ s/\/Scripts$//; | 
|---|
| 81 |   $scriptsdir .= "/Scripts"; | 
|---|
| 82 |    | 
|---|
| 83 |   ($sname, $deploy, $addrend, $admin_username, $requires_sql, $scriptsdev, $human) = @ARGV; | 
|---|
| 84 |   chdir "$HOME/web_scripts/$addrend"; | 
|---|
| 85 |   $email = "$human\@mit.edu"; | 
|---|
| 86 |    | 
|---|
| 87 |   if($addrend =~ /^(.*)\/$/) { | 
|---|
| 88 |     $addrend = $1; | 
|---|
| 89 |   } | 
|---|
| 90 |   ($addrlast) = ($addrend =~ /([^\/]*)$/); | 
|---|
| 91 |    | 
|---|
| 92 |   $base_uri = "http://$server/~$USER/$addrend/"; | 
|---|
| 93 |    | 
|---|
| 94 |   if($requires_sql) { | 
|---|
| 95 |     print "\nCreating SQL database for $sname...\n"; | 
|---|
| 96 |     | 
|---|
| 97 |     open GETPWD, '-|', "/mit/scripts/sql/bin$scriptsdev/get-password"; | 
|---|
| 98 |     ($sqlhost, $sqluser, $sqlpass) = split(/\s/, <GETPWD>); | 
|---|
| 99 |     close GETPWD; | 
|---|
| 100 |     open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/get-next-database", $addrlast; | 
|---|
| 101 |     $sqldb = <SQLDB>; | 
|---|
| 102 |     close SQLDB; | 
|---|
| 103 |     open SQLDB, '-|', "/mit/scripts/sql/bin$scriptsdev/create-database", $sqldb; | 
|---|
| 104 |     $sqldb = <SQLDB>; | 
|---|
| 105 |     close SQLDB; | 
|---|
| 106 |     if($sqldb eq "") { | 
|---|
| 107 |       print "\nERROR:\n"; | 
|---|
| 108 |       print "Your SQL account failed to create a SQL database.\n"; | 
|---|
| 109 |       print "You should log in at http://sql.mit.edu to check whether\n"; | 
|---|
| 110 |       print "your SQL account is at its database limit or its storage limit.\n"; | 
|---|
| 111 |       print "If you cannot determine the cause of the problem, please\n"; | 
|---|
| 112 |       print "feel free to contact sql\@mit.edu for assistance.\n"; | 
|---|
| 113 |       open FAILED, ">.failed"; | 
|---|
| 114 |       close FAILED; | 
|---|
| 115 |       exit 1; | 
|---|
| 116 |     } | 
|---|
| 117 |   } | 
|---|
| 118 |   | 
|---|
| 119 |   if(-e "$HOME/web_scripts/$addrend/.admin") {  | 
|---|
| 120 |     open ADMIN, "<$HOME/web_scripts/$addrend/.admin"; | 
|---|
| 121 |     $admin_password=<ADMIN>; | 
|---|
| 122 |     chomp($admin_password); | 
|---|
| 123 |     close ADMIN; | 
|---|
| 124 |     unlink "$HOME/web_scripts/$addrend/.admin"; | 
|---|
| 125 |   }  | 
|---|
| 126 |  | 
|---|
| 127 |   print "\nConfiguring $sname...\n"; | 
|---|
| 128 |   if($requires_sql) { | 
|---|
| 129 |     print "A copy of ${USER}'s SQL login info will be placed in\n/mit/$USER/web_scripts/$addrend.\n"; | 
|---|
| 130 |   } | 
|---|
| 131 |    | 
|---|
| 132 |   open(VERSION, ">.scripts-version") or die "Can't write scripts-version file: $!\n"; | 
|---|
| 133 |   print VERSION strftime("%F %T %z\n", localtime); | 
|---|
| 134 |   print VERSION $ENV{'USER'}, '@', getclienthostname(), "\n"; | 
|---|
| 135 |   my $tarball = abs_path("/mit/scripts/deploy$scriptsdev/$deploy.tar.gz"); | 
|---|
| 136 |   print VERSION $tarball, "\n"; | 
|---|
| 137 |   $tarball =~ s|/deploydev/|/deploy/|; | 
|---|
| 138 |   print VERSION dirname($tarball), "\n"; | 
|---|
| 139 |   close(VERSION); | 
|---|
| 140 |  | 
|---|
| 141 |   select STDOUT; | 
|---|
| 142 |   $| = 1; # STDOUT is *hot*! | 
|---|
| 143 | } | 
|---|
| 144 |  | 
|---|
| 145 | 1; | 
|---|