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>