summaryrefslogtreecommitdiffstats
path: root/src/hooks/dhcp/lease_cmds/lease_cmds.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/hooks/dhcp/lease_cmds/lease_cmds.h')
-rw-r--r--src/hooks/dhcp/lease_cmds/lease_cmds.h616
1 files changed, 616 insertions, 0 deletions
diff --git a/src/hooks/dhcp/lease_cmds/lease_cmds.h b/src/hooks/dhcp/lease_cmds/lease_cmds.h
new file mode 100644
index 0000000..1ea9e53
--- /dev/null
+++ b/src/hooks/dhcp/lease_cmds/lease_cmds.h
@@ -0,0 +1,616 @@
+// Copyright (C) 2017-2023 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef LEASE_CMDS_H
+#define LEASE_CMDS_H
+
+#include <cc/data.h>
+#include <hooks/hooks.h>
+
+#include <boost/shared_ptr.hpp>
+
+namespace isc {
+namespace lease_cmds {
+
+/// @brief Forward declaration of implementation class.
+class LeaseCmdsImpl;
+
+/// @brief Implements the logic for processing commands pertaining to
+/// lease manipulation.
+///
+/// This class is used by the callouts implementing command handlers for
+/// lease manipulations.
+class LeaseCmds {
+public:
+ /// @brief Constructor.
+ ///
+ /// It creates an instance of the @c LeaseCmdsImpl.
+ LeaseCmds();
+
+ /// @brief lease4-add, lease6-add command handler
+ ///
+ /// This command attempts to add a lease.
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// This function covers both v4 and v6 leases.
+ ///
+ /// Example command for v4:
+ /// {
+ /// "command": "lease4-add",
+ /// "parameters": {
+ /// "address": "192.0.2.1",
+ /// "hwaddr": "00:01:02:03:04:05",
+ /// "client-id": "this-is-a-client",
+ /// "valid-lft": 3600,
+ /// "expire": 12345678,
+ /// "subnet-id": 1,
+ /// "fqdn-fwd": true,
+ /// "fqdn-rev": true,
+ /// "hostname": "myhost.example.org",
+ /// "state": 0
+ /// }
+ /// }
+ /// Example command for v6:
+ /// {
+ /// "command": "lease6-add",
+ /// "arguments": {
+ /// "subnet-id": 66,
+ /// "ip-address": "2001:db8:abcd::",
+ /// "type": "IA_PD",
+ /// "prefix-len": 48,
+ /// "duid": "01:02:03:04:05:06:07:08",
+ /// "iaid": 1234,
+ /// "preferred-lft": 500,
+ /// "valid-lft": 1000,
+ /// "expire": 12345678,
+ /// "fqdn-fwd": true,
+ /// "fqdn-rev": true,
+ /// "hostname": "urania.example.org""
+ /// }
+ /// }
+ ///
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// add command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ leaseAddHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease6-bulk-apply command handler
+ ///
+ /// This command conveys information about multiple leases to be added,
+ /// updated or deleted. This command should be used instead of lease6-add,
+ /// lease6-update and lease6-del when it is desired to apply multiple
+ /// lease changes within a single transaction. This is much faster and
+ /// should be used in cases when the performance is critical. This
+ /// command was added as a result of our experience with High Availability
+ /// where multiple IPv6 addresses and/or prefixes can be allocated for
+ /// a single DHCPv6 packet.
+ ///
+ /// @note Unlike leaseX-del, this command does not support "update-ddns" and
+ /// this will not generate CHG_REMOVEs for deleted leases.
+ ///
+ /// Example structure of the command:
+ ///
+ /// {
+ /// "command": "lease6-bulk-apply",
+ /// "arguments": {
+ /// "deleted-leases": [
+ /// {
+ /// "subnet-id": 66,
+ /// "ip-address": "2001:db8:abcd::",
+ /// "type": "IA_PD",
+ /// ...
+ /// },
+ /// {
+ /// "subnet-id": 66,
+ /// "ip-address": "2001:db8:abcd::234",
+ /// "type": "IA_NA",
+ /// ...
+ /// }
+ /// ],
+ /// "leases": [
+ /// {
+ /// "subnet-id": 66,
+ /// "ip-address": "2001:db8:cafe::",
+ /// "type": "IA_PD",
+ /// ...
+ /// },
+ /// {
+ /// "subnet-id": 66,
+ /// "ip-address": "2001:db8:abcd::333",
+ /// "type": "IA_NA",
+ /// ...
+ /// }
+ /// ]
+ /// }
+ /// }
+ ///
+ /// The response indicates which of the leases failed to be applied.
+ /// For example:
+ ///
+ /// {
+ /// "result": 0,
+ /// "text": IPv6 leases bulk apply completed.
+ /// "arguments": {
+ /// "failed-deleted-leases": [
+ /// {
+ /// "subnet-id": 66,
+ /// "ip-address": "2001:db8:abcd::",
+ /// "type": "IA_PD"
+ /// }
+ /// ],
+ /// "failed-leases": [
+ /// {
+ /// "subnet-id": 66,
+ /// "ip-address": "2001:db8:cafe::",
+ /// "type": "IA_PD",
+ /// ...
+ /// }
+ /// ]
+ /// }
+ /// }
+ ///
+ /// The command handler first attempts to delete all leases listed in
+ /// the "deleted-leases" list. Next, it adds the leases listed in the
+ /// "leases" list. If any of these leases already exists, it is updated.
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// add command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease6BulkApplyHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-get, lease6-get command handler
+ ///
+ /// This command attempts to retrieve a lease that match selected criteria.
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// The following types of parameters are supported:
+ /// - (subnet-id, address) for both v4 and v6
+ /// - (subnet-id, identifier-type, identifier) for v4
+ /// - (subnet-id, type, iana, identifier-type, identifier) for v6
+ ///
+ /// Example command for query by (subnet-id, address):
+ /// {
+ /// "command": "lease4-get",
+ /// "arguments": {
+ /// "subnet-id": 1,
+ /// "ip-address": "192.0.2.202"
+ /// }
+ /// }
+ ///
+ /// Example command for query by (subnet-id, identifier-type, identifier)
+ /// {
+ /// "command": "lease4-get",
+ /// "arguments": {
+ /// "subnet-id": 1,
+ /// "identifier-type": "hw-address",
+ /// "identifier": "00:01:02:03:04:05"
+ /// }
+ /// }
+ ///
+ /// Example command for query by (subnet-id, type, iana, identifier-type,
+ /// identifier):
+ /// {
+ /// "command": "lease6-get",
+ /// "arguments": {
+ /// "subnet-id": 66,
+ /// "iaid": 42,
+ /// "type": "IA_NA",
+ /// "identifier-type": "duid",
+ /// "identifier": "77:77:77:77:77:77:77:77"
+ /// }
+ /// }
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// get command JSON text in the "command" argument
+ /// @return result of the operation (includes lease details, if found),
+ /// 1 if an error occurs, 3 if lease not found.
+ int
+ leaseGetHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-get-all, lease6-get-all commands handler
+ ///
+ /// These commands attempt to retrieve all IPv4 or IPv6 leases,
+ /// or all IPv4 or all IPv6 leases belonging to the particular
+ /// subnets. If no subnet identifiers are provided, it returns all
+ /// IPv4 or IPv6 leases from the database.
+ ///
+ /// Example command for IPv4 query by (subnet-ids):
+ /// {
+ /// "command": "lease4-get-all",
+ /// "arguments": {
+ /// "subnets": [ 1, 2, 3, 4 ]
+ /// }
+ /// }
+ ///
+ /// Example command for retrieving all IPv6 leases:
+ /// {
+ /// "command": "lease6-get-all",
+ /// }
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// get command JSON text in the "command" argument
+ /// @return 0 if the handler has been invoked successfully, 1 if an
+ /// error occurs, 3 if no leases are returned.
+ int
+ leaseGetAllHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-get-page, lease6-get-page commands handler
+ ///
+ /// These commands attempt to retrieve 1 page of all IPv4 or IPv6
+ /// leases. The size of the page is specified by the caller. The
+ /// caller also specifies the last address returned in the previous
+ /// page. The new page starts from the first address following the
+ /// address specified by the caller. If the first page should be
+ /// returned the IPv4 zero address, IPv6 zero address or the keyword
+ /// "start" should be provided instead of the last address.
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// get commands JSON text in the "command" argument.
+ /// @return 0 if the handler has been invoked successfully, 1 if an
+ /// error occurs, 3 if no leases are returned.
+ int
+ leaseGetPageHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-get-by-hw-address command handler
+ ///
+ /// This command attempts to retrieve all IPv4 leases with a particular
+ /// hardware address.
+ ///
+ /// Example command:
+ /// {
+ /// "command": "lease4-get-by-hw-address",
+ /// "arguments": {
+ /// "hwaddr": "00:01:02:03:04:05"
+ /// }
+ /// }
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// get command JSON text in the "command" argument
+ /// @return 0 if the handler has been invoked successfully, 1 if an
+ /// error occurs, 3 if no leases are returned.
+ int
+ leaseGetByHwAddressHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-get-by-client-id command handler
+ ///
+ /// This command attempts to retrieve all IPv4 leases with a particular
+ /// Client Id.
+ ///
+ /// Example command:
+ /// {
+ /// "command": "lease4-get-by-client-id",
+ /// "arguments": {
+ /// "client-id": "this-is-a-client"
+ /// }
+ /// }
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// get command JSON text in the "command" argument
+ /// @return 0 if the handler has been invoked successfully, 1 if an
+ /// error occurs, 3 if no leases are returned.
+ int
+ leaseGetByClientIdHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease6-get-by-duid command handler
+ ///
+ /// This command attempts to retrieve all IPv6 leases with a particular
+ /// DUID.
+ ///
+ /// Example command:
+ /// {
+ /// "command": "lease6-get-by-duid",
+ /// "arguments": {
+ /// "duid": "01:02:03:04:05:06:07:08"
+ /// }
+ /// }
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// get command JSON text in the "command" argument
+ /// @return 0 if the handler has been invoked successfully, 1 if an
+ /// error occurs, 3 if no leases are returned.
+ int
+ leaseGetByDuidHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-get-by-hostname and lease6-get-by-hostname commands
+ /// handler
+ ///
+ /// These commands attempt to retrieve all IPv4 or Ipv6 leases with
+ /// a particular hostname.
+ ///
+ /// Example command for v4:
+ /// {
+ /// "command": "lease4-get-by-hostname",
+ /// "arguments": {
+ /// "hostname": "urania.example.org"
+ /// }
+ /// }
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// get command JSON text in the "command" argument
+ /// @return 0 if the handler has been invoked successfully, 1 if an
+ /// error occurs, 3 if no leases are returned.
+ int
+ leaseGetByHostnameHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-del command handler
+ ///
+ /// This command attempts to delete an IPv4 lease that match selected
+ /// criteria.
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly. If the lease is deleted successfully, then a call
+ /// to @ref isc::dhcp::queueNCR() is issued, which to generate an
+ /// CHG_REMOVE request to kea-dhcp-ddns, if appropriate.
+ ///
+ /// Two types of parameters are supported: (subnet-id, address) or
+ /// (subnet-id, identifier-type, identifier).
+ ///
+ ///
+ /// Example command for deletion by (subnet-id, address):
+ /// {
+ /// "command": "lease4-del",
+ /// "arguments": {
+ /// "subnet-id": 1,
+ /// "ip-address": "192.0.2.202"
+ /// }
+ /// }
+ ///
+ /// Example command for deletion by (subnet-id, identifier-type, identifier)
+ /// {
+ /// "command": "lease4-del",
+ /// "arguments": {
+ /// "subnet-id": 1,
+ /// "identifier-type": "hw-address",
+ /// "identifier": "00:01:02:03:04:05"
+ /// }
+ /// }";
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// delete command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease4DelHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease6-del command handler
+ ///
+ /// This command attempts to delete a lease that match selected criteria.
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly. If the lease is deleted successfully, then a call
+ /// to @ref isc::dhcp::queueNCR() is issued, which to generate an
+ /// CHG_REMOVE request to kea-dhcp-ddns, if appropriate.
+ ///
+ /// Two types of parameters are supported: (subnet-id, address) or
+ /// (subnet-id, type, iaid, identifier-type, identifier).
+ ///
+ /// Example command for deletion by (subnet-id, address):
+ /// {
+ /// "command": "lease6-del",
+ /// "arguments": {
+ /// "subnet-id": 1,
+ /// "ip-address": "192.0.2.202"
+ /// }
+ /// }
+ ///
+ /// Example command for deletion by (subnet-id, type, iaid, identifier-type,
+ /// identifier):
+ /// {
+ /// "command": "lease6-del",
+ /// "arguments": {
+ /// "subnet-id": 1,
+ /// "type": "IA_NA",
+ /// "iaid": 123456,
+ /// "identifier-type": "hw-address",
+ /// "identifier": "00:01:02:03:04:05"
+ /// }
+ /// }";
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// delete command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease6DelHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-update handler
+ ///
+ /// This command attempts to update existing IPv4 lease. The parameters
+ /// specified will replace existing lease. The only condition is that
+ /// the IP address must not change. If you want to change the IP address,
+ /// please use lease4-del and lease4-add instead.
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// Example command:
+ /// {
+ /// "command": "lease4-update",
+ /// "arguments": {
+ /// "subnet-id": 44,
+ /// "ip-address": "192.0.2.1",
+ /// "hw-address": "1a:1b:1c:1d:1e:1f",
+ /// "hostname": "newhostname.example.org"
+ /// }
+ /// };
+ ///
+ /// The optional 'force-create' boolean parameter may be specified to force
+ /// the lease to be created if it doesn't exist. By default, this parameter
+ /// is set to false, which means that the lease is not created.
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// update command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease4UpdateHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease6-update handler
+ ///
+ /// This command attempts to update existing IPv6 lease. The parameters
+ /// specified will replace existing lease. The only condition is that
+ /// the IP address must not change. If you want to change the IP address,
+ /// please use lease6-del and lease6-add instead.
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// Example command:
+ /// {
+ /// "command": "lease6-update",
+ /// "arguments": {
+ /// "subnet-id": 66,
+ /// "ip-address": "2001:db8::1",
+ /// "iaid": 7654321,
+ /// "duid": "88:88:88:88:88:88:88:88",
+ /// "hostname": "newhostname.example.org"
+ /// }
+ /// }";
+ ///
+ /// The optional 'force-create' boolean parameter may be specified to force
+ /// the lease to be created if it doesn't exist. By default, this parameter
+ /// is set to false, which means that the lease is not created.
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// update command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease6UpdateHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-wipe handler
+ ///
+ /// This commands attempts to remove all IPv4 leases from a specific
+ /// subnet. Currently the leases are removed from the database,
+ /// without any processing (like calling hooks or doing DDNS
+ /// cleanups).
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// Example command:
+ /// {
+ /// "command": "lease4-wipe",
+ /// "arguments": {
+ /// "subnet-id": 44
+ /// }
+ /// }";
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// wipe command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease4WipeHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease6-wipe handler
+ ///
+ /// This commands attempts to remove all IPv4 leases from a specific
+ /// subnet. Currently the leases are removed from the database,
+ /// without any processing (like calling hooks or doing DDNS
+ /// cleanups).
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// Example command:
+ /// {
+ /// "command": "lease6-wipe",
+ /// "arguments": {
+ /// "subnet-id": 44
+ /// }
+ /// };
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// wipe command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease6WipeHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-resend-ddns command handler
+ ///
+ /// This command attempts to resend the DDNS updates for the IPv4 lease that
+ /// matches the selection criteria.
+ ///
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// A single parameter is supported: ip-address:
+ ///
+ /// Example command to resend DDNS based on existing FDQN and flags
+ /// {
+ /// "command": "lease4-resend-ddns",
+ /// "arguments": {
+ /// "ip-address": "192.0.2.202"
+ /// }
+ /// }
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// lease4-resend-ddns command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease4ResendDdnsHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease6-resend-ddns command handler
+ ///
+ /// This command attempts to resend the DDNS updates for the IPv6 lease that
+ /// matches the selection criteria.
+ ///
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// A single parameter is supported: ip-address:
+ ///
+ /// Example command to resend DDNS based on existing FDQN and flags
+ /// {
+ /// "command": "lease6-resend-ddns",
+ /// "arguments": {
+ /// "ip-address": "2001:db8:abcd::",
+ /// }
+ /// }
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// lease6-resend-ddns command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ lease6ResendDdnsHandler(hooks::CalloutHandle& handle);
+
+ /// @brief lease4-write handler, lease6-write handler
+ ///
+ /// This commands attempts to write the lease database to a CSV file.
+ /// Currently it is supported only by the memfile database and
+ /// should be reserved to emergency situations.
+ /// It extracts the command name and arguments from the given CalloutHandle,
+ /// attempts to process them, and then set's the handle's "response"
+ /// argument accordingly.
+ ///
+ /// Example command:
+ /// {
+ /// "command": "lease4-write",
+ /// "arguments": {
+ /// "filename": "leases.csv"
+ /// }
+ /// }";
+ ///
+ /// @param handle Callout context - which is expected to contain the
+ /// write command JSON text in the "command" argument
+ /// @return result of the operation
+ int
+ leaseWriteHandler(hooks::CalloutHandle& handle);
+
+private:
+ /// Pointer to the actual implementation
+ boost::shared_ptr<LeaseCmdsImpl> impl_;
+};
+
+};
+};
+
+#endif