Annotation of embedaddon/dhcp/omapip/omapi.3, revision 1.1
1.1 ! misho 1: .\" omapi.3
! 2: .\"
! 3: .\" Copyright (c) 2009-2010 by Internet Systems Consortium, Inc. ("ISC")
! 4: .\" Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
! 5: .\" Copyright (c) 2000-2003 by Internet Software Consortium
! 6: .\"
! 7: .\" Permission to use, copy, modify, and distribute this software for any
! 8: .\" purpose with or without fee is hereby granted, provided that the above
! 9: .\" copyright notice and this permission notice appear in all copies.
! 10: .\"
! 11: .\" THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
! 12: .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 13: .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
! 14: .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 15: .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 16: .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 17: .\" OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 18: .\"
! 19: .\" Internet Systems Consortium, Inc.
! 20: .\" 950 Charter Street
! 21: .\" Redwood City, CA 94063
! 22: .\" <info@isc.org>
! 23: .\" https://www.isc.org/
! 24: .\"
! 25: .\" This software has been written for Internet Systems Consortium
! 26: .\" by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
! 27: .\"
! 28: .\" Support and other services are available for ISC products - see
! 29: .\" https://www.isc.org for more information or to learn more about ISC.
! 30: .\"
! 31: .TH omapi 3
! 32: .SH NAME
! 33: OMAPI - Object Management Application Programming Interface
! 34: .SH DESCRIPTION
! 35: .PP
! 36: OMAPI is an programming layer designed for controlling remote
! 37: applications, and for querying them for their state. It is currently
! 38: used by the ISC DHCP server and this outline addresses the parts of
! 39: OMAPI appropriate to the clients of DHCP server. It does this by also
! 40: describing the use of a thin API layered on top of OMAPI called
! 41: \'dhcpctl\'
! 42: .PP
! 43: OMAPI uses TCP/IP as the transport for server communication, and
! 44: security can be imposed by having the client and server
! 45: cryptographically sign messages using a shared secret.
! 46: .PP
! 47: dhcpctl works by presenting the client with handles to objects that
! 48: act as surrogates for the real objects in the server. For example a
! 49: client will create a handle for a lease object, and will request the
! 50: server to fill the lease handle's state. The client application can
! 51: then pull details such as the lease expiration time from the lease
! 52: handle.
! 53: .PP
! 54: Modifications can be made to the server state by creating handles to
! 55: new objects, or by modifying attributes of handles to existing
! 56: objects, and then instructing the server to update itself according to
! 57: the changes made.
! 58: .SH USAGE
! 59: .PP
! 60: The client application must always call dhcpctl_initialize() before
! 61: making calls to any other dhcpctl functions. This initializes
! 62: various internal data structures.
! 63: .PP
! 64: To create the connection to the server the client must use
! 65: dhcpctl_connect() function. As well as making the physical connection
! 66: it will also set up the connection data structures to do
! 67: authentication on each message, if that is required.
! 68: .PP
! 69: All the dhcpctl functions return an integer value of type
! 70: isc_result_t. A successful call will yield a result of
! 71: ISC_R_SUCCESS. If the call fails for a reason local to the client
! 72: (e.g. insufficient local memory, or invalid arguments to the call)
! 73: then the return value of the dhcpctl function will show that. If the
! 74: call succeeds but the server couldn't process the request the error
! 75: value from the server is returned through another way, shown below.
! 76: .PP
! 77: The easiest way to understand dhcpctl is to see it in action. The
! 78: following program is fully functional, but almost all error checking
! 79: has been removed to make is shorter and easier to understand. This
! 80: program will query the server running on the localhost for the details
! 81: of the lease for IP address 10.0.0.101. It will then print out the time
! 82: the lease ends.
! 83: .PP
! 84: .nf
! 85: #include <stdarg.h>
! 86: #include <sys/time.h>
! 87: #include <sys/socket.h>
! 88: #include <stdio.h>
! 89: #include <netinet/in.h>
! 90:
! 91: #include <isc/result.h>
! 92: #include <dhcpctl/dhcpctl.h>
! 93:
! 94: int main (int argc, char **argv) {
! 95: dhcpctl_data_string ipaddrstring = NULL;
! 96: dhcpctl_data_string value = NULL;
! 97: .fi
! 98: .PP
! 99: All modifications of handles and all accesses of handle data happen
! 100: via dhcpctl_data_string objects.
! 101: .PP
! 102: .nf
! 103: dhcpctl_handle connection = NULL;
! 104: dhcpctl_handle lease = NULL;
! 105: isc_result_t waitstatus;
! 106: struct in_addr convaddr;
! 107: time_t thetime;
! 108:
! 109: dhcpctl_initialize ();
! 110: .fi
! 111: .PP
! 112: Required first step.
! 113: .PP
! 114: .nf
! 115: dhcpctl_connect (&connection, "127.0.0.1",
! 116: 7911, 0);
! 117: .fi
! 118: .PP
! 119: Sets up the connection to the server. The server normally listens on
! 120: port 7911 unless configured to do otherwise.
! 121: .PP
! 122: .nf
! 123: dhcpctl_new_object (&lease, connection,
! 124: "lease");
! 125: .fi
! 126: .PP
! 127: Here we create a handle to a lease. This call just sets up local data
! 128: structure. The server hasn't yet made any association between the
! 129: client's data structure and any lease it has.
! 130: .PP
! 131: .nf
! 132: memset (&ipaddrstring, 0, sizeof
! 133: ipaddrstring);
! 134:
! 135: inet_pton(AF_INET, "10.0.0.101",
! 136: &convaddr);
! 137:
! 138: omapi_data_string_new (&ipaddrstring,
! 139: 4, MDL);
! 140: .fi
! 141: .PP
! 142: Create a new data string to storing in the handle.
! 143: .PP
! 144: .nf
! 145: memcpy(ipaddrstring->value, &convaddr.s_addr, 4);
! 146:
! 147: dhcpctl_set_value (lease, ipaddrstring,
! 148: "ip-address");
! 149: .fi
! 150: .PP
! 151: We're setting the ip-address attribute of the lease handle to the
! 152: given address. We've not set any other attributes so when the server
! 153: makes the association the ip address will be all it uses to look up
! 154: the lease in its tables.
! 155: .PP
! 156: .nf
! 157: dhcpctl_open_object (lease, connection, 0);
! 158: .fi
! 159: .PP
! 160: Here we prime the connection with the request to look up the lease in
! 161: the server and fill up the local handle with the attributes the server
! 162: will send over in its answer.
! 163: .PP
! 164: .nf
! 165: dhcpctl_wait_for_completion (lease,
! 166: &waitstatus);
! 167: .fi
! 168: .PP
! 169: This call causes the message to get sent to the server (the message to
! 170: look up the lease and send back the attribute values in the
! 171: answer). The value in the variable waitstatus when the function
! 172: returns will be the result from the server. If the message could
! 173: not be processed properly by the server then the error will be
! 174: reflected here.
! 175: .PP
! 176: .nf
! 177: if (waitstatus != ISC_R_SUCCESS) {
! 178: /* server not authoritative */
! 179: exit (0);
! 180: }
! 181:
! 182: dhcpctl_data_string_dereference(&ipaddrstring,
! 183: MDL);
! 184: .fi
! 185: .PP
! 186: Clean-up memory we no longer need.
! 187: .PP
! 188: .nf
! 189: dhcpctl_get_value (&value, lease, "ends");
! 190: .fi
! 191: .PP
! 192: Get the attribute named ``ends'' from the lease handle. This is a
! 193: 4-byte integer of the time (in unix epoch seconds) that the lease
! 194: will expire.
! 195: .PP
! 196: .nf
! 197:
! 198: memcpy(&thetime, value->value, value->len);
! 199: dhcpctl_data_string_dereference(&value, MDL);
! 200:
! 201: fprintf (stdout, "ending time is %s",
! 202: ctime(&thetime));
! 203: }
! 204:
! 205: .fi
! 206: .SH AUTHENTICATION
! 207: If the server demands authenticated connections then before opening
! 208: the connection the user must call dhcpctl_new_authenticator.
! 209: .PP
! 210: .nf
! 211: dhcpctl_handle authenticator = NULL;
! 212: const char *keyname = "a-key-name";
! 213: const char *algorithm = "hmac-md5";
! 214: const char *secret = "a-shared-secret";
! 215:
! 216: dhcpctl_new_authenticator (&authenticator,
! 217: keyname,
! 218: algorithm,
! 219: secret,
! 220: strlen(secret) + 1);
! 221: .fi
! 222: .PP
! 223: The keyname, algorithm and must all match what is specified in the server's
! 224: dhcpd.conf file, excepting that the secret should appear in \'raw\' form, not
! 225: in base64 as it would in dhcpd.conf:
! 226: .PP
! 227: .nf
! 228: key "a-key-name" {
! 229: algorithm hmac-md5;
! 230: secret "a-shared-secret";
! 231: };
! 232:
! 233: # Set the omapi-key value to use
! 234: # authenticated connections
! 235: omapi-key a-key-name;
! 236: .fi
! 237: .PP
! 238: The authenticator handle that is created by the call to
! 239: dhcpctl_new_authenticator must be given as the last (the 4th) argument
! 240: to the call to dhcpctl_connect(). All messages will then be signed
! 241: with the given secret string using the specified algorithm.
! 242: .SH SEE ALSO
! 243: dhcpctl(3), omshell(1), dhcpd(8), dhclient(8), dhcpd.conf(5), dhclient.conf(5).
! 244: .SH AUTHOR
! 245: .B omapi
! 246: was created by Ted Lemon of Nominum, Inc. This documentation was
! 247: written by James Brister of Nominum, Inc.
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>