]> git.proxmox.com Git - pmg-api.git/blobdiff - PMG/RuleDB.pm
PMG/Config.pm: allow single address setups
[pmg-api.git] / PMG / RuleDB.pm
index d3581d750b2516a3519f079a05edc4e9e582e382..542fd4a21f8164f552d6e2149b42a4a85c108194 100644 (file)
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 use DBI;
 use HTML::Entities;
+use Data::Dumper;
 
 use PVE::SafeSyslog;
 
@@ -22,9 +23,8 @@ use PMG::RuleDB::IPAddress;
 use PMG::RuleDB::IPNet;
 use PMG::RuleDB::Domain;
 use PMG::RuleDB::ReceiverDomain;
-# fixme:
-#use Proxmox::RuleDB::LDAP;
-#use Proxmox::RuleDB::LDAPUser;
+use PMG::RuleDB::LDAP;
+use PMG::RuleDB::LDAPUser;
 use PMG::RuleDB::TimeFrame;
 use PMG::RuleDB::Spam;
 use PMG::RuleDB::ReportSpam;
@@ -61,6 +61,43 @@ sub close {
     $self->{dbh}->disconnect();
 }
 
+sub create_group_with_obj {
+    my ($self, $obj, $name, $info) = @_;
+
+    my $og;
+    my $id;
+
+    defined($obj) || die "proxmox: undefined object";
+
+    $name //= '';
+    $info //= '';
+
+    eval {
+
+       $self->{dbh}->begin_work;
+
+        $self->{dbh}->do("INSERT INTO Objectgroup (Name, Info, Class) " .
+                        "VALUES (?, ?, ?)", undef,
+                        $name, $info, $obj->oclass());
+
+       my $lid = PMG::Utils::lastid($self->{dbh}, 'objectgroup_id_seq');
+
+       $og = PMG::RuleDB::Group->new($name, $info, $obj->oclass());
+       $og->{id} = $lid;
+
+       $obj->{ogroup} = $lid;
+       $id = $obj->save($self, 1);
+       $obj->{id} = $id; # just to be sure
+
+        $self->{dbh}->commit;
+    };
+    if (my $err = $@) {
+       $self->{dbh}->rollback;
+       die $err;
+    }
+    return $og;
+}
+
 sub load_groups {
     my ($self, $rule) = @_;
 
@@ -78,7 +115,7 @@ sub load_groups {
 
     $sth->execute($rule->{id});
 
-    my ($from, $to, $when, $what, $action) = ((), (), (), (), ());
+    my ($from, $to, $when, $what, $action) = ([], [], [], [], []);
 
     while (my $ref = $sth->fetchrow_hashref()) {
        my $og = PMG::RuleDB::Group->new($ref->{name}, $ref->{info});
@@ -106,6 +143,21 @@ sub load_groups {
     return ($from, $to, $when, $what, $action);
 }
 
+sub load_groups_by_name {
+    my ($self, $rule) = @_;
+
+    my ($from, $to, $when, $what, $action) =
+       $self->load_groups($rule);
+
+    return {
+       from => $from,
+       to => $to,
+       when => $when,
+       what => $what,
+       action => $action,
+    };
+}
+
 sub save_group {
     my ($self, $og) = @_;
 
@@ -138,42 +190,6 @@ sub save_group {
     return undef;
 }
 
-sub new_action {
-    my ($self, $obj) = @_;
-
-    my $og;
-
-    defined($obj) || die "proxmox: undefined object";
-
-    eval {
-
-       $self->{dbh}->begin_work;
-
-        $self->{dbh}->do("INSERT INTO Objectgroup " .
-                         "(Name, Info, Class) " .
-                         "VALUES (?, ?, ?)", undef,
-                         decode_entities($obj->otype_text()),
-                         $obj->oinfo(),
-                         $obj->oclass());
-
-       my $lid = PMG::Utils::lastid($self->{dbh}, 'objectgroup_id_seq');
-
-       $og = PMG::RuleDB::Group->new();
-       $og->{id} = $lid;
-
-       $obj->{ogroup} = $lid;
-       $obj->save($self, 1);
-
-        $self->{dbh}->commit;
-    };
-    if (my $err = $@) {
-       $self->{dbh}->rollback;
-       die $err;
-    }
-
-    return $og;
-}
-
 sub delete_group {
     my ($self, $groupid) = @_;
 
@@ -299,13 +315,12 @@ sub get_object {
     elsif ($otype == PMG::RuleDB::IPNet::otype) {
        $obj = PMG::RuleDB::IPNet->new();
     }
-# fixme
-#    elsif ($otype == Proxmox::RuleDB::LDAP::otype) {
-#      $obj = Proxmox::RuleDB::LDAP->new();
-#    }
-#    elsif ($otype == Proxmox::RuleDB::LDAPUser::otype) {
-#      $obj = Proxmox::RuleDB::LDAPUser->new();
-#    }
+    elsif ($otype == PMG::RuleDB::LDAP::otype) {
+       $obj = PMG::RuleDB::LDAP->new();
+    }
+    elsif ($otype == PMG::RuleDB::LDAPUser::otype) {
+       $obj = PMG::RuleDB::LDAPUser->new();
+    }
     # WHEN OBJECTS
     elsif ($otype == PMG::RuleDB::TimeFrame::otype) {
        $obj = PMG::RuleDB::TimeFrame->new();
@@ -424,6 +439,22 @@ sub load_object {
     $obj->load_attr($self, $objid, $ogroup, $value);
 }
 
+sub load_object_full {
+    my ($self, $id, $gid, $exp_otype) = @_;
+
+    my $obj = $self->load_object($id);
+    die "object '$id' does not exists\n" if !defined($obj);
+
+    my $otype = $obj->otype();
+    die "wrong object type ($otype != $exp_otype)\n"
+       if defined($exp_otype) && $otype != $exp_otype;
+
+    die "wrong object group ($obj->{ogroup} != $gid)\n"
+       if $obj->{ogroup} != $gid;
+
+    return $obj;
+}
+
 sub load_group_by_name {
     my ($self, $name) = @_;
 
@@ -628,18 +659,19 @@ sub delete_testrules {
     return 1;
 }
 
-sub create_group_with_obj {
-    my ($self, $obj, $name, $desc) = @_;
-
-    my $og = PMG::RuleDB::Group->new($name, $desc, $obj->oclass());
-    $self->save_group($og);
-    $self->group_add_object($og, $obj);
-
-    return $og;
-}
+my $grouptype_hash = {
+    from => 0,
+    to => 1,
+    when => 2,
+    what => 3,
+    action => 4,
+};
 
 sub rule_add_group {
-    my ($self, $ruleid, $groupid, $gtype) = @_;
+    my ($self, $ruleid, $groupid, $gtype_str) = @_;
+
+    my $gtype = $grouptype_hash->{$gtype_str} //
+       die "unknown group type '$gtype_str'\n";
 
     defined($ruleid) || die "undefined rule id: ERROR";
     defined($groupid) || die "undefined group id: ERROR";
@@ -655,35 +687,38 @@ sub rule_add_group {
 sub rule_add_from_group {
     my ($self, $rule, $group) = @_;
 
-    $self->rule_add_group($rule->{id}, $group->{id}, 0);
+    $self->rule_add_group($rule->{id}, $group->{id}, 'from');
 }
 
 sub rule_add_to_group {
     my ($self, $rule, $group) = @_;
 
-    $self->rule_add_group($rule->{id}, $group->{id}, 1);
+    $self->rule_add_group($rule->{id}, $group->{id}, 'to');
 }
 
 sub rule_add_when_group {
     my ($self, $rule, $group) = @_;
 
-    $self->rule_add_group($rule->{id}, $group->{id}, 2);
+    $self->rule_add_group($rule->{id}, $group->{id}, 'when');
 }
 
 sub rule_add_what_group {
     my ($self, $rule, $group) = @_;
 
-    $self->rule_add_group($rule->{id}, $group->{id}, 3);
+    $self->rule_add_group($rule->{id}, $group->{id}, 'what');
 }
 
 sub rule_add_action {
     my ($self, $rule, $group) = @_;
 
-    $self->rule_add_group($rule->{id}, $group->{id}, 4);
+    $self->rule_add_group($rule->{id}, $group->{id}, 'action');
 }
 
 sub rule_remove_group {
-    my ($self, $ruleid, $groupid, $gtype) = @_;
+    my ($self, $ruleid, $groupid, $gtype_str) = @_;
+
+    my $gtype = $grouptype_hash->{$gtype_str} //
+       die "unknown group type '$gtype_str'\n";
 
     defined($ruleid) || die "undefined rule id: ERROR";
     defined($groupid) || die "undefined group id: ERROR";
@@ -708,6 +743,7 @@ sub load_rule {
     $sth->execute($id);
 
     my $ref = $sth->fetchrow_hashref();
+    die "rule '$id' does not exist\n" if !defined($ref);
 
     my $rule = PMG::RuleDB::Rule->new($ref->{name}, $ref->{priority},
                                      $ref->{active}, $ref->{direction});
@@ -797,7 +833,7 @@ Add an object group to the rule.
 
 Possible values for $gtype are:
 
-    0 = FROM, 1 = TO, 2 = WHEN, 3 = WHAT, 4 = ACTION
+    'from' 'to', 'when', 'what', 'action'
 
 =head3  $ruledb->rule_remove_group ($rule, $og, $gtype)