diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/itadmin.ctr |
Initial commit
Diffstat (limited to 'support/dktools/itadmin.ctr')
-rw-r--r-- | support/dktools/itadmin.ctr | 4125 |
1 files changed, 4125 insertions, 0 deletions
diff --git a/support/dktools/itadmin.ctr b/support/dktools/itadmin.ctr new file mode 100644 index 0000000000..f60d2c5835 --- /dev/null +++ b/support/dktools/itadmin.ctr @@ -0,0 +1,4125 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2012-xxxx +license = bsd + + + +%% header + +#include "dk3all.h" + + + +/** Computer owner/user. +*/ +typedef struct { + char const *us; /**< Short name, login name (primary key). */ + char const *tt; /**< Title, academic degree. */ + char const *sn; /**< Surname. */ + char const *na; /**< Family name. */ + char const *em; /**< E-mail address. */ + char const *cc; /**< ID in cost controlling. */ + char const *si; /**< Staff ID number. */ + dk3_sto_t *s_ho; /**< Hosts for user. */ + dk3_sto_it_t *i_ho; /**< Iterator for hosts storage. */ + dk3_sto_t *s_li; /**< Licenses assigned to user. */ + dk3_sto_it_t *i_li; /**< Iterator for licenses storage. */ +} itadmin_user; + + + +/** Building. +*/ +typedef struct { + char const *s; /**< Short name (primary key). */ + char const *l; /**< Full building name. */ + char const *a1; /**< Address line 1. */ + char const *a2; /**< Address line 2. */ + char const *a3; /**< Address line 3. */ + char const *a4; /**< Address line 4. */ + char const *zc; /**< Zip code (german: Postleitzahl). */ + char const *city; /**< City/Town name. */ +} itadmin_building; + + + +/** Speed for network connection. +*/ +typedef struct { + char const *s; /**< Short speed name (primary key). */ + char const *l; /**< Long speed name (description). */ +} itadmin_speed; + + + +/** VLAN. +*/ +typedef struct { + char const *s; /**< Short VLAN name (primary key). */ + char const *l; /**< Long VLAN name (description). */ + dk3_sto_t *s_nw; /**< Storage for networks. */ + dk3_sto_it_t *i_nw; /**< Iterator through networks storage. */ + dk3_sto_t *s_do; /**< DHCP options for VLAN. */ + dk3_sto_it_t *i_do; /**< Iterator through DHCP options. */ +} itadmin_vlan; + + + +/** Network connection socket. +*/ +typedef struct { + char const *s; /**< Short name (label on socket, pk). */ + char const *hp; /**< Hub port used for socket. */ + char const *room; /**< Room name or number in building. */ + itadmin_speed *sp; /**< Speed setting for socket. */ + itadmin_vlan *vl; /**< VLAN for socket. */ + itadmin_building *bu; /**< Building. */ +} itadmin_connect; + + + +/** Network. +*/ +typedef struct { + itadmin_vlan *vl; /**< Parent VLAN. */ + dk3_sto_t *s_p; /**< Storage for DHCP pools. */ + dk3_sto_it_t *i_p; /**< Iterator through pools storage. */ + dk3_sto_t *s_dg; /**< Storage for DHCP groups in network. */ + dk3_sto_it_t *i_dg; /**< Iterator through groups in nw storage. */ + dk3_sto_t *s_do; /**< DHCP options. */ + dk3_sto_it_t *i_do; /**< Iterator for DHCP options. */ + dk3_sto_t *s_hoi; /**< Storage for hosts. */ + dk3_sto_it_t *i_hoi; /**< Iterator for hosts storage. */ + dk3_sto_t *s_dc; /**< DHCP classes for this network. */ + dk3_sto_it_t *i_dc; /**< Iterator through DHCP classes storage. */ + unsigned long ip4; /**< IPv4 start address (primary key). */ + unsigned long ma4; /**< IPv4 network mask. */ + unsigned long gw4; /**< IPv4 gateway. */ + unsigned long bc4; /**< IPv4 broadcast address. */ +} itadmin_network; + + + +/** Netgroup. +*/ +typedef struct { + char const *sn; /**< Short name (primary key). */ + char const *ln; /**< Long name (description). */ + size_t no; /**< Netgroup number. */ +} itadmin_netgroup; + + + +/** Netgroup dependency. +*/ +typedef struct { + itadmin_netgroup *pa; /**< Parent group. */ + itadmin_netgroup *ch; /**< Child group. */ +} itadmin_ngdep; + + + +/** DHCP class. +*/ +typedef struct { + char const *sn; /**< Short name (primary key). */ + char const *ln; /**< Long name (description). */ + dk3_sto_t *s_ho; /**< Hosts in this class. */ + dk3_sto_it_t *i_ho; /**< Iterator through hosts storage. */ + itadmin_network *dhcpn; /**< Network for DHCP hosts. */ +} itadmin_dhcp_class; + + + +/** DHCP address pool. +*/ +typedef struct { + itadmin_network *nw; /**< Network. */ + itadmin_dhcp_class *acl; /**< Allowed DHCP class. */ + dk3_sto_t *s_do; /**< DHCP options for pool. */ + dk3_sto_it_t *i_do; /**< Iterator for DHCP options. */ + dk3_sto_t *s_hoi; /**< Hosts storage. */ + dk3_sto_it_t *i_hoi; /**< Hosts storage iterator. */ + unsigned long ip4s; /**< IPv4 start address. */ + unsigned long ip4e; /**< IPv4 end address. */ + char duc; /**< Flag: Deny unknown clients. */ + char auc; /**< Flag: Allow unknown clients. */ +} itadmin_dhcp_pool; + + + +/** DHCP group. +*/ +typedef struct { + char const *sn; /**< Short group name (primary key). */ + char const *ln; /**< Long name (description). */ + dk3_sto_t *s_do; /**< DHCP options storage. */ + dk3_sto_it_t *i_do; /**< DHCP options iterator. */ +} itadmin_dhcp_group; + + + +/** DHCP group within a network. +*/ +typedef struct { + itadmin_dhcp_group *gr; /**< Group. */ + dk3_sto_t *s_h; /**< Storage for hosts in this group. */ + dk3_sto_it_t *i_h; /**< Iterator for storage. */ +} itadmin_dhcp_ginw; + + + +/** Date (used for host expiration). +*/ +typedef struct { + int y; /**< Year. */ + int m; /**< Month. */ + int d; /**< Day in month. */ +} itadmin_date; + + + +/** Host. +*/ +typedef struct { + itadmin_date expi; /**< Expiration date. */ + char const *sn; /**< Short host name (primary key). */ + char const *co; /**< Comment, description. */ + char const *maca; /**< MAC address. */ + char const *room; /**< Room within the building. */ + char const *inv; /**< Inventory ID. */ + char const *serno; /**< Serial number. */ + char const *hid; /**< Host ID. */ + char const *dnsd; /**< DNS domain. */ + itadmin_user *un; /**< System owner. */ + itadmin_netgroup *ng; /**< Netgroup. */ + itadmin_dhcp_class *dc; /**< DHCP class. */ + itadmin_dhcp_group *dg; /**< DHCP group. */ + itadmin_dhcp_pool *dp; /**< DHCP pool. */ + itadmin_connect *nc; /**< Network connection socket. */ + itadmin_building *bu; /**< Building. */ + dk3_sto_t *s_al; /**< Storage for aliases. */ + dk3_sto_it_t *i_al; /**< Iterator through aliases storage. */ + dk3_sto_t *s_do; /**< DHCP options for host. */ + dk3_sto_it_t *i_do; /**< DHCP options iterator. */ + dk3_sto_t *s_li; /**< Licenses assigned to host. */ + dk3_sto_it_t *i_li; /**< Iterator through licenses storage. */ + unsigned long ipv4; /**< IPv4 address. */ + char fnf; /**< Flag: Full name first in hosts. */ + char fgu; /**< Flag: Guest computer. */ + char snd; /**< Flag: Skip in network documentation. */ + char saw; /**< Flag: Skip in arpwatch configuration. */ +} itadmin_host; + + + +/** Software manufacturer. +*/ +typedef struct { + char const *sn; /**< Short name (primary key). */ + char const *ln; /**< Full name. */ +} itadmin_swman; + + + +/** Software product. +*/ +typedef struct { + char const *sn; /**< Short name (primary key). */ + char const *ln; /**< Full name. */ + itadmin_swman *mn; /**< Software manufacturer. */ +} itadmin_swprod; + + + +/** License type. +*/ +typedef struct { + char const *sn; /**< Short name (primary key). */ + char const *ln; /**< Full name. */ + int num; /**< Number of client licenses. */ +} itadmin_lictype; + + + +/** Software license. +*/ +typedef struct { + itadmin_date d_del; /**< Delivery date. */ + itadmin_date d_inv; /**< Invoice date. */ + char const *order; /**< Internal order ID. */ + char const *notes; /**< Additional notes about the license. */ + char const *i_del; /**< Delivery note ID. */ + char const *i_inv; /**< Invoice ID. */ + itadmin_swprod *prod; /**< Software product. */ + itadmin_lictype *ltype; /**< License type. */ + itadmin_user *owner; /**< License owner. */ + itadmin_host *host; /**< Host where license is used. */ + unsigned long pk; /**< Primary key from database. */ +} itadmin_license; + + + +/** DHCP option. +*/ +typedef struct { + char const *k; /**< Key (option name). */ + char const *v; /**< Option value. */ + long pk; /**< Primary key from database. */ +} itadmin_dhcp_option; + + + +/** Job structure for the itadmin program. +*/ +typedef struct { + itadmin_date today; /**< Current date. */ + dk3_app_t *app; /**< Application structure. */ + dk3_option_set_t *opt; /**< Option set. */ + dk3_sto_t *s_us; /**< User storage. */ + dk3_sto_it_t *i_us; /**< User storage iterator. */ + dk3_sto_t *s_usn; /**< User sorted by name. */ + dk3_sto_it_t *i_usn; /**< Storage iterator for users by name. */ + dk3_sto_t *s_bu; /**< Building storage. */ + dk3_sto_it_t *i_bu; /**< Building storage iterator. */ + dk3_sto_t *s_sp; /**< Patch speed storage. */ + dk3_sto_it_t *i_sp; /**< Patch speed storage iterator. */ + dk3_sto_t *s_vl; /**< VLAN storage. */ + dk3_sto_it_t *i_vl; /**< VLAN storage iterator. */ + dk3_sto_t *s_pa; /**< Network patch storage. */ + dk3_sto_it_t *i_pa; /**< Network patch storage iterator. */ + dk3_sto_t *s_nw; /**< Network storage. */ + dk3_sto_it_t *i_nw; /**< Network storage iterator. */ + dk3_sto_t *s_ng; /**< Netgroup storage. */ + dk3_sto_it_t *i_ng; /**< Netgroup storage iterator. */ + dk3_sto_t *s_nd; /**< Netgroup dependency storage. */ + dk3_sto_it_t *i_nd; /**< Netgroup dependency storage iterator. */ + dk3_sto_t *s_dc; /**< DHCP class storage. */ + dk3_sto_it_t *i_dc; /**< DHCP class storage iterator. */ + dk3_sto_t *s_dp; /**< DHCP pool storage. */ + dk3_sto_it_t *i_dp; /**< DHCP pool storage iterator. */ + dk3_sto_t *s_dg; /**< DHCP group storage. */ + dk3_sto_it_t *i_dg; /**< DHCP group storage iterator. */ + dk3_sto_t *s_ho; /**< Host storage, sorted by name. */ + dk3_sto_it_t *i_ho; /**< Host storage iterator for s_ho. */ + dk3_sto_t *s_hoi; /**< Host storage, sorted by IP address. */ + dk3_sto_it_t *i_hoi; /**< Host storage iterator for s_hoi. */ + dk3_sto_t *s_sm; /**< Software manufacturer storage. */ + dk3_sto_it_t *i_sm; /**< Software manufacturer storage iterator. */ + dk3_sto_t *s_sw; /**< Software storage. */ + dk3_sto_it_t *i_sw; /**< Software storage iterator. */ + dk3_sto_t *s_lt; /**< License type storage. */ + dk3_sto_it_t *i_lt; /**< License type storage iterator. */ + dk3_sto_t *s_lc; /**< Licenses storage. */ + dk3_sto_it_t *i_lc; /**< Licenses storage iterator. */ + dk3_sto_t *s_lf; /**< Free licenses. */ + dk3_sto_it_t *i_lf; /**< Free licenses iterator. */ + dk3_sto_t *s_do; /**< DHCP options for entire server. */ + dk3_sto_it_t *i_do; /**< Iterator for DHCP options. */ + void *dbptr; /**< Database object pointer. */ + dk3_bm_t *ngdep; /**< Direct/indirect netgroup dependencies. */ + dk3_uc2lat_t *uc2l; /**< Unicode to LaTeX converter. */ + dkChar const * const *msg; /**< Localized message texts. */ + dkChar const * const *noloc; /**< Texts, not localized. */ + dkChar const *dbhn; /**< Database host name. */ + dkChar const *dbn; /**< Database name. */ + dkChar const *dbcf; /**< Database credentials files. */ + dkChar const *dbus; /**< Database user name. */ + dkChar const *dbpw; /**< Database password. */ + dkChar const *vlan; /**< VLAN name. */ + dkChar const *org; /**< Organization name. */ + dkChar const *ou; /**< Organizational unit name. */ + dkChar const *admn; /**< Administrator name. */ + dkChar const *ldapb; /**< LDAP base. */ + size_t nng; /**< Number of netgroups. */ + int exval; /**< Exit status code. */ + int ec; /**< Error code, see @ref errorcodes. */ + int cmd; /**< Command to execute. */ + int f_dh; /**< Flag: Write dhcpd.conf file. */ + int dbt; /**< Database type. */ + int gdate; /**< Flag: German date notation. */ + int hlh; /**< Flag: Have localhost entry. */ + int ukoma; /**< Flag: Use koma-script. */ + int rel; /**< Release lease on shutdown. */ +} itadmin_job; + + + +/** Reader structure for credentials file. +*/ +typedef struct { + itadmin_job *job; /**< Job structure. */ + int f_clnt; /**< Flag: In client section. */ +} itadmin_cred_reader; + + +/** @defgroup itadmincommand Command IDs for itadmin. */ +/**@{*/ +/** itadmin command: Rebuild configuration and network documentation. +*/ +#define ITADMIN_CMD_CONFIG 1 + +/** itadmin command: Rebuild license report. +*/ +#define ITADMIN_CMD_LICENSES 2 + +/** itadmin command: show help text. +*/ +#define ITADMIN_CMD_HELP 4 + +/** itadmin command: show version information. +*/ +#define ITADMIN_CMD_VERSION 8 + +/** itadmin command: show license terms. +*/ +#define ITADMIN_CMD_LICENSE_TERMS 16 +/**@}*/ + + + +/** Maximum size for configuration file lines. +*/ +#define ITADMIN_CONFIG_LINE_SIZE 256 + +/** Function to remove one object. +*/ +typedef void itadmin_obj_del(void *); + +#ifdef __cplusplus +extern "C" { +#endif + +/** Read configuration file(s). + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_config_read(itadmin_job *job); + +/** Delete one user. + @param v Object to delete. +*/ +void +itadmin_mem_user_del(void *v); + +/** Delete one building. + @param v Object to delete. +*/ +void +itadmin_mem_building_del(void *v); + +/** Delete one speed setting. + @param v Object to delete. +*/ +void +itadmin_mem_speed_del(void *v); + +/** Delete one VLAN. + @param v Object to delete. +*/ +void +itadmin_mem_vlan_del(void *v); + +/** Delete one network connection patch. + @param v Object to delete. +*/ +void +itadmin_mem_connect_del(void *v); + +/** Delete one network. + @param v Object to delete. +*/ +void +itadmin_mem_network_del(void *v); + +/** Delete one netgroup. + @param v Object to delete. +*/ +void +itadmin_mem_netgroup_del(void *v); + +/** Delete one netgroup dependency. + @param v Object to delete. +*/ +void +itadmin_mem_ngdep_del(void *v); + +/** Delete one DHCP class. + @param v Object to delete. +*/ +void +itadmin_mem_dhcp_class_del(void *v); + +/** Delete one DHCP pool. + @param v Object to delete. +*/ +void +itadmin_mem_dhcp_pool_del(void *v); + +/** Delete one DHCP group. + @param v Object to delete. +*/ +void +itadmin_mem_dhcp_group_del(void *v); + +/** Delete one host. + @param v Object to delete. +*/ +void +itadmin_mem_host_del(void *v); + +/** Delete one software manufacturer. + @param v Object to delete. +*/ +void +itadmin_mem_sw_man_del(void *v); + +/** Delete one software product. + @param v Object to delete. +*/ +void +itadmin_mem_software_del(void *v); + +/** Delete one license type. + @param v Object to delete. +*/ +void +itadmin_mem_lic_type_del(void *v); + +/** Delete one license. + @param v Object to delete. +*/ +void +itadmin_mem_license_del(void *v); + +/** Create new user. + @param job Job structure. + @param un Name. + @param tt Academic degree or title (may be NULL). + @param sn Surname (may be NULL). + @param na Name. + @param em E-Mail (may be NULL). + @param cc Cost control ID (may be NULL). + @param si Staff ID number (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_user * +itadmin_mem_user_new( + itadmin_job *job, + char const *un, + char const *tt, + char const *sn, + char const *na, + char const *em, + char const *cc, + char const *si +); + +/** Create new building. + @param job Job structure. + @param s Name. + @param l Long name (may be NULL). + @param a1 Address line 1 (typically street and number, + may be NULL). + @param a2 Address line 2 (may be NULL). + @param a3 Address line 3 (may be NULL). + @param a4 Address line 4 (may be NULL). + @param zc Zip code (may be NULL). + @param city Town or city name (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_building * +itadmin_mem_building_new( + itadmin_job *job, + char const *s, + char const *l, + char const *a1, + char const *a2, + char const *a3, + char const *a4, + char const *zc, + char const *city +); + +/** Create new speed setting. + @param job Job structure. + @param s Name. + @param n Description (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_speed * +itadmin_mem_speed_new( + itadmin_job *job, + char const *s, + char const *n +); + +/** Create new VLAN. + @param job Job structure. + @param s Name. + @param l Long name (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_vlan * +itadmin_mem_vlan_new( + itadmin_job *job, + char const *s, + char const *l +); + +/** Create new network connector. + @param job Job structure. + @param s Name. + @param hp Building. + @param room Room. + @param sp Speed setting. + @param vl VLAN. + @param bu Building. + @return Pointer to new object on success, NULL on error. +*/ +itadmin_connect * +itadmin_mem_connect_new( + itadmin_job *job, + char const *s, + char const *hp, + char const *room, + itadmin_speed *sp, + itadmin_vlan *vl, + itadmin_building *bu +); + +/** Create new network. + @param job Job structure. + @param ip4 Network address. + @param ma4 Network mask. + @param gw4 Gateway. + @param bc4 Broadcast address. + @param vl VLAN. + @return Pointer to new object on success, NULL on error. +*/ +itadmin_network * +itadmin_mem_network_new( + itadmin_job *job, + unsigned long ip4, + unsigned long ma4, + unsigned long gw4, + unsigned long bc4, + itadmin_vlan *vl +); + +/** Create new netgroup. + @param job Job structure. + @param sn Short name. + @param ln Long name (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_netgroup * +itadmin_mem_netgroup_new( + itadmin_job *job, + char const *sn, + char const *ln +); + +/** Create new netgroup dependency. + @param job Job structure. + @param pa Parent group. + @param ch Child group. + @return Pointer to new object on success, NULL on error. +*/ +itadmin_ngdep * +itadmin_mem_ngdep_new( + itadmin_job *job, + itadmin_netgroup *pa, + itadmin_netgroup *ch +); + +/** Create new DHCP class. + @param job Job structure. + @param sn Short name. + @param ln Long name (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_dhcp_class * +itadmin_mem_dhcp_class_new( + itadmin_job *job, + char const *sn, + char const *ln +); + +/** Create new DHCP pool. + @param job Job structure. + @param nw Network. + @param cn Allowed class (if unknown clients are denied, + may be NULL). + @param ip4s IPv4 start address. + @param ip4e IPv4 end address. + @param duc Flag: Deny unknown clients (needs cn). + @param auc Flag: Allow unknown clients. + @return Pointer to new object on success, NULL on error. +*/ +itadmin_dhcp_pool * +itadmin_mem_dhcp_pool_new( + itadmin_job *job, + itadmin_network *nw, + itadmin_dhcp_class *cn, + unsigned long ip4s, + unsigned long ip4e, + int duc, + int auc +); + +/** Create new DHCP group. + @param job Job structure. + @param sn Short name. + @param ln Long name (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_dhcp_group * +itadmin_mem_dhcp_group_new( + itadmin_job *job, + char const *sn, + char const *ln +); + +/** Create new host + @param job Job structure. + @param sn Short name. + @param co Comment/description (may be NULL). + @param maca MAC address (may be NULL). + @param room Room (may be NULL). + @param inv Inventory number (may be NULL). + @param serno Serial number (may be NULL). + @param hid Host ID (may be NULL). + @param expi Expiration date (may be NULL). + @param dnsd DNS domain (may be NULL). + @param un System owner. + @param ng Netgroup (may be NULL). + @param dc DHCP class (may be NULL). + @param dg DHCP group (may be NULL). + @param nc Network connection socket (may be NULL). + @param bu Building (may be NULL). + @param ipv4 IPv4 address (may be NULL). + @param fnf Flag: FQDN first in hosts file. + @param fgu Flag: Guest computer (bring your own device). + @param snd Flag: Skip in network documentation. + @param saw Flag: Skip in arpwatch configuration. + @return Pointer to new object on success, NULL on error. +*/ +itadmin_host * +itadmin_mem_host_new( + itadmin_job *job, + itadmin_date *expi, + char const *sn, + char const *co, + char const *maca, + char const *room, + char const *inv, + char const *serno, + char const *hid, + char const *dnsd, + itadmin_user *un, + itadmin_netgroup *ng, + itadmin_dhcp_class *dc, + itadmin_dhcp_group *dg, + itadmin_connect *nc, + itadmin_building *bu, + unsigned long ipv4, + int fnf, + int fgu, + int snd, + int saw +); + +/** Create new software manufacturer. + @param job Job structure. + @param sn Short name. + @param ln Long name (description). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_swman * +itadmin_mem_sw_man_new( + itadmin_job *job, + char const *sn, + char const *ln +); + +/** Create new software product. + @param job Job structure. + @param sn Short name. + @param ln Long name. + @param mn Software manufacturer name (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_swprod * +itadmin_mem_swprod_new( + itadmin_job *job, + char const *sn, + char const *ln, + itadmin_swman *mn +); + +/** Create new license type. + @param job Job structure. + @param sn Short license type name. + @param ln Long name (description). + @param num Number of client licenses for floating license servers. + @return Pointer to new object on success, NULL on error. +*/ +itadmin_lictype * +itadmin_mem_lictype_new( + itadmin_job *job, + char const *sn, + char const *ln, + int num +); + +/** Create new license. + @param job Job structure. + @param pk Primary key from licenses table (unused). + @param order Order ID or tracking information (may be NULL). + @param notes Additional notes (may be NULL). + @param d_del Delivery date (may be NULL). + @param i_del Delivery note ID (may be NULL). + @param d_inv Invoice date (may be NULL). + @param i_inv Invoice ID (may be NULL). + @param prod Software product. + @param ltype License type. + @param owner License owner (may be NULL). + @param host Computer (may be NULL). + @return Pointer to new object on success, NULL on error. +*/ +itadmin_license * +itadmin_mem_license_new( + itadmin_job *job, + unsigned long pk, + char const *order, + char const *notes, + itadmin_date *d_del, + char const *i_del, + itadmin_date *d_inv, + char const *i_inv, + itadmin_swprod *prod, + itadmin_lictype *ltype, + itadmin_user *owner, + itadmin_host *host +); + +/** Create new DHCP group in network. + @param job Job structure. + @param gr DHCP group structure. + @return Pointer to new object on success, NULL on error. +*/ +itadmin_dhcp_ginw * +itadmin_mem_dhcp_ginw_new(itadmin_job *job, itadmin_dhcp_group *gr); + +/** Destroy DHCP group in network structure, release memory. + @param g Group structure to destroy. +*/ +void +itadmin_mem_dhcp_ginw_del(itadmin_dhcp_ginw *g); + +/** Initialize date structure. + @param dp Date pointer. +*/ +void +itadmin_mem_date_init(itadmin_date *dp); + +/** Copy date structure. + @param dp Destination pointer. + @param sp Source pointer. +*/ +void +itadmin_mem_date_copy(itadmin_date *dp, itadmin_date *sp); + +/** Create a DHCP option structure. + @param job Job structure. + @param k Key (option name). + @param v Option value. + @param pk Primary key number from table (unused). + @return Valid pointer to new object on success, NULL on error. +*/ +itadmin_dhcp_option * +itadmin_mem_dhcp_option_new( + itadmin_job *job, + char const *k, + char const *v, + long pk +); + +/** Destroy DHCP option structure, release memory. + @param v Option to destroy. +*/ +void +itadmin_mem_dhcp_option_del(void *v); + +/** Read data from database. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_data_read(itadmin_job *job); + +/** Read data from MySQL database. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_data_mysql_read(itadmin_job *job); + +/** Register a user record. + @param job Job structure. + @param us_s User short name (login name). + @param us_t User title or academic degree. + @param us_sn Surname. + @param us_fn Family name. + @param us_em E-Mail. + @param us_ko Cost control ID. + @param us_se Organizational unit. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_user( + itadmin_job *job, + char const *us_s, + char const *us_t, + char const *us_sn, + char const *us_fn, + char const *us_em, + char const *us_ko, + char const *us_se +); + +/** Register building. + @param job Job structure. + @param gb_s Short building name. + @param gb_l Long building name. + @param gb_a1 Address line 1. + @param gb_a2 Address line 2. + @param gb_a3 Address line 3. + @param gb_a4 Address line 4. + @param gb_plz Zip code. + @param gb_ort City name. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_building( + itadmin_job *job, + char const *gb_s, + char const *gb_l, + char const *gb_a1, + char const *gb_a2, + char const *gb_a3, + char const *gb_a4, + char const *gb_plz, + char const *gb_ort +); + +/** Register a speed setting. + @param job Job structure. + @param sn Short name for setting. + @param ln Description. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_speed( + itadmin_job *job, + char const *sn, + char const *ln +); + +/** Register a VLAN. + @param job Job structure. + @param vl_s Short name for VLAN. + @param vl_l Description. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_vlan(itadmin_job *job, char const *vl_s, char const *vl_l); + +/** Register patch (ethernet socket). + @param job Job structure. + @param dd_n Patch name. + @param sp_s Speed setting name. + @param vl_s VLAN short name. + @param dd_p Hub port name. + @param gb_s Building. + @param dd_r Room number/name of patch. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_patch( + itadmin_job *job, + char const *dd_n, + char const *sp_s, + char const *vl_s, + char const *dd_p, + char const *gb_s, + char const *dd_r +); + +/** Register network. + @param job Job structure. + @param nw_ip IP address. + @param nw_ma Network mask. + @param nw_gw Gateway. + @param nw_bc Broadcast address. + @param vl_s VLAN for network. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_network( + itadmin_job *job, + char const *nw_ip, + char const *nw_ma, + char const *nw_gw, + char const *nw_bc, + char const *vl_s +); + +/** Register DHCP pool. + @param job Job structure. + @param ips IP start address of pool. + @param ipe IP end address of pool. + @param nw Network address (may be NULL or empty). + @param alu Flag: Allow unknown clients. + @param dnu Flag: Deny unknown clients. + @param dcn Allowed class name if unknown clients denied. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_dhcp_pool( + itadmin_job *job, + char const *ips, + char const *ipe, + char const *nw, + int alu, + int dnu, + char const *dcn +); + +/** Register DHCP class. + @param job Job structure. + @param dcs Short class name. + @param dcl Long class name (description). + @return 1 on success, 0 on error. +*/ +int +itadmin_register_dhcp_class(itadmin_job *job,char const *dcs,char const *dcl); + +/** Register DHCP group. + @param job Job structure. + @param sn Short name. + @param ln Long name (description). + @return 1 on success, 0 on error. +*/ +int +itadmin_register_dhcp_group(itadmin_job *job, char const *sn, char const *ln); + +/** Register netgroup. + @param job Job structure. + @param ng_s Short netgroup name. + @param ng_l Long name (description). + @return 1 on success, 0 on error. +*/ +int +itadmin_register_netgroup(itadmin_job *job,char const *ng_s,char const *ng_l); + +/** Register netgroup dependency. + @param job Job structure. + @param pgn Name of the parent group. + @param cgn Name of the child group. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_ngdep(itadmin_job *job, char const *pgn, char const *cgn); + +/** Register one host. + @param job Job structure. + @param co_s Short name for computer. + @param us_s Owner / user in charge. + @param co_ip IPv4 address. + @param co_mc MAC address. + @param ng_s Netgroup. + @param co_co Comment for PC. + @param dc_s DHCP class. + @param dg_s DHCP group. + @param dd_n Patch/connector number. + @param gb_s Building. + @param co_r Room number. + @param co_in Inventory ID. + @param co_sn Serial number. + @param co_dd DNS domain name. + @param co_ff Flag: Write FQDN first in /etc/hosts. + @param co_gu Flag: BYOD (bring your own device). + @param co_hi Host ID. + @param co_ex Expiration date. + @param co_nn Flag: Skip host in network documentation. + @param co_na Flag: Skip host for arpwatch. +*/ + +int +itadmin_register_host( + itadmin_job *job, + char const *co_s, + char const *us_s, + char const *co_ip, + char const *co_mc, + char const *ng_s, + char const *co_co, + char const *dc_s, + char const *dg_s, + char const *dd_n, + char const *gb_s, + char const *co_r, + char const *co_in, + char const *co_sn, + char const *co_dd, + int co_ff, + int co_gu, + char const *co_hi, + itadmin_date *co_ex, + int co_nn, + int co_na +); + +/** Register host name alias. + @param job Job structure. + @param al Alias name. + @param rn Real host name. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_alias(itadmin_job *job, char const *al, char const *rn); + +/** Register a DHCP option. + @param job Job structure. + @param sct Scope type name. + @param scn Scope name. + @param k Key (option name). + @param v Option value. + @param pk Primary key from database. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_dhcp_option( + itadmin_job *job, + char const *sct, + char const *scn, + char const *k, + char const *v, + long pk +); + +/** Check name for empty string or minus. + We have to save the entry if the string pointer is not + NULL and the string is not empty and not a minus. + @param sn String to check. + @return 1 if string must be saved, 0 for ignore. +*/ +int +itadmin_register_check_user_name(char const *sn); + +/** Check whether we can attempt to convert a string to an IP address. + @param ip String to test. + @return 1 for string with text, 0 for empty string. +*/ +int +itadmin_register_check_ip(char const *ip); + +/** Register a software manufacturer. + @param job Job structure. + @param sm_s Short name. + @param sm_l Long name. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_swman( itadmin_job *job, char const *sm_s, char const *sm_l); + +/** Register a software product. + @param job Job structure. + @param sw_s Short software name. + @param sw_l Long software name. + @param sm_s Software manufacturer. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_swprod( + itadmin_job *job, + char const *sw_s, + char const *sw_l, + char const *sm_s +); +/** Register a license type. + @param job Job structure. + @param lt_s Short license type name. + @param lt_l Long name/description of license type. + @param nl Number of licenses (for floating licenses). +*/ +int +itadmin_register_lictype( + itadmin_job *job, + char const *lt_s, + char const *lt_l, + int nl +); + +/** Register license. + @param job Job structure. + @param pk Primary key. + @param li_on Order number (purchase process ID). + @param sw_s Software short name. + @param us_s User to which the license is assigned. + @param co_s Computer on which the license is used. + @param lt_s License type. + @param li_no Optional note for the license. + @param sr_s Software reseller. + @param li_dd Delivery date. + @param li_nd Delivery note number. + @param li_di Invoide date. + @param li_ni Invoice number. + @return 1 on success, 0 on error. +*/ +int +itadmin_register_license( + itadmin_job *job, + unsigned long pk, + char const *li_on, + char const *sw_s, + char const *us_s, + char const *co_s, + char const *lt_s, + char const *li_no, + char const *sr_s, + itadmin_date *li_dd, + char const *li_nd, + itadmin_date *li_di, + char const *li_ni +); + +/** Compare structures for user. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=user/user by us, 1=user/name by us, 2=user/user by na+sn+tt+us). + @return Comparison result. +*/ +int +itadmin_comp_user(void const *l, void const *r, int cr); + +/** Compare structures for buildings. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=building/building by s, 1=building/name by s). + @return Comparison result. +*/ +int +itadmin_comp_building(void const *l, void const *r, int cr); + +/** Compare structures for network speed. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=speed/speed by s, 1=speed/name). + @return Comparison result. +*/ +int +itadmin_comp_speed(void const *l, void const *r, int cr); + +/** Compare structures for VLAN. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=vlan/vlan by s, 1=vlan/name by s). + @return Comparison result. +*/ +int +itadmin_comp_vlan(void const *l, void const *r, int cr); + +/** Compare structures for ethernet socket. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=socket/socket by s, 1=socket/name). + @return Comparison result. +*/ +int +itadmin_comp_connect(void const *l, void const *r, int cr); + +/** Compare structures for network. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=network/network by ip4, 1=network/ipaddress). + @return Comparison result. +*/ +int +itadmin_comp_network(void const *l, void const *r, int cr); + +/** Compare structures for netgroup. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=netgroup/netgroup by sn, 1=netgroup/name by sn). + @return Comparison result. +*/ +int +itadmin_comp_netgroup(void const *l, void const *r, int cr); + +/** Compare structures for DHCP class. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=class/class by sn, 1=class/name by sn). + @return Comparison result. +*/ +int +itadmin_comp_dhcp_class(void const *l, void const *r, int cr); + +/** Compare structures for DHCP pool. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=pool/pool by ip4s, 1=pool/ipaddress). + @return Comparison result. +*/ +int +itadmin_comp_dhcp_pool(void const *l, void const *r, int cr); + +/** Compare structures for DHCP group. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=group/group by sn, 1=group/name). + @return Comparison result. +*/ +int +itadmin_comp_dhcp_group(void const *l, void const *r, int cr); + +/** Compare structures for host + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=host/host by sn, 1=host/name, 2=host/host by ipv4, 3=host/ipaddr). + @return Comparison result. +*/ +int +itadmin_comp_host(void const *l, void const *r, int cr); + +/** Compare structures for software manufacturer. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=swman/swman by sn, 1=swman/name). + @return Comparison result. +*/ +int +itadmin_comp_swman(void const *l, void const *r, int cr); + +/** Compare structures for software product. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=product/product by sn, 1=product/name, + 2=product/product by mn->ln+ln). + @return Comparison result. +*/ +int +itadmin_comp_swprod(void const *l, void const *r, int cr); + +/** Compare structures for license type. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=type/type by sn, 1=type/name). + @return Comparison result. +*/ +int +itadmin_comp_user(void const *l, void const *r, int cr); + +/** Compare structures for license type. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=license/license by product). + @return Comparison result. +*/ +int +itadmin_comp_lictype(void const *l, void const *r, int cr); + +/** Compare structures for license. + @param l Left structure. + @param r Right structure, object, or name. + @param cr Comparison criteria + (0=license/license by pk, 1=license/pk, 2=license/license by product). + @return Comparison result. +*/ +int +itadmin_comp_license(void const *l, void const *r, int cr); + +/** Compare two licenses within a network. + @param l Left object. + @param r Right object or name. + @param cr Comparison criteria (0=group/group, + 1=group/name). + @return Comparison result. +*/ +int +itadmin_comp_dhcp_ginw(void const *l, void const *r, int cr); + +/** Compare two date structures. + @param l Left object. + @param r Right object. + @return 1 if @arg l is later than @arg r, 0 for equal days, + 1 if @arg l is earlier than @arg r. +*/ +int +itadmin_comp_date(itadmin_date const *l, itadmin_date const *r); + +/** Compare two DHCP options. + @param l Left object. + @param r Right object. + @param cr Comparison criteria (ignored). + @return Comparison result. +*/ +int +itadmin_comp_dhcp_option(void const *l, void const *r, int cr); + +/** Compare two strings. + @param l Left string. + @param r Right string. + @param cr Comparison criteria (1=case-insensitive, 0=normal). + @return Comparison result. +*/ +int +itadmin_comp_string(void const *l, void const *r, int cr); + +/** Check whether we have to write network configuration + and documentation. + @param job Job structure. + @return 1 for yes, 0 for no. +*/ +int +itadmin_job_do_network(itadmin_job *job); + +/** Check whether we have to write a dhcpd.conf file. + @param job Job structure. + @return 1 for yes, 0 for no. +*/ +int +itadmin_job_do_dhcp(itadmin_job *job); + +/** Check whether we have to write a license report. + @param job Job structure. + @return 1 for yes, 0 for no. +*/ +int +itadmin_job_do_licenses(itadmin_job *job); + +/** Convert string yyyy-mm-dd to date structure. + @param job Job structure. + @param dp Destination pointer. + @param str Source text. + @return 1 on success, 0 on error. +*/ +int +itadmin_tool_convert_date(itadmin_job *job, itadmin_date *dp, char const *str); + +/** Write IPv4 address to file. + @param df Destination file. + @param ipv4 Address to write. +*/ +void +itadmin_tool_write_ip(FILE *df, unsigned long ipv4); + +/** Write IPv4 address to stream. + @param os Output stream. + @param ipv4 Address to write. +*/ +void +itadmin_tool_stream_ip(dk3_stream_t *os, unsigned long ipv4); + +/** Write user name short to LaTeX output. + @param job Job structure. + @param os Output stream. + @param user User to write. +*/ +void +itadmin_tool_write_user_latex_short( + itadmin_job *job, + dk3_stream_t *os, + itadmin_user *user +); + +/** Write user name long to LaTeX output. + @param job Job structure. + @param os Output stream. + @param user User to write. +*/ +void +itadmin_tool_write_user_latex_long( + itadmin_job *job, + dk3_stream_t *os, + itadmin_user *user +); + +/** Write the section header in the table. + @param job Job structure. + @param os Output stream. + @param kwi Keyword index. +*/ +void +itadmin_tool_table_section_header( + itadmin_job *job, + dk3_stream_t *os, + size_t kwi +); + +/** Start a table line. + @param job Job structure. + @param os Output stream. + @param kwi Keyword index in localized messages. +*/ +void +itadmin_tool_table_line_start( + itadmin_job *job, + dk3_stream_t *os, + size_t kwi +); + +/** Separate two items in a table. + @param job Job structure. + @param os Output stream. +*/ +void +itadmin_tool_table_line_sep_rows( + itadmin_job *job, + dk3_stream_t *os +); + +/** Finish a table line. + @param job Job structure. + @param os Output stream. + @param pb Flag: Allow page break here. +*/ +void +itadmin_tool_table_line_finish( + itadmin_job *job, + dk3_stream_t *os, + int pb +); + +/** Create empty table field. + @param job Job structure. + @param os Output stream. + @param nu Flag: Write notification for missing value. +*/ +void +itadmin_tool_table_line_no_data( + itadmin_job *job, + dk3_stream_t *os, + int nu +); + +/** Write one detail table line. + @param job Job structure. + @param os Output stream. + @param kwi Keyword index for option name. + @param det Details to write. + @param nu Flag: Write a note about unknown values. + @param pb Flag: Allow page break after line. +*/ +void +itadmin_tool_table_line( + itadmin_job *job, + dk3_stream_t *os, + size_t kwi, + char const *det, + int nu, + int pb +); + +/** Write a table line consisting of two values. + @param job Job structure. + @param os Output stream. + @param key Key. + @param val Value. + @param fb Flag: Key in bold. + @param pb Flag: Allow page break. +*/ +void +itadmin_tool_table_values( + itadmin_job *job, + dk3_stream_t *os, + char const *key, + char const *val, + int fb, + int pb +); + +/** Check whether a host is owned by a user. + @param us User. + @param co Host. + @return 1 if the host is owned by the user, 0 otherwise. +*/ +int +itadmin_tool_check_same_user(itadmin_user *us, itadmin_host *co); + +/** Write a section of text to output stream. + @param job Job structure. + @param os Output stream. + @param sect Text section to write. +*/ +void +itadmin_tool_write_section( + itadmin_job *job, + dk3_stream_t *os, + char const * const *sect +); + +/** Write log message of one part. + @param job Job structure. + @param ll Log level. + @param i Index of message text in localized messages array. +*/ +void +itadmin_tool_log_1( + itadmin_job *job, + int ll, + size_t i +); + +/** Write log message of three parts. + @param job Job structure. + @param ll Log level. + @param i1 Index of first message text in localized messages array. + @param i2 Index of third text part in localized messages array. + @param msg Variable message text, second text part. +*/ +void +itadmin_tool_log_utf8_3( + itadmin_job *job, + int ll, + size_t i1, + size_t i2, + char const *msg +); + +/** Write log message of five parts. + @param job Job structure. + @param ll Log level. + @param i1 Index of first message text in localized messages array. + @param i2 Index of third text part in localized messages array. + @param i3 Index of fifth text part in localized messages array. + @param msg1 First variable message text, second text part. + @param msg2 Second variable messagetext, fourth text part. +*/ +void +itadmin_tool_log_utf8_5( + itadmin_job *job, + int ll, + size_t i1, + size_t i2, + size_t i3, + char const *msg1, + char const *msg2 +); + +/** Write log message of three parts. + @param job Job structure. + @param ll Log level. + @param i1 Index of first constant message part. + @param i2 Index of third message part. + @param pk Primary key as numeric value. +*/ +void +itadmin_tool_log_pk_3( + itadmin_job *job, + int ll, + size_t i1, + size_t i2, + unsigned long pk +); + +/** Write log message of five parts. + @param job Job structure. + @param ll Log level. + @param i1 Index of first constant message part. + @param i2 Index of third message part. + @param i3 Index of fifth message part. + @param pk Primary key as numeric value. + @param msg Variable message part. +*/ +void +itadmin_tool_log_pk_5( + itadmin_job *job, + int ll, + size_t i1, + size_t i2, + size_t i3, + unsigned long pk, + char const *msg +); + +/** Write IPv4 address to buffer. + @param bu Destination buffer, at least 16 bytes long. + @param ip IP address. +*/ +void +itadmin_tool_ip_to_buffer(char *bu, unsigned long ip); + +/** Write hosts file. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_hosts_output(itadmin_job *job); + +/** Write hosts.ldif file. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_hosts_ldif_output(itadmin_job *job); + +/** Write ethers-by-ip and ethers-by-mac files. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_ethers_output(itadmin_job *job); + +/** Write ethers.ldif file. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_ethers_ldif_output(itadmin_job *job); + +/** Expand netgroup dependencies. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_netgroup_expand(itadmin_job *job); + +/** Check whether a host is a member of a netgroup. + @param job Job structure. + @param netgroup Netgroup. + @param host Host. + @return 0 for no member, 1 for indirect member, 2 for direct member. +*/ +int +itadmin_netgroup_host_member( + itadmin_job *job, + itadmin_netgroup *netgroup, + itadmin_host *host +); + +/** Write netgroup.ldif file. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_netgroup_ldif_output(itadmin_job *job); + +/** Write dhcpd.conf file. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_dhcpd_conf_output(itadmin_job *job); + +/** Write network documentation file. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_netdocu(itadmin_job *job); + +/** Write license report. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +int +itadmin_license_report(itadmin_job *job); + +#ifdef __cplusplus +} +#endif + +%% module + + +#include "dk3all.h" +#include "itadmin.h" +#if 0 +#include "dkt-version.h" +#endif +#include "dk4vers.h" + + +$!trace-include + + + +/** Keywords used by the program, not localized. +*/ +static dkChar const * const itadmin_kw_noloc[] = { +$!string-table macro=dkT +# +# 0: Program group name. +# +dktools +# +# 1: String table name. +# +itadmin.str +# +# 2: Program name used in version +# +itadmin +# +# 3: Help text file name. +# +itadmin.txt +# +# 4: Configuration file name. +# +itadmin.conf +$!end +}; + + + +/** Localized message texts. +*/ +static dkChar const * const itadmin_kw[] = { +$!string-table macro=dkT +# +# 0: Title for network documentation +# +Network documentation +# +# 1: Subject for network documentation +# +Network documentation +# +# 2: LaTeX packages for localization +# + +# +# 3: Hosts +# +Hosts +# +# 4: Other hosts +# +Other hosts +# +# 5: Overview +# +Overview +# +# 6: Purpose: +# +Purpose: +# +# 7: Inventory ID: +# +Inventory ID: +# +# 8: Serial no: +# +Serial no: +# +# 9: not specified (unknown) +# +not specified +# +# 10: Main user: (person responsible for host) +# +Main user: +# +# 11: Place (building and room) +# +Place: +# +# 12: Network +# +Network +# +# 13: IP address +# +IP address: +# +# 14: DNS domain +# +DNS domain: +# +# 15: MAC address +# +MAC address: +# +# 16: Ethernet socket (patch no) +# +Ethernet socket: +# +# 17: DHCP class +# +DHCP class: +# +# 18: DHCP group +# +DHCP group: +# +# 19: Netgroups +# +Netgroups +# +# 20: Notice, this is an address from a DHCP pool +# +IP address from DHCP pool, dynamically assigned to DHCP clients +# +# 21: Short section header BYOD + DHCP +# +BYOD DHCP +# +# 22: Section header BYOD + DHCP +# +Bring your own device, use DHCP +# +# 23: +# +This is a ``bring your own device'' system, not owned by our organizational +# +# 24: +# +unit. +# +# 25: +# +This host is not owned by our organizational unit, it is a computer outside. +# +# 26: +# +It is listed in configuration files and documentation because there is a +# +# 27: +# +need for communication between our computers and this system. +# +# 28: +# +IP address dynamically assigned to computers. +# +# 29: Parent groups +# +Parent groups +# +# 30: Subgroups +# +Subgroups +# +# 31: Additional network interface +# +Additional network interface. +# +# 32: Member hosts for netgroups +# +Member hosts +# +# 33: DHCP pools +# +DHCP pools +# +# 34: Start address +# +Start address: +# +# 35: End address +# +End address: +# +# 36: Allow unknown clients +# +Allow unknown clients: +# +# 37: Deny unknown clients +# +Deny unknown clients: +# +# 38: Allow members of group +# +Allow class: +# +# 39: yes +# +yes +# +# 40: no +# +no +# +# 41: DHCP classes +# +DHCP classes +# +# 42: Ethernet connectors +# +Ethernet connectors +# +# 43: Connector +# +Connector +# +# 44: Room +# +Room +# +# 45: VLAN +# +VLAN +# +# 46: Speed +# +Speed +# +# 47: Hub port +# +Hub port +# +# 48: Available licenses +# +Available licenses +# +# 49/50: Message to explain section contents +# +The licenses listed here were purchased by the organizational unit +but not (yet) assigned to a user or computer. +# +# 51: LaTeX text for pdftitle +# +License report +# +# 52: LaTeX text for pdfsubject +# +licenses +# +# 53: Default license type: Single computer license +# +Single computer license +# +# 54: LaTeX text: Purchase process ID +# +Purchase process ID: +# +# 55: LaTeX text: Delivery date +# +Delivery date: +# +# 56: LaTeX text: Delivery note ID (Lieferschein-Nr) +# +Delivery note ID: +# +# 57: LaTeX text: Invoice date +# +Invoice date: +# +# 58: LaTeX text: Invoice ID (Rechnungs-Nr) +# +Invoice ID: +# +# 59: LaTeX text: Complete license list +# +Complete license list +# +# 60: LaTeX text: Host unknown +# +Host unknown +# +# 61: LaTeX text: Assignment to host not specified. +# +Assignment to host not specified +# +# 62: LaTeX text: Other people's hosts +# +Other people's hosts +# +# 63: LaTeX text: Licenses used on other people's hosts +# +Licenses used on other people's hosts +# +# 64: LaTeX text +# +The licenses listed in this section were assigned to the user. +# +# 65: LaTeX text +# +There is no information available (yet) on which computers the licenses +# +# 66: LaTeX text +# +are used. +# +# 67: LaTeX text +# +The licenses listed in this section were assigned to the user. +# +# 68: LaTeX text +# +At this time they are used on computers other people are +# +# 69: LaTeX text +# +responsible for. +# +# 70: LaTeX text +# +Note: +# +# 71: LaTeX text +# +These licenses are listed twice in the license report: +# +# 72: LaTeX text +# +Once in the section for the host and once again here. +# +# 73: LaTeX text +# +This special situation is indicated in the host licenses section by +# +# 74: LaTeX text +# +the license owner name written in an +# +# 75: LaTeX text +# +italic font. +# +# 76: String separator in date, - for english, . for german +# +- +# +# 77: Progress message: Expanding netgroup dependencies. +# +Expanding netgroup dependencies. +# +# 78: Progress message: Writing hosts file. +# +Writing "hosts" file. +# +# 79: Progress message: Writing hosts.ldif file. +# +Writing "hosts.ldif" file. +# +# 80: Progress message: Writing ethers files. +# +Writing "ethers" files. +# +# 81: Progress message: Writing ethers.ldif file. +# +Writing "ethers.ldif" file. +# +# 82: Progress message: Writing netgroup.ldif file. +# +Writing "netgroup.ldif" file. +# +# 83: Progress message: Writing dhcpd.conf file. +# +Writing "dhcpd.conf" file. +# +# 84: Progress message: Writing netdocu.tex file. +# +Writing "netdocu.tex" file. +# +# 85: Progress message: Writing licenses.tex file. +# +Writing "licenses.tex" file. +# +# 86: Progress message: Finished writing output files. +# +Finished writing output files. +# +# 87: Progress message: Reading users table. +# +Reading users table. +# +# 88: Progress message: Reading buildings table. +# +Reading buildings table. +# +# 89: Progress message: Reading network speed types table. +# +Reading network speed types table. +# +# 90: Progress message: Reading VLANs table. +# +Reading VLANs table. +# +# 91: Progress message: Reading ethernet connectors table. +# +Reading ethernet connectors table. +# +# 92: Progress message: Reading netgroups table. +# +Reading netgroups table. +# +# 93: Progress message: Reading netgroup dependencies table. +# +Reading netgroup dependencies table. +# +# 94: Progress message: Reading networks table. +# +Reading networks table. +# +# 95: Progress message: Reading DHCP classes table. +# +Reading DHCP classes table. +# +# 96: Progress message: Reading DHCP groups table. +# +Reading DHCP groups table. +# +# 97: Progress message: Reading DHCP pools table. +# +Reading DHCP pools table. +# +# 98: Progress message: Reading hosts table. +# +Reading hosts table. +# +# 99: Progress message: Reading host name aliases table. +# +Reading host name aliases table. +# +# 100: Progress message: Reading DHCP options table. +# +Reading DHCP options table. +# +# 101: Progress message: Reading software manufacturers table. +# +Reading software manufacturers table. +# +# 102: Progress message: Reading software products table. +# +Reading software products table. +# +# 103: Progress message: Reading license types table. +# +Reading license types table. +# +# 104: Progress message: Reading licenses table. +# +Reading licenses table. +# +# 105: Progress message: Finished reading input from database. +# +Finished reading input from database. +# +# 106/107: ERROR: Not a boolean value "..."! +# +Not a boolean value: " +"! +# +# 108/109: ERROR: Configuration text "..." too long! +# +Configuration value text " +" too long! +# +# 110/111: ERROR: No such database type: "..."! +# +No such database type: " +"! +# +# 112: ERROR: A value text is required! +# +A value text is required! +# +# 113/114: ERROR: Unknown configuration option "..."! +# +Unknown configuration option " +"! +# +# 115: ERROR: Syntax error - "=" and value required! +# +Syntax error - "=" and value required! +# +# 116: ERROR: Input line too long! +# +Input line too long! +# +# 117: ERROR: Missing end of section name! +# +Missing end of section name! +# +# 118/119: ERROR: File name contains wildcards, this is not allowed! +# +File name " +"\ncontains wildcards, this is not allowed! +# +# 120/121: WARNING: File name "..." is not an absolute path name! +# +File name " +"\nis not an absolute path name! +# +# 122: ERROR: Missing database host name! +# +Missing database host name! +# +# 123: ERROR: Missing database name! +# +Missing database name! +# +# 124: WARNING: Missing DHCP VLAN name! +# +Missing DHCP VLAN name! +# +# 125: ERROR: Missing organization name! +# +Missing organization name! +# +# 126: ERROR: Missing organizational unit name! +# +Missing organizational unit name! +# +# 127: ERROR: Missing administrator name! +# +Missing administrator name! +# +# 128: ERROR: Missing database credentials file name! +# +Missing database credentials file name! +# +# 129: ERROR: Missing database user name! +# +Missing database user name! +# +# 130: ERROR: Missing database user password! +# +Missing database user password! +# +# 131: ERROR: No configuration files found! +# +No configuration file(s) "itadmin.conf" found!# +# +# 132: ERROR: Configuration problems! +# +Configuration problems,\nplease check the itadmin.conf configuration files! +# +# 133: ERROR: Unsupported database type! +# +Unsupported database type! +# +# 134: ERROR start: DHCP pool " +# +DHCP pool " +# +# 135: ERROR: +# +": Inconsistent setup!\nUnknown clients can be allowed or denied to use a pool, not both! +# +# 136: ERROR start DHCP class " +# +DHCP class " +# +# 137: ERROR: DHCP class assigned to pools in different networks! +# +" assigned to pools in different networks! +# +# 138: ERROR: DHCP pool "...": Missing allowed DHCP class name! +# +": Missing allowed DHCP class name! +# +# 139/140: ERROR: No such VLAN! +# +No such VLAN: " +"! +# +# 141: ERROR: Failed to obtain results list! +# +Failed to obtain results list for database query! +# +# 142: ERROR: Failed to query database! +# +Failed to query database! +# +# 143: ERROR: Primary key is not numeric! +# +Table "licenses", record +# +# 144: ERROR: Primary key is not numeric! +# + Primary key is not numeric! +# +# 145: ERROR: Missing primary key! +# + Missing primary key! +# +# 146, 147, 148: License type "...": Not a number "..."! +# +License type " +": Not a number " +"! +# +# 149/150: ERROR: Tabel swm record ... Missing primary key! +# +Table "swmanufacturers" record + Missing primary key! +# +# 151: ERROR start: Table "dhcpoptions" record ... +# +Table "dhcpoptions" record +# +# 152: ERROR: Primary key is not numeric! +# + Primary key is not numeric! +# +# 153: ERROR: Missing primary key! +# + Missing primary key! +# +# 154: ERROR: Failed to set database encoding! +# +Failed to set database encoding! +# +# 155/156/157: ERROR: Failed to connect to database! +# +Failed to connect to database " +" at host " +"! +# +# 158/159: ERROR: Illegal database name! +# +Illegal database name: " +"! +# +# 160: ERROR: Failed to convert database user password! +# +Failed to convert database user passwort to UTF-8! +# +# 161/162: ERROR: Failed to convert database user name to UTF-8! +# +Failed to convert database user name " +" to UTF-8! +# +# 163/164: ERROR: Failed to convert database host name to UTF-8! +# +Failed to convert database host name " +" to UTF-8! +# +# 165: ERROR: Failed to initialize MySQL client object! +# +Failed to initialize MySQL client object! +# +# 166: ERROR: Failed to initialize MySQL client library! +# +Failed to initialize MySQL client library! +# +# 167: ERROR: MySQL database support not available! +# +MySQL database support not available! +# +# 168/169: ERROR: User name "...": Duplicated entry! +# +User name " +": Duplicated entry! +# +# 170/171: ERROR: Building "...": Duplicated entry! +# +Building " +": Duplicated entry! +# +# 172/173: ERROR: Ethernet speed setting "...": Duplicated entry! +# +Ethernet speed setting " +": Duplicated entry! +# +# 174/175: VLAN "...": Duplicated entry! +# +VLAN " +": Duplicated entry! +# +# 176/177: Computer "...": Duplicated entry! +# +Computer " +": Duplicated entry! +# +# 178/179: Software manufacturer "...": Duplicated entry! +# +Software manufacturer " +": Duplicated entry! +# +# 180/181: Netgroup "...": Duplicated entry! +# +Netgroup " +": Duplicated entry! +# +# 182/183: Netgroup "..." not defined! +# +Netgroup " +" not defined! +# +# 184/185: Ethernet connector "...": Duplicated entry! +# +Ethernet connector " +": Duplicated entry! +# +# 186/187: Ethernet speed setting "..." not defined! +# +Ethernet speed setting " +" not defined! +# +# 188/189: VLAN "..." not defined! +# +VLAN " +" not defined! +# +# 190/191: Building "..." not defined! +# +Building " +" not defined! +# +# 192/193: Failed to convert net mask "..."! +# +Failed to convert net mask " +"! +# +# 194: Using default net mask 255.255.255.0! +# +Using default net mask 255.255.255.0! +# +# 195/196: Failed to convert default gateway "..."! +# +Failed to convert default gateway " +"! +# +# 197/198: Using default gateway ... +# +Using default gateway +. +# +# 199/200: Failed to convert broadcast address! +# +Failed to convert broadcast address " +"! +# +# 201/202: Network "...": Duplicated entry! +# +Network " +": Duplicated entry! +# +# 203: Attempt to define IP network without specifying an IP address! +# +Attempt to define IP network without specifying an IP address! +# +# 204/205: DHCP class "...": Duplicated entry! +# +DHCP class " +": Duplicated entry! +# +# 206/207: DHCP group "...": Duplicated entry! +# +DHCP group " +": Duplicated entry! +# +# 208/209: Invalied network address "..."! +# +Invalid network address " +"! +# +# 210/211: DHCP class "..." not defined! +# +DHCP class " +" not defined! +# +# 212/213: Network "..." not defined! +# +Network " +" not defined! +# +# 214/215: DHCP pool "...": Invalid end address! +# +DHCP pool " +": Invalid end address! +# +# 216/217: DHCP pool "...": Missing end address! +# +DHCP pool " +": Missing end address! +# +# 218/219: DHCP pool "...": Invalid start address! +# +DHCP pool " +": Invalid start address! +# +# 220: DHCP pool definition attempted with empty start address! +# +DHCP pool definition attempted with empty start address! +# +# 221/222: Computer "...": Illegal MAC address! +# +Computer " +": Illegal MAC address! +# +# 223/224: Computer "...": MAC address too long! +# +Computer " +": MAC address too long! +# +# 225/226/227: Computer "...": User "..." not defined! +# +Computer " +": User " +" not defined! +# +# 228/229/230: Computer "...": Netgroup "..." not defined! +# +Computer " +": Netgroup " +" not defined! +# +# 231/232/233: Computer "...": DHCP class "..." not defined! +# +Computer " +": DHCP class " +" not defined! +# +# 234/235/236: Computer "...": DHCP group "..." not defined! +# +Computer " +": DHCP group " +" not defined! +# +# 237/238/239: Computer "...": Ethernet connector "..." not defined! +# +Computer " +": Ethernet connector " +" not defined! +# +# 240/241/242: Computer "...": Building "..." not defined! +# +Computer " +": Building " +" not defined! +# +# 243/244: Computer "...": Both DHCP class and IP address defined! +# +Computer " +": Both DHCP class and IP address specified! +# +# 245/246: Computer "...": DHCP class specified, but MAC address missing! +# +Computer " +": DHCP class specified, but MAC address is missing! +# +# 247/248: Computer "...": Netgroup specified, but IP address missing! +# +Computer " +": Netgroup specified, but IP address is missing! +# +# 249/250: Computer "...": Netgroup specified, but DNS domain missing! +# +Computer " +": Netgroup specified, but DNS domain is missing! +# +# 251/252: Computer "...": FQDN first flag set, but DNS domain missing! +# +Computer " +": FQDN first flag set, but DNS domain is missing! +# +# 253/254: Computer "...": Over expiration date, should be removed! +# +Computer " +": Over expiration date, should be removed! +# +# 255: Attempt to define a computer without a host name! +# +Attempt to define a computer without a host name! +# +# 256/257/258: Alias "...": Computer "..." not defined! +# +Alias " +": Computer " +" not defined! +# +# 259/260/261: DHCP option ...: VLAN "..." not defined! +# +DHCP option +: VLAN " +" not defined! +# +# 262/263/264: DHCP option ...: Network "..." not defined! +# +DHCP option +: Network " +" not defined! +# +# 265/266/267: DHCP option ...: DHCP group "..." not defined! +# +DHCP option +: DHCP group " +" not defined! +# +# 268/269/270: DHCP option ...: DHCP pool "..." not defined! +# +DHCP option +: DHCP pool " +" not defined! +# +# 271/272/273: DHCP option ...: Computer "..." not defined! +# +DHCP option +: Computer " +" not defined! +# +# 274/275/276: DHCP option ...: Unknown scope type name "..."! +# +DHCP option +: Unknown scope type name " +"! +# +# 277/278: Software product "...": Duplicated entry! +# +Software product " +": Duplicated entry! +# +# 279/280/281: Software product "...": Manufacturer "..." not defined! +# +Software product " +": Software manufacturer " +" not defined! +# +# 282/283: License type "...": Duplicated entry! +# +License type " +": Duplicated entry! +# +# 284/285: License ...: Duplicated entry! +# +License +: Duplicated entry! +# +# 286/287/288: License ...: User "..." not defined! +# +License +: User " +" not defined! +# +# 289/290/291: License ...: Computer "..." not defined! +# +License +: Computer " +" not defined! +# +# 292/293/294: License ...: License type "..." not defined! +# +License +: License type " +" not defined! +# +# 295/296/297: License ... assigned to computer "..." but no user specified! +# +License + assigned to computer " +" but no user specified! +# +# 298/299: License ...: No software product specified! +# +License +: No software product specified! +# +# 300/301: Illegal date specification "..."! +# +Illegal date specification " +"! +# +# 302: Koma-script suggestion. +# +Users from Europe - especially from Germany - should consider using koma-script. +# +# 303/304: ERROR: Illegal software manufacturer! +# +Illegal software manufacturer (short name): " +"! +# +# 305/306: ERROR: Illegal software! +# +Illegal software (short name): " +"! +# +# 307/308: ERROR: Illegal license type! +# +Illegal license type (short name): " +"! +# +# 309: ERROR: Failed to reset sensitive memory range! +# +Failed to reset sensitive memory range! +$!end +}; + + + +/** License text written for --license option. +*/ +static dkChar const * const itadmin_license_overview[] = { +$!text macro=dkT + +Overview +======== +This software uses code from the following projects, either directly or +by linking a library: + +dktools DK tools and libraries + See http://dktools.sourceforge.net for information. + +MySQL MySQL client library. + See http://www.mysql.com for information. + +$!end +}; + + + +/** License for the dktools project. +*/ +static dkChar const * const itadmin_license_dktools[] = { +$!text macro=dkT + +License conditions for DK tools and libraries +============================================= +Copyright (c) 2012-2016, Dirk Krause +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the copyright holder(s) nor the names of + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. + +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + +$!end +}; + + + +/** License for the MySQL client library (GPL + FLOSS exception). +*/ +static dkChar const * const itadmin_license_mysql[] = { +$!text macro=dkT +License conditions for the MySQL client library +=============================================== + +GNU General Public License +-------------------------- + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; + or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. + +MySQL FLOSS License Exception +----------------------------- + +MySQL FLOSS License Exception + +The MySQL AB Exception for Free/Libre and Open Source Software-only +Applications Using MySQL Client Libraries (the "FLOSS Exception"). + +Version 0.6, 7 March 2007 + +Exception Intent + +We want specified Free/Libre and Open Source Software (``FLOSS'') +applications to be able to use specified GPL-licensed MySQL client +libraries (the ``Program'') despite the fact that not all FLOSS +licenses are compatible with version 2 of the GNU General Public +License (the ``GPL''). + +Legal Terms and Conditions + +As a special exception to the terms and conditions of version 2.0 +of the GPL: + + 1. You are free to distribute a Derivative Work that is formed + entirely from the Program and one or more works (each, a + "FLOSS Work") licensed under one or more of the licenses + listed below in section 1, as long as: + a. You obey the GPL in all respects for the Program and the + Derivative Work, except for identifiable sections of the + Derivative Work which are not derived from the Program, + and which can reasonably be considered independent and + separate works in themselves, + b. all identifiable sections of the Derivative Work which + are not derived from the Program, and which can + reasonably be considered independent and separate works + in themselves, + i. are distributed subject to one of the FLOSS licenses + listed below, and + ii. the object code or executable form of those sections + are accompanied by the complete corresponding + machine-readable source code for those sections on + the same medium and under the same FLOSS license as + the corresponding object code or executable forms of + those sections, and + c. any works which are aggregated with the Program or with a + Derivative Work on a volume of a storage or distribution + medium in accordance with the GPL, can reasonably be + considered independent and separate works in themselves + which are not derivatives of either the Program, a + Derivative Work or a FLOSS Work. + If the above conditions are not met, then the Program may only + be copied, modified, distributed or used under the terms and + conditions of the GPL or another valid licensing option from + MySQL AB. + + 2. FLOSS License List + +License name Version(s)/Copyright Date +Academic Free License 2.0 +Apache Software License 1.0/1.1/2.0 +Apple Public Source License 2.0 +Artistic license From Perl 5.8.0 +BSD license "July 22 1999" +Common Development and Distribution License (CDDL) 1.0 +Common Public License 1.0 +Eclipse Public License 1.0 +GNU Library or "Lesser" General Public License (LGPL) 2.0/2.1 +Jabber Open Source License 1.0 +MIT license (As listed in file MIT-License.txt) --- +Mozilla Public License (MPL) 1.0/1.1 +Open Software License 2.0 +OpenSSL license (with original SSLeay license) "2003" ("1998") +PHP License 3.0 +Python license (CNRI Python License) --- +Python Software Foundation License 2.1.1 +Sleepycat License "1999" +University of Illinois/NCSA Open Source License --- +W3C License "2001" +X11 License "2001" +Zlib/libpng License --- +Zope Public License 2.0 + + Due to the many variants of some of the above licenses, we + require that any version follow the 2003 version of the Free + Software Foundation's Free Software Definition + (http://www.gnu.org/philosophy/free-sw.html) or version 1.9 of + the Open Source Definition by the Open Source Initiative + (http://www.opensource.org/docs/definition.php). + + 3. Definitions + + a. Terms used, but not defined, herein shall have the + meaning provided in the GPL. + b. Derivative Work means a derivative work under copyright + law. + + 4. Applicability: This FLOSS Exception applies to all Programs + that contain a notice placed by MySQL AB saying that the + Program may be distributed under the terms of this FLOSS + Exception. If you create or distribute a work which is a + Derivative Work of both the Program and any other work + licensed under the GPL, then this FLOSS Exception is not + available for that work; thus, you must remove the FLOSS + Exception notice from that work and comply with the GPL in all + respects, including by retaining all GPL notices. You may + choose to redistribute a copy of the Program exclusively under + the terms of the GPL by removing the FLOSS Exception notice + from that copy of the Program, provided that the copy has + never been modified by you or any third party. + +Appendix A. Qualified Libraries and Packages + +The following is a non-exhaustive list of libraries and packages +which are covered by the FLOSS License Exception. Please note that +this appendix is provided merely as an additional service to +specific FLOSS projects wishing to simplify licensing information +for their users. Compliance with one of the licenses noted under +the "FLOSS license list" section remains a prerequisite. + +Package Name Qualifying License and Version +Apache Portable Runtime (APR) Apache Software License 2.0 + +$!end +}; + + + +/** Help text shown for --help. +*/ +static dkChar const * const itadmin_help_text[] = { +$!text macro=dkT + +NAME + + itadmin - IT administration using databases + +SYNOPSIS + + itadmin [<options>] [<config-file>] + +DESCRIPTION + +The program reads IT-related information from a database and creates +configuration files, a network documentation, and a license report. +A configuration file can be specified as argument, the program searches +for itadmin.conf files if no configuration file is specified. + +OPTIONS + +-c +--configuration + Create configuration files and network documentation. + +-l +--licenses + Create license report. + If none of -c and -l is used the program creates all output + (same as both -c and -l used). + +-h +--help + Show a help text. + +-v +--version + Show version information. + +-L +--license-terms + Show license terms. + +EXIT STATUS + +0 on success, all other exit status codes indicate an error. + +FILES + +itadmin.conf + The itadmin.conf file contains the configuration information + used by the program. The file consists of key=value pairs, one + per line. Keys can consist of multiple words. + Lines started by '#' are comments. + The following key=value pairs can be used: + + database host = <string> + database name = <string> + database credentials file = <filename> + dhcpd.conf vlan = <name> + organization = <name> + organizational unit = <name> + administrator name = <name> + +AUTHOR + +Dirk Krause + +HISTORY + +The itadmin program replaces the hostsadm script found in previous +versions of dktools. + +COPYRIGHT AND LICENSE + +Run + itadmin --license-terms +to see the license conditions. + +SEE ALSO + +http://dktools.sourceforge.net + +$!end +}; + + +/** Options for the itadmin program. +*/ +static dk3_option_t const itadmin_options[] = { + { dkT('h'), dkT("help"), 0 }, + { dkT('v'), dkT("version"), 0 }, + { dkT('L'), dkT("license-terms"), 0 }, + { dkT('c'), dkT("configuration"), 0 }, + { dkT('l'), dkT("licenses"), 0 }, +}; + +/** Number of elements in itadmin_options. +*/ +static size_t itadmin_sz_options = +(sizeof(itadmin_options)/sizeof(dk3_option_t)); + + + +int +itadmin_job_do_network(itadmin_job *job) +{ + int back = 0; + if(job) { + if((job->cmd) & ITADMIN_CMD_CONFIG) { + back = 1; + } + } + return back; +} + + + +int +itadmin_job_do_dhcp(itadmin_job *job) +{ + int back = 0; + if(itadmin_job_do_network(job)) { + if(job->f_dh) { + back = 1; + } + } + return back; +} + + + +int +itadmin_job_do_licenses(itadmin_job *job) +{ + int back = 0; + if(job) { + if((job->cmd) & ITADMIN_CMD_LICENSES) { + back = 1; + } + } + return back; +} + + + +/** Clean up a storage, destroy contained objects. + @param s Storage to clean up. + @param i Iterator through storage. + @param f Function to use on each object. +*/ +static +void +itadmin_clean_storage( + dk3_sto_t **s, + dk3_sto_it_t **i, + itadmin_obj_del *f +) +{ + void *v; + + if(*s) { + if(*i) { + dk3sto_it_reset(*i); + while((v = dk3sto_it_next(*i)) != NULL) { + (*f)(v); + } + dk3sto_it_close(*i); + } + dk3sto_close(*s); + } + *s = NULL; + *i = NULL; +} + + + +/** Initialize job structure. + @param job Job structure to initialize. + @param app Application structure for diagnostics. + @param msg Localized message texts. + @param noloc Texts, not localized. +*/ +static +void +itadmin_job_init( + itadmin_job *job, + dk3_app_t *app, + dkChar const * const *msg, + dkChar const * const *noloc +) +{ + job->app = app; + job->opt = NULL; + job->msg = msg; + job->noloc = noloc; + job->exval = 1; + job->cmd = 0; + job->ec = 0; + job->f_dh = 0; + job->dbt = DK3_SQLDB_TYPE_MYSQL; + job->dbhn = NULL; + job->uc2l = NULL; + job->dbn = NULL; + job->dbcf = NULL; + job->dbus = NULL; + job->dbpw = NULL; + job->vlan = NULL; + job->org = NULL; + job->ou = NULL; + job->admn = NULL; + job->ldapb = NULL; + job->ngdep = NULL; + job->nng = 0; + job->s_us = NULL; job->i_us = NULL; + job->s_usn = NULL; job->i_usn = NULL; + job->s_bu = NULL; job->i_bu = NULL; + job->s_sp = NULL; job->i_sp = NULL; + job->s_vl = NULL; job->i_vl = NULL; + job->s_pa = NULL; job->i_pa = NULL; + job->s_nw = NULL; job->i_nw = NULL; + job->s_ng = NULL; job->i_ng = NULL; + job->s_nd = NULL; job->i_nd = NULL; + job->s_dc = NULL; job->i_dc = NULL; + job->s_dp = NULL; job->i_dp = NULL; + job->s_dg = NULL; job->i_dg = NULL; + job->s_ho = NULL; job->i_ho = NULL; + job->s_hoi = NULL; job->i_hoi = NULL; + job->s_sm = NULL; job->i_sm = NULL; + job->s_sw = NULL; job->i_sw = NULL; + job->s_lt = NULL; job->i_lt = NULL; + job->s_lc = NULL; job->i_lc = NULL; + job->s_lf = NULL; job->i_lf = NULL; + job->s_do = NULL; job->i_do = NULL; + job->dbptr = NULL; + job->gdate = 0; + job->hlh = 0; + job->ukoma = 0; + job->rel = 0; + if(*(msg[76]) == dkT('.')) { job->gdate = 1; } +} + + + +/** Prepare a storage/iterator pair. + @param job Job structure. + @param s Address of storage pointer. + @param i Address if iterator pointer. + @param f Object comparison function for storage. + @param cr Comparison criteria. + @param ok Pointer to OK flag, reset on errors. +*/ +static +void +itadmin_job_prepare_storage( + itadmin_job *job, + dk3_sto_t **s, + dk3_sto_it_t **i, + dk3_fct_comp_t *f, + int cr, + int *ok +) +{ + *s = NULL; + *i = NULL; + *s = dk3sto_open_app(job->app); + if(*s) { + *i = dk3sto_it_open(*s); + if(*i) { + if(f) { + dk3sto_set_comp(*s, f, cr); + } + } else { + *ok = 0; + } + } else { + *ok = 0; + } +} + + + +/** Prepare all data structures for a job. + @param job Job structure. + @return 1 on success, 0 on error. +*/ +static +int +itadmin_job_up(itadmin_job *job) +{ + dk3_time_t ct; + dk3_tm_t tm; + int back = 1; + int f_utf8 = 0; + (job->today).y = 0; + (job->today).m = 0; + (job->today).d = 0; + if(dk3sf_time(&ct)) { + if(dk3sf_localtime_app(&tm, &ct, job->app)) { + (job->today).y = tm.Y; + (job->today).m = tm.M; + (job->today).d = tm.D; + } + } + itadmin_job_prepare_storage( + job, &(job->s_us), &(job->i_us), itadmin_comp_user, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_usn), &(job->i_usn), itadmin_comp_user, 2, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_bu), &(job->i_bu), itadmin_comp_building, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_sp), &(job->i_sp), itadmin_comp_speed, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_vl), &(job->i_vl), itadmin_comp_vlan, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_pa), &(job->i_pa), itadmin_comp_connect, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_nw), &(job->i_nw), itadmin_comp_network, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_ng), &(job->i_ng), itadmin_comp_netgroup, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_nd), &(job->i_nd), NULL, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_dc), &(job->i_dc), itadmin_comp_dhcp_class, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_dp), &(job->i_dp), itadmin_comp_dhcp_pool, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_dg), &(job->i_dg), itadmin_comp_dhcp_group, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_ho), &(job->i_ho), itadmin_comp_host, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_hoi), &(job->i_hoi), itadmin_comp_host, 2, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_sm), &(job->i_sm), itadmin_comp_swman, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_sw), &(job->i_sw), itadmin_comp_swprod, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_lt), &(job->i_lt), itadmin_comp_lictype, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_lc), &(job->i_lc), itadmin_comp_license, 0, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_lf), &(job->i_lf), itadmin_comp_license, 2, &back + ); + itadmin_job_prepare_storage( + job, &(job->s_do), &(job->i_do), itadmin_comp_dhcp_option, 0, &back + ); + f_utf8 = 0; + if(DK3_ENCODING_UTF8 == dk3app_get_encoding(job->app)) { f_utf8 = 1; } + job->uc2l = dk3uc2lat_open_app(NULL, 0, f_utf8, job->app); + if(!(job->uc2l)) { back = 0; } + return back; +} + + + +/** Clean up job structure. + @param job Job structure to clean up. +*/ +static +void +itadmin_job_cleanup(itadmin_job *job) +{ +#if 0 + /* 2016-12-09 + Function dk3mem_reset_secure() to sanitize memory was added. + */ + size_t sz; + size_t i; + int ok = 1; +#endif + if(job->opt) { + dk3opt_close(job->opt); + } job->opt = NULL; + if(job->uc2l) { + dk3uc2lat_close(job->uc2l); + } job->uc2l = NULL; + $!trace-code if(job->dbhn) { + $!trace-code dk3sf_fputs(dkT("DB hostname: "), stdout); + $!trace-code dk3sf_fputs(job->dbhn, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + dk3_release(job->dbhn); + $!trace-code if(job->dbn) { + $!trace-code dk3sf_fputs(dkT("DB name: "), stdout); + $!trace-code dk3sf_fputs(job->dbn, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + dk3_release(job->dbn); + $!trace-code if(job->dbcf) { + $!trace-code dk3sf_fputs(dkT("DB credfile: "), stdout); + $!trace-code dk3sf_fputs(job->dbcf, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + dk3_release(job->dbcf); + $!trace-code if(job->dbus) { + $!trace-code dk3sf_fputs(dkT("DB username: "), stdout); + $!trace-code dk3sf_fputs(job->dbus, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + if(job->dbus) { +#if 0 + /* 2016-12-09 + Function dk3mem_reset_secure() to sanitize memory was added. + */ + dk3mem_res((void *)(job->dbus), dk3str_c8_len(job->dbus)); +#endif + (void)dk3mem_reset_secure((void *)(job->dbus), dk3str_c8_len(job->dbus)); + } + dk3_release(job->dbus); + $!trace-code if(job->dbpw) { +#if 0 + $!trace-code dk3sf_fputs(dkT("DB password: "), stdout); + $!trace-code dk3sf_fputs(job->dbpw, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); +#endif + $!trace-code } + if(job->dbpw) { +#if 0 + /* 2016-12-09 + Function dk3mem_reset_secure() to sanitize memory was added. + */ + sz = dk3str_c8_len(job->dbpw); + dk3mem_res((void *)(job->dbpw), dk3str_c8_len(job->dbpw)); + /* Static code analysis: Dead assignment ok = 0 */ + /* The purpose of the following instruction is to avoid */ + /* optimizing out the memory reset in the instruction before. */ + for (i = 0; i < sz; i++) { if('\0' != (job->dbpw)[i]) { ok = 0; } } + if (1 != ok) { + dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 309); + } +#endif + (void)dk3mem_reset_secure((void *)(job->dbpw), dk3str_c8_len(job->dbpw)); + } + dk3_release(job->dbpw); + $!trace-code if(job->vlan) { + $!trace-code dk3sf_fputs(dkT("VLAN name: "), stdout); + $!trace-code dk3sf_fputs(job->vlan, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + dk3_release(job->vlan); + $!trace-code if(job->org) { + $!trace-code dk3sf_fputs(dkT("Organization: "), stdout); + $!trace-code dk3sf_fputs(job->org, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + dk3_release(job->org); + $!trace-code if(job->ou) { + $!trace-code dk3sf_fputs(dkT("OU name: "), stdout); + $!trace-code dk3sf_fputs(job->ou, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + dk3_release(job->ou); + $!trace-code if(job->admn) { + $!trace-code dk3sf_fputs(dkT("admin name: "), stdout); + $!trace-code dk3sf_fputs(job->admn, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + dk3_release(job->admn); + $!trace-code if(job->ldapb) { + $!trace-code dk3sf_fputs(dkT("ldap base: "), stdout); + $!trace-code dk3sf_fputs(job->ldapb, stdout); + $!trace-code dk3sf_fputc(dkT('\n'), stdout); + $!trace-code } + dk3_release(job->ldapb); + itadmin_clean_storage(&(job->s_us), &(job->i_us), itadmin_mem_user_del); + itadmin_clean_storage(&(job->s_bu), &(job->i_bu), itadmin_mem_building_del); + itadmin_clean_storage(&(job->s_sp), &(job->i_sp), itadmin_mem_speed_del); + itadmin_clean_storage(&(job->s_vl), &(job->i_vl), itadmin_mem_vlan_del); + itadmin_clean_storage(&(job->s_pa), &(job->i_pa), itadmin_mem_connect_del); + itadmin_clean_storage(&(job->s_nw), &(job->i_nw), itadmin_mem_network_del); + itadmin_clean_storage(&(job->s_ng), &(job->i_ng), itadmin_mem_netgroup_del); + itadmin_clean_storage(&(job->s_nd), &(job->i_nd), itadmin_mem_ngdep_del); + itadmin_clean_storage(&(job->s_dc), &(job->i_dc), itadmin_mem_dhcp_class_del); + itadmin_clean_storage(&(job->s_dp), &(job->i_dp), itadmin_mem_dhcp_pool_del); + itadmin_clean_storage(&(job->s_dg), &(job->i_dg), itadmin_mem_dhcp_group_del); + if(job->s_hoi) { + if(job->i_hoi) { + dk3sto_it_close(job->i_hoi); + } + dk3sto_close(job->s_hoi); + } + job->s_hoi = NULL; job->i_hoi = NULL; + if(job->s_usn) { + if(job->i_usn) { + dk3sto_it_close(job->i_usn); + } + dk3sto_close(job->s_usn); + } + job->s_usn = NULL; job->i_usn = NULL; + itadmin_clean_storage(&(job->s_ho), &(job->i_ho), itadmin_mem_host_del); + itadmin_clean_storage(&(job->s_sm), &(job->i_sm), itadmin_mem_sw_man_del); + itadmin_clean_storage(&(job->s_sw), &(job->i_sw), itadmin_mem_software_del); + itadmin_clean_storage(&(job->s_lt), &(job->i_lt), itadmin_mem_lic_type_del); + if(job->s_lf) { + if(job->i_lf) { + dk3sto_it_close(job->i_lf); + } + dk3sto_close(job->s_lf); + } + job->s_lf = NULL; job->i_lf = NULL; + itadmin_clean_storage(&(job->s_lc), &(job->i_lc), itadmin_mem_license_del); + itadmin_clean_storage(&(job->s_do),&(job->i_do),itadmin_mem_dhcp_option_del); + if(job->ngdep) { + dk3bm_close(job->ngdep); + job->ngdep = NULL; + } +} + + + +/** Process command line arguments. + @param job Job structure. + @return 1 on success (can continue), 0 on error. +*/ +static +int +itadmin_process_arguments(itadmin_job *job) +{ + dkChar const * const *xargv = NULL; + int xargc = 0; + int back = 0; + $? "+ itadmin_process_arguments" + xargc = dk3app_get_argc(job->app); + xargv = dk3app_get_argv(job->app); + xargv++; xargc--; + job->opt = dk3opt_open_app( + itadmin_options, itadmin_sz_options, + dkT('\0'), NULL, + xargc, xargv, + job->app + ); + if(job->opt) { + if(0 == dk3opt_get_error_code(job->opt)) { + back = 1; + if(dk3opt_is_set(job->opt, dkT('c'))) { + job->cmd |= ITADMIN_CMD_CONFIG; + } + if(dk3opt_is_set(job->opt, dkT('l'))) { + job->cmd |= ITADMIN_CMD_LICENSES; + } + if(dk3opt_is_set(job->opt, dkT('h'))) { + job->cmd |= ITADMIN_CMD_HELP; + } + if(dk3opt_is_set(job->opt, dkT('v'))) { + job->cmd |= ITADMIN_CMD_VERSION; + } + if(dk3opt_is_set(job->opt, dkT('L'))) { + job->cmd |= ITADMIN_CMD_LICENSE_TERMS; + } + } else { $? "! errors in opt proc" + } + } else { $? "! failed to read opts" + } + $? "- itadmin_process_arguments %d", back + return back; +} + + + +/** Show version number. + @param job Job structure. +*/ +static +void +itadmin_show_version(itadmin_job *job) +{ + dk3sf_fputs(itadmin_kw_noloc[2], stdout); + dk3sf_fputs(DKT_VERSION_DK, stdout); + dk3sf_fputc(dkT('\n'), stdout); +#if !(DK3_HAVE_MYSQL_MYSQL_H || DK3_HAVE_MYSQL_H) + dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 167); +#endif +} + + + +/** Show help text. + @param job Job structure. +*/ +static +void +itadmin_show_help(itadmin_job *job) +{ + dk3app_help(job->app, itadmin_kw_noloc[3], itadmin_help_text); +} + + + +/** Show one text section, used to show license terms. + @param job Job structure. + @param ltxt License text to show. +*/ +static +void +itadmin_show_license_section(itadmin_job *job, dkChar const * const *ltxt) +{ + dkChar const * const *sptr; + sptr = ltxt; + while(*sptr) { + dk3sf_fputs(*(sptr++), stdout); + dk3sf_fputc(dkT('\n'), stdout); + } +} + + + +/** Show license conditions. + @param job Job structure. +*/ +static +void +itadmin_show_license(itadmin_job *job) +{ + itadmin_show_license_section(job, itadmin_license_overview); + itadmin_show_license_section(job, itadmin_license_dktools); + itadmin_show_license_section(job, itadmin_license_mysql); +} + + + +/** Run the tasks. + @param job Job structure. +*/ +static +void +itadmin_run(itadmin_job *job) +{ + int success = 0; + if(itadmin_config_read(job)) { + if(itadmin_data_read(job)) { + /* PROGRESS: Expanding netgroup dependencies. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 77); + if(itadmin_netgroup_expand(job)) { + success = 1; + if(itadmin_job_do_network(job)) { + /* + Hosts + */ + /* PROGRESS: Writing hosts file. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 78); + if(!itadmin_hosts_output(job)) { $? "! hosts output" + success = 0; + } + if(job->ldapb) { + /* PROGRESS: Writing hosts.ldif file. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 79); + if(!itadmin_hosts_ldif_output(job)) { $? "! hosts.ldif output" + success = 0; + } + } + /* + Ethers + */ + /* PROGRESS: Writing ethers file. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 80); + if(!itadmin_ethers_output(job)) { $? "! ethers output" + success = 0; + } + if(job->ldapb) { + /* PROGRESS: Writing ethers.ldif file. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 81); + if(!itadmin_ethers_ldif_output(job)) { $? "! ethers ldif" + success = 0; + } + } + /* + Netgroups + */ + /* PROGRESS: Writing netgroup.ldif file. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 82); + if(!itadmin_netgroup_ldif_output(job)) { $? "! netgroup.ldif" + success = 0; + } + /* + DHCP configuration + */ + if(itadmin_job_do_dhcp(job)) { + /* PROGRESS: Writing dhcpd.conf file. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 83); + if(!itadmin_dhcpd_conf_output(job)) { $? "! dhcpd.conf" + success = 0; + } + } + /* + Network documentation + */ + /* PROGRESS: Writing netdocu.tex file. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 84); + if(!itadmin_netdocu(job)) { $? "! netdocu output" + success = 0; + } + } + if(itadmin_job_do_licenses(job)) { + /* + Write license report. + */ + /* PROGRESS: Writing licenses.tex file. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 85); + if(!itadmin_license_report(job)) { $? "! license report" + success = 0; + } + } + } + /* PROGRESS: Finished writing output. */ + itadmin_tool_log_1(job, DK3_LL_PROGRESS, 86); + } + } + if(success) { + job->exval = 0; + } else { $? "! no success" + } +} + + + +/** Run program or print help/license/version. + @param job Job structure. +*/ +static +void +itadmin_run_or_help(itadmin_job *job) +{ + $? "+ itadmin_run_or_help" + if((job->cmd) & (~(ITADMIN_CMD_CONFIG | ITADMIN_CMD_LICENSES))) { $? ". help" + job->exval = 0; + dk3sf_initialize_stdout(); + if((job->cmd) & ITADMIN_CMD_VERSION) { $? ". version" + itadmin_show_version(job); + } + if((job->cmd) & ITADMIN_CMD_LICENSE_TERMS) { $? ". license" + itadmin_show_license(job); + } + if((job->cmd) & ITADMIN_CMD_HELP) { $? ". help" + itadmin_show_help(job); + } + } else { $? ". run" + if(!((job->cmd) & (ITADMIN_CMD_CONFIG | ITADMIN_CMD_LICENSES))) { + job->cmd = (ITADMIN_CMD_CONFIG | ITADMIN_CMD_LICENSES); + } + itadmin_run(job); + } $? "- itadmin_run_or_help" +} + + + +/** Entry point of the program. + @param argc Number of command line arguments. + @param argv Command line arguments array. + @return 0 on success, any other value indicates an error. +*/ +DK3_MAIN +{ + itadmin_job job; /* Job structure. */ + dk3_app_t *app; /* Application structure. */ + dkChar const * const *msg; /* Localized message texts. */ + int exval = 1; /* Exit status code. */ + $!trace-init itadmin.deb + $? "+ main" +#if DK3_HAVE_TZSET + tzset(); +#endif + job.exval = 1; + app = dk3app_open_command( + argc, (dkChar const * const *)argv, itadmin_kw_noloc[0] + ); + if(app) { + msg = dk3app_messages(app,itadmin_kw_noloc[1],(dkChar const **)itadmin_kw); + if(msg) { + itadmin_job_init(&job, app, msg, itadmin_kw_noloc); + if(itadmin_job_up(&job)) { + if(itadmin_process_arguments(&job)) { + itadmin_run_or_help(&job); + } + } + itadmin_job_cleanup(&job); + } else { + /* + BUG: Should not happen as dk3app_messages() returns the default + string array if there is any error. + */ + } + dk3app_close(app); + } else { + /* ERROR: Memory */ + fprintf( + stderr, + "ERROR: Not enough memory\n" + ); + fflush(stderr); + } + exval = job.exval; + $? "- main %d", exval + $!trace-end + fflush(stdout); + exit(exval); return exval; +} + + + |