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__
------------------------------------------------------------------------------