1 /*
2 Copyright (C) 2012-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 /*
7 WARNING: This file was generated by the dkct program (see
8 http://dktools.sourceforge.net/ for details).
9 Changes you make here will be lost if dkct is run again!
10 You should modify the original source and run dkct on it.
11 Original source: itamysql.ctr
12 */
13
14 /** @file itamysql.c The itamysql module.
15 */
16
17
18 #include <libdk3c/dk3all.h>
19 #include <itadmin/itadmin.h>
20
21 #if DK3_HAVE_MARIADB_MYSQL_H
22 #include <mariadb/mysql.h>
23 #else
24 #if DK3_HAVE_MYSQL_MYSQL_H
25 #include <mysql/mysql.h>
26 #else
27 #if DK3_HAVE_MYSQL_H
28 #include <mysql.h>
29 #endif
30 #endif
31 #endif
32
33
34
35
36
37
38 #if DK3_HAVE_MARIADB_MYSQL_H || DK3_HAVE_MYSQL_MYSQL_H || DK3_HAVE_MYSQL_H
39
40
41 /** Keywords used by this module.
42 */
43 static char const *itadmin_mysql_c8_kw[] = {
44 /* 0 */
45 "select * from users",
46
47 /* 1 */
48 "select * from buildings",
49
50 /* 2 */
51 "select * from vlans",
52
53 /* 3 */
54 "select * from patches",
55
56 /* 4 */
57 "select * from ddspeed",
58
59 /* 5 */
60 "select * from networks",
61
62 /* 6 */
63 "select * from netgroups",
64
65 /* 7 */
66 "select * from ngdeps",
67
68 /* 8 */
69 "select * from dhcpclasses",
70
71 /* 9 */
72 "select * from dhcpgroups",
73
74 /* 10 */
75 "select * from dhcppools",
76
77 /* 11 */
78 "select * from computers",
79
80 /* 12 */
81 "select * from aliases",
82
83 /* 13 */
84 "select * from dhcpoptions",
85
86 /* 14 */
87 "select * from swmanufacturers",
88
89 /* 15 */
90 "select * from swproducts",
91
92 /* 16 */
93 "select * from licensetypes",
94
95 /* 17 */
96 "select * from licenses",
97
98 NULL
99
100 };
101
102
103
104 /** Configuration section name "itadmin".
105 */
106 static char itadmin_mysql_arg_0[] = {
107 'i', 't', 'a', 'd', 'm', 'i', 'n', '\0'
108 };
109
110
111 /** Configuration section name "client".
112 */
113 static char itadmin_mysql_gr_client[] = {
114 'c', 'l', 'i', 'e', 'n', 't', '\0'
115 };
116
117
118 /** Argv array to initialize the library.
119 */
120 static char *itadmin_mysql_argv[] = {
121 itadmin_mysql_arg_0,
122 NULL
123 };
124
125
126 /** Groups (configuration file section) names.
127 */
128 static char *itadmin_mysql_groups[] = {
129 itadmin_mysql_gr_client,
130 itadmin_mysql_arg_0,
131 NULL
132 };
133
134
135 /** Elements from users table.
136 */
137 static char const * const itadmin_mysql_cn_users[] = {
138 /* 0 */
139 "us_s",
140
141 /* 1 */
142 "us_t",
143
144 /* 2 */
145 "us_sn",
146
147 /* 3 */
148 "us_fn",
149
150 /* 4 */
151 "us_em",
152
153 /* 5 */
154 "us_ko",
155
156 /* 6 */
157 "us_se",
158
159 NULL
160
161 };
162
163 /** Number of elements in itadmin_mysql_cn_users.
164 */
165 static size_t const itadmin_mysql_sz_cn_users =
166 sizeof(itadmin_mysql_cn_users)/sizeof(DK3_PCCHAR) - 1;
167
168
169 /** Elements from buildings table.
170 */
171 static char const * const itadmin_mysql_cn_buildings[] = {
172 /* 0 */
173 "gb_s",
174
175 /* 1 */
176 "gb_l",
177
178 /* 2 */
179 "gb_a1",
180
181 /* 3 */
182 "gb_a2",
183
184 /* 4 */
185 "gb_a3",
186
187 /* 5 */
188 "gb_a4",
189
190 /* 6 */
191 "gb_plz",
192
193 /* 7 */
194 "gb_ort",
195
196 NULL
197
198 };
199
200 /** Number of elements in itadmin_mysql_cn_buildings.
201 */
202 static size_t const itadmin_mysql_sz_cn_buildings =
203 sizeof(itadmin_mysql_cn_buildings)/sizeof(DK3_PCCHAR) - 1;
204
205
206 /** Elements from speed table.
207 */
208 static char const * const itadmin_mysql_cn_speed[] = {
209 /* 0 */
210 "sp_s",
211
212 /* 1 */
213 "sp_l",
214
215 NULL
216
217 };
218
219 /** Number of elements in itadmin_mysql_cn_speed.
220 */
221 static size_t const itadmin_mysql_sz_cn_speed =
222 sizeof(itadmin_mysql_cn_speed)/sizeof(DK3_PCCHAR) - 1;
223
224
225 /** Elements from vlan table.
226 */
227 static char const * const itadmin_mysql_cn_vlan[] = {
228 /* 0 */
229 "vl_s",
230
231 /* 1 */
232 "vl_l",
233
234 NULL
235
236 };
237
238 /** Number of elements in itadmin_mysql_cn_vlan.
239 */
240 static size_t const itadmin_mysql_sz_cn_vlan =
241 sizeof(itadmin_mysql_cn_vlan)/sizeof(DK3_PCCHAR) - 1;
242
243
244 /** Elements from patch table.
245 */
246 static char const * const itadmin_mysql_cn_patch[] = {
247 /* 0 */
248 "dd_n",
249
250 /* 1 */
251 "sp_s",
252
253 /* 2 */
254 "vl_s",
255
256 /* 3 */
257 "dd_p",
258
259 /* 4 */
260 "gb_s",
261
262 /* 5 */
263 "dd_r",
264
265 NULL
266
267 };
268
269 /** Number of elements in itadmin_mysql_cn_patch.
270 */
271 static size_t const itadmin_mysql_sz_cn_patch =
272 sizeof(itadmin_mysql_cn_patch)/sizeof(DK3_PCCHAR) - 1;
273
274
275 /** Elements from netgroup table.
276 */
277 static char const * const itadmin_mysql_cn_netgroup[] = {
278 /* 0 */
279 "ng_s",
280
281 /* 1 */
282 "ng_l",
283
284 NULL
285
286 };
287
288 /** Number of elements in itadmin_mysql_cn_netgroup.
289 */
290 static size_t const itadmin_mysql_sz_cn_netgroup =
291 sizeof(itadmin_mysql_cn_netgroup)/sizeof(DK3_PCCHAR) - 1;
292
293
294 /** Elements from dhcp_option table.
295 */
296 static char const * const itadmin_mysql_cn_dhcp_option[] = {
297 /* 0 */
298 "do_pk",
299
300 /* 1 */
301 "do_sc",
302
303 /* 2 */
304 "do_sn",
305
306 /* 3 */
307 "do_n",
308
309 /* 4 */
310 "do_v",
311
312 NULL
313
314 };
315
316 /** Number of elements in itadmin_mysql_cn_dhcp_option.
317 */
318 static size_t const itadmin_mysql_sz_cn_dhcp_option =
319 sizeof(itadmin_mysql_cn_dhcp_option)/sizeof(DK3_PCCHAR) - 1;
320
321
322 /** Elements from swman table.
323 */
324 static char const * const itadmin_mysql_cn_swman[] = {
325 /* 0 */
326 "sm_s",
327
328 /* 1 */
329 "sm_l",
330
331 NULL
332
333 };
334
335 /** Number of elements in itadmin_mysql_cn_swman.
336 */
337 static size_t const itadmin_mysql_sz_cn_swman =
338 sizeof(itadmin_mysql_cn_swman)/sizeof(DK3_PCCHAR) - 1;
339
340
341 /** Elements from swprod table.
342 */
343 static char const * const itadmin_mysql_cn_swprod[] = {
344 /* 0 */
345 "sw_s",
346
347 /* 1 */
348 "sw_l",
349
350 /* 2 */
351 "sm_s",
352
353 NULL
354
355 };
356
357 /** Number of elements in itadmin_mysql_cn_swprod.
358 */
359 static size_t const itadmin_mysql_sz_cn_swprod =
360 sizeof(itadmin_mysql_cn_swprod)/sizeof(DK3_PCCHAR) - 1;
361
362
363 /** Elements from lictype table.
364 */
365 static char const * const itadmin_mysql_cn_lictype[] = {
366 /* 0 */
367 "lt_s",
368
369 /* 1 */
370 "lt_l",
371
372 /* 2 */
373 "lt_i",
374
375 NULL
376
377 };
378
379 /** Number of elements in itadmin_mysql_cn_lictype.
380 */
381 static size_t const itadmin_mysql_sz_cn_lictype =
382 sizeof(itadmin_mysql_cn_lictype)/sizeof(DK3_PCCHAR) - 1;
383
384
385 /** Elements from license table.
386 */
387 static char const * const itadmin_mysql_cn_license[] = {
388 /* 0 */
389 "li_pk",
390
391 /* 1 */
392 "li_on",
393
394 /* 2 */
395 "sw_s",
396
397 /* 3 */
398 "us_s",
399
400 /* 4 */
401 "co_s",
402
403 /* 5 */
404 "lt_s",
405
406 /* 6 */
407 "li_no",
408
409 /* 7 */
410 "sr_s",
411
412 /* 8 */
413 "li_dd",
414
415 /* 9 */
416 "li_nd",
417
418 /* 10 */
419 "li_di",
420
421 /* 11 */
422 "li_ni",
423
424 NULL
425
426 };
427
428 /** Number of elements in itadmin_mysql_cn_license.
429 */
430 static size_t const itadmin_mysql_sz_cn_license =
431 sizeof(itadmin_mysql_cn_license)/sizeof(DK3_PCCHAR) - 1;
432
433
434 /** Elements from ngdep table.
435 */
436 static char const * const itadmin_mysql_cn_ngdep[] = {
437 /* 0 */
438 "nd_p",
439
440 /* 1 */
441 "nd_c",
442
443 NULL
444
445 };
446
447 /** Number of elements in itadmin_mysql_cn_ngdep.
448 */
449 static size_t const itadmin_mysql_sz_cn_ngdep =
450 sizeof(itadmin_mysql_cn_ngdep)/sizeof(DK3_PCCHAR) - 1;
451
452
453 /** Elements from hosts table.
454 */
455 static char const * const itadmin_mysql_cn_hosts[] = {
456 /* 0 */
457 "co_s",
458
459 /* 1 */
460 "us_s",
461
462 /* 2 */
463 "co_ip",
464
465 /* 3 */
466 "co_mc",
467
468 /* 4 */
469 "ng_s",
470
471 /* 5 */
472 "co_co",
473
474 /* 6 */
475 "dc_s",
476
477 /* 7 */
478 "dg_s",
479
480 /* 8 */
481 "dd_n",
482
483 /* 9 */
484 "gb_s",
485
486 /* 10 */
487 "co_r",
488
489 /* 11 */
490 "co_in",
491
492 /* 12 */
493 "co_sn",
494
495 /* 13 */
496 "co_dd",
497
498 /* 14 */
499 "co_ff",
500
501 /* 15 */
502 "co_gu",
503
504 /* 16 */
505 "co_hi",
506
507 /* 17 */
508 "co_ex",
509
510 /* 18 */
511 "co_nn",
512
513 /* 19 */
514 "co_na",
515
516 NULL
517
518 };
519
520 /** Number of elements in itadmin_mysql_cn_hosts.
521 */
522 static size_t const itadmin_mysql_sz_cn_hosts =
523 sizeof(itadmin_mysql_cn_hosts)/sizeof(DK3_PCCHAR) - 1;
524
525
526 /** Elements from network table.
527 */
528 static char const * const itadmin_mysql_cn_network[] = {
529 /* 0 */
530 "nw_ip",
531
532 /* 1 */
533 "nw_ma",
534
535 /* 2 */
536 "nw_gw",
537
538 /* 3 */
539 "nw_bc",
540
541 /* 4 */
542 "vl_s",
543
544 NULL
545
546 };
547
548 /** Number of elements in itadmin_mysql_cn_network.
549 */
550 static size_t const itadmin_mysql_sz_cn_network =
551 sizeof(itadmin_mysql_cn_network)/sizeof(DK3_PCCHAR) - 1;
552
553
554 /** Elements from dhcp_class table.
555 */
556 static char const * const itadmin_mysql_cn_dhcp_class[] = {
557 /* 0 */
558 "dc_s",
559
560 /* 1 */
561 "dc_d",
562
563 NULL
564
565 };
566
567 /** Number of elements in itadmin_mysql_cn_dhcp_class.
568 */
569 static size_t const itadmin_mysql_sz_cn_dhcp_class =
570 sizeof(itadmin_mysql_cn_dhcp_class)/sizeof(DK3_PCCHAR) - 1;
571
572
573 /** Elements from dhcp_group table.
574 */
575 static char const * const itadmin_mysql_cn_dhcp_group[] = {
576 /* 0 */
577 "dg_s",
578
579 /* 1 */
580 "dg_l",
581
582 NULL
583
584 };
585
586 /** Number of elements in itadmin_mysql_cn_dhcp_group.
587 */
588 static size_t const itadmin_mysql_sz_cn_dhcp_group =
589 sizeof(itadmin_mysql_cn_dhcp_group)/sizeof(DK3_PCCHAR) - 1;
590
591
592 /** Elements from dhcp_pool table.
593 */
594 static char const * const itadmin_mysql_cn_dhcp_pool[] = {
595 /* 0 */
596 "dp_st",
597
598 /* 1 */
599 "dp_en",
600
601 /* 2 */
602 "nw_ip",
603
604 /* 3 */
605 "dp_al",
606
607 /* 4 */
608 "dp_dn",
609
610 /* 5 */
611 "dc_s",
612
613 NULL
614
615 };
616
617 /** Number of elements in itadmin_mysql_cn_dhcp_pool.
618 */
619 static size_t const itadmin_mysql_sz_cn_dhcp_pool =
620 sizeof(itadmin_mysql_cn_dhcp_pool)/sizeof(DK3_PCCHAR) - 1;
621
622
623 /** Elements from alias table.
624 */
625 static char const * const itadmin_mysql_cn_alias[] = {
626 /* 0 */
627 "al_s",
628
629 /* 1 */
630 "co_s",
631
632 NULL
633
634 };
635
636 /** Number of elements in itadmin_mysql_cn_alias.
637 */
638 static size_t const itadmin_mysql_sz_cn_alias =
639 sizeof(itadmin_mysql_cn_alias)/sizeof(DK3_PCCHAR) - 1;
640
641
642 #if VERSION_BEFORE_20120208
643 /** Obtain int value from string.
644 @param job Job structure.
645 @param ptr String to convert.
646 @param lgt Length of string.
647 @param def Default value to use if conversion fails.
648 @return The value or the default value.
649 */
650 static
651 int
itadmin_mysql_read_int(itadmin_job * job,char const * ptr,size_t lgt,int def)652 itadmin_mysql_read_int(itadmin_job *job, char const *ptr, size_t lgt, int def)
653 {
654 int back;
655 int i;
656
657 back = def;
658 if(ptr) {
659 if(lgt) {
660 if(sscanf(ptr, "%d", &i) == 1) {
661 back = i;
662 }
663 }
664 }
665 return back;
666 }
667 #else
668 /** Obtain int value from string.
669 @param ptr String to convert.
670 @param lgts Lengths of strings.
671 @param cnind Column name indices.
672 @param ind Current index to use.
673 @param def Default value to use if conversion fails.
674 @return The value or the default value.
675 */
676 static
677 int
itadmin_mysql_read_int(char const * ptr,unsigned long * lgts,size_t * cnind,size_t ind,int def)678 itadmin_mysql_read_int(
679 char const *ptr,
680 unsigned long *lgts,
681 size_t *cnind,
682 size_t ind,
683 int def
684 )
685 {
686 int back;
687 int i;
688
689 back = def;
690 if(ptr) {
691 if(cnind[ind] != 0xFFFFU) {
692 if(lgts[cnind[ind]]) {
693 if(sscanf(ptr, "%d", &i) == 1) {
694 back = i;
695 }
696 }
697 }
698 }
699 return back;
700 }
701 #endif
702
703
704 /** Find column name indices.
705 For column names not found the program sets the index
706 to 0xFFFFU.
707 @param cnind Destination array for indices.
708 @param sz_cnind Size of @a cnind.
709 @param nf Number of fields in query result.
710 @param mr Query result.
711 @param colnames Column names.
712 */
713 static
714 void
itadmin_data_mysql_find_indices(size_t * cnind,size_t sz_cnind,size_t nf,MYSQL_RES * mr,char const * const * colnames)715 itadmin_data_mysql_find_indices(
716 size_t *cnind,
717 size_t sz_cnind,
718 size_t nf,
719 MYSQL_RES *mr,
720 char const * const *colnames
721 )
722 {
723 MYSQL_FIELD *field;
724 size_t i;
725 int ai;
726 for(i = 0; i < sz_cnind; i++) { cnind[i] = 0xFFFFU; }
727 for(i = 0; i < nf; i++) {
728 /*
729 nf is retrieved as unsigned from a MySQL function,
730 so conversion back to unsigned is ok.
731 */
732 field = mysql_fetch_field_direct(mr, (unsigned int)i);
733 if(field) {
734 if(field->name) {
735 ai = dk3str_c8_array_index(colnames, field->name, 0);
736 if(ai >= 0) {
737 if(((size_t)ai) < sz_cnind) {
738 cnind[(size_t)ai] = i;
739 }
740 }
741 }
742 }
743 }
744 }
745
746
747
748 /** Set value pointers.
749 @param val Value pointers array.
750 @param cnind Index array.
751 @param sz_cnind Size of @a val and @a cnind.
752 @param nf Number of fields in @a mrow.
753 @param mrow One result row.
754 @param lgts Array of string lengths for row.
755 */
756 static
757 void
itadmin_data_mysql_set_pointers(char const ** val,size_t * cnind,size_t sz_cnind,size_t nf,MYSQL_ROW mrow,unsigned long * lgts)758 itadmin_data_mysql_set_pointers(
759 char const * *val,
760 size_t *cnind,
761 size_t sz_cnind,
762 size_t nf,
763 MYSQL_ROW mrow,
764 unsigned long *lgts
765 )
766 {
767 size_t i;
768 size_t j;
769 for(i = 0; i < sz_cnind; i++) {
770 val[i] = NULL;
771 if(cnind[i] != 0xFFFFU) {
772 j = cnind[i];
773 if(j < nf) {
774 if(lgts[j]) {
775 if(mrow[j]) {
776 val[i] = mrow[j];
777 }
778 }
779 }
780 }
781 }
782 }
783
784
785
786 /** Read aliases table.
787 @param job Job structure.
788 @return 1 on success, 0 on error.
789 */
790 static
791 int
itadmin_data_mysql_alias(itadmin_job * job)792 itadmin_data_mysql_alias(itadmin_job *job)
793 {
794 MYSQL_RES *mr; /* Results set. */
795 MYSQL_ROW mrow; /* One result row. */
796 char const *val[sizeof(itadmin_mysql_cn_alias)/sizeof(DK3_PCCHAR) - 1];
797 size_t cnind[sizeof(itadmin_mysql_cn_alias)/sizeof(DK3_PCCHAR) - 1];
798 unsigned long *lgts; /* Field lengths. */
799 unsigned int nf; /* Number of fields in result. */
800 int res; /* Query result. */
801 int back = 0;
802
803 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[12]);
804 if(0 == res) {
805 mr = mysql_use_result((MYSQL *)(job->dbptr));
806 if(mr) {
807 nf = mysql_num_fields(mr);
808 itadmin_data_mysql_find_indices(
809 cnind, itadmin_mysql_sz_cn_alias, nf, mr,
810 itadmin_mysql_cn_alias
811 );
812 back = 1;
813 do {
814 mrow = mysql_fetch_row(mr);
815 if(mrow) {
816 lgts = mysql_fetch_lengths(mr);
817 if(lgts) {
818 itadmin_data_mysql_set_pointers(
819 val, cnind, itadmin_mysql_sz_cn_alias,
820 nf, mrow, lgts
821 );
822 res = itadmin_register_alias(
823 job,
824 val[0], val[1]
825 );
826 if(!(res)) { back = 0; }
827 } else {
828 back = 0;
829 }
830 }
831 } while(mrow);
832 mysql_free_result(mr);
833 } else {
834 /* ERROR: Failed to obtain results list */
835 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
836 }
837 } else {
838 /* ERROR: Query failed! */
839 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
840 }
841
842 return back;
843 }
844
845
846
847 /** Read DHCP pool table.
848 @param job Job structure.
849 @return 1 on success, 0 on error.
850 */
851 static
852 int
itadmin_data_mysql_dhcp_pool(itadmin_job * job)853 itadmin_data_mysql_dhcp_pool(itadmin_job *job)
854 {
855 MYSQL_RES *mr; /* Results set. */
856 MYSQL_ROW mrow; /* One result row. */
857 char const *val[sizeof(itadmin_mysql_cn_dhcp_pool)/sizeof(DK3_PCCHAR) - 1];
858 size_t cnind[sizeof(itadmin_mysql_cn_dhcp_pool)/sizeof(DK3_PCCHAR) - 1];
859 unsigned long *lgts; /* Field lengths. */
860 unsigned int nf; /* Number of fields in result. */
861 int res; /* Query result. */
862 int back = 0;
863
864 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[10]);
865 if(0 == res) {
866 mr = mysql_use_result((MYSQL *)(job->dbptr));
867 if(mr) {
868 nf = mysql_num_fields(mr);
869 itadmin_data_mysql_find_indices(
870 cnind, itadmin_mysql_sz_cn_dhcp_pool, nf, mr,
871 itadmin_mysql_cn_dhcp_pool
872 );
873 back = 1;
874 do {
875 mrow = mysql_fetch_row(mr);
876 if(mrow) {
877 lgts = mysql_fetch_lengths(mr);
878 if(lgts) {
879 itadmin_data_mysql_set_pointers(
880 val, cnind, itadmin_mysql_sz_cn_dhcp_pool,
881 nf, mrow, lgts
882 );
883 res = itadmin_register_dhcp_pool(
884 job,
885 val[0], val[1], val[2],
886 #if VERSION_BEFORE_20120208
887 itadmin_mysql_read_int(val[3], lgts[cnind[3]], 0),
888 itadmin_mysql_read_int(val[4], lgts[cnind[4]], 0),
889 #else
890 itadmin_mysql_read_int(val[3], lgts, cnind, 3, 0),
891 itadmin_mysql_read_int(val[4], lgts, cnind, 4, 0),
892 #endif
893 val[5]
894 );
895 if(!(res)) { back = 0; }
896 } else {
897 back = 0;
898 }
899 }
900 } while(mrow);
901
902 mysql_free_result(mr);
903 } else {
904 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
905 }
906 } else {
907 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
908 }
909
910 return back;
911 }
912
913
914 /** Read DHCP group table.
915 @param job Job structure.
916 @return 1 on success, 0 on error.
917 */
918 static
919 int
itadmin_data_mysql_dhcp_group(itadmin_job * job)920 itadmin_data_mysql_dhcp_group(itadmin_job *job)
921 {
922 MYSQL_RES *mr; /* Results set. */
923 MYSQL_ROW mrow; /* One result row. */
924 char const *val[sizeof(itadmin_mysql_cn_dhcp_group)/sizeof(DK3_PCCHAR) - 1];
925 size_t cnind[sizeof(itadmin_mysql_cn_dhcp_group)/sizeof(DK3_PCCHAR) - 1];
926 unsigned long *lgts; /* Field lengths. */
927 unsigned int nf; /* Number of fields in result. */
928 int res; /* Query result. */
929 int back = 0;
930
931 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[9]);
932 if(0 == res) {
933 mr = mysql_use_result((MYSQL *)(job->dbptr));
934 if(mr) {
935 nf = mysql_num_fields(mr);
936 itadmin_data_mysql_find_indices(
937 cnind, itadmin_mysql_sz_cn_dhcp_group, nf, mr,
938 itadmin_mysql_cn_dhcp_group
939 );
940 back = 1;
941 do {
942 mrow = mysql_fetch_row(mr);
943 if(mrow) {
944 lgts = mysql_fetch_lengths(mr);
945 if(lgts) {
946 itadmin_data_mysql_set_pointers(
947 val, cnind, itadmin_mysql_sz_cn_dhcp_group,
948 nf, mrow, lgts
949 );
950 res = itadmin_register_dhcp_group(job, val[0], val[1]);
951 if(!(res)) { back = 0; }
952 } else {
953 back = 0;
954 }
955 }
956 } while(mrow);
957 mysql_free_result(mr);
958 } else {
959 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
960 }
961 } else {
962 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
963 }
964
965 return back;
966 }
967
968
969
970 /** Read DHCP class table.
971 @param job Job structure.
972 @return 1 on success, 0 on error.
973 */
974 static
975 int
itadmin_data_mysql_dhcp_class(itadmin_job * job)976 itadmin_data_mysql_dhcp_class(itadmin_job *job)
977 {
978 MYSQL_RES *mr; /* Results set. */
979 MYSQL_ROW mrow; /* One result row. */
980 char const *val[sizeof(itadmin_mysql_cn_dhcp_class)/sizeof(DK3_PCCHAR) - 1];
981 size_t cnind[sizeof(itadmin_mysql_cn_dhcp_class)/sizeof(DK3_PCCHAR) - 1];
982 unsigned long *lgts; /* Field lengths. */
983 unsigned int nf; /* Number of fields in result. */
984 int res; /* Query result. */
985 int back = 0;
986
987 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[8]);
988 if(0 == res) {
989 mr = mysql_use_result((MYSQL *)(job->dbptr));
990 if(mr) {
991 nf = mysql_num_fields(mr);
992 itadmin_data_mysql_find_indices(
993 cnind, itadmin_mysql_sz_cn_dhcp_class, nf, mr,
994 itadmin_mysql_cn_dhcp_class
995 );
996 back = 1;
997 do {
998 mrow = mysql_fetch_row(mr);
999 if(mrow) {
1000 lgts = mysql_fetch_lengths(mr);
1001 if(lgts) {
1002 itadmin_data_mysql_set_pointers(
1003 val, cnind, itadmin_mysql_sz_cn_dhcp_class,
1004 nf, mrow, lgts
1005 );
1006 res = itadmin_register_dhcp_class(job, val[0], val[1]);
1007 if(!(res)) { back = 0; }
1008 } else {
1009 back = 0;
1010 }
1011 }
1012 } while(mrow);
1013 mysql_free_result(mr);
1014 } else {
1015 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1016 }
1017 } else {
1018 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1019 }
1020
1021 return back;
1022 }
1023
1024
1025
1026 /** Read networks table.
1027 @param job Job structure.
1028 @return 1 on success, 0 on error.
1029 */
1030 static
1031 int
itadmin_data_mysql_network(itadmin_job * job)1032 itadmin_data_mysql_network(itadmin_job *job)
1033 {
1034 MYSQL_RES *mr; /* Results set. */
1035 MYSQL_ROW mrow; /* One result row. */
1036 char const *val[sizeof(itadmin_mysql_cn_network)/sizeof(DK3_PCCHAR) - 1];
1037 size_t cnind[sizeof(itadmin_mysql_cn_network)/sizeof(DK3_PCCHAR) - 1];
1038 unsigned long *lgts; /* Field lengths. */
1039 unsigned int nf; /* Number of fields in result. */
1040 int res; /* Query result. */
1041 int back = 0;
1042
1043 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[5]);
1044 if(0 == res) {
1045 mr = mysql_use_result((MYSQL *)(job->dbptr));
1046 if(mr) {
1047 nf = mysql_num_fields(mr);
1048 itadmin_data_mysql_find_indices(
1049 cnind, itadmin_mysql_sz_cn_network, nf, mr,
1050 itadmin_mysql_cn_network
1051 );
1052 back = 1;
1053 do {
1054 mrow = mysql_fetch_row(mr);
1055 if(mrow) {
1056 lgts = mysql_fetch_lengths(mr);
1057 if(lgts) {
1058 itadmin_data_mysql_set_pointers(
1059 val, cnind, itadmin_mysql_sz_cn_network,
1060 nf, mrow, lgts
1061 );
1062 res = itadmin_register_network(
1063 job, val[0], val[1], val[2], val[3], val[4]
1064 );
1065 if(!(res)) { back = 0; }
1066 } else {
1067 back = 0;
1068 }
1069 }
1070 } while(mrow);
1071 mysql_free_result(mr);
1072 } else {
1073 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1074 }
1075 } else {
1076 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1077 }
1078
1079 return back;
1080 }
1081
1082
1083
1084 /** Read hosts table.
1085 @param job Job structure.
1086 @return 1 on success, 0 on error.
1087 */
1088 static
1089 int
itadmin_data_mysql_hosts(itadmin_job * job)1090 itadmin_data_mysql_hosts(itadmin_job *job)
1091 {
1092 itadmin_date expi; /* Expiration date for host entry. */
1093 MYSQL_RES *mr; /* Results set. */
1094 MYSQL_ROW mrow; /* One result row. */
1095 char const *val[sizeof(itadmin_mysql_cn_hosts)/sizeof(DK3_PCCHAR) - 1];
1096 size_t cnind[sizeof(itadmin_mysql_cn_hosts)/sizeof(DK3_PCCHAR) - 1];
1097 unsigned long *lgts; /* Field lengths. */
1098 unsigned int nf; /* Number of fields in result. */
1099 int res; /* Query result. */
1100 int hexpi; /* Flag: Have expiration date. */
1101 int flag_first; /* Flag: Write FQDN to /etc/hosts first. */
1102 int flag_guest; /* Flag: Guest computer. */
1103 int flag_no_net_docu; /* Flag: Skip host in docu. */
1104 int flag_no_arpwatch; /* Flag: Skip host for arpwatch. */
1105 int back = 0;
1106
1107 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[11]);
1108 if(0 == res) {
1109 mr = mysql_use_result((MYSQL *)(job->dbptr));
1110 if(mr) {
1111 nf = mysql_num_fields(mr);
1112 itadmin_data_mysql_find_indices(
1113 cnind, itadmin_mysql_sz_cn_hosts, nf, mr,
1114 itadmin_mysql_cn_hosts
1115 );
1116 back = 1;
1117 do {
1118 mrow = mysql_fetch_row(mr);
1119 if(mrow) {
1120 lgts = mysql_fetch_lengths(mr);
1121 if(lgts) {
1122 itadmin_data_mysql_set_pointers(
1123 val, cnind, itadmin_mysql_sz_cn_hosts,
1124 nf, mrow, lgts
1125 );
1126 flag_first =
1127 itadmin_mysql_read_int(val[14], lgts, cnind, 14, 0);
1128 flag_guest =
1129 itadmin_mysql_read_int(val[15], lgts, cnind, 15, 0);
1130 flag_no_net_docu =
1131 itadmin_mysql_read_int(val[18], lgts, cnind, 18, 0);
1132 flag_no_arpwatch =
1133 itadmin_mysql_read_int(val[19], lgts, cnind, 19, 0);
1134 itadmin_mem_date_init(&expi);
1135 hexpi = 0;
1136 if(val[17]) {
1137 if(cnind[17] != 0xFFFFU) {
1138 if(lgts[cnind[17]]) {
1139 if(itadmin_tool_convert_date(job, &expi, val[17])) {
1140 hexpi = 1;
1141 } else {
1142 }
1143 } else {
1144 }
1145 } else {
1146 }
1147 } else {
1148 }
1149 res = itadmin_register_host(
1150 job, val[0], val[1], val[2], val[3], val[4], val[5], val[6],
1151 val[7], val[8], val[9], val[10], val[11], val[12], val[13],
1152 flag_first, flag_guest, val[16], ((hexpi) ? &expi : NULL),
1153 flag_no_net_docu, flag_no_arpwatch
1154 );
1155 if(!(res)) { back = 0; }
1156 } else {
1157 back = 0;
1158 }
1159 }
1160 } while(mrow);
1161 mysql_free_result(mr);
1162 } else {
1163 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1164 }
1165 } else {
1166 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1167 }
1168
1169 return back;
1170 }
1171
1172
1173
1174 /** Read ngdep table.
1175 @param job Job structure.
1176 @return 1 on success, 0 on error.
1177 */
1178 static
1179 int
itadmin_data_mysql_ngdep(itadmin_job * job)1180 itadmin_data_mysql_ngdep(itadmin_job *job)
1181 {
1182 MYSQL_RES *mr; /* Results set. */
1183 MYSQL_ROW mrow; /* One result row. */
1184 char const *val[sizeof(itadmin_mysql_cn_ngdep)/sizeof(DK3_PCCHAR) - 1];
1185 size_t cnind[sizeof(itadmin_mysql_cn_ngdep)/sizeof(DK3_PCCHAR) - 1];
1186 unsigned long *lgts; /* Field lengths. */
1187 unsigned int nf; /* Number of fields in result. */
1188 int res; /* Query result. */
1189 int back = 0;
1190
1191 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[7]);
1192 if(0 == res) {
1193 mr = mysql_use_result((MYSQL *)(job->dbptr));
1194 if(mr) {
1195 nf = mysql_num_fields(mr);
1196 itadmin_data_mysql_find_indices(
1197 cnind, itadmin_mysql_sz_cn_ngdep, nf, mr,
1198 itadmin_mysql_cn_ngdep
1199 );
1200 back = 1;
1201 do {
1202 mrow = mysql_fetch_row(mr);
1203 if(mrow) {
1204 lgts = mysql_fetch_lengths(mr);
1205 if(lgts) {
1206 itadmin_data_mysql_set_pointers(
1207 val, cnind, itadmin_mysql_sz_cn_ngdep,
1208 nf, mrow, lgts
1209 );
1210 res = itadmin_register_ngdep(job, val[0], val[1]);
1211 if(!(res)) { back = 0; }
1212 } else {
1213 back = 0;
1214 }
1215 }
1216 } while(mrow);
1217 mysql_free_result(mr);
1218 } else {
1219 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1220 }
1221 } else {
1222 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1223 }
1224
1225 return back;
1226 }
1227
1228
1229
1230 /** Read license types table.
1231 @param job Job structure.
1232 @return 1 on success, 0 on error.
1233 */
1234 static
1235 int
itadmin_data_mysql_license(itadmin_job * job)1236 itadmin_data_mysql_license(itadmin_job *job)
1237 {
1238 char lnbuffer[128]; /* Line number buffer. */
1239 MYSQL_RES *mr; /* Results set. */
1240 MYSQL_ROW mrow; /* One result row. */
1241 itadmin_date dd; /* Delivery date. */
1242 itadmin_date di; /* Invoice date. */
1243 char const *val[sizeof(itadmin_mysql_cn_license)/sizeof(DK3_PCCHAR) - 1];
1244 size_t cnind[sizeof(itadmin_mysql_cn_license)/sizeof(DK3_PCCHAR) - 1];
1245 unsigned long *lgts; /* Field lengths. */
1246 unsigned long pk; /* Primary key. */
1247 unsigned long lineno; /* Record number. */
1248 unsigned int nf; /* Number of fields in result. */
1249 int res; /* Query result. */
1250 int back = 0;
1251
1252 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[17]);
1253 if(0 == res) {
1254 mr = mysql_use_result((MYSQL *)(job->dbptr));
1255 if(mr) {
1256 nf = mysql_num_fields(mr);
1257 itadmin_data_mysql_find_indices(
1258 cnind, itadmin_mysql_sz_cn_license, nf, mr,
1259 itadmin_mysql_cn_license
1260 );
1261 back = 1;
1262 lineno = 0UL;
1263 do {
1264 mrow = mysql_fetch_row(mr);
1265 if(mrow) {
1266 lgts = mysql_fetch_lengths(mr);
1267 if(lgts) {
1268 itadmin_data_mysql_set_pointers(
1269 val, cnind, itadmin_mysql_sz_cn_license,
1270 nf, mrow, lgts
1271 );
1272 /*
1273 res = itadmin_register_license(
1274 job, val[0], val[1], licno
1275 );
1276 if(!(res)) { back = 0; }
1277 */
1278 if(val[0]) {
1279 if(sscanf(val[0], "%lu", &pk) == 1) {
1280 if(val[8]) {
1281 if(cnind[8] != 0xFFFFU) {
1282 if(lgts[cnind[8]]) {
1283 itadmin_tool_convert_date(job, &dd, val[8]);
1284 }
1285 }
1286 }
1287 if(val[10]) {
1288 if(cnind[10] != 0xFFFFU) {
1289 if(lgts[cnind[10]]) {
1290 itadmin_tool_convert_date(job, &di, val[10]);
1291 }
1292 }
1293 }
1294 res = itadmin_register_license(
1295 job,
1296 pk,
1297 val[1], /* li_on */
1298 val[2], /* sw_s */
1299 val[3], /* us_s */
1300 val[4], /* co_s */
1301 val[5], /* lt_s */
1302 val[6], /* li_no */
1303 val[9], /* li_nd */
1304 val[11] /* li_ni */
1305 );
1306 if(!(res)) { back = 0; }
1307 } else {
1308 /* ERROR: Primary key not numeric! */
1309 sprintf(lnbuffer, "%lu", lineno);
1310 itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 143, 144, lnbuffer);
1311 }
1312 } else {
1313 /* ERROR: No primary key */
1314 sprintf(lnbuffer, "%lu", lineno);
1315 itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 143, 145, lnbuffer);
1316 }
1317 } else {
1318 back = 0;
1319 }
1320 }
1321 lineno++;
1322 } while(mrow);
1323 mysql_free_result(mr);
1324 } else {
1325 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1326 }
1327 } else {
1328 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1329 }
1330
1331 return back;
1332 }
1333
1334
1335
1336 /** Read license types table.
1337 @param job Job structure.
1338 @return 1 on success, 0 on error.
1339 */
1340 static
1341 int
itadmin_data_mysql_lictype(itadmin_job * job)1342 itadmin_data_mysql_lictype(itadmin_job *job)
1343 {
1344 MYSQL_RES *mr; /* Results set. */
1345 MYSQL_ROW mrow; /* One result row. */
1346 char const *val[sizeof(itadmin_mysql_cn_lictype)/sizeof(DK3_PCCHAR) - 1];
1347 size_t cnind[sizeof(itadmin_mysql_cn_lictype)/sizeof(DK3_PCCHAR) - 1];
1348 unsigned long *lgts; /* Field lengths. */
1349 unsigned int nf; /* Number of fields in result. */
1350 int res; /* Query result. */
1351 int licno; /* Number of licenses. */
1352 int back = 0;
1353
1354 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[16]);
1355 if(0 == res) {
1356 mr = mysql_use_result((MYSQL *)(job->dbptr));
1357 if(mr) {
1358 nf = mysql_num_fields(mr);
1359 itadmin_data_mysql_find_indices(
1360 cnind, itadmin_mysql_sz_cn_lictype, nf, mr,
1361 itadmin_mysql_cn_lictype
1362 );
1363 back = 1;
1364 do {
1365 mrow = mysql_fetch_row(mr);
1366 if(mrow) {
1367 lgts = mysql_fetch_lengths(mr);
1368 if(lgts) {
1369 itadmin_data_mysql_set_pointers(
1370 val, cnind, itadmin_mysql_sz_cn_lictype,
1371 nf, mrow, lgts
1372 );
1373 licno = 1;
1374 if(val[2]) {
1375 char const *s;
1376 int i;
1377 s = dk3str_c8_start(val[2], NULL);
1378 if(s) {
1379 if(sscanf(s, "%d", &i) == 1) {
1380 licno = i;
1381 } else {
1382 /* ERROR: Not a number! */
1383 itadmin_tool_log_utf8_5(
1384 job, DK3_LL_ERROR, 146, 147, 148, val[0], s
1385 );
1386 }
1387 }
1388 }
1389 res = itadmin_register_lictype(
1390 job, val[0], val[1], licno
1391 );
1392 if(!(res)) { back = 0; }
1393 } else {
1394 back = 0;
1395 }
1396 }
1397 } while(mrow);
1398 mysql_free_result(mr);
1399 } else {
1400 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1401 }
1402 } else {
1403 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1404 }
1405
1406 return back;
1407 }
1408
1409
1410
1411 /** Read software products table.
1412 @param job Job structure.
1413 @return 1 on success, 0 on error.
1414 */
1415 static
1416 int
itadmin_data_mysql_swprod(itadmin_job * job)1417 itadmin_data_mysql_swprod(itadmin_job *job)
1418 {
1419 MYSQL_RES *mr; /* Results set. */
1420 MYSQL_ROW mrow; /* One result row. */
1421 char const *val[sizeof(itadmin_mysql_cn_swprod)/sizeof(DK3_PCCHAR) - 1];
1422 size_t cnind[sizeof(itadmin_mysql_cn_swprod)/sizeof(DK3_PCCHAR) - 1];
1423 unsigned long *lgts; /* Field lengths. */
1424 unsigned int nf; /* Number of fields in result. */
1425 int res; /* Query result. */
1426 int back = 0;
1427
1428 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[15]);
1429 if(0 == res) {
1430 mr = mysql_use_result((MYSQL *)(job->dbptr));
1431 if(mr) {
1432 nf = mysql_num_fields(mr);
1433 itadmin_data_mysql_find_indices(
1434 cnind, itadmin_mysql_sz_cn_swprod, nf, mr,
1435 itadmin_mysql_cn_swprod
1436 );
1437 back = 1;
1438 do {
1439 mrow = mysql_fetch_row(mr);
1440 if(mrow) {
1441 lgts = mysql_fetch_lengths(mr);
1442 if(lgts) {
1443 itadmin_data_mysql_set_pointers(
1444 val, cnind, itadmin_mysql_sz_cn_swprod,
1445 nf, mrow, lgts
1446 );
1447 res = itadmin_register_swprod(
1448 job, val[0], val[1], val[2]
1449 );
1450 if(!(res)) { back = 0; }
1451 } else {
1452 back = 0;
1453 }
1454 }
1455 } while(mrow);
1456 mysql_free_result(mr);
1457 } else {
1458 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1459 }
1460 } else {
1461 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1462 }
1463
1464 return back;
1465 }
1466
1467
1468
1469 /** Read swman table.
1470 @param job Job structure.
1471 @return 1 on success, 0 on error.
1472 */
1473 static
1474 int
itadmin_data_mysql_swman(itadmin_job * job)1475 itadmin_data_mysql_swman(itadmin_job *job)
1476 {
1477 char lnbuffer[128]; /* Buffer for record number. */
1478 unsigned long lineno; /* Record number. */
1479 MYSQL_RES *mr; /* Results set. */
1480 MYSQL_ROW mrow; /* One result row. */
1481 char const *val[sizeof(itadmin_mysql_cn_swman)/sizeof(DK3_PCCHAR) - 1];
1482 size_t cnind[sizeof(itadmin_mysql_cn_swman)/sizeof(DK3_PCCHAR) - 1];
1483 unsigned long *lgts; /* Field lengths. */
1484 #if 0
1485 long pk;
1486 #endif
1487 unsigned int nf; /* Number of fields in result. */
1488 int res; /* Query result. */
1489 int back = 0;
1490
1491 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[14]);
1492 if(0 == res) {
1493 mr = mysql_use_result((MYSQL *)(job->dbptr));
1494 if(mr) {
1495 nf = mysql_num_fields(mr);
1496 itadmin_data_mysql_find_indices(
1497 cnind, itadmin_mysql_sz_cn_swman, nf, mr,
1498 itadmin_mysql_cn_swman
1499 );
1500 back = 1;
1501 lineno = 0UL;
1502 do {
1503 mrow = mysql_fetch_row(mr);
1504 if(mrow) {
1505 lgts = mysql_fetch_lengths(mr);
1506 if(lgts) {
1507 itadmin_data_mysql_set_pointers(
1508 val, cnind, itadmin_mysql_sz_cn_swman,
1509 nf, mrow, lgts
1510 );
1511 res = 0;
1512 if(val[0]) {
1513 res = itadmin_register_swman(
1514 job, val[0], val[1]
1515 );
1516 } else {
1517 /* ERROR: No pk pointer! */
1518 sprintf(lnbuffer, "%lu", lineno);
1519 itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 149, 150, lnbuffer);
1520 }
1521 if(!(res)) { back = 0; }
1522 } else {
1523 back = 0;
1524 }
1525 }
1526 lineno++;
1527 } while(mrow);
1528 mysql_free_result(mr);
1529 } else {
1530 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1531 }
1532 } else {
1533 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1534 }
1535
1536 return back;
1537 }
1538
1539
1540
1541 /** Read dhcp_option table.
1542 @param job Job structure.
1543 @return 1 on success, 0 on error.
1544 */
1545 static
1546 int
itadmin_data_mysql_dhcp_option(itadmin_job * job)1547 itadmin_data_mysql_dhcp_option(itadmin_job *job)
1548 {
1549 char lnbuffer[128]; /* Record number buffer. */
1550 unsigned long lineno; /* Record number. */
1551 MYSQL_RES *mr; /* Results set. */
1552 MYSQL_ROW mrow; /* One result row. */
1553 char const *val[sizeof(itadmin_mysql_cn_dhcp_option)/sizeof(DK3_PCCHAR) - 1];
1554 size_t cnind[sizeof(itadmin_mysql_cn_dhcp_option)/sizeof(DK3_PCCHAR) - 1];
1555 unsigned long *lgts; /* Field lengths. */
1556 long pk;
1557 unsigned int nf; /* Number of fields in result. */
1558 int res; /* Query result. */
1559 int back = 0;
1560
1561 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[13]);
1562 if(0 == res) {
1563 mr = mysql_use_result((MYSQL *)(job->dbptr));
1564 if(mr) {
1565 nf = mysql_num_fields(mr);
1566 itadmin_data_mysql_find_indices(
1567 cnind, itadmin_mysql_sz_cn_dhcp_option, nf, mr,
1568 itadmin_mysql_cn_dhcp_option
1569 );
1570 back = 1;
1571 lineno = 0UL;
1572 do {
1573 mrow = mysql_fetch_row(mr);
1574 if(mrow) {
1575 lgts = mysql_fetch_lengths(mr);
1576 if(lgts) {
1577 itadmin_data_mysql_set_pointers(
1578 val, cnind, itadmin_mysql_sz_cn_dhcp_option,
1579 nf, mrow, lgts
1580 );
1581 res = 0;
1582 if(val[0]) {
1583 if(sscanf(val[0], "%ld", &pk) == 1) {
1584 res = itadmin_register_dhcp_option(
1585 job, val[1], val[2], val[3], val[4], pk
1586 );
1587 } else {
1588 /* ERROR: pk not a number! */
1589 sprintf(lnbuffer, "%lu", lineno);
1590 itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 151, 152, lnbuffer);
1591 }
1592 } else {
1593 /* ERROR: No pk pointer! */
1594 sprintf(lnbuffer, "%lu", lineno);
1595 itadmin_tool_log_utf8_3(job, DK3_LL_ERROR, 151, 153, lnbuffer);
1596 }
1597 if(!(res)) { back = 0; }
1598 } else {
1599 back = 0;
1600 }
1601 }
1602 lineno++;
1603 } while(mrow);
1604 mysql_free_result(mr);
1605 } else {
1606 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1607 }
1608 } else {
1609 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1610 }
1611
1612 return back;
1613 }
1614
1615
1616
1617 /** Read netgroup table.
1618 @param job Job structure.
1619 @return 1 on success, 0 on error.
1620 */
1621 static
1622 int
itadmin_data_mysql_netgroup(itadmin_job * job)1623 itadmin_data_mysql_netgroup(itadmin_job *job)
1624 {
1625 MYSQL_RES *mr; /* Results set. */
1626 MYSQL_ROW mrow; /* One result row. */
1627 char const *val[sizeof(itadmin_mysql_cn_netgroup)/sizeof(DK3_PCCHAR) - 1];
1628 size_t cnind[sizeof(itadmin_mysql_cn_netgroup)/sizeof(DK3_PCCHAR) - 1];
1629 unsigned long *lgts; /* Field lengths. */
1630 unsigned int nf; /* Number of fields in result. */
1631 int res; /* Query result. */
1632 int back = 0;
1633
1634 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[6]);
1635 if(0 == res) {
1636 mr = mysql_use_result((MYSQL *)(job->dbptr));
1637 if(mr) {
1638 nf = mysql_num_fields(mr);
1639 itadmin_data_mysql_find_indices(
1640 cnind, itadmin_mysql_sz_cn_netgroup, nf, mr,
1641 itadmin_mysql_cn_netgroup
1642 );
1643 back = 1;
1644 do {
1645 mrow = mysql_fetch_row(mr);
1646 if(mrow) {
1647 lgts = mysql_fetch_lengths(mr);
1648 if(lgts) {
1649 itadmin_data_mysql_set_pointers(
1650 val, cnind, itadmin_mysql_sz_cn_netgroup,
1651 nf, mrow, lgts
1652 );
1653 res = itadmin_register_netgroup(job, val[0], val[1]);
1654 if(!(res)) { back = 0; }
1655 } else {
1656 back = 0;
1657 }
1658 }
1659 } while(mrow);
1660 mysql_free_result(mr);
1661 } else {
1662 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1663 }
1664 } else {
1665 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1666 }
1667
1668 return back;
1669 }
1670
1671
1672
1673 /** Read patches table.
1674 @param job Job structure.
1675 @return 1 on success, 0 on error.
1676 */
1677 static
1678 int
itadmin_data_mysql_patch(itadmin_job * job)1679 itadmin_data_mysql_patch(itadmin_job *job)
1680 {
1681 MYSQL_RES *mr; /* Results set. */
1682 MYSQL_ROW mrow; /* One result row. */
1683 char const *val[sizeof(itadmin_mysql_cn_patch)/sizeof(DK3_PCCHAR) - 1];
1684 size_t cnind[sizeof(itadmin_mysql_cn_patch)/sizeof(DK3_PCCHAR) - 1];
1685 unsigned long *lgts; /* Field lengths. */
1686 unsigned int nf; /* Number of fields in result. */
1687 int res; /* Query result. */
1688 int back = 0;
1689
1690 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[3]);
1691 if(0 == res) {
1692 mr = mysql_use_result((MYSQL *)(job->dbptr));
1693 if(mr) {
1694 nf = mysql_num_fields(mr);
1695 itadmin_data_mysql_find_indices(
1696 cnind, itadmin_mysql_sz_cn_patch, nf, mr,
1697 itadmin_mysql_cn_patch
1698 );
1699 back = 1;
1700 do {
1701 mrow = mysql_fetch_row(mr);
1702 if(mrow) {
1703 lgts = mysql_fetch_lengths(mr);
1704 if(lgts) {
1705 itadmin_data_mysql_set_pointers(
1706 val, cnind, itadmin_mysql_sz_cn_patch,
1707 nf, mrow, lgts
1708 );
1709 res = itadmin_register_patch(
1710 job, val[0], val[1], val[2], val[3], val[4], val[5]
1711 );
1712 if(!(res)) { back = 0; }
1713 } else {
1714 back = 0;
1715 }
1716 }
1717 } while(mrow);
1718 mysql_free_result(mr);
1719 } else {
1720 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1721 }
1722 } else {
1723 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1724 }
1725
1726 return back;
1727 }
1728
1729
1730
1731 /** Read VLAN table.
1732 @param job Job structure.
1733 @return 1 on success, 0 on error.
1734 */
1735 static
1736 int
itadmin_data_mysql_vlan(itadmin_job * job)1737 itadmin_data_mysql_vlan(itadmin_job *job)
1738 {
1739 MYSQL_RES *mr; /* Results set. */
1740 MYSQL_ROW mrow; /* One result row. */
1741 char const *val[sizeof(itadmin_mysql_cn_vlan)/sizeof(DK3_PCCHAR) - 1];
1742 size_t cnind[sizeof(itadmin_mysql_cn_vlan)/sizeof(DK3_PCCHAR) - 1];
1743 unsigned long *lgts; /* Field lengths. */
1744 unsigned int nf; /* Number of fields in result. */
1745 int res; /* Query result. */
1746 int back = 0;
1747
1748 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[2]);
1749 if(0 == res) {
1750 mr = mysql_use_result((MYSQL *)(job->dbptr));
1751 if(mr) {
1752 nf = mysql_num_fields(mr);
1753 itadmin_data_mysql_find_indices(
1754 cnind, itadmin_mysql_sz_cn_vlan, nf, mr,
1755 itadmin_mysql_cn_vlan
1756 );
1757 back = 1;
1758 do {
1759 mrow = mysql_fetch_row(mr);
1760 if(mrow) {
1761 lgts = mysql_fetch_lengths(mr);
1762 if(lgts) {
1763 itadmin_data_mysql_set_pointers(
1764 val, cnind, itadmin_mysql_sz_cn_vlan,
1765 nf, mrow, lgts
1766 );
1767 res = itadmin_register_vlan(job, val[0], val[1]);
1768 if(!(res)) { back = 0; }
1769 } else {
1770 back = 0;
1771 }
1772 }
1773 } while(mrow);
1774 mysql_free_result(mr);
1775 } else {
1776 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1777 }
1778 } else {
1779 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1780 }
1781
1782 return back;
1783 }
1784
1785
1786
1787 /** Read speed table.
1788 @param job Job structure.
1789 @return 1 on success, 0 on error.
1790 */
1791 static
1792 int
itadmin_data_mysql_speed(itadmin_job * job)1793 itadmin_data_mysql_speed(itadmin_job *job)
1794 {
1795 MYSQL_RES *mr; /* Results set. */
1796 MYSQL_ROW mrow; /* One result row. */
1797 char const *val[sizeof(itadmin_mysql_cn_speed)/sizeof(DK3_PCCHAR) - 1];
1798 size_t cnind[sizeof(itadmin_mysql_cn_speed)/sizeof(DK3_PCCHAR) - 1];
1799 unsigned long *lgts; /* Field lengths. */
1800 unsigned int nf; /* Number of fields in result. */
1801 int res; /* Query result. */
1802 int back = 0;
1803
1804 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[4]);
1805 if(0 == res) {
1806 mr = mysql_use_result((MYSQL *)(job->dbptr));
1807 if(mr) {
1808 nf = mysql_num_fields(mr);
1809 itadmin_data_mysql_find_indices(
1810 cnind, itadmin_mysql_sz_cn_speed, nf, mr,
1811 itadmin_mysql_cn_speed
1812 );
1813 back = 1;
1814 do {
1815 mrow = mysql_fetch_row(mr);
1816 if(mrow) {
1817 lgts = mysql_fetch_lengths(mr);
1818 if(lgts) {
1819 itadmin_data_mysql_set_pointers(
1820 val, cnind, itadmin_mysql_sz_cn_speed,
1821 nf, mrow, lgts
1822 );
1823 res = itadmin_register_speed(job, val[0], val[1]);
1824 if(!(res)) { back = 0; }
1825 } else {
1826 back = 0;
1827 }
1828 }
1829 } while(mrow);
1830 mysql_free_result(mr);
1831 } else {
1832 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1833 }
1834 } else {
1835 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1836 }
1837
1838 return back;
1839 }
1840
1841
1842
1843 /** Read buildings table.
1844 @param job Job structure.
1845 @return 1 on success, 0 on error.
1846 */
1847 static
1848 int
itadmin_data_mysql_buildings(itadmin_job * job)1849 itadmin_data_mysql_buildings(itadmin_job *job)
1850 {
1851 MYSQL_RES *mr; /* Results set. */
1852 MYSQL_ROW mrow; /* One result row. */
1853 char const *val[sizeof(itadmin_mysql_cn_buildings)/sizeof(DK3_PCCHAR) - 1];
1854 size_t cnind[sizeof(itadmin_mysql_cn_buildings)/sizeof(DK3_PCCHAR) - 1];
1855 unsigned long *lgts; /* Field lengths. */
1856 unsigned int nf; /* Number of fields in result. */
1857 int res; /* Query result. */
1858 int back = 0;
1859
1860 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[1]);
1861 if(0 == res) {
1862 mr = mysql_use_result((MYSQL *)(job->dbptr));
1863 if(mr) {
1864 nf = mysql_num_fields(mr);
1865 itadmin_data_mysql_find_indices(
1866 cnind, itadmin_mysql_sz_cn_buildings, nf, mr,
1867 itadmin_mysql_cn_buildings
1868 );
1869 back = 1;
1870 do {
1871 mrow = mysql_fetch_row(mr);
1872 if(mrow) {
1873 lgts = mysql_fetch_lengths(mr);
1874 if(lgts) {
1875 itadmin_data_mysql_set_pointers(
1876 val, cnind, itadmin_mysql_sz_cn_buildings,
1877 nf, mrow, lgts
1878 );
1879 res = itadmin_register_building(
1880 job,
1881 val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7]
1882 );
1883 if(!(res)) { back = 0; }
1884 } else {
1885 back = 0;
1886 }
1887 }
1888 } while(mrow);
1889 mysql_free_result(mr);
1890 } else {
1891 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1892 }
1893 } else {
1894 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1895 }
1896
1897 return back;
1898 }
1899
1900
1901
1902 /** Read users table.
1903 @param job Job structure.
1904 @return 1 on success, 0 on error.
1905 */
1906 static
1907 int
itadmin_data_mysql_users(itadmin_job * job)1908 itadmin_data_mysql_users(itadmin_job *job)
1909 {
1910 MYSQL_RES *mr; /* Results set. */
1911 MYSQL_ROW mrow; /* One result row. */
1912 char const *val[sizeof(itadmin_mysql_cn_users)/sizeof(DK3_PCCHAR) - 1];
1913 size_t cnind[sizeof(itadmin_mysql_cn_users)/sizeof(DK3_PCCHAR) - 1];
1914 unsigned long *lgts; /* Field lengths array. */
1915 unsigned int nf; /* Number of fields in result. */
1916 int res; /* Query result. */
1917 int back = 0;
1918
1919 res = mysql_query((MYSQL *)(job->dbptr), itadmin_mysql_c8_kw[0]);
1920 if(0 == res) {
1921 mr = mysql_use_result((MYSQL *)(job->dbptr));
1922 if(mr) {
1923 nf = mysql_num_fields(mr);
1924 itadmin_data_mysql_find_indices(
1925 cnind, itadmin_mysql_sz_cn_users, nf, mr, itadmin_mysql_cn_users
1926 );
1927 back = 1;
1928 do {
1929 mrow = mysql_fetch_row(mr);
1930 if(mrow) {
1931 lgts = mysql_fetch_lengths(mr);
1932 if(lgts) {
1933 itadmin_data_mysql_set_pointers(
1934 val, cnind, itadmin_mysql_sz_cn_users,
1935 nf, mrow, lgts
1936 );
1937 res = itadmin_register_user(
1938 job, val[0], val[1], val[2], val[3], val[4], val[5], val[6]
1939 );
1940 if(!(res)) {
1941 back = 0;
1942 }
1943 } else {
1944 back = 0;
1945 }
1946 }
1947 } while(mrow);
1948 mysql_free_result(mr);
1949 } else {
1950 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 141);
1951 }
1952 } else {
1953 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 142);
1954 }
1955 return back;
1956 }
1957
1958
1959
1960
1961 /** Retrieve data from a MySQL database.
1962 @param job Job structure.
1963 @return 1 on success, 0 on error.
1964 */
1965 static
1966 int
itadmin_data_mysql_retrieve(itadmin_job * job)1967 itadmin_data_mysql_retrieve(itadmin_job *job)
1968 {
1969 int back = 1;
1970
1971 /* PROGRESS: Reading users table. */
1972 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 87);
1973 if(!itadmin_data_mysql_users(job)) { back = 0; }
1974 /* PROGRESS: Reading buildings table. */
1975 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 88);
1976 if(!itadmin_data_mysql_buildings(job)) { back = 0; }
1977 if(itadmin_job_do_network(job)) {
1978 /* PROGRESS: Reading connection speed type table. */
1979 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 89);
1980 if(!itadmin_data_mysql_speed(job)) { back = 0; }
1981 /* PROGRESS: Reading VLANS table. */
1982 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 90);
1983 if(!itadmin_data_mysql_vlan(job)) { back = 0; }
1984 /* PROGRESS: Reading ethernet connections table. */
1985 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 91);
1986 if(!itadmin_data_mysql_patch(job)) { back = 0; }
1987 /* PROGRESS: Reading netgroups table. */
1988 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 92);
1989 if(!itadmin_data_mysql_netgroup(job)) { back = 0; }
1990 /* PROGRESS: Reading netgroup dependencies. */
1991 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 93);
1992 if(!itadmin_data_mysql_ngdep(job)) { back = 0; }
1993 }
1994 if((itadmin_job_do_dhcp(job)) || (itadmin_job_do_licenses(job))) {
1995 /* PROGRESS: Reading networks. */
1996 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 94);
1997 if(!itadmin_data_mysql_network(job)) { back = 0; }
1998 }
1999 if(itadmin_job_do_network(job)) {
2000 if(itadmin_job_do_dhcp(job)) {
2001 /* PROGRESS: Reading DHCP classes. */
2002 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 95);
2003 if(!itadmin_data_mysql_dhcp_class(job)) { back = 0; }
2004 /* PROGRESS: Reading DHCP groups. */
2005 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 96);
2006 if(!itadmin_data_mysql_dhcp_group(job)) { back = 0; }
2007 }
2008 }
2009 if((itadmin_job_do_dhcp(job)) || (itadmin_job_do_licenses(job))) {
2010 /* PROGRESS: Reading DHCP pools. */
2011 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 97);
2012 if(!itadmin_data_mysql_dhcp_pool(job)) { back = 0; }
2013 }
2014 /* PROGRESS: Reading hosts. */
2015 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 98);
2016 if(!itadmin_data_mysql_hosts(job)) { back = 0; }
2017 /* PROGRESS: Reading host name aliases. */
2018 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 99);
2019 if(!itadmin_data_mysql_alias(job)) { back = 0; }
2020 if(itadmin_job_do_dhcp(job)) {
2021 /* PROGRESS: Reading DHCP options. */
2022 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 100);
2023 if(!itadmin_data_mysql_dhcp_option(job)) { back = 0; }
2024 }
2025 if(itadmin_job_do_licenses(job)) {
2026 /* PROGRESS: Reading software manufacturers. */
2027 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 101);
2028 if(!itadmin_data_mysql_swman(job)) { back = 0; }
2029 /* PROGRESS: Reading software products. */
2030 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 102);
2031 if(!itadmin_data_mysql_swprod(job)) { back = 0; }
2032 /* PROGRESS: Reading license types. */
2033 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 103);
2034 if(!itadmin_data_mysql_lictype(job)) { back = 0; }
2035 /* PROGRESS: Reading licenses. */
2036 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 104);
2037 if(!itadmin_data_mysql_license(job)) { back = 0; }
2038 }
2039 /* PROGRESS: Finished reading input. */
2040 itadmin_tool_log_1(job, DK3_LL_PROGRESS, 105);
2041
2042 return back;
2043 }
2044
2045
2046 #endif
2047
2048 int
itadmin_data_mysql_read(itadmin_job * job)2049 itadmin_data_mysql_read(itadmin_job *job)
2050 {
2051 #if DK3_HAVE_MARIADB_MYSQL_H || DK3_HAVE_MYSQL_MYSQL_H || DK3_HAVE_MYSQL_H
2052 char dbh[ITADMIN_CONFIG_LINE_SIZE]; /* Host name. */
2053 char dbu[ITADMIN_CONFIG_LINE_SIZE]; /* User name. */
2054 char dbp[ITADMIN_CONFIG_LINE_SIZE]; /* Password. */
2055 char dbn[ITADMIN_CONFIG_LINE_SIZE]; /* DB name. */
2056 MYSQL *re1;
2057 MYSQL *res; /* Same connection. */
2058 int ie; /* INput encoding. */
2059 int back = 0;
2060
2061 ie = dk3app_get_encoding(job->app);
2062 if(0 == mysql_library_init(-1, itadmin_mysql_argv, itadmin_mysql_groups)) {
2063 re1 = mysql_init(NULL);
2064 if(re1) {
2065 if(dk3str_to_c8u_app(dbh,sizeof(dbh),job->dbhn,ie,job->app)) {
2066 if(dk3str_to_c8u_app(dbu,sizeof(dbu),job->dbus,ie,job->app)) {
2067 if(dk3str_to_c8u_app(dbp,sizeof(dbp),job->dbpw,ie,job->app)) {
2068 if(dk3str_to_c8u_app(dbn,sizeof(dbn),job->dbn,ie,job->app)) {
2069
2070 res = mysql_real_connect(re1, dbh, dbu, dbp, dbn, 0, NULL, 0);
2071 if(res) {
2072 job->dbptr = (void *)res;
2073 if(mysql_set_character_set(res, "utf8")) {
2074 /* WARNING: Failed to set encoding! */
2075 dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 154);
2076 }
2077 back = itadmin_data_mysql_retrieve(job);
2078 } else {
2079 /* ERROR: Failed to connect to database! */
2080 itadmin_tool_log_utf8_5(job,DK3_LL_ERROR,155,156,157,dbn,dbh);
2081 }
2082 } else {
2083 /* ERROR: Failed to convert database name! */
2084 dk3app_log_3(job->app,DK3_LL_ERROR,job->msg,158,159,job->dbn);
2085 }
2086 } else {
2087 /* ERROR: Failed to convert database user password! */
2088 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 160);
2089 }
2090 } else {
2091 /* ERROR: Failed to convert database user name! */
2092 dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 161, 162, job->dbus);
2093 }
2094 } else {
2095 /* ERROR: Failed to convert database host name! */
2096 dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 163, 164, job->dbhn);
2097 }
2098 mysql_close(re1);
2099 } else {
2100 /* ERROR: Failed to initialize MySQL client object! */
2101 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 165);
2102 }
2103 mysql_library_end();
2104 } else {
2105 /* ERROR: Failed to initialize MySQL library! */
2106 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 166);
2107 }
2108
2109 #else
2110 int back = 0;
2111 /* ERROR: No MySQL support available! */
2112 dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 167);
2113 #endif
2114 return back;
2115 }
2116
2117
2118
2119