Annotation of embedaddon/dhcp/omapip/omapi.3, revision 1.1.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>