[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

SF.net SVN: ledger-smb: [180] trunk/setup.pl



Revision: 180
          http://svn.sourceforge.net/ledger-smb/?rev=180&view=rev
Author:   einhverfr
Date:     2006-10-02 11:47:54 -0700 (Mon, 02 Oct 2006)

Log Message:
-----------
Applied a modified version of davedv's patch to test the db connection.

Modified Paths:
--------------
    trunk/setup.pl

Modified: trunk/setup.pl
===================================================================
--- trunk/setup.pl	2006-10-02 15:17:09 UTC (rev 179)
+++ trunk/setup.pl	2006-10-02 18:47:54 UTC (rev 180)
@@ -54,7 +54,7 @@
   if ($cpan == 1){
     # Can try to install the module..
     print "\n\nWould you like to try and install this package ($module) through CPAN? (Y/N) [Y]:";
-    $response=<STDIN>;
+    my $response=<STDIN>;
     if(($response=~/y/i) or ($response eq "\n")){
       my $inst_obj = CPAN::Shell->install($module);
       @results=&check_module($module);
@@ -74,14 +74,14 @@
 use HTML::LinkExtor;
 
 
-$lynx = `lynx -version`;      # if LWP is not installed use lynx
-$gzip = `gzip -V 2>&1`;            # gz decompression utility
-$tar = `tar --version 2>&1`;       # tar archiver
-$latex = `latex -version`;
+my $lynx = `lynx -version`;      # if LWP is not installed use lynx
+my $gzip = `gzip -V 2>&1`;            # gz decompression utility
+my $tar = `tar --version 2>&1`;       # tar archiver
+my $latex = `latex -version`;
 
 my $versionurl ='http://prdownloads.sourceforge.net/ledger-smb';
 
-%source = (
+my %source = (
 	    1 => { url => "http://voxel.dl.sourceforge.net/sourceforge/ledger-smb";, site => "New York, U.S.A", locale => 'us' },
             2 => { url => "http://easynews.dl.sourceforge.net/sourceforge/ledger-smb";, site => "Arizona, U.S.A", locale => 'us' },
 	    3 => { url => "http://ufpr.dl.sourceforge.net/sourceforge/ledger-smb";, site =>"Brazil", locale => 'br' },
@@ -96,14 +96,14 @@
 	    12 => { url => "http://heanet.dl.sourceforge.net/sourceforge/ledger-smb";, site => "Ireland", locale => 'ie' }
 	  );
 
-$userspath = "users";         # default for new installation
+my $userspath = "users";         # default for new installation
 
 eval { require "ledger-smb.conf"; };
 
-$filename = shift;
+my $filename = shift;
 chomp $filename;
 
-$newinstall = 1;
+my $newinstall = 1;
 
 # is LWP installed
 eval { require LWP::Simple; };
@@ -129,34 +129,68 @@
   close(FH);
   $version = $a[0];
   chomp $version;
-
   $newinstall = !$version;
-
   if (! -f "ledger-smb.conf") {
     $newinstall = 1;
   }
 }
 
+# Try to determine web user and group..
+
 $webowner = "nobody";
 $webgroup = "nogroup";
 
-if ($httpd = `find /etc /usr/local/etc -type f -name 'httpd.conf'`) {
+# Check for apache2.conf
+if ($httpd = `find /etc /usr/local/etc -type f -name 'apache2.conf'`) {
   chomp $httpd;
   $webowner = `grep "^User " $httpd`;
   $webgroup = `grep "^Group " $httpd`;
-
   chomp $webowner;
   chomp $webgroup;
+  (undef, $webowner) = split / /, $webowner;
+  (undef, $webgroup) = split / /, $webgroup;
   
-  ($null, $webowner) = split / /, $webowner;
-  ($null, $webgroup) = split / /, $webgroup;
-
+} elsif ($httpd = `find /etc /usr/local/etc -type f -name 'httpd.conf'`) {
+  # Else check for httpd.conf
+  chomp $httpd;
+  $webowner = `grep "^User " $httpd`;
+  $webgroup = `grep "^Group " $httpd`;
+  chomp $webowner;
+  chomp $webgroup;
+  (undef, $webowner) = split / /, $webowner;
+  (undef, $webgroup) = split / /, $webgroup;
 }
 
 if ($confd = `find /etc /usr/local/etc -type d -name 'apache*/conf.d'`) {
   chomp $confd;
 }
+# If we are doing a new install.. check the postgresql installation..
+if ($newinstall == 1){
+  # Check the postgresql version before we even check for a connection if local
+  system("tput clear"); # Clear the screen..
+  our ($pghost, $pgport, $pguser, $pgpassword);
+  print "\n\nIs PostgreSQL installed [L]ocally,\n or will you be connecting to a [R]emote server? (L/R) [L]:";
+  my $localremote=<STDIN>;
+  if(($localremote=~/L/i) or ($localremote eq "\n")){
+    $pghost = 'localhost';
+    # If local, check the local postgresql version..
+    my $pgversion = `psql --version`;
+    ($pgversionnum) = $pgversion =~ m/(\d\.\d\.\d)/;
+    unless ($pgversionnum gt '8.0.0'){
+      # Die, cannot continue..
+      print "LedgerSMB requires postgres version 8.0 or higher.  You have version $pgversionnum installed\n";
+      die;
+    }
+  }
+  if (!&check_pgconnect){
+    print "\n\n\nInstallation was not successful\n Exiting....\n";
+    exit;
+  }
+  
+}
 
+
+
 system("tput clear");
 
 if ($filename) {
@@ -617,4 +651,118 @@
 
 sub remove_lockfile { unlink "$userspath/nologin" if (-f "$userspath/nologin") };
 
+sub check_pgconnect{
+  print "We will now attempt to validate that we are able to \nconnect to your postgres database.\n";
+  my $cnx = 0;
+  while (!$cnx){
+    print "\nPlease enter the host name of the postgresql database? ".
+	"(ie localhost)\n [$pghost]:";
+    my $response=<STDIN>;
+    $response =~ s/\s*//g;
+    chomp($response);
+    # Should probably try to validate the hostname here.. but for now, we'll leave it.
+    $response = $pghost if ($response eq '');
+    while (!$pgport){
+      print "\nPlease enter the port postgres is listening on.\n[5432]:";
+      $pgport=<STDIN>;
+      chomp($pgport);
+      $pgport = 5432 if ($pgport eq '');
+      if (($pgport =~ /\D/)||($pgport > 65535)){
+        print "\nThe port must be a number between 0 and 65535, ".
+  		"postgres default is 5432\n";
+        undef $pgport;
+      }
+    }
+    while (!$pguser){
+      print "\nPlease enter a valid postgres user name ".
+	"to validate the connection.:";
+      $pguser=<STDIN>;
+      chomp($pguser);
+      if ($pguser eq ''){
+        print "\nYou must enter a username\n";
+      }
+    }
+    while (!$pgpass){
+      print "\nPlease enter a valid postgres password ".
+	"to validate the connection.:";
+      $pgpass=<STDIN>;
+      chomp($pgpass);
+      if ($pgpass eq ''){
+        print "\nYou must enter a password\n";
+      }
+    }
+  
+    # Try to connect;
+    eval {
+      my $dbh = DBI->connect("dbi:Pg:dbname=template1;host=$response;".
+	"port=$pgport;", $pguser, $pgpass) or die $DBI::errstr;
+      my $version = $dbh->get_info(  18 );
+      if ($version =~ /^07/){
+        die "You have postgres version $version installed, ".
+		"we require a minimum of 8.0\n";
+      }
+    };
+    if ($@){
+      system("tput clear");
+      print "Connection to the database was unsucessful\n".
+	"The error we received was this:..hidden..".
+	"Would you like to try to enter the authentication ".
+	"information again? (Y/N)[N]:";
+      $answer=<STDIN>;
+      chomp($answer);
+      if($answer=~/n/i){
+	$cnx = 1;
+      }
+    } else {
+      $cnx = 1;
+    }
+  }
+    # Try to guide the user to an answer to the connection problems.
+    system("tput clear"); # Clear the screen..
+    print "Have you already set up a database user for LedgerSMB? (Y/N) [N]:";
+    $answer = <STDIN>;
+    chomp($answer);
+    if(($answer=~/n/i) or ($answer eq "")){
+      print q|
+    
+If you have not set up a database user yet, you can use the following command:
 
+# su postgres
+$ createuser -d ledger-smb
+Shall the new user be allowed to create databases? (y/n) y
+Shall the new user be allowed to create more new users? (y/n) n
+  
+if you use passwords to access postgres use this command
+$ createuser -d -P ledger-smb
+    |;
+    return 0;
+    }
+    # Maybe they did not change pg_hba.conf?
+    print qq|Did you modify pg_hba.conf to allow access?
+
+    See pg_hba.conf example entries here:
+    http://www.postgresql.org/docs/8.0/static/client-authentication.html#EXAMPLE-PG-HBA.CONF
+    A good starting point would be to add something similar to below to pg_hba.conf:
+    host all all 192.168.1.5/32 MD5
+    Which would allow a connection
+    from any user,
+    to any database,
+    from that one IP (You will need to change this for your setup)
+    Using a MD5 password.
+    
+    Also, remember to reload postgres when you make the change.
+    
+    Did you allow access to the postgres database from the web server?
+    (Y/N) [Y]:|;
+    $answer = <STDIN>;
+    if(($response=~/n/i) or ($response eq "\n")){
+      return 0;
+    }    
+    # Add other checks here..
+    
+    return 0;
+}
+  print "\nConnection Successful, Press enter to continue\n";
+  $answer=<STDIN>;
+  return 1;
+  


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.