]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#396,!205] Handle audit for pool specific options.
authorMarcin Siodelski <marcin@isc.org>
Thu, 24 Jan 2019 15:25:47 +0000 (16:25 +0100)
committerMarcin Siodelski <marcin@isc.org>
Wed, 30 Jan 2019 09:18:59 +0000 (10:18 +0100)
src/hooks/dhcp/mysql_cb/mysql_cb_dhcp4.cc
src/hooks/dhcp/mysql_cb/tests/mysql_cb_dhcp4_unittest.cc
src/share/database/scripts/mysql/dhcpdb_create.mysql

index 4a15d0bfe899804ccbc6388a7df425ef6275a25f..75ab68c22a962f8e0dff8998c20b6cdeef2be3bc 100644 (file)
@@ -1394,7 +1394,7 @@ public:
                       << pool_end_address);
         }
 
-        createUpdateOption4(server_selector, pool_id, option, true);
+        createUpdateOption4(server_selector, pool_id, option, false);
     }
 
 
@@ -1433,13 +1433,7 @@ public:
             MySqlBinding::createTimestamp(option->getModificationTime())
         };
 
-        boost::scoped_ptr<MySqlTransaction> transaction;
-        // Only start new transaction if specified to do so. This function may
-        // be called from within an existing transaction in which case we
-        // don't start the new one.
-        if (!cascade_update) {
-            transaction.reset(new MySqlTransaction(conn_));
-        }
+        MySqlTransaction transaction(conn_);
 
         OptionDescriptorPtr existing_option = getOption4(server_selector, pool_id,
                                                          option->option_->getType(),
@@ -1465,9 +1459,7 @@ public:
             insertOption4(server_selector, in_bindings);
         }
 
-        if (transaction) {
-            transaction->commit();
-        }
+        transaction.commit();
     }
 
     /// @brief Sends query to insert or update DHCP option in a shared network.
index e39c87efcbbdd6ac685191fa5fc800f65b8b1b1f..71b3f4ce0a5ba413c44ee411ff3fa8948beb44df 100644 (file)
@@ -1370,6 +1370,13 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeletePoolOption4) {
     Subnet4Ptr subnet = test_subnets_[1];
     cbptr_->createUpdateSubnet4(ServerSelector::ALL(), subnet);
 
+    {
+        SCOPED_TRACE("CREATE audit entry for a subnet");
+        testNewAuditEntry("dhcp4_subnet",
+                          AuditEntry::ModificationType::CREATE,
+                          "subnet set");
+    }
+
     // Add an option into the pool.
     const PoolPtr pool = subnet->getPool(Lease::TYPE_V4, IOAddress("192.0.2.10"));
     ASSERT_TRUE(pool);
@@ -1395,6 +1402,15 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeletePoolOption4) {
     ASSERT_TRUE(returned_opt_boot_file_name.option_);
     EXPECT_TRUE(returned_opt_boot_file_name.equals(*opt_boot_file_name));
 
+    {
+        SCOPED_TRACE("UPDATE audit entry for a subnet after adding an option "
+                     "to the pool");
+        testNewAuditEntry("dhcp4_subnet",
+                          AuditEntry::ModificationType::UPDATE,
+                          "pool specific option set");
+    }
+
+
     // Modify the option and update it in the database.
     opt_boot_file_name->persistent_ = !opt_boot_file_name->persistent_;
     cbptr_->createUpdateOption4(ServerSelector::ALL(),
@@ -1416,6 +1432,14 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeletePoolOption4) {
     ASSERT_TRUE(returned_opt_boot_file_name.option_);
     EXPECT_TRUE(returned_opt_boot_file_name.equals(*opt_boot_file_name));
 
+    {
+        SCOPED_TRACE("UPDATE audit entry for a subnet when updating pool "
+                     "specific option");
+        testNewAuditEntry("dhcp4_subnet",
+                          AuditEntry::ModificationType::UPDATE,
+                          "pool specific option set");
+    }
+
     // Deleting an option with explicitly specified server tag should fail.
     EXPECT_EQ(0, cbptr_->deleteOption4(ServerSelector::ONE("server1"),
                                        pool->getFirstAddress(),
@@ -1442,6 +1466,14 @@ TEST_F(MySqlConfigBackendDHCPv4Test, createUpdateDeletePoolOption4) {
     // Option should be gone.
     EXPECT_FALSE(returned_pool2->getCfgOption()->get(DHCP4_OPTION_SPACE,
                                                      DHO_BOOT_FILE_NAME).option_);
+
+    {
+        SCOPED_TRACE("UPDATE audit entry for a subnet when deleting pool "
+                     "specific option");
+        testNewAuditEntry("dhcp4_subnet",
+                          AuditEntry::ModificationType::UPDATE,
+                          "pool specific option deleted");
+    }
 }
 
 // This test verifies that shared network level option can be added,
index 06912f8dc9c8802ea1dfff8ec22fe1056419ad9d..a4d263e6800bebbc10d49f383aa09255e09e0646 100644 (file)
@@ -1570,11 +1570,13 @@ CREATE PROCEDURE createOptionAuditDHCP4(IN modification_type TINYINT(1),
                                         IN option_id BIGINT(20) UNSIGNED,
                                         IN subnet_id INT(10) UNSIGNED,
                                         IN host_id INT(10) UNSIGNED,
-                                        IN network_name VARCHAR(128))
+                                        IN network_name VARCHAR(128),
+                                        IN pool_id BIGINT(20))
 BEGIN
-    # This variable will hold shared network id that we will retrieve
-    # by matching it name.
+    # These variables will hold shared network id and subnet id that
+    # we will select.
     DECLARE snid VARCHAR(128);
+    DECLARE sid INT(10) UNSIGNED;
 
     # Cascade transaction flag is set to 1 to prevent creation of
     # the audit entries for the options when the options are
@@ -1605,11 +1607,16 @@ BEGIN
             CALL createAuditEntryDHCP4('hosts', host_id, 1);
         ELSEIF scope_id = 4 THEN
             # If shared network specific option is added or modified,
-            # created audit entry for the shared network which
+            # create audit entry for the shared network which
             # indicates that it should be treated as the shared
             # network update.
            SELECT id INTO snid FROM dhcp4_shared_network WHERE name = network_name LIMIT 1;
            CALL createAuditEntryDHCP4('dhcp4_shared_network', snid, 1);
+        ELSEIF scope_id = 5 THEN
+            # If pool specific option is added or modified, create
+            # audit entry for the subnet which this pool belongs to.
+            SELECT dhcp4_pool.subnet_id INTO sid FROM dhcp4_pool WHERE id = pool_id;
+            CALL createAuditEntryDHCP4('dhcp4_subnet', sid, 1);
         END IF;
     END IF;
 END $$
@@ -1621,7 +1628,7 @@ CREATE TRIGGER dhcp4_options_AINS AFTER INSERT ON dhcp4_options
     FOR EACH ROW
     BEGIN
         CALL createOptionAuditDHCP4(0, NEW.scope_id, NEW.option_id, NEW.dhcp4_subnet_id,
-                                    NEW.host_id, NEW.shared_network_name);
+                                    NEW.host_id, NEW.shared_network_name, NEW.pool_id);
     END $$
 DELIMITER ;
 
@@ -1631,7 +1638,7 @@ CREATE TRIGGER dhcp4_options_AUPD AFTER UPDATE ON dhcp4_options
     FOR EACH ROW
     BEGIN
         CALL createOptionAuditDHCP4(1, NEW.scope_id, NEW.option_id, NEW.dhcp4_subnet_id,
-                                    NEW.host_id, NEW.shared_network_name);
+                                    NEW.host_id, NEW.shared_network_name, NEW.pool_id);
     END $$
 DELIMITER ;
 
@@ -1641,7 +1648,7 @@ CREATE TRIGGER dhcp4_options_ADEL AFTER DELETE ON dhcp4_options
     FOR EACH ROW
     BEGIN
         CALL createOptionAuditDHCP4(2, OLD.scope_id, OLD.option_id, OLD.dhcp4_subnet_id,
-                                    OLD.host_id, OLD.shared_network_name);
+                                    OLD.host_id, OLD.shared_network_name, OLD.pool_id);
     END $$
 DELIMITER ;