ispman/lib/ISPMan DBMan.pm,1.5,1.6

Joerg Delker <[email protected]> Mon, 29 Dec 2008 16:21:18 +0000
Newsgroups gmane.comp.isp.ispman.cvs
Message-ID <[email protected]>
Update of /cvsroot/ispman/ispman/lib/ISPMan
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv30821/lib/ISPMan

Modified Files:
	DBMan.pm 
Log Message:
major reorg/rewrite of methods

Index: DBMan.pm
===================================================================
RCS file: /cvsroot/ispman/ispman/lib/ISPMan/DBMan.pm,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- DBMan.pm	11 Dec 2007 01:16:38 -0000	1.5
+++ DBMan.pm	29 Dec 2008 16:21:16 -0000	1.6
@@ -3,189 +3,281 @@
 use strict;
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
 
+use Digest::SHA1;
+
 require Exporter;
 
 @ISA    = qw(ISPMan Exporter AutoLoader);
 @EXPORT = qw(
-   createDatabase
-   editDatabase
-   getDatabaseTypes
-   AddDatabase
-   _AddDatabase
-   getDatabaseBranchDN
-   getDatabaseDN
-   getDatabaseInfo
-   getDatabases
-   addDatabaseProcess
+  add_database_form
+  edit_database_form
+
+  add_database_cgi
+  delete_database_cgi
+  modify_database_cgi
+
+  add_database
+  delete_database
+  modify_database
+
+  getDatabases
+  getDatabaseInfo
+  getDatabaseBranchDN
+  getDatabaseDN
+  getDatabasesCount
+  getAllDatabaseCount
 );
 $VERSION = '0.01';
 
-sub createDatabase {
+#######################################################################
+# Display Form Methods
+
+sub add_database_form {
     my $self = shift;
     my $r    = shift;
-    my $cn   = $r->param("cn");
-    my $template;
 
-    $self->{'domain'} = $self->getDomainInfo( $r->param("ispmanDomain") );
+    my $domain = $r->param("ispmanDomain");
 
-    if ( $self->isDomainEditable( $r->param("ispmanDomain") ) ) {
-        $template = $self->getTemplate("databases/add.tmpl");
-    }
-    else {
-        $template = $self->getTemplate("ro.tmpl");
+    # check user limit for this domain
+    my $domainMaxDatabases =
+      $self->getDomainAttribute( $domain, "ispmanMaxDatabases" );
+
+    my $domainDatabaseCount = $self->getDatabasesCount($domain);
+
+    if (   $domainMaxDatabases > 0
+        && $domainDatabaseCount >= $domainMaxDatabases )
+    {
+        $self->{'message'} =
+          "Max databases limit exceeded. <br>Your limit is $domainMaxDatabases <br>You cannot create any more databases.";
+        print $self->{'message'};
+        return;
     }
+
+    my $template = $self->getTemplate("databases/add.tmpl");
     print $template->fill_in( PACKAGE => "ISPMan" );
 }
 
-sub editDatabase {
+sub edit_database_form {
     my $self = shift;
     my $r    = shift;
-    my $cn   = $r->param("cn");
-    my $domain   = $r->param("ispmanDomain");
-    my $template;
 
-    $self->{'domain'} = $self->getDomainInfo( $r->param("ispmanDomain") );
-    $self->{"thisDbInfo"}=$self->getDatabaseInfo($domain, $cn);
+    my $dbInfo = $self->getDatabaseInfo( $r->param("ispmanDBName") );
 
+    my $template = $self->getTemplate("databases/edit.tmpl");
+    print $template->fill_in(
+        PACKAGE => "ISPMan",
+        HASH    => { dbInfo => \$dbInfo }
+    );
+}
+
+#######################################################################
+# CGI Methods
+
+sub add_database_cgi {
+    my ( $self, $r ) = @_;
+
+    my $domain = $r->param("ispmanDomain");
+    my $dbName = $r->param("ispmanDBName");
+
+    # copy data from CGI
+    my $dbhash;
+    for (
+        qw(ispmanDBType ispmanDBName ispmanDBUser ispmanDBPass ispmanDBHost
+        ispmanDBAccessFilter ispmanDBPrivilege)
+      )
+    {
+        my $size = scalar( @{ $r->param_fetch($_) } );
+        if    ( $size == 1 ) { $dbhash->{$_} = $r->param($_); }
+        elsif ( $size > 1 )  { $dbhash->{$_} = $r->param_fetch($_); }
+        else                 { }
 
-    if ( $self->isDomainEditable( $r->param("ispmanDomain") ) ) {
-        $template = $self->getTemplate("databases/edit.tmpl");
-    } else {
-        $template = $self->getTemplate("ro.tmpl");
     }
 
-    print $template->fill_in( PACKAGE => "ISPMan" );
+    # create database
+    if ( $self->add_database( $domain, $dbhash ) ) {
+        print $self->refreshSignal($domain);
+        print "Creation of the database ", $dbName, " scheduled.";
+    }
 }
 
+sub modify_database_cgi {
+    my $self = shift;
+    my $r    = shift;
 
-sub AddDatabase {
-   my ( $self, $r ) = @_;
-   #TODO.
-   # Do some error checking here.
-   # Make sure that all parameters are correct
+    my $domain = $r->param("ispmanDomain");
 
+    my $dbhash = {};
 
-   if (
-      $self->_AddDatabase(
-      $r->param("ispmanDomain"),
-      $r->param("cn"),
-      $r->param("suffix"),
-      $r->param("dbHost"),
-      $r->param("ispmanDatabaseType"),
-      $r->param("userPassword")
-      )){
-      print "Database Scheduled for addition";
-   }
+    for (
+        qw(ispmanDBType ispmanDBName ispmanDBUser ispmanDBPass ispmanDBHost
+        ispmanDBAccessFilter ispmanDBPrivilege)
+      )
+    {
+        my $size = scalar( @{ $r->param_fetch($_) } );
+        if    ( $size == 1 ) { $dbhash->{$_} = $r->param($_); }
+        elsif ( $size > 1 )  { $dbhash->{$_} = $r->param_fetch($_); }
+        else                 { }
 
+    }
 
+    if ( $self->modify_database( $domain, $r->param("oldDBName"), $dbhash ) ) {
+        print $self->refreshSignal($domain);
+        print "Modify the database ", $r->param("oldDBName"), " scheduled.";
+    }
+    else {
+        print "Update failed!";
+    }
 }
 
+sub delete_database_cgi {
+    my $self   = shift;
+    my $r      = shift;
+    my $domain = $r->param('ispmanDomain');
+    my $dbName = $r->param('ispmanDBName');
 
-sub _AddDatabase {
-    my $self = shift;
-    my ( $domain, $cn, $suffix, $dbhost, $type, $pass ) = @_;
+    if ( $self->delete_database( $dbName, $domain ) ) {
+        print $self->refreshSignal($domain);
+        print "Database $dbName scheduled for deletion";
+    }
+    else {
+        print "Failed to delete database $dbName!";
+    }
+}
 
-    #TODO.
-    # Do some error checking here.
-    # Make sure that all parameters are correct
+#######################################################################
+# Backend Methods
 
-    # this sub will only add data to the LDAP server
-    # it will not really create or drop tables.
+sub add_database {
+    my $self   = shift;
+    my $domain = shift;
+    my $dbhash = shift;
 
-    my $data;
-    $cn =~ s/[^a-z0-9]//g;
+    my $dbName = $dbhash->{'ispmanDBName'};
+    my $server = $dbhash->{'ispmanDBHost'};
 
-   if ($cn!~/\w/) {
-      print "Error: Db name is not valid\n";
-      return 0;
-   }
+    $dbhash->{'objectclass'} = "ispmanDatabaseData";
 
-   if ($dbhost!~/\w/) {
-      print "Error: Db host is not valid\n";
-      return 0;
-   }
+    # treat password
+    if (lc($dbhash->{'ispmanDBType'}) eq "mysql") {
+       # generate MySQL password hash
+       my $digest=Digest::SHA1->new->add($dbhash->{'ispmanDBPass'})->digest;
+       $dbhash->{'ispmanDBPass'} = "*".uc(Digest::SHA1->new->add($digest)->hexdigest);
+    }
 
-   if ($type!~/\w/) {
-      print "Error: Db type is not valid\n";
-      return 0;
-   }
+    # prepare branch
+    $self->prepareBranchForDN( $self->getDatabaseBranchDN($domain) );
 
-   if ($suffix!~/\w/) {
-      print "Error: Suffix is not valid\n";
-      return 0;
-   }
+    my $dn = $self->getDatabaseDN( $dbName, $domain );
 
+    if ( $self->entryExists($dn) ) {
+        print $self->refreshSignal($domain);
+        print
+          "The operation failed. There is already a database with this name.";
+        return 0;
+    }
+    else {
+        if ( $self->addNewEntryWithData( $dn, $dbhash ) ) {
+            $self->addProcessToHost( $domain, $server, "AddDatabase", join "&",
+                map { "$_=" . ((ref $dbhash->{$_} eq "ARRAY")?join(",",@{$dbhash->{$_}}):$dbhash->{$_}) } keys %$dbhash );
+            return 1;
+        }
+    }
+}
 
-   if ($pass!~/\w/ || length($pass)<5) {
-      print "Error: Password not valid or too short\n";
-      return 0;
-   }
+sub modify_database {
+    my $self       = shift;
+    my $domain     = shift;
+    my $origDbName = shift;
+    my $updates    = shift;
 
-    $cn = join '_', ( $cn, $suffix);
+    # get old data
+    my $dbInfo = $self->getDatabaseInfo($origDbName);
 
-    $data->{'cn'}        = $cn;
+    # build new DB hash so we have definately all variables
+    my $dbNew;
+    foreach ( keys %$dbInfo ) {
+        $dbNew->{$_} = $updates->{$_} || $dbInfo->{$_};
+    }
 
-    #$data->{'ispmanDBUser'}        = $suffix;
+    my $dn = $self->getDatabaseDN( $dbNew->{'ispmanDBName'}, $domain );
 
-    $data->{'ispmanDBUser'}        = $cn;
-    $data->{'ispmanDBPass'}    = $pass;
-    $data->{'ispmanDBType'}    = $type;
-    $data->{'ispmanDBHost'}    = $dbhost;
+    # treat password change
+    if ($dbInfo->{'ispmanDBPass'} ne $dbNew->{'ispmanDBPass'} ||
+        lc($dbNew->{'ispmanDBType'}) eq "mysql") {
+       # generate MySQL password hash
+       my $digest=Digest::SHA1->new->add($dbNew->{'ispmanDBPass'})->digest;
+       $dbNew->{'ispmanDBPass'} = "*".uc(Digest::SHA1->new->add($digest)->hexdigest);
+    }
 
+    # do we have a move? (ispmanDBName changed)
+    if ( $dbInfo->{'ispmanDBName'} ne $dbNew->{'ispmanDBName'} ) {
 
-    $data->{'objectclass'} = "ispmanDatabaseData";
+        # first add the new entry
+        if ( $self->addNewEntryWithData( $dn, $dbNew ) ) {
 
-    my $branch = $self->getDatabaseBranchDN($domain);
-      
-    unless ( $self->branchExists($branch) ) {
-       $self->prepareBranchForDN($branch);
+            # add was successful, so lets delete the old entry
+            $self->deleteEntry(
+                $self->getDatabaseDN( $dbInfo->{'ispmanDBName'}, $domain ) );
+        }
+        else {
+            return 0;    # already exists or failure
+        }
     }
-
-    my $dn = $self->getDatabaseDN($domain, $cn);
-    unless ( $self->entryExists($dn) ) {
-        print "Adding $dn\n";
-        if ($self->addNewEntryWithData( $dn, $data )){
-           $self->addDatabaseProcess($domain, $cn, "AddDatabase");
+    else {
+        # just update existing entry
+        if ( !$self->updateEntryWithData( $dn, $dbNew ) ) {
+            return 0;
         }
     }
-}
 
-sub getDatabaseBranchDN{
-   my $self = shift;
-   my $domain=shift;
-   return "ou=databases, ispmanDomain=$domain, @{[$self->getConf('ldapBaseDN')]}";
+    # create update process
+    $self->addProcessToHost(
+        $domain,
+        $dbNew->{'ispmanDBHost'},
+        "UpdateDatabase",
+        join "&",
+        (
+            (map { "old_$_=" . ((ref $dbInfo->{$_} eq "ARRAY")?join(",",@{$dbInfo->{$_}}):$dbInfo->{$_}) } keys %$dbInfo),
+            (map { "new_$_=" . ((ref $dbNew->{$_} eq "ARRAY")?join(",",@{$dbNew->{$_}}):$dbNew->{$_}) } keys %$dbNew)
+        )
+    );
 }
 
-sub getDatabaseDN{
-   my $self = shift;
-   my $domain=shift;
-   my $cn=shift;
-   return join ",", ("cn=$cn", $self->getDatabaseBranchDN($domain));
-}
+sub delete_database {
+    my $self   = shift;
+    my $dbName = shift;
+    my $domain = shift;
 
+    my $dbInfo = $self->getDatabaseInfo($dbName);
 
-sub getDatabaseTypes {
-   my $self = shift;
-   my $db_types={};
-   $db_types->{"mysql"}="Mysql";
-   $db_types->{"pgsql"}="Postgresql";
-   $db_types->{"oracle"}="Oracle";
-   return $db_types;
-}
+    my $dn = $self->getDatabaseDN( $dbName, $domain );
+    if ( $self->branchExists($dn) ) {
 
+        if ( $self->deleteEntry($dn) ) {
+            $self->addProcessToHost(
+                $domain,
+                $dbInfo->{'ispmanDBHost'},
+                "DeleteDatabase",
+                join "&",
+                map { "$_=" . ((ref $dbInfo->{$_} eq "ARRAY")?join(",",@{$dbInfo->{$_}}):$dbInfo->{$_}) } keys %$dbInfo );
+        }
+        return 1;
+    }
+    return 0;
+}
 
 sub getDatabases {
-    my $self = shift;
-    my $domain   = shift;
-    my $dn=$self->getDatabaseBranchDN($domain);
+    my $self   = shift;
+    my $domain = shift;
 
-    my $dbHash =
-      $self->{'ldap'}
-      ->getEntriesAsHashRef( $dn, "&(objectclass=ispmanDatabaseData)(cn=*)",
-        ["cn"] );
+    my $dbHash = $self->getEntriesAsHashRef(
+        $self->getDatabaseBranchDN($domain),
+        "objectclass=ispmanDatabaseData",
+        ["ispmanDBName"]
+    );
     my $dbs;
     for ( keys %$dbHash ) {
-        $dbs->{ $dbHash->{$_}{'cn'} } = $_;
+        $dbs->{ $dbHash->{$_}{'ispmanDBName'} } = $_;
     }
     return $dbs;
 
@@ -193,27 +285,41 @@
 
 sub getDatabaseInfo {
     my $self   = shift;
-    my $domain = shift;
-    my $cn = shift;
-    my $dn;
-    my $dn=$self->getDatabaseDN($domain, $cn);
+    my $dbName = shift;
 
+    my $entry = $self->getEntryAsHashRef( $self->getConf("ldapBaseDN"),
+        "ispmanDBName=$dbName", '*', "sub" );
 
-    $self->{'dbInfo'}{$domain}{$cn} = $self->getEntryAsHashRef($dn);
-    return $self->{'dbInfo'}{$domain}{$cn};
+    return $entry;
+}
 
+sub getDatabaseBranchDN {
+    my $self   = shift;
+    my $domain = shift;
+    return "ou=databases,ispmanDomain=$domain," . $self->getConf('ldapBaseDN');
 }
 
+sub getDatabaseDN {
+    my $self   = shift;
+    my $dbName = shift;
+    my $domain = shift;
+
+    return "ispmanDBName=$dbName," . $self->getDatabaseBranchDN($domain);
+}
 
-sub addDatabaseProcess {
-    my $self = shift;
-    my ( $domain, $cn, $process ) = @_;
-    my $dbInfo=$self->getDatabaseInfo($domain, $cn);
-    my $param=join "&", map {"$_=$dbInfo->{$_}"} keys %$dbInfo;
-    $self->addProcessToHost( $domain, $dbInfo->{"ispmanDBHost"}, $process, $param );
-    return 1;
+sub getAllDatabaseCount {
+    my ($self) = @_;
+    return $self->getCount( $self->getConf('ldapBaseDN'),
+        "objectclass=ispmanDatabaseData" );
 }
 
+sub getDatabasesCount {
+    my $self   = shift;
+    my $domain = shift;
+
+    return $self->getCount( $self->getDatabaseBranchDN($domain),
+        "objectClass=ispmanDatabaseData" );
+}
 1;
 
 __END__


------------------------------------------------------------------------------