root/trunk/unxsvz.c

Revision 1828, 76.9 KB (checked in by Gary, 7 months ago)

unxsVZ started moving to separate command line executable.

Line 
1/*
2FILE
3        unxsVZ/unxsvz.c
4        $Id$
5PURPOSE
6        Provide wrapper for standalone job queue processor unxsvz
7NOTES
8        Will keep initialize functions for install in .cgi
9        Will move every other command line function here
10        including the jobqueue functions.
11
12        First development stage will be to duplicate everything
13        here. Then once working fine remove code not required from
14        mainfunc.h
15AUTHOR/LEGAL
16        (C) 2011-2012 Unixservice, LLC.
17        GPLv2 license applies. See LICENSE file included.
18FREE HELP
19        support @ openisp . net
20        supportgrp @ unixservice . com
21        Join mailing list: https://lists.openisp.net/mailman/listinfo/unxsvz
22*/
23
24#include "mysqlrad.h"
25#include <ctype.h>
26
27#include "language.h"
28#include "local.h"
29
30//Global vars
31
32MYSQL gMysql;
33char gcCommand[100];
34static char cLogKey[16]={"Ksdj458jssdUjf79"};
35
36int guPermLevel=0;
37unsigned guLoginClient=0;
38unsigned guReseller=0;
39unsigned guCompany=0;
40char gcCompany[100]={""};
41char gcUser[100]={""};
42char gcHost[100]={""};
43char gcHostname[100]={""};
44
45char gcFunction[100]={""};
46char gcQuery[8192]={""};
47
48void GetClientOwner(unsigned uClient, unsigned *uOwner);
49void htmlPlainTextError(const char *cError);
50
51int main(int iArgc, char *cArgv[])
52{
53        gethostname(gcHostname,98);
54
55        ExtMainShell(iArgc,cArgv);
56
57        return(0);
58
59}//end of main()
60
61#include "local.h"
62#include <dirent.h>
63#include <openisp/ucidr.h>
64void GetDatacenterProp(const unsigned uDatacenter,const char *cName,char *cValue);//tcontainerfunc.h
65void SetContainerStatus(unsigned uContainer,unsigned uStatus);
66void ChangeGroup(unsigned uContainer, unsigned uGroup);
67void CreateDNSJob(unsigned uIPv4,unsigned uOwner,char const *cOptionalIPv4,char const *cHostname,unsigned uDatacenter,unsigned uCreatedBy);
68void GetNodeProp(const unsigned uNode,const char *cName,char *cValue);//jobqueue.c
69char *strptime(const char *s, const char *format, struct tm *tm);
70
71static char cTableList[64][32]={ "tAuthorize", "tClient", "tConfig", "tConfiguration", "tContainer",
72                "tDatacenter", "tGlossary", "tGroup", "tGroupGlue", "tGroupType", "tIP", "tJob",
73                "tJobStatus", "tLog", "tLogMonth", "tLogType", "tMonth", "tNameserver", "tNode",
74                "tOSTemplate", "tProperty", "tSearchdomain", "tStatus", "tTemplate", "tTemplateSet",
75                        "tTemplateType", "tType", ""};
76
77char cInitTableList[64][32]={ "tAuthorize", "tClient", "tConfig", "tGlossary", "tGroupType",
78                "tJobStatus", "tLogType", "tOSTemplate", "tStatus", "tTemplate", "tTemplateSet",
79                        "tTemplateType", "tType", ""};
80
81void ExtMainShell(int argc, char *argv[]);
82void Initialize(char *cPasswd);
83void Backup(char *cPasswd);
84void Restore(char *cPasswd, char *cTableName);
85void RestoreAll(char *cPasswd);
86void mySQLRootConnect(char *cPasswd);
87void ImportTemplateFile(char *cTemplate, char *cFile, char *cTemplateSet, char *cTemplateType);
88void ImportOSTemplates(char *cPath,char *cOwner);
89void MassCreateContainers(char *cConfigfileName);
90void ImportRemoteDatacenter(
91                        const char *cLocalDatacenter,
92                        const char *cRemoteDatacenter,
93                        const char *cLocalNode,
94                        const char *cRemoteNode,
95                        const char *cHost,
96                        const char *cUser,
97                        const char *cPasswd,
98                        const char *cuOwner);
99void ExtracttLog(char *cMonth, char *cYear, char *cPasswd, char *cTablePath);
100time_t cDateToUnixTime(char *cDate);
101void CreatetLogTable(char *cTableName);
102void NextMonthYear(char *cMonth,char *cYear,char *cNextMonth,char *cNextYear);
103
104void CalledByAlias(int iArgc,char *cArgv[]);
105unsigned TextConnectDb(void);//mysqlconnect.c
106void DashBoard(const char *cOptionalMsg);
107void CloneReport(const char *cOptionalMsg);
108void ContainerReport(const char *cOptionalMsg);
109void EncryptPasswdMD5(char *pw);
110void GetConfiguration(const char *cName,char *cValue,
111                unsigned uDatacenter,
112                unsigned uNode,
113                unsigned uContainer,
114                unsigned uHtml);
115void UpdateSchema(void);
116void RecoverMode(void);
117void ResetAllSyncPeriod(void);
118
119//jobqueue.c
120void ProcessJobQueue(unsigned uDebug);
121
122
123void ExtMainShell(int argc, char *argv[])
124{
125        if(getuid())
126        {
127                printf("Only root can run this command!\n");
128                exit(0);
129        }
130
131        if(argc==2 && !strcmp(argv[1],"ProcessJobQueue"))
132                ProcessJobQueue(0);
133        if(argc==2 && !strcmp(argv[1],"ProcessJobQueueDebug"))
134                ProcessJobQueue(1);
135        else if(argc==2 && !strcmp(argv[1],"UpdateSchema"))
136                UpdateSchema();
137        else if(argc==2 && !strcmp(argv[1],"RecoverMode"))
138                RecoverMode();
139        else if(argc==2 && !strcmp(argv[1],"ResetAllSyncPeriod"))
140                ResetAllSyncPeriod();
141        else if(argc==6 && !strcmp(argv[1],"ImportTemplateFile"))
142                ImportTemplateFile(argv[2],argv[3],argv[4],argv[5]);
143        else if(argc==3 && !strcmp(argv[1],"Initialize"))
144                Initialize(argv[2]);
145        else if(argc==3 && !strcmp(argv[1],"Backup"))
146                Backup(argv[2]);
147        else if(argc==4 && !strcmp(argv[1],"Restore"))
148                Restore(argv[2],argv[3]);
149        else if(argc==3 && !strcmp(argv[1],"RestoreAll"))
150                RestoreAll(argv[2]);
151        else if(argc==6 && !strcmp(argv[1],"ExtracttLog"))
152                ExtracttLog(argv[2],argv[3],argv[4],argv[5]);
153        else if(argc==10 && !strcmp(argv[1],"ImportRemoteDatacenter"))
154                ImportRemoteDatacenter(argv[2],argv[3],argv[4],argv[5],argv[6],argv[7],argv[8],argv[9]);
155        else if(argc==4 && !strcmp(argv[1],"ImportOSTemplates"))
156                ImportOSTemplates(argv[2],argv[3]);
157        else if(argc==3 && !strcmp(argv[1],"MassCreateContainers"))
158                MassCreateContainers(argv[2]);
159        else
160        {
161                printf("\n%s %s Menu\n\nDatabase Ops:\n",argv[0],RELEASE);
162                printf("\tInitialize|Backup|RestoreAll <mysql root passwd>\n");
163                printf("\tRestore <mysql root passwd> <Restore table name>\n");
164                printf("\nCrontab Ops:\n");
165                printf("\tProcessJobQueue\n");
166                printf("\tProcessJobQueueDebug\n");
167                //printf("\tProcessExtJobQueue <cServer>\n");
168                printf("\nSpecial Admin Ops:\n");
169                printf("\tUpdateSchema\n");
170                printf("\tRecoverMode\n");
171                printf("\tResetAllSyncPeriod\n");
172                printf("\tImportTemplateFile <tTemplate.cLabel> <filespec> <tTemplateSet.cLabel> <tTemplateType.cLabel>\n");
173                printf("\tExtracttLog <Mon> <Year> <mysql root passwd> <path to mysql table>\n");
174                printf("\tImportRemoteDatacenter <local datacenter> <remote datacenter> <local node> <remote node>\n"
175                        "\t\t<host> <user> <passwd> <local uOwner>\n");
176                printf("\tImportOSTemplates <path to templates e.g. /vz/template/cache/> <tClient.cLabel owner string>\n");
177                printf("\tMassCreateContainers <configuration file>\n");
178                printf("\n");
179        }
180        mysql_close(&gMysql);
181        exit(0);
182
183
184}//void ExtMainShell(int argc, char *argv[])
185
186
187void RestoreAll(char *cPasswd)
188{
189        char cISMROOT[256]={""};
190        register int i;
191
192        if(getenv("ISMROOT")!=NULL)
193        {
194                strncpy(cISMROOT,getenv("ISMROOT"),255);
195                gcHost[255]=0;
196        }
197
198        if(!cISMROOT[0])
199        {
200                printf("You must set ISMROOT env var first. Ex. export ISMROOT=/home/joe\n");
201                exit(1);
202        }
203
204        printf("Restoring unxsVZ data from .txt file in %s/unxsVZ/data...\n\n",cISMROOT);
205
206        //connect as root to master db
207        mySQLRootConnect(cPasswd);
208
209        sprintf(gcQuery,"USE %s",DBNAME);
210        mysql_query(&gMysql,gcQuery);
211        if(mysql_errno(&gMysql))
212        {
213                printf("%s\n",mysql_error(&gMysql));
214                exit(1);
215        }
216
217        for(i=0;cTableList[i][0];i++)
218        {
219                sprintf(gcQuery,"LOAD DATA LOCAL INFILE '%s/unxsVZ/data/%s.txt' REPLACE INTO TABLE %s",
220                                cISMROOT,cTableList[i],cTableList[i]);
221                mysql_query(&gMysql,gcQuery);
222                if(mysql_errno(&gMysql))
223                {
224                        printf("%s\n",mysql_error(&gMysql));
225                        exit(1);
226                }
227                printf("%s\n",cTableList[i]);
228        }
229
230        printf("\nDone\n");
231
232}//void RestoreAll(char *cPasswd)
233
234
235void Restore(char *cPasswd, char *cTableName)
236{
237        char cISMROOT[256]={""};
238
239        if(getenv("ISMROOT")!=NULL)
240        {
241                strncpy(cISMROOT,getenv("ISMROOT"),255);
242                gcHost[255]=0;
243        }
244
245        if(!cISMROOT[0])
246        {
247                printf("You must set ISMROOT env var first. Ex. export ISMROOT=/home/joe\n");
248                exit(1);
249        }
250
251        printf("Restoring unxsVZ data from .txt file in %s/unxsVZ/data...\n\n",cISMROOT);
252
253        //connect as root to master db
254        mySQLRootConnect(cPasswd);
255
256        sprintf(gcQuery,"USE %s",DBNAME);
257        mysql_query(&gMysql,gcQuery);
258        if(mysql_errno(&gMysql))
259        {
260                printf("%s\n",mysql_error(&gMysql));
261                exit(1);
262        }
263
264        sprintf(gcQuery,"LOAD DATA LOCAL INFILE '%s/unxsVZ/data/%s.txt' REPLACE INTO TABLE %s",
265                        cISMROOT,cTableName,cTableName);
266        mysql_query(&gMysql,gcQuery);
267        if(mysql_errno(&gMysql))
268        {
269                printf("%s\n",mysql_error(&gMysql));
270                exit(1);
271        }
272
273        printf("%s\n\nDone\n",cTableName);
274
275}//void Restore(char *cPasswd, char *cTableName)
276
277
278void Backup(char *cPasswd)
279{
280        register int i;
281        char cISMROOT[256]={""};
282
283        if(getenv("ISMROOT")!=NULL)
284        {
285                strncpy(cISMROOT,getenv("ISMROOT"),255);
286                gcHost[255]=0;
287        }
288
289        if(!cISMROOT[0])
290        {
291                printf("You must set ISMROOT env var first. Ex. export ISMROOT=/home/joe\n");
292                exit(1);
293        }
294
295        printf("Backing up unxsVZ data to .txt files in %s/unxsVZ/data...\n\n",cISMROOT);
296
297        //connect as root to master db
298        mySQLRootConnect(cPasswd);
299
300        sprintf(gcQuery,"USE %s",DBNAME);
301        mysql_query(&gMysql,gcQuery);
302        if(mysql_errno(&gMysql))
303        {
304                printf("%s\n",mysql_error(&gMysql));
305                exit(1);
306        }
307
308        for(i=0;cTableList[i][0];i++)
309        {
310                char cFileName[300];
311
312                sprintf(cFileName,"%s/unxsVZ/data/%s.txt"
313                                ,cISMROOT,cTableList[i]);
314                unlink(cFileName);
315
316                sprintf(gcQuery,"SELECT * INTO OUTFILE '%s' FROM %s",
317                                                        cFileName,cTableList[i]);
318                mysql_query(&gMysql,gcQuery);
319                if(mysql_errno(&gMysql))
320                {
321                        printf("%s\n",mysql_error(&gMysql));
322                        exit(1);
323                }
324                printf("%s\n",cTableList[i]);
325        }
326
327
328        printf("\nDone.\n");
329
330}//void Backup(char *cPasswd)
331
332
333void Initialize(char *cPasswd)
334{
335        char cISMROOT[256]={""};
336        register int i;
337
338        if(getenv("ISMROOT")!=NULL)
339        {
340                strncpy(cISMROOT,getenv("ISMROOT"),255);
341                gcHost[255]=0;
342        }
343
344        if(!cISMROOT[0])
345        {
346                printf("You must set ISMROOT env var first. Ex. export ISMROOT=/home/joe\n");
347                exit(1);
348        }
349
350        printf("Creating db and setting permissions, installing data from %sunxsVZ...\n\n",
351                        cISMROOT);
352
353        //connect as root to master db
354        mySQLRootConnect(cPasswd);
355
356        //Create database
357        sprintf(gcQuery,"CREATE DATABASE %s",DBNAME);
358        mysql_query(&gMysql,gcQuery);
359        if(mysql_errno(&gMysql))
360        {
361                printf("%s\n",mysql_error(&gMysql));
362                exit(1);
363        }
364
365        //Grant localaccess privileges.
366        sprintf(gcQuery,"GRANT ALL ON %s.* to %s@localhost IDENTIFIED BY '%s'",
367                                                        DBNAME,DBLOGIN,DBPASSWD);
368        mysql_query(&gMysql,gcQuery);
369        if(mysql_errno(&gMysql))
370        {
371                printf("%s\n",mysql_error(&gMysql));
372                exit(1);
373        }
374       
375        //Change to mysqlbind db. Then initialize some tables with needed data
376        sprintf(gcQuery,"USE %s",DBNAME);
377        mysql_query(&gMysql,gcQuery);
378        if(mysql_errno(&gMysql))
379        {
380                printf("%s\n",mysql_error(&gMysql));
381                exit(1);
382        }
383       
384
385        //debug only
386        //Create tables and install default data
387        //Standard RAD3 required tables
388        CreatetAuthorize();
389        CreatetClient();
390        CreatetConfig();
391        CreatetConfiguration();
392        CreatetContainer();
393        CreatetDatacenter();
394        CreatetGlossary();
395        CreatetGroup();
396        CreatetGroupGlue();
397        CreatetGroupType();
398        CreatetIP();
399        CreatetJob();
400        CreatetJobStatus();
401        CreatetLog();
402        CreatetLogMonth();
403        CreatetLogType();
404        CreatetMonth();
405        CreatetNameserver();
406        CreatetNode();
407        CreatetOSTemplate();
408        CreatetProperty();
409        CreatetSearchdomain();
410        CreatetStatus();
411        CreatetTemplate();
412        CreatetTemplateSet();
413        CreatetTemplateType();
414        CreatetType();
415
416        //Unique uContainer values starting at 101
417        sprintf(gcQuery,"INSERT INTO tContainer SET uContainer=100");
418        mysql_query(&gMysql,gcQuery);
419        if(mysql_errno(&gMysql))
420        {
421                printf("%s\n",mysql_error(&gMysql));
422                exit(1);
423        }
424        sprintf(gcQuery,"DELETE FROM tContainer");
425        mysql_query(&gMysql,gcQuery);
426        if(mysql_errno(&gMysql))
427        {
428                printf("%s\n",mysql_error(&gMysql));
429                exit(1);
430        }
431
432        for(i=0;cInitTableList[i][0];i++)
433        {
434                sprintf(gcQuery,"LOAD DATA LOCAL INFILE '%s/unxsVZ/data/%s.txt' REPLACE INTO TABLE %s",
435                        cISMROOT,cInitTableList[i],cInitTableList[i]);
436                mysql_query(&gMysql,gcQuery);
437                if(mysql_errno(&gMysql))
438                {
439                        printf("%s.\nAttempting to drop database for re-initialize...\n",mysql_error(&gMysql));
440
441                        sprintf(gcQuery,"DROP DATABASE %s",DBNAME);
442                        mysql_query(&gMysql,gcQuery);
443                        if(mysql_errno(&gMysql))
444                        {
445                                printf("%s\n",mysql_error(&gMysql));
446                                exit(1);
447                        }
448
449                        exit(1);
450                }
451        }
452
453        printf("Done\n");
454
455}//void Initialize(void)
456
457
458//No need for redundancy here like TextConnectDb()
459void mySQLRootConnect(char *cPasswd)
460{
461        mysql_init(&gMysql);
462        if (!mysql_real_connect(&gMysql,NULL,"root",cPasswd,"mysql",0,NULL,0))
463        {
464                printf("Database server unavailable\n");
465                exit(1);
466        }
467}//void mySQLRootConnect(void)
468
469
470void UpdateSchema(void)
471{
472        MYSQL_RES *res;
473        MYSQL_ROW field;
474        unsigned uVeth=0;
475        unsigned uBackupDate=0;
476        unsigned uSource=0;
477
478        unsigned uIPDatacenter=0;
479        unsigned uOSTemplateDatacenter=0;
480        unsigned uConfigDatacenter=0;
481        unsigned uNameserverDatacenter=0;
482        unsigned uSearchdomainDatacenter=0;
483
484        unsigned uIncorrectSource=0;
485        unsigned uIncorrectVeth=0;
486        unsigned uSourceIndex=0;
487        unsigned uPropertyNameIndex=0;
488        unsigned uJobStatusIndex=0;
489        unsigned uJobNodeIndex=0;
490        unsigned uJobDatacenterIndex=0;
491        unsigned uJobContainerIndex=0;
492        unsigned uTemplateLabelIndex=0;
493        unsigned uGlossaryLabelIndex=0;
494
495        printf("UpdateSchema(): Start\n");
496
497        if(TextConnectDb())
498                exit(1);
499
500        //Take note if what we need to change/add
501        //This is based on expanded and incorrect schema of previous releases. Yes this sucks.
502        sprintf(gcQuery,"SHOW COLUMNS IN tContainer");
503        mysql_query(&gMysql,gcQuery);
504        if(mysql_errno(&gMysql))
505                printf("%s\n",mysql_error(&gMysql));
506        mysql_query(&gMysql,gcQuery);
507        res=mysql_store_result(&gMysql);
508        while((field=mysql_fetch_row(res)))
509        {
510                if(!strcmp(field[0],"uVeth"))
511                {
512                        uVeth=1;
513                        if(!strcmp(field[2],"YES"))
514                                uIncorrectVeth=1;
515                }
516                if(!strcmp(field[0],"uSource"))
517                {
518                        uSource=1;
519                        if(!strcmp(field[2],"YES"))
520                                uIncorrectSource=1;
521                }
522                if(!strcmp(field[0],"uBackupDate"))
523                {
524                        uBackupDate=1;
525                }
526        }
527        mysql_free_result(res);
528
529        sprintf(gcQuery,"SHOW COLUMNS IN tIP");
530        mysql_query(&gMysql,gcQuery);
531        if(mysql_errno(&gMysql))
532                printf("%s\n",mysql_error(&gMysql));
533        mysql_query(&gMysql,gcQuery);
534        res=mysql_store_result(&gMysql);
535        while((field=mysql_fetch_row(res)))
536        {
537                if(!strcmp(field[0],"uDatacenter"))
538                        uIPDatacenter=1;
539        }
540        mysql_free_result(res);
541
542        sprintf(gcQuery,"SHOW COLUMNS IN tOSTemplate");
543        mysql_query(&gMysql,gcQuery);
544        if(mysql_errno(&gMysql))
545                printf("%s\n",mysql_error(&gMysql));
546        mysql_query(&gMysql,gcQuery);
547        res=mysql_store_result(&gMysql);
548        while((field=mysql_fetch_row(res)))
549        {
550                if(!strcmp(field[0],"uDatacenter"))
551                        uOSTemplateDatacenter=1;
552        }
553        mysql_free_result(res);
554
555        sprintf(gcQuery,"SHOW COLUMNS IN tConfig");
556        mysql_query(&gMysql,gcQuery);
557        if(mysql_errno(&gMysql))
558                printf("%s\n",mysql_error(&gMysql));
559        mysql_query(&gMysql,gcQuery);
560        res=mysql_store_result(&gMysql);
561        while((field=mysql_fetch_row(res)))
562        {
563                if(!strcmp(field[0],"uDatacenter"))
564                        uConfigDatacenter=1;
565        }
566        mysql_free_result(res);
567
568        sprintf(gcQuery,"SHOW COLUMNS IN tNameserver");
569        mysql_query(&gMysql,gcQuery);
570        if(mysql_errno(&gMysql))
571                printf("%s\n",mysql_error(&gMysql));
572        mysql_query(&gMysql,gcQuery);
573        res=mysql_store_result(&gMysql);
574        while((field=mysql_fetch_row(res)))
575        {
576                if(!strcmp(field[0],"uDatacenter"))
577                        uNameserverDatacenter=1;
578        }
579        mysql_free_result(res);
580
581        sprintf(gcQuery,"SHOW COLUMNS IN tSearchdomain");
582        mysql_query(&gMysql,gcQuery);
583        if(mysql_errno(&gMysql))
584                printf("%s\n",mysql_error(&gMysql));
585        mysql_query(&gMysql,gcQuery);
586        res=mysql_store_result(&gMysql);
587        while((field=mysql_fetch_row(res)))
588        {
589                if(!strcmp(field[0],"uDatacenter"))
590                        uSearchdomainDatacenter=1;
591        }
592        mysql_free_result(res);
593
594        sprintf(gcQuery,"SHOW INDEX IN tContainer");
595        mysql_query(&gMysql,gcQuery);
596        if(mysql_errno(&gMysql))
597                printf("%s\n",mysql_error(&gMysql));
598        mysql_query(&gMysql,gcQuery);
599        res=mysql_store_result(&gMysql);
600        while((field=mysql_fetch_row(res)))
601        {
602                if(!strcmp(field[2],"uSource")) uSourceIndex=1;
603        }
604        mysql_free_result(res);
605
606        sprintf(gcQuery,"SHOW INDEX IN tProperty");
607        mysql_query(&gMysql,gcQuery);
608        if(mysql_errno(&gMysql))
609                printf("%s\n",mysql_error(&gMysql));
610        mysql_query(&gMysql,gcQuery);
611        res=mysql_store_result(&gMysql);
612        while((field=mysql_fetch_row(res)))
613        {
614                if(!strcmp(field[2],"cName")) uPropertyNameIndex=1;
615        }
616        mysql_free_result(res);
617
618        sprintf(gcQuery,"SHOW INDEX IN tJob");
619        mysql_query(&gMysql,gcQuery);
620        if(mysql_errno(&gMysql))
621                printf("%s\n",mysql_error(&gMysql));
622        mysql_query(&gMysql,gcQuery);
623        res=mysql_store_result(&gMysql);
624        while((field=mysql_fetch_row(res)))
625        {
626                if(!strcmp(field[2],"uJobStatus")) uJobStatusIndex=1;
627                else if(!strcmp(field[2],"uContainer")) uJobContainerIndex=1;
628                else if(!strcmp(field[2],"uNode")) uJobNodeIndex=1;
629                else if(!strcmp(field[2],"uDatacenter")) uJobDatacenterIndex=1;
630        }
631        mysql_free_result(res);
632
633        sprintf(gcQuery,"SHOW INDEX IN tTemplate");
634        mysql_query(&gMysql,gcQuery);
635        if(mysql_errno(&gMysql))
636                printf("%s\n",mysql_error(&gMysql));
637        mysql_query(&gMysql,gcQuery);
638        res=mysql_store_result(&gMysql);
639        while((field=mysql_fetch_row(res)))
640        {
641                if(!strcmp(field[2],"cLabel")) uTemplateLabelIndex=1;
642        }
643        mysql_free_result(res);
644
645        sprintf(gcQuery,"SHOW INDEX IN tGlossary");
646        mysql_query(&gMysql,gcQuery);
647        if(mysql_errno(&gMysql))
648                printf("%s\n",mysql_error(&gMysql));
649        mysql_query(&gMysql,gcQuery);
650        res=mysql_store_result(&gMysql);
651        while((field=mysql_fetch_row(res)))
652        {
653                if(!strcmp(field[2],"cLabel")) uGlossaryLabelIndex=1;
654        }
655        mysql_free_result(res);
656
657        if(uIncorrectVeth)
658        {
659                sprintf(gcQuery,"ALTER TABLE tContainer MODIFY uVeth INT UNSIGNED NOT NULL DEFAULT 0");
660                mysql_query(&gMysql,gcQuery);
661                if(mysql_errno(&gMysql))
662                        printf("%s\n",mysql_error(&gMysql));
663                else
664                        printf("Corrected uVeth of tContainer\n");
665        }
666        if(!uVeth)
667        {
668                sprintf(gcQuery,"ALTER TABLE tContainer ADD uVeth INT UNSIGNED NOT NULL DEFAULT 0");
669                mysql_query(&gMysql,gcQuery);
670                if(mysql_errno(&gMysql))
671                        printf("%s\n",mysql_error(&gMysql));
672                else
673                        printf("Added uVeth to tContainer\n");
674        }
675        if(!uBackupDate)
676        {
677                sprintf(gcQuery,"ALTER TABLE tContainer ADD uBackupDate INT UNSIGNED NOT NULL DEFAULT 0");
678                mysql_query(&gMysql,gcQuery);
679                if(mysql_errno(&gMysql))
680                        printf("%s\n",mysql_error(&gMysql));
681                else
682                        printf("Added uBackupDate to tContainer\n");
683        }
684
685        sprintf(gcQuery,"SELECT uStatus FROM tStatus WHERE uStatus=81");       
686        mysql_query(&gMysql,gcQuery);
687        if(mysql_errno(&gMysql))
688                printf("%s\n",mysql_error(&gMysql));
689        mysql_query(&gMysql,gcQuery);
690        res=mysql_store_result(&gMysql);
691        if(mysql_num_rows(res)==0)
692        {
693                sprintf(gcQuery,"INSERT INTO tStatus SET uStatus=81,cLabel='Awaiting Clone',"
694                                "uCreatedBy=1,uOwner=1,uCreatedDate=UNIX_TIMESTAMP(NOW())");
695                mysql_query(&gMysql,gcQuery);
696                if(mysql_errno(&gMysql))
697                        printf("%s\n",mysql_error(&gMysql));
698                else
699                        printf("Inserted uStatus=81 into tStatus\n");
700        }
701        mysql_free_result(res);
702
703        sprintf(gcQuery,"SELECT uStatus FROM tStatus WHERE uStatus=91");       
704        mysql_query(&gMysql,gcQuery);
705        if(mysql_errno(&gMysql))
706                printf("%s\n",mysql_error(&gMysql));
707        mysql_query(&gMysql,gcQuery);
708        res=mysql_store_result(&gMysql);
709        if(mysql_num_rows(res)==0)
710        {
711                sprintf(gcQuery,"INSERT INTO tStatus SET uStatus=91,cLabel='Awaiting Failover',"
712                                "uCreatedBy=1,uOwner=1,uCreatedDate=UNIX_TIMESTAMP(NOW())");
713                mysql_query(&gMysql,gcQuery);
714                if(mysql_errno(&gMysql))
715                        printf("%s\n",mysql_error(&gMysql));
716                else
717                        printf("Inserted uStatus=91 into tStatus\n");
718        }
719        mysql_free_result(res);
720
721        //Not important if repeated
722        sprintf(gcQuery,"UPDATE tConfiguration SET cLabel='cSSHOptions' WHERE cLabel='cSSLOptions'");
723        mysql_query(&gMysql,gcQuery);
724        if(mysql_errno(&gMysql))
725                printf("%s\n",mysql_error(&gMysql));
726
727        //Not important if repeated
728        sprintf(gcQuery,"ALTER TABLE tOSTemplate MODIFY cLabel VARCHAR(100) NOT NULL DEFAULT ''");
729        mysql_query(&gMysql,gcQuery);
730        if(mysql_errno(&gMysql))
731                printf("%s\n",mysql_error(&gMysql));
732
733        if(uIncorrectSource)
734        {
735                sprintf(gcQuery,"ALTER TABLE tContainer MODIFY uSource INT UNSIGNED NOT NULL DEFAULT 0");
736                mysql_query(&gMysql,gcQuery);
737                if(mysql_errno(&gMysql))
738                        printf("%s\n",mysql_error(&gMysql));
739                else
740                        printf("Corrected uSource of tContainer\n");
741
742                sprintf(gcQuery,"ALTER TABLE tContainer DROP INDEX uSource");
743                mysql_query(&gMysql,gcQuery);
744                if(mysql_errno(&gMysql))
745                {
746                        printf("%s\n",mysql_error(&gMysql));
747                }
748                else
749                {
750                        printf("Dropped uSource index of tContainer\n");
751                        uSourceIndex=0;
752                }
753        }
754
755        if(!uSource)
756        {
757                sprintf(gcQuery,"ALTER TABLE tContainer ADD uSource INT UNSIGNED NOT NULL DEFAULT 0");
758                mysql_query(&gMysql,gcQuery);
759                if(mysql_errno(&gMysql))
760                        printf("%s\n",mysql_error(&gMysql));
761                else
762                        printf("Added uSource to tContainer\n");
763        }
764
765        if(!uSourceIndex)
766        {
767                sprintf(gcQuery,"ALTER TABLE tContainer ADD INDEX (uSource)");
768                mysql_query(&gMysql,gcQuery);
769                if(mysql_errno(&gMysql))
770                        printf("%s\n",mysql_error(&gMysql));
771                else
772                        printf("Added INDEX uSource tContainer\n");
773        }
774
775        //alter table tProperty add index (cName)
776        if(!uPropertyNameIndex)
777        {
778                sprintf(gcQuery,"ALTER TABLE tProperty ADD INDEX (cName)");
779                mysql_query(&gMysql,gcQuery);
780                if(mysql_errno(&gMysql))
781                        printf("%s\n",mysql_error(&gMysql));
782                else
783                        printf("Added INDEX cName tProperty\n");
784        }
785
786
787        //alter table tJob add index
788        if(!uJobStatusIndex)
789        {
790                sprintf(gcQuery,"ALTER TABLE tJob ADD INDEX (uJobStatus)");
791                mysql_query(&gMysql,gcQuery);
792                if(mysql_errno(&gMysql))
793                        printf("%s\n",mysql_error(&gMysql));
794                else
795                        printf("Added INDEX uJobStatus tJob\n");
796        }
797
798        if(!uJobNodeIndex)
799        {
800                sprintf(gcQuery,"ALTER TABLE tJob ADD INDEX (uNode)");
801                mysql_query(&gMysql,gcQuery);
802                if(mysql_errno(&gMysql))
803                        printf("%s\n",mysql_error(&gMysql));
804                else
805                        printf("Added INDEX uNode tJob\n");
806        }
807
808        if(!uJobDatacenterIndex)
809        {
810                sprintf(gcQuery,"ALTER TABLE tJob ADD INDEX (uDatacenter)");
811                mysql_query(&gMysql,gcQuery);
812                if(mysql_errno(&gMysql))
813                        printf("%s\n",mysql_error(&gMysql));
814                else
815                        printf("Added INDEX uDatacenter tJob\n");
816        }
817
818        if(!uJobContainerIndex)
819        {
820                sprintf(gcQuery,"ALTER TABLE tJob ADD INDEX (uContainer)");
821                mysql_query(&gMysql,gcQuery);
822                if(mysql_errno(&gMysql))
823                        printf("%s\n",mysql_error(&gMysql));
824                else
825                        printf("Added INDEX uContainer tJob\n");
826        }
827
828        if(!uTemplateLabelIndex)
829        {
830                sprintf(gcQuery,"ALTER TABLE tTemplate ADD INDEX (cLabel)");
831                mysql_query(&gMysql,gcQuery);
832                if(mysql_errno(&gMysql))
833                        printf("%s\n",mysql_error(&gMysql));
834                else
835                        printf("Added INDEX cLabel tTemplate\n");
836        }
837
838        if(!uGlossaryLabelIndex)
839        {
840                sprintf(gcQuery,"ALTER TABLE tGlossary ADD INDEX (cLabel)");
841                mysql_query(&gMysql,gcQuery);
842                if(mysql_errno(&gMysql))
843                        printf("%s\n",mysql_error(&gMysql));
844                else
845                        printf("Added INDEX cLabel tGlossary\n");
846        }
847
848        if(!uIPDatacenter)
849        {
850                sprintf(gcQuery,"ALTER TABLE tIP ADD uDatacenter INT UNSIGNED NOT NULL DEFAULT 0");
851                mysql_query(&gMysql,gcQuery);
852                if(mysql_errno(&gMysql))
853                        printf("%s\n",mysql_error(&gMysql));
854                else
855                        printf("Added uDatacenter to tIP\n");
856        }
857
858        if(!uOSTemplateDatacenter)
859        {
860                sprintf(gcQuery,"ALTER TABLE tOSTemplate ADD uDatacenter INT UNSIGNED NOT NULL DEFAULT 0");
861                mysql_query(&gMysql,gcQuery);
862                if(mysql_errno(&gMysql))
863                        printf("%s\n",mysql_error(&gMysql));
864                else
865                        printf("Added uDatacenter to tOSTemplate\n");
866        }
867
868        if(!uConfigDatacenter)
869        {
870                sprintf(gcQuery,"ALTER TABLE tConfig ADD uDatacenter INT UNSIGNED NOT NULL DEFAULT 0");
871                mysql_query(&gMysql,gcQuery);
872                if(mysql_errno(&gMysql))
873                        printf("%s\n",mysql_error(&gMysql));
874                else
875                        printf("Added uDatacenter to tConfig\n");
876        }
877
878        if(!uNameserverDatacenter)
879        {
880                sprintf(gcQuery,"ALTER TABLE tNameserver ADD uDatacenter INT UNSIGNED NOT NULL DEFAULT 0");
881                mysql_query(&gMysql,gcQuery);
882                if(mysql_errno(&gMysql))
883                        printf("%s\n",mysql_error(&gMysql));
884                else
885                        printf("Added uDatacenter to tNameserver\n");
886        }
887
888        if(!uSearchdomainDatacenter)
889        {
890                sprintf(gcQuery,"ALTER TABLE tSearchdomain ADD uDatacenter INT UNSIGNED NOT NULL DEFAULT 0");
891                mysql_query(&gMysql,gcQuery);
892                if(mysql_errno(&gMysql))
893                        printf("%s\n",mysql_error(&gMysql));
894                else
895                        printf("Added uDatacenter to tSearchdomain\n");
896        }
897
898        //Please fix this TODO
899                sprintf(gcQuery,"ALTER TABLE tJob MODIFY cRemoteMsg VARCHAR(64) NOT NULL DEFAULT ''");
900                mysql_query(&gMysql,gcQuery);
901                if(mysql_errno(&gMysql))
902                        printf("%s\n",mysql_error(&gMysql));
903                else
904                        printf("Corrected cRemoteMsg of tJob\n");
905
906
907        printf("UpdateSchema(): End\n");
908
909}//void UpdateSchema(void)
910
911
912void ImportTemplateFile(char *cTemplate, char *cFile, char *cTemplateSet, char *cTemplateType)
913{
914        FILE *fp;
915        unsigned uTemplate=0;
916        unsigned uTemplateSet=0;
917        unsigned uTemplateType=0;
918        MYSQL_RES *mysqlRes;
919        MYSQL_ROW mysqlField;
920        char cBuffer[2048]={""};
921
922        printf("\nImportTemplateFile(): Start\n");
923
924        if(TextConnectDb())
925                exit(1);
926
927        sprintf(gcQuery,"USE %s",DBNAME);
928        mysql_query(&gMysql,gcQuery);
929        if(mysql_errno(&gMysql))
930        {
931                printf("%s\n",mysql_error(&gMysql));
932                exit(1);
933        }
934
935        if((fp=fopen(cFile,"r"))==NULL)
936        {
937                printf("Could not open %s\n",cFile);
938                exit(1);
939        }
940
941        //uTemplateSet
942        sprintf(gcQuery,"SELECT uTemplateSet FROM tTemplateSet WHERE cLabel='%s'",cTemplateSet);
943        mysql_query(&gMysql,gcQuery);
944        if(mysql_errno(&gMysql))
945        {
946                printf("%s\n",mysql_error(&gMysql));
947                exit(1);
948        }
949        mysqlRes=mysql_store_result(&gMysql);
950        if((mysqlField=mysql_fetch_row(mysqlRes)))
951                sscanf(mysqlField[0],"%u",&uTemplateSet);
952        mysql_free_result(mysqlRes);
953
954        if(!uTemplateSet)
955        {
956                printf("Could not find tTemplateSet.clabel=%s\n",cTemplateSet);
957                exit(1);
958        }
959
960        //uTemplateType
961        sprintf(gcQuery,"SELECT uTemplateType FROM tTemplateType  WHERE cLabel='%s'",cTemplateType);
962        mysql_query(&gMysql,gcQuery);
963        if(mysql_errno(&gMysql))
964        {
965                printf("%s\n",mysql_error(&gMysql));
966                exit(1);
967        }
968        mysqlRes=mysql_store_result(&gMysql);
969        if((mysqlField=mysql_fetch_row(mysqlRes)))
970                sscanf(mysqlField[0],"%u",&uTemplateType);
971        mysql_free_result(mysqlRes);
972
973        if(!uTemplateType)
974        {
975                printf("Could not find tTemplateType.clabel=%s\n",cTemplateSet);
976                exit(1);
977        }
978
979        //uTemplate
980        sprintf(gcQuery,"SELECT uTemplate FROM tTemplate WHERE cLabel='%s' AND uTemplateSet=%u AND uTemplateType=%u",
981                                                cTemplate,uTemplateSet,uTemplateType);
982        mysql_query(&gMysql,gcQuery);
983        if(mysql_errno(&gMysql))
984        {
985                printf("%s\n",mysql_error(&gMysql));
986                exit(1);
987        }
988        mysqlRes=mysql_store_result(&gMysql);
989        if((mysqlField=mysql_fetch_row(mysqlRes)))
990                sscanf(mysqlField[0],"%u",&uTemplate);
991        mysql_free_result(mysqlRes);
992
993
994        if(uTemplate)
995        {
996                printf("Updating tTemplate for %s %s %s\n",cTemplate,cTemplateSet,cTemplateType);
997                sprintf(cBuffer,"UPDATE tTemplate SET uModBy=1,uModDate=UNIX_TIMESTAMP(NOW()),cTemplate='',"
998                                "uTemplateSet=%u,uTemplateType=%u,uModBy=1 WHERE uTemplate=%u",
999                                                                uTemplateSet,uTemplateType,uTemplate);
1000                mysql_query(&gMysql,cBuffer);
1001                if(mysql_errno(&gMysql))
1002                {
1003                        printf("%s\n%.254s\n",mysql_error(&gMysql),cBuffer);
1004                        exit(1);
1005                }
1006        }
1007        else
1008        {
1009                printf("Inserting new tTemplate for %s\n",cTemplate);
1010                sprintf(cBuffer,"INSERT INTO tTemplate SET uOwner=1,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW()),"
1011                                "cLabel='%s',uTemplateSet=%u,uTemplateType=%u",cTemplate,uTemplateSet,uTemplateType);
1012                mysql_query(&gMysql,cBuffer);
1013                if(mysql_errno(&gMysql))
1014                {
1015                        printf("%s\n%.254s\n",mysql_error(&gMysql),cBuffer);
1016                        exit(1);
1017                }
1018                uTemplate=mysql_insert_id(&gMysql);
1019        }
1020
1021        while(fgets(gcQuery,1024,fp)!=NULL)
1022        {
1023                sprintf(cBuffer,"UPDATE tTemplate SET cTemplate=CONCAT(cTemplate,'%s') WHERE uTemplate=%u",
1024                                TextAreaSave(gcQuery),uTemplate);
1025                mysql_query(&gMysql,cBuffer);
1026                if(mysql_errno(&gMysql))
1027                {
1028                        printf("%s\n%.254s\n",mysql_error(&gMysql),cBuffer);
1029                        exit(1);
1030                }
1031        }
1032        fclose(fp);
1033
1034        printf("\nDone\n");
1035
1036}//void ImportTemplateFile()
1037
1038
1039void ExtracttLog(char *cMonth, char *cYear, char *cPasswd, char *cTablePath)
1040{
1041        char cTableName[33]={""};
1042        char cNextMonth[4]={""};
1043        char cNextYear[8]={""};
1044        char cThisYear[8]={""};
1045        char cThisMonth[4]={""};
1046        long uStart=0;
1047        long uEnd=0;
1048        unsigned uRows=0;
1049        time_t clock;
1050        struct tm *structTime;
1051        struct stat info;
1052
1053        time(&clock);
1054        structTime=localtime(&clock);
1055        strftime(cThisYear,8,"%Y",structTime);
1056        strftime(cThisMonth,4,"%b",structTime);
1057
1058        printf("ExtracttLog() Start\n");
1059
1060        printf("cThisMonth:%s cThisYear:%s\n",cThisMonth,cThisYear);
1061
1062        if(!strcmp(cThisMonth,cMonth) && !strcmp(cThisYear,cYear))
1063        {
1064                fprintf(stderr,"Can't extract this months data!\n");
1065                exit(1);
1066        }
1067
1068        if(stat("/usr/bin/myisampack",&info) )
1069        {
1070                fprintf(stderr,"/usr/bin/myisampack is not installed!\n");
1071                exit(1);
1072        }
1073
1074        if(stat("/usr/bin/myisamchk",&info))
1075        {
1076                fprintf(stderr,"/usr/bin/myisamchk is not installed!\n");
1077                exit(1);
1078        }
1079
1080
1081        mySQLRootConnect(cPasswd);
1082        mysql_query(&gMysql,"USE idns");
1083        if(mysql_errno(&gMysql))
1084        {
1085                printf("%s\n",mysql_error(&gMysql));
1086                exit(1);
1087        }
1088        sprintf(gcQuery,"INSERT INTO tLog SET cMessage='ExtracttLog() Start...',"
1089                        "cServer='%s',uLogType=4,uOwner=1,uCreatedBy=1,"
1090                        "uCreatedDate=UNIX_TIMESTAMP(NOW())",gcHostname);
1091        mysql_query(&gMysql,gcQuery);
1092        if(mysql_errno(&gMysql))
1093                fprintf(stderr,"%s\n",mysql_error(&gMysql));
1094
1095        sprintf(cTableName,"t%.3s%.7s",cMonth,cYear);
1096
1097        sprintf(gcQuery,"1-%s-%s",cMonth,cYear);
1098        uStart=cDateToUnixTime(gcQuery);
1099        printf("Start: %s",ctime(&uStart));
1100
1101        if(uStart== -1 || !uStart)
1102        {
1103                fprintf(stderr,"Garbled month year input (uStart)\n");
1104                exit(1);
1105        }
1106
1107        NextMonthYear(cMonth,cYear,cNextMonth,cNextYear);
1108        //Debug only
1109        //printf("%s %s to %s %s\n",cMonth,cYear,cNextMonth,cNextYear);
1110        //exit(0);
1111
1112        sprintf(gcQuery,"1-%s-%s",cNextMonth,cNextYear);
1113        uEnd=cDateToUnixTime(gcQuery);
1114        printf("End:   %s",ctime(&uEnd));
1115        if(uEnd== -1 || !uEnd)
1116        {
1117                fprintf(stderr,"Garbled month year input (uEnd)\n");
1118                exit(1);
1119        }
1120
1121       
1122        CreatetLogTable(cTableName);
1123        if(mysql_errno(&gMysql))
1124        {
1125                fprintf(stderr,"%s\n",mysql_error(&gMysql));
1126                exit(1);
1127        }
1128
1129        printf("Clearing data from %s...\n",cTableName);
1130        sprintf(gcQuery,"DELETE FROM %s",cTableName);
1131        mysql_query(&gMysql,gcQuery);
1132        if(mysql_errno(&gMysql))
1133        {
1134                fprintf(stderr,"%s\n",mysql_error(&gMysql));
1135                exit(1);
1136        }
1137
1138        printf("Getting data from tLog...\n");
1139        sprintf(gcQuery,"INSERT %s (uLog,cLabel,uLogType,cHash,uPermLevel,uLoginClient,cLogin,"
1140                        "cHost,uTablePK,cTableName,uOwner,uCreatedBy,uCreatedDate,uModBy,uModDate)"
1141                        " SELECT uLog,cLabel,uLogType,cHash,uPermLevel,uLoginClient,cLogin,cHost,"
1142                        "uTablePK,cTableName,uOwner,uCreatedBy,uCreatedDate,uModBy,uModDate"
1143                        " FROM tLog WHERE uCreatedDate>=%lu AND uCreatedDate<%lu",
1144                                cTableName,uStart,uEnd);
1145        mysql_query(&gMysql,gcQuery);
1146        if(mysql_errno(&gMysql))
1147        {
1148                fprintf(stderr,"%s\n",mysql_error(&gMysql));
1149                exit(1);
1150        }
1151
1152        //If 0 records inserted delete from tMonth and exit now
1153        uRows=mysql_affected_rows(&gMysql);
1154
1155        printf("Number of rows found and inserted: %u\n",uRows);
1156
1157        if(uRows)
1158        {
1159
1160                sprintf(gcQuery,"REPLACE tMonth SET cLabel='%s',uOwner=1,uCreatedBy=1,"
1161                                        "uCreatedDate=UNIX_TIMESTAMP(NOW())",cTableName);
1162                mysql_query(&gMysql,gcQuery);
1163                if(mysql_errno(&gMysql))
1164                {
1165                        fprintf(stderr,"%s\n",mysql_error(&gMysql));
1166                        exit(1);
1167                }
1168        }
1169        else
1170        {
1171                sprintf(gcQuery,"DELETE FROM tMonth WHERE cLabel='%s'",cTableName);
1172                mysql_query(&gMysql,gcQuery);
1173                if(mysql_errno(&gMysql))
1174                {
1175                        fprintf(stderr,"%s\n",mysql_error(&gMysql));
1176                        exit(1);
1177                }
1178
1179                sprintf(gcQuery,"DROP TABLE %s",cTableName);
1180                mysql_query(&gMysql,gcQuery);
1181                if(mysql_errno(&gMysql))
1182                {
1183                        fprintf(stderr,"%s\n",mysql_error(&gMysql));
1184                        exit(1);
1185                }
1186
1187
1188                printf("Exiting early no data to be archived\n");
1189                exit(0);
1190        }
1191
1192        sprintf(gcQuery,"/usr/bin/myisampack %s/%s",cTablePath,cTableName);
1193        if(system(gcQuery))
1194        {
1195                fprintf(stderr,"Failed: %s\n",gcQuery);
1196                exit(1);
1197        }
1198
1199        sprintf(gcQuery,"/usr/bin/myisamchk -rq %s/%s",cTablePath,cTableName);
1200        if(system(gcQuery))
1201        {
1202                fprintf(stderr,"Failed: %s\n",gcQuery);
1203                exit(1);
1204        }
1205
1206        printf("Flushing compressed RO table...\n");
1207        sprintf(gcQuery,"FLUSH TABLE %s",cTableName);
1208        mysql_query(&gMysql,gcQuery);
1209        if(mysql_errno(&gMysql))
1210        {
1211                fprintf(stderr,"%s\n",mysql_error(&gMysql));
1212                exit(1);
1213        }
1214
1215        printf("Removing records from tLog...\n");
1216        sprintf(gcQuery,"DELETE QUICK FROM tLog WHERE uCreatedDate>=%lu AND uCreatedDate<%lu AND uLogType!=5",
1217                                uStart,uEnd);
1218        mysql_query(&gMysql,gcQuery);
1219        if(mysql_errno(&gMysql))
1220        {
1221                fprintf(stderr,"%s\n",mysql_error(&gMysql));
1222                exit(1);
1223        }
1224
1225
1226        printf("Extracted and Archived. Table flushed: %s\n",cTableName);
1227        printf("ExtracttLog() End\n");
1228        sprintf(gcQuery,"INSERT INTO tLog SET cMessage='ExtracttLog() End',cServer='%s',uLogType=4,"
1229                        "uOwner=1,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",gcHostname);
1230        mysql_query(&gMysql,gcQuery);
1231        if(mysql_errno(&gMysql))
1232                fprintf(stderr,"%s\n",mysql_error(&gMysql));
1233        exit(0);
1234
1235}//void ExtracttLog(char *cMonth, char *cYear, char *cPasswd, char *cTablePath)
1236
1237
1238time_t cDateToUnixTime(char *cDate)
1239{
1240        struct  tm locTime;
1241        time_t  res;
1242
1243        bzero(&locTime, sizeof(struct tm));
1244        if(strchr(cDate,'-'))
1245                strptime(cDate,"%d-%b-%Y", &locTime);
1246        else if(strchr(cDate,'/'))
1247                strptime(cDate,"%d/%b/%Y", &locTime);
1248        else if(strchr(cDate,' '))
1249                strptime(cDate,"%d %b %Y", &locTime);
1250        locTime.tm_sec = 0;
1251        locTime.tm_min = 0;
1252        locTime.tm_hour = 0;
1253        res = mktime(&locTime);
1254        return(res);
1255}//time_t cDateToUnixTime(char *cDate)
1256
1257
1258//Another schema dependent item
1259void CreatetLogTable(char *cTableName)
1260{
1261        sprintf(gcQuery,"CREATE TABLE IF NOT EXISTS %s ( uTablePK VARCHAR(32) NOT NULL DEFAULT '', cHost VARCHAR(32) NOT NULL DEFAULT '', uLoginClient INT UNSIGNED NOT NULL DEFAULT 0, cLogin VARCHAR(32) NOT NULL DEFAULT '', uPermLevel INT UNSIGNED NOT NULL DEFAULT 0, cTableName VARCHAR(32) NOT NULL DEFAULT '', uLog INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, cLabel VARCHAR(64) NOT NULL DEFAULT '', uOwner INT UNSIGNED NOT NULL DEFAULT 0,index (uOwner), uCreatedBy INT UNSIGNED NOT NULL DEFAULT 0, uCreatedDate INT UNSIGNED NOT NULL DEFAULT 0, uModBy INT UNSIGNED NOT NULL DEFAULT 0, uModDate INT UNSIGNED NOT NULL DEFAULT 0, cHash VARCHAR(32) NOT NULL DEFAULT '', uLogType INT UNSIGNED NOT NULL DEFAULT 0,index (uLogType) )",cTableName);
1262        mysql_query(&gMysql,gcQuery);
1263        if(mysql_errno(&gMysql))
1264        {
1265                printf("%s\n",mysql_error(&gMysql));
1266                exit(1);
1267        }
1268}//CreatetLogTable()
1269
1270
1271void NextMonthYear(char *cMonth,char *cYear,char *cNextMonth,char *cNextYear)
1272{
1273        unsigned uYear=0;
1274
1275        //Preset for all but Dec cases
1276        sprintf(cNextYear,"%.7s",cYear);
1277        sscanf(cNextYear,"%u",&uYear);
1278
1279        if(!strcmp(cMonth,"Jan"))
1280        {
1281                strcpy(cNextMonth,"Feb");
1282        }
1283        else if(!strcmp(cMonth,"Feb"))
1284        {
1285                strcpy(cNextMonth,"Mar");
1286        }
1287        else if(!strcmp(cMonth,"Mar"))
1288        {
1289                strcpy(cNextMonth,"Apr");
1290        }
1291        else if(!strcmp(cMonth,"Apr"))
1292        {
1293                strcpy(cNextMonth,"May");
1294        }
1295        else if(!strcmp(cMonth,"May"))
1296        {
1297                strcpy(cNextMonth,"Jun");
1298        }
1299        else if(!strcmp(cMonth,"Jun"))
1300        {
1301                strcpy(cNextMonth,"Jul");
1302        }
1303        else if(!strcmp(cMonth,"Jul"))
1304        {
1305                strcpy(cNextMonth,"Aug");
1306        }
1307        else if(!strcmp(cMonth,"Aug"))
1308        {
1309                strcpy(cNextMonth,"Sep");
1310        }
1311        else if(!strcmp(cMonth,"Sep"))
1312        {
1313                strcpy(cNextMonth,"Oct");
1314        }
1315        else if(!strcmp(cMonth,"Oct"))
1316        {
1317                strcpy(cNextMonth,"Nov");
1318        }
1319        else if(!strcmp(cMonth,"Nov"))
1320        {
1321                strcpy(cNextMonth,"Dec");
1322        }
1323        else if(!strcmp(cMonth,"Dec"))
1324        {
1325                strcpy(cNextMonth,"Jan");
1326                uYear++;
1327                sprintf(cNextYear,"%u",uYear);
1328        }
1329
1330}//NextMonthYear()
1331
1332
1333void TextError(const char *cError, unsigned uContinue)
1334{
1335        printf("\nPlease report this unxsVZ fatal error ASAP:\n%s\n",cError);
1336
1337        //Attempt to report error in tLog
1338        sprintf(gcQuery,"INSERT INTO tLog SET cLabel='TextError',uLogType=4,uPermLevel=%u,uLoginClient=%u,"
1339                        "cLogin='%s',cHost='%s',cMessage=\"%s\",cServer='%s',uOwner=1,uCreatedBy=%u,"
1340                        "uCreatedDate=UNIX_TIMESTAMP(NOW())",
1341                        guPermLevel,guLoginClient,gcUser,gcHost,cError,gcHostname,guLoginClient);
1342        mysql_query(&gMysql,gcQuery);
1343        if(mysql_errno(&gMysql))
1344                printf("Another error occurred while attempting to log: %s\n",
1345                                mysql_error(&gMysql));
1346        if(!uContinue) exit(0);
1347
1348}//void TextError(const char *cError, unsigned uContinue)
1349
1350
1351void GetConfiguration(const char *cName,char *cValue,
1352                unsigned uDatacenter,
1353                unsigned uNode,
1354                unsigned uContainer,
1355                unsigned uHtml)
1356{
1357        MYSQL_RES *res;
1358        MYSQL_ROW field;
1359
1360        char cQuery[1024];
1361        char cExtra[100]={""};
1362
1363        sprintf(cQuery,"SELECT cValue FROM tConfiguration WHERE cLabel='%s'",
1364                        cName);
1365        if(uDatacenter)
1366        {
1367                sprintf(cExtra," AND uDatacenter=%u",uDatacenter);
1368                strcat(cQuery,cExtra);
1369        }
1370        if(uNode)
1371        {
1372                sprintf(cExtra," AND uNode=%u",uNode);
1373                strcat(cQuery,cExtra);
1374        }
1375        if(uContainer)
1376        {
1377                sprintf(cExtra," AND uContainer=%u",uContainer);
1378                strcat(cQuery,cExtra);
1379        }
1380        mysql_query(&gMysql,cQuery);
1381        if(mysql_errno(&gMysql))
1382        {
1383                if(uHtml)
1384                        htmlPlainTextError(mysql_error(&gMysql));
1385                else
1386                        TextError(mysql_error(&gMysql),0);
1387        }
1388        res=mysql_store_result(&gMysql);
1389        if((field=mysql_fetch_row(res)))
1390                sprintf(cValue,"%.255s",field[0]);
1391        mysql_free_result(res);
1392
1393}//void GetConfiguration(...)
1394
1395
1396void RecoverMode(void)
1397{
1398        MYSQL_RES *res;
1399        MYSQL_ROW field;
1400        char cHostname[100];
1401        unsigned uNode=0,uDatacenter=0;
1402
1403        printf("RecoverMode(): Start\n");
1404
1405        if(gethostname(cHostname,99)!=0)
1406        {
1407                printf("Could not determine cHostname\n");
1408                exit(1);
1409        }
1410
1411        if(TextConnectDb())
1412                exit(1);
1413
1414        //Get node and datacenter via hostname
1415        sprintf(gcQuery,"SELECT uNode,uDatacenter FROM tNode WHERE cLabel='%.99s'",cHostname);
1416        mysql_query(&gMysql,gcQuery);
1417        if(mysql_errno(&gMysql))
1418        {
1419                printf("%s\n",mysql_error(&gMysql));
1420                mysql_close(&gMysql);
1421                exit(2);
1422        }
1423        res=mysql_store_result(&gMysql);
1424        if((field=mysql_fetch_row(res)))
1425        {
1426                sscanf(field[0],"%u",&uNode);
1427                sscanf(field[1],"%u",&uDatacenter);
1428        }
1429        mysql_free_result(res);
1430
1431        //FQDN vs short name of 2nd NIC mess
1432        if(!uNode)
1433        {
1434                char *cp;
1435
1436                if((cp=strchr(cHostname,'.')))
1437                        *cp=0;
1438                sprintf(gcQuery,"SELECT uNode,uDatacenter FROM tNode WHERE cLabel='%.99s'",cHostname);
1439                mysql_query(&gMysql,gcQuery);
1440                if(mysql_errno(&gMysql))
1441                {
1442                        printf("%s\n",mysql_error(&gMysql));
1443                        mysql_close(&gMysql);
1444                        exit(2);
1445                }
1446                res=mysql_store_result(&gMysql);
1447                if((field=mysql_fetch_row(res)))
1448                {
1449                        sscanf(field[0],"%u",&uNode);
1450                        sscanf(field[1],"%u",&uDatacenter);
1451                }
1452                mysql_free_result(res);
1453        }
1454
1455        if(!uNode)
1456        {
1457                printf("Could not determine uNode\n");
1458                mysql_close(&gMysql);
1459                exit(1);
1460        }
1461
1462        //Take note if what we need to change/add
1463        //This is based on expanded and incorrect schema of previous releases. Yes this sucks.
1464        sprintf(gcQuery,"SELECT uContainer FROM tJob WHERE cJobName='FailoverFrom' AND uJobStatus=1 AND uJobDate<UNIX_TIMESTAMP(NOW())"
1465                        " AND uDatacenter=%u AND uNode=%u",uDatacenter,uNode);
1466        mysql_query(&gMysql,gcQuery);
1467        if(mysql_errno(&gMysql))
1468        {
1469                printf("%s\n",mysql_error(&gMysql));
1470                mysql_close(&gMysql);
1471                exit(1);
1472        }
1473        res=mysql_store_result(&gMysql);
1474        while((field=mysql_fetch_row(res)))
1475        {
1476                //Nothing yet. Old startup issue was fixed in jobqueue.c
1477        }
1478        mysql_free_result(res);
1479
1480        mysql_close(&gMysql);
1481        printf("RecoverMode(): End\nNow you can start vz\n");
1482
1483}//void RecoverMode(void)
1484
1485
1486void ResetAllSyncPeriod(void)
1487{
1488        MYSQL_RES *res;
1489        MYSQL_ROW field;
1490        char cHostname[100];
1491        unsigned uNode=0,uDatacenter=0;
1492
1493        printf("ResetAllSyncPeriod(): Start\n");
1494
1495        if(gethostname(cHostname,99)!=0)
1496        {
1497                printf("Could not determine cHostname\n");
1498                exit(1);
1499        }
1500
1501        if(TextConnectDb())
1502                exit(1);
1503
1504        //Get node and datacenter via hostname
1505        sprintf(gcQuery,"SELECT uNode,uDatacenter FROM tNode WHERE cLabel='%.99s'",cHostname);
1506        mysql_query(&gMysql,gcQuery);
1507        if(mysql_errno(&gMysql))
1508        {
1509                printf("%s\n",mysql_error(&gMysql));
1510                mysql_close(&gMysql);
1511                exit(2);
1512        }
1513        res=mysql_store_result(&gMysql);
1514        if((field=mysql_fetch_row(res)))
1515        {
1516                sscanf(field[0],"%u",&uNode);
1517                sscanf(field[1],"%u",&uDatacenter);
1518        }
1519        mysql_free_result(res);
1520
1521        //FQDN vs short name of 2nd NIC mess
1522        if(!uNode)
1523        {
1524                char *cp;
1525
1526                if((cp=strchr(cHostname,'.')))
1527                        *cp=0;
1528                sprintf(gcQuery,"SELECT uNode,uDatacenter FROM tNode WHERE cLabel='%.99s'",cHostname);
1529                mysql_query(&gMysql,gcQuery);
1530                if(mysql_errno(&gMysql))
1531                {
1532                        printf("%s\n",mysql_error(&gMysql));
1533                        mysql_close(&gMysql);
1534                        exit(2);
1535                }
1536                res=mysql_store_result(&gMysql);
1537                if((field=mysql_fetch_row(res)))
1538                {
1539                        sscanf(field[0],"%u",&uNode);
1540                        sscanf(field[1],"%u",&uDatacenter);
1541                }
1542                mysql_free_result(res);
1543        }
1544
1545        if(!uNode)
1546        {
1547                printf("Could not determine uNode\n");
1548                mysql_close(&gMysql);
1549                exit(1);
1550        }
1551
1552        //Take note if what we need to change/add
1553        //This is based on expanded and incorrect schema of previous releases. Yes this sucks.
1554        sprintf(gcQuery,"SELECT tProperty.uProperty FROM tContainer,tProperty"
1555                        " WHERE tProperty.uKey=tContainer.uContainer AND tProperty.uType=3 AND tProperty.cName='cuSyncPeriod'"
1556                        " AND tProperty.cValue='0'"
1557                        " AND tContainer.uSource>0"
1558                        " AND LOCATE('-clone',tContainer.cLabel)>0"
1559                        " AND tContainer.uDatacenter=%u AND tContainer.uNode=%u",uDatacenter,uNode);
1560        mysql_query(&gMysql,gcQuery);
1561        if(mysql_errno(&gMysql))
1562        {
1563                printf("%s\n",mysql_error(&gMysql));
1564                mysql_close(&gMysql);
1565                exit(1);
1566        }
1567        res=mysql_store_result(&gMysql);
1568        while((field=mysql_fetch_row(res)))
1569        {
1570                printf("%s\n",field[0]);
1571                sprintf(gcQuery,"UPDATE tProperty SET cValue='1200' WHERE uProperty=%s",field[0]);
1572                mysql_query(&gMysql,gcQuery);
1573                if(mysql_errno(&gMysql))
1574                {
1575                        printf("%s\n",mysql_error(&gMysql));
1576                        mysql_close(&gMysql);
1577                        exit(1);
1578                }
1579        }
1580        mysql_free_result(res);
1581
1582        mysql_close(&gMysql);
1583        printf("ResetAllSyncPeriod(): End\n");
1584
1585}//void ResetAllSyncPeriod(void)
1586
1587
1588//Import remote datacenter containers from-to specified node, and set as status offline
1589//Local tDatacenter and tNode must be ready.
1590//Local tIP,tOSTemplate,tConfig,tNameserver,tSearchdomain,tProperty will be modified as needed.
1591//Clone containers will not be imported.
1592//Only import basic tContainer data
1593void ImportRemoteDatacenter(
1594                        const char *cLocalDatacenter,
1595                        const char *cRemoteDatacenter,
1596                        const char *cLocalNode,
1597                        const char *cRemoteNode,
1598                        const char *cHost,
1599                        const char *cUser,
1600                        const char *cPasswd,
1601                        const char *cuOwner)
1602{
1603        MYSQL_RES *res;
1604        MYSQL_ROW field;
1605
1606        MYSQL gMysqlExt;
1607        MYSQL_RES *resExt;
1608        MYSQL_ROW fieldExt;
1609
1610        //Same for all import ops
1611        unsigned uLocalDatacenter=0;
1612        unsigned uLocalNode=0;
1613        unsigned uRemoteDatacenter=0;
1614        unsigned uRemoteNode=0;
1615        unsigned uClient=0;//Same as c/uOwner
1616        unsigned uGroup=0;
1617
1618        //Used in loop
1619        unsigned uIP;
1620        unsigned uOSTemplate;
1621        unsigned uConfig;
1622        unsigned uNameserver;
1623        unsigned uSearchdomain;
1624        unsigned uContainer;
1625
1626        printf("ImportRemoteDatacenter(): Start\n");
1627
1628        if(TextConnectDb())
1629                exit(1);
1630
1631        mysql_init(&gMysqlExt);
1632        if(!mysql_real_connect(&gMysqlExt,cHost,cUser,cPasswd,"unxsvz",0,NULL,0))
1633        {
1634                printf("Could not connect and/or authenticate to remote database.\n");
1635                exit(1);
1636        }
1637
1638        //Checks
1639        //1. tDatacenter check
1640        sprintf(gcQuery,"SELECT uDatacenter FROM tDatacenter WHERE cLabel='%s'",cLocalDatacenter);
1641        mysql_query(&gMysql,gcQuery);
1642        if(mysql_errno(&gMysql))
1643        {
1644                printf("%s\n",mysql_error(&gMysql));
1645                exit(1);
1646        }
1647        mysql_query(&gMysql,gcQuery);
1648        res=mysql_store_result(&gMysql);
1649        if((field=mysql_fetch_row(res)))
1650                sscanf(field[0],"%u",&uLocalDatacenter);
1651        mysql_free_result(res);
1652        if(!uLocalDatacenter)
1653        {
1654                printf("Local tDatacenter.cLabel=%s does not exist\n",cLocalDatacenter);
1655                exit(1);
1656        }
1657
1658        sprintf(gcQuery,"SELECT uDatacenter FROM tDatacenter WHERE cLabel='%s'",cRemoteDatacenter);
1659        mysql_query(&gMysqlExt,gcQuery);
1660        if(mysql_errno(&gMysqlExt))
1661        {
1662                printf("%s\n",mysql_error(&gMysqlExt));
1663                exit(1);
1664        }
1665        mysql_query(&gMysqlExt,gcQuery);
1666        resExt=mysql_store_result(&gMysqlExt);
1667        if((fieldExt=mysql_fetch_row(resExt)))
1668                sscanf(fieldExt[0],"%u",&uRemoteDatacenter);
1669        mysql_free_result(resExt);
1670        if(!uRemoteDatacenter)
1671        {
1672                printf("Remote tDatacenter.cLabel=%s does not exist\n",cRemoteDatacenter);
1673                exit(1);
1674        }
1675
1676        //2. tNode check
1677        sprintf(gcQuery,"SELECT uNode FROM tNode WHERE cLabel='%s'",cLocalNode);
1678        mysql_query(&gMysql,gcQuery);
1679        if(mysql_errno(&gMysql))
1680        {
1681                printf("%s\n",mysql_error(&gMysql));
1682                exit(1);
1683        }
1684        mysql_query(&gMysql,gcQuery);
1685        res=mysql_store_result(&gMysql);
1686        if((field=mysql_fetch_row(res)))
1687                sscanf(field[0],"%u",&uLocalNode);
1688        mysql_free_result(res);
1689        if(!uLocalNode)
1690        {
1691                printf("Local tNode.cLabel=%s does not exist\n",cLocalNode);
1692                exit(1);
1693        }
1694
1695        sprintf(gcQuery,"SELECT uNode FROM tNode WHERE cLabel='%s'",cRemoteNode);
1696        mysql_query(&gMysqlExt,gcQuery);
1697        if(mysql_errno(&gMysqlExt))
1698        {
1699                printf("%s\n",mysql_error(&gMysqlExt));
1700                exit(1);
1701        }
1702        mysql_query(&gMysqlExt,gcQuery);
1703        resExt=mysql_store_result(&gMysqlExt);
1704        if((fieldExt=mysql_fetch_row(resExt)))
1705                sscanf(fieldExt[0],"%u",&uRemoteNode);
1706        mysql_free_result(resExt);
1707        if(!uRemoteNode)
1708        {
1709                printf("Remote tNode.cLabel=%s does not exist\n",cRemoteNode);
1710                exit(1);
1711        }
1712
1713        //3. tClient check
1714        sprintf(gcQuery,"SELECT uClient FROM tClient WHERE uClient=%s",cuOwner);
1715        mysql_query(&gMysql,gcQuery);
1716        if(mysql_errno(&gMysql))
1717        {
1718                printf("%s\n",mysql_error(&gMysql));
1719                exit(1);
1720        }
1721        mysql_query(&gMysql,gcQuery);
1722        res=mysql_store_result(&gMysql);
1723        if((field=mysql_fetch_row(res)))
1724                sscanf(field[0],"%u",&uClient);
1725        mysql_free_result(res);
1726        if(!uClient)
1727        {
1728                printf("Local tClient.uClient=%s does not exist\n",cuOwner);
1729                exit(1);
1730        }
1731
1732        //4. Optional tGroup with same name as remote datacenter cLabel
1733        sprintf(gcQuery,"SELECT uGroup FROM tGroup WHERE cLabel='%s'",cRemoteDatacenter);
1734        mysql_query(&gMysql,gcQuery);
1735        if(mysql_errno(&gMysql))
1736        {
1737                printf("%s\n",mysql_error(&gMysql));
1738                exit(1);
1739        }
1740        mysql_query(&gMysql,gcQuery);
1741        res=mysql_store_result(&gMysql);
1742        if((field=mysql_fetch_row(res)))
1743                sscanf(field[0],"%u",&uGroup);
1744        mysql_free_result(res);
1745
1746        //Start importing
1747        //Only active (1) not clones
1748        sprintf(gcQuery,"SELECT tContainer.cLabel,tContainer.cHostname,"
1749                        " tIP.cLabel,tOSTemplate.cLabel,tConfig.cLabel,tNameserver.cLabel,tSearchdomain.cLabel"
1750                        " FROM tContainer,tIP,tOSTemplate,tConfig,tNameserver,tSearchdomain"
1751                        " WHERE tContainer.uIPv4=tIP.uIP AND tContainer.uOSTemplate=tOSTemplate.uOSTemplate"
1752                        " AND tContainer.uConfig=tConfig.uConfig AND tContainer.uNameserver=tNameserver.uNameserver"
1753                        " AND tContainer.uSearchdomain=tSearchdomain.uSearchdomain"
1754                        " AND tContainer.uStatus=1 AND tContainer.uSource=0 AND tContainer.uDatacenter=%u AND tContainer.uNode=%u",
1755                                uRemoteDatacenter,uRemoteNode);
1756        mysql_query(&gMysqlExt,gcQuery);
1757        if(mysql_errno(&gMysqlExt))
1758        {
1759                printf("%s\n",mysql_error(&gMysqlExt));
1760                exit(1);
1761        }
1762        mysql_query(&gMysqlExt,gcQuery);
1763        resExt=mysql_store_result(&gMysqlExt);
1764        while((fieldExt=mysql_fetch_row(resExt)))
1765        {
1766                uIP=0;
1767                uOSTemplate=0;
1768                uConfig=0;
1769                uNameserver=0;
1770                uSearchdomain=0;
1771                uContainer=0;
1772
1773                //printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n",
1774                //      fieldExt[0],fieldExt[1],fieldExt[2],fieldExt[3],fieldExt[4],fieldExt[5],fieldExt[6]);
1775
1776                //Do not add if we already have a local tContainer.cLabel
1777                sprintf(gcQuery,"SELECT uContainer FROM tContainer WHERE cLabel='%s'",fieldExt[0]);
1778                mysql_query(&gMysql,gcQuery);
1779                if(mysql_errno(&gMysql))
1780                {
1781                        printf("%s\n",mysql_error(&gMysql));
1782                        exit(1);
1783                }
1784                mysql_query(&gMysql,gcQuery);
1785                res=mysql_store_result(&gMysql);
1786                if(mysql_num_rows(res)!=0)
1787                {
1788                        printf("Local tContainer.cLabel=%s exists\n",fieldExt[0]);
1789                        continue;
1790                }
1791                mysql_free_result(res);
1792
1793                //tIP.cLabel [2]
1794                sprintf(gcQuery,"SELECT uIP FROM tIP WHERE cLabel='%s'",fieldExt[2]);
1795                mysql_query(&gMysql,gcQuery);
1796                if(mysql_errno(&gMysql))
1797                {
1798                        printf("%s\n",mysql_error(&gMysql));
1799                        exit(1);
1800                }
1801                res=mysql_store_result(&gMysql);
1802                if(mysql_num_rows(res)==0)
1803                {
1804                        sprintf(gcQuery,"INSERT INTO tIP SET cLabel='%s',uAvailable=0,uDatacenter=%u,uOwner=%u,"
1805                                        "uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
1806                                                fieldExt[2],uLocalDatacenter,uClient);
1807                        mysql_query(&gMysql,gcQuery);
1808                        if(mysql_errno(&gMysql))
1809                        {
1810                                printf("%s\n",mysql_error(&gMysql));
1811                                exit(1);
1812                        }
1813                        uIP=mysql_insert_id(&gMysql);
1814                }
1815                else
1816                {
1817                        if((field=mysql_fetch_row(res)))
1818                                sscanf(field[0],"%u",&uIP);
1819                        //printf("Local tIP.cLabel=%s exists. Not adding.\n",fieldExt[2]);
1820                        if(!uIP)
1821                        {
1822                                printf("Unexpected uIP==0 error skip to next container\n");
1823                                continue;
1824                        }
1825                }
1826                mysql_free_result(res);
1827
1828                //debug only
1829                //printf("Post tIP import stop %s uClient=%u\n",fieldExt[2],uClient);
1830                //exit(0);
1831
1832                //tOSTemplate.cLabel [3]
1833                sprintf(gcQuery,"SELECT uOSTemplate FROM tOSTemplate WHERE cLabel='%s'",fieldExt[3]);
1834                mysql_query(&gMysql,gcQuery);
1835                if(mysql_errno(&gMysql))
1836                {
1837                        printf("%s\n",mysql_error(&gMysql));
1838                        exit(1);
1839                }
1840                res=mysql_store_result(&gMysql);
1841                if(mysql_num_rows(res)==0)
1842                {
1843                        sprintf(gcQuery,"INSERT INTO tOSTemplate SET cLabel='%s',uOwner=%u,"
1844                                        "uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
1845                                                fieldExt[3],uClient);
1846                        mysql_query(&gMysql,gcQuery);
1847                        if(mysql_errno(&gMysql))
1848                        {
1849                                printf("%s\n",mysql_error(&gMysql));
1850                                exit(1);
1851                        }
1852                        uOSTemplate=mysql_insert_id(&gMysql);
1853                        //Enable for only this datacenter via tProperty tOSTemplate type = 8
1854                        sprintf(gcQuery,"INSERT INTO tProperty SET cName='cDatacenter',cValue='%s',uType=8,uKey=%u,"
1855                                        " uOwner=%u,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
1856                                                cLocalDatacenter,uOSTemplate,uClient);
1857                        mysql_query(&gMysql,gcQuery);
1858                        if(mysql_errno(&gMysql))
1859                        {
1860                                printf("%s\n",mysql_error(&gMysql));
1861                                exit(1);
1862                        }
1863                }
1864                else
1865                {
1866                        if((field=mysql_fetch_row(res)))
1867                                sscanf(field[0],"%u",&uOSTemplate);
1868                        //printf("Local tOSTemplate.cLabel=%s exists. Not adding.\n",fieldExt[3]);
1869                        if(!uOSTemplate)
1870                        {
1871                                printf("Unexpected uOSTemplate==0 error skip to next container\n");
1872                                continue;
1873                        }
1874                }
1875                mysql_free_result(res);
1876
1877                //debug only
1878                //printf("Post tOSTemplate import stop uOSTemplate=%u\n",uOSTemplate);
1879                //exit(0);
1880
1881                //tConfig.cLabel [4]
1882                sprintf(gcQuery,"SELECT uConfig FROM tConfig WHERE cLabel='%s'",fieldExt[4]);
1883                mysql_query(&gMysql,gcQuery);
1884                if(mysql_errno(&gMysql))
1885                {
1886                        printf("%s\n",mysql_error(&gMysql));
1887                        exit(1);
1888                }
1889                res=mysql_store_result(&gMysql);
1890                if(mysql_num_rows(res)==0)
1891                {
1892                        sprintf(gcQuery,"INSERT INTO tConfig SET cLabel='%s',uOwner=%u,"
1893                                        "uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
1894                                                fieldExt[4],uClient);
1895                        mysql_query(&gMysql,gcQuery);
1896                        if(mysql_errno(&gMysql))
1897                        {
1898                                printf("%s\n",mysql_error(&gMysql));
1899                                exit(1);
1900                        }
1901                        uConfig=mysql_insert_id(&gMysql);
1902                        //Enable for only this datacenter via tProperty tConfig type = 6 TODO defines
1903                        sprintf(gcQuery,"INSERT INTO tProperty SET cName='cDatacenter',cValue='%s',uType=6,uKey=%u,"
1904                                        "uOwner=%u,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
1905                                                cLocalDatacenter,uConfig,uClient);
1906                        mysql_query(&gMysql,gcQuery);
1907                        if(mysql_errno(&gMysql))
1908                        {
1909                                printf("%s\n",mysql_error(&gMysql));
1910                                exit(1);
1911                        }
1912                }
1913                else
1914                {
1915                        if((field=mysql_fetch_row(res)))
1916                                sscanf(field[0],"%u",&uConfig);
1917                        //printf("Local tConfig.cLabel=%s exists. Not adding.\n",fieldExt[4]);
1918                        if(!uConfig)
1919                        {
1920                                printf("Unexpected uConfig==0 error skip to next container\n");
1921                                continue;
1922                        }
1923                }
1924                mysql_free_result(res);
1925
1926                //debug only
1927                //printf("Post tConfig import stop uConfig=%u\n",uConfig);
1928                //exit(0);
1929
1930                //tNameserver.cLabel [5]
1931                sprintf(gcQuery,"SELECT uNameserver FROM tNameserver WHERE cLabel='%s'",fieldExt[5]);
1932                mysql_query(&gMysql,gcQuery);
1933                if(mysql_errno(&gMysql))
1934                {
1935                        printf("%s\n",mysql_error(&gMysql));
1936                        exit(1);
1937                }
1938                res=mysql_store_result(&gMysql);
1939                if(mysql_num_rows(res)==0)
1940                {
1941                        sprintf(gcQuery,"INSERT INTO tNameserver SET cLabel='%s',uOwner=%u,"
1942                                        "uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
1943                                                fieldExt[5],uClient);
1944                        mysql_query(&gMysql,gcQuery);
1945                        if(mysql_errno(&gMysql))
1946                        {
1947                                printf("%s\n",mysql_error(&gMysql));
1948                                exit(1);
1949                        }
1950                        uNameserver=mysql_insert_id(&gMysql);
1951                        //Enable for only this datacenter via tProperty tNameserver type = 7 TODO defines
1952                        sprintf(gcQuery,"INSERT INTO tProperty SET cName='cDatacenter',cValue='%s',uType=7,uKey=%u,"
1953                                        " uOwner=%u,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
1954                                                cLocalDatacenter,uNameserver,uClient);
1955                        mysql_query(&gMysql,gcQuery);
1956                        if(mysql_errno(&gMysql))
1957                        {
1958                                printf("%s\n",mysql_error(&gMysql));
1959                                exit(1);
1960                        }
1961                }
1962                else
1963                {
1964                        if((field=mysql_fetch_row(res)))
1965                                sscanf(field[0],"%u",&uNameserver);
1966                        //printf("Local tNameserver.cLabel=%s exists. Not adding.\n",fieldExt[5]);
1967                        if(!uNameserver)
1968                        {
1969                                printf("Unexpected uNameserver==0 error skip to next container\n");
1970                                continue;
1971                        }
1972                }
1973
1974                //debug only
1975                //printf("Post tNameserver import stop uNameserver=%u\n",uNameserver);
1976                //exit(0);
1977
1978                //tSearchdomain.cLabel [6]
1979                sprintf(gcQuery,"SELECT uSearchdomain FROM tSearchdomain WHERE cLabel='%s'",fieldExt[6]);
1980                mysql_query(&gMysql,gcQuery);
1981                if(mysql_errno(&gMysql))
1982                {
1983                        printf("%s\n",mysql_error(&gMysql));
1984                        exit(1);
1985                }
1986                res=mysql_store_result(&gMysql);
1987                if(mysql_num_rows(res)==0)
1988                {
1989                        sprintf(gcQuery,"INSERT INTO tSearchdomain SET cLabel='%s',uOwner=%u,"
1990                                        "uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
1991                                                fieldExt[6],uClient);
1992                        mysql_query(&gMysql,gcQuery);
1993                        if(mysql_errno(&gMysql))
1994                        {
1995                                printf("%s\n",mysql_error(&gMysql));
1996                                exit(1);
1997                        }
1998                        uSearchdomain=mysql_insert_id(&gMysql);
1999                        //Enable for only this datacenter via tProperty tSearchdomain type = 9 TODO defines
2000                        sprintf(gcQuery,"INSERT INTO tProperty SET cName='cDatacenter',cValue='%s',uType=9,uKey=%u,"
2001                                        "uOwner=%u,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
2002                                                cLocalDatacenter,uSearchdomain,uClient);
2003                        mysql_query(&gMysql,gcQuery);
2004                        if(mysql_errno(&gMysql))
2005                        {
2006                                printf("%s\n",mysql_error(&gMysql));
2007                                exit(1);
2008                        }
2009                }
2010                else
2011                {
2012                        if((field=mysql_fetch_row(res)))
2013                                sscanf(field[0],"%u",&uSearchdomain);
2014                        //printf("Local tSearchdomain.cLabel=%s exists. Not adding.\n",fieldExt[6]);
2015                        if(!uSearchdomain)
2016                        {
2017                                printf("Unexpected uSearchdomain==0 error skip to next container\n");
2018                                continue;
2019                        }
2020                }
2021
2022                //debug only
2023                //printf("Post tSearchdomain import stop uSearchdomain=%u\n",uSearchdomain);
2024                //exit(0);
2025
2026                //Add container
2027                sprintf(gcQuery,"INSERT INTO tContainer SET"
2028                                " cLabel='%s',"
2029                                " cHostname='%s',"
2030                                " uVeth=0,"
2031                                " uIPv4=%u,"
2032                                " uOSTemplate=%u,"
2033                                " uConfig=%u,"
2034                                " uNameserver=%u,"
2035                                " uSearchdomain=%u,"
2036                                " uDatacenter=%u,"
2037                                " uNode=%u,"
2038                                " uStatus=3," //Offline
2039                                " uSource=0,"
2040                                " uOwner=%u,"
2041                                " uCreatedBy=1,"
2042                                " uCreatedDate=UNIX_TIMESTAMP(NOW())",
2043                                fieldExt[0],
2044                                fieldExt[1],
2045                                uIP,
2046                                uOSTemplate,
2047                                uConfig,
2048                                uNameserver,
2049                                uSearchdomain,
2050                                uLocalDatacenter,
2051                                uLocalNode,
2052                                uClient);
2053                mysql_query(&gMysql,gcQuery);
2054                if(mysql_errno(&gMysql))
2055                {
2056                        printf("%s\n",mysql_error(&gMysql));
2057                        exit(1);
2058                }
2059                printf("Imported: %s\n",fieldExt[1]);
2060                uContainer=mysql_insert_id(&gMysql);
2061                if(!uContainer)
2062                {
2063                        printf("Unexpected uContainer==0 error skipping group section\n");
2064                        continue;
2065                }
2066
2067                //Add container to premade optional group "cRemoteDatacenter"
2068                if(uGroup)
2069                {
2070                        sprintf(gcQuery,"INSERT INTO tGroupGlue SET uGroup=%u,uContainer=%u",uGroup,uContainer);
2071                        mysql_query(&gMysql,gcQuery);
2072                        if(mysql_errno(&gMysql))
2073                        {
2074                                printf("%s\n",mysql_error(&gMysql));
2075                                exit(1);
2076                        }
2077                }
2078
2079        }//While remote containers
2080        mysql_free_result(resExt);
2081
2082
2083        mysql_close(&gMysql);
2084        mysql_close(&gMysqlExt);
2085        printf("ImportRemoteDatacenter(): End\n");
2086
2087}//void ImportRemoteDatacenter()
2088
2089
2090void ImportOSTemplates(char *cPath, char *cOwner)
2091{
2092        char cHostname[100]={""};
2093        char cLabel[100]={""};
2094        unsigned uOwner=0;
2095        unsigned uNode=0;
2096        unsigned uDatacenter=0;
2097        struct dirent **namelist;
2098        register int n,i;
2099        char *cp;
2100        MYSQL_RES *res;
2101        MYSQL_ROW field;
2102
2103        printf("ImportOSTemplates(): Start\n");
2104
2105        if(TextConnectDb())
2106                exit(1);
2107
2108        if(gethostname(cHostname,99)!=0)
2109        {
2110                printf("gethostname() failed\n");
2111                exit(1);
2112        }
2113
2114        //Get node and datacenter via hostname
2115        sprintf(gcQuery,"SELECT uNode,uDatacenter FROM tNode WHERE cLabel='%.99s'",cHostname);
2116        mysql_query(&gMysql,gcQuery);
2117        if(mysql_errno(&gMysql))
2118        {
2119                printf(mysql_error(&gMysql));
2120                mysql_close(&gMysql);
2121                exit(2);
2122        }
2123        res=mysql_store_result(&gMysql);
2124        if((field=mysql_fetch_row(res)))
2125        {
2126                sscanf(field[0],"%u",&uNode);
2127                sscanf(field[1],"%u",&uDatacenter);
2128        }
2129        mysql_free_result(res);
2130        //FQDN vs short name of 2nd NIC mess
2131        if(!uNode)
2132        {
2133                if((cp=strchr(cHostname,'.')))
2134                        *cp=0;
2135                sprintf(gcQuery,"SELECT uNode,uDatacenter FROM tNode WHERE cLabel='%.99s'",cHostname);
2136                mysql_query(&gMysql,gcQuery);
2137                if(mysql_errno(&gMysql))
2138                {
2139                        printf(mysql_error(&gMysql));
2140                        mysql_close(&gMysql);
2141                        exit(2);
2142                }
2143                res=mysql_store_result(&gMysql);
2144                if((field=mysql_fetch_row(res)))
2145                {
2146                        sscanf(field[0],"%u",&uNode);
2147                        sscanf(field[1],"%u",&uDatacenter);
2148                }
2149                mysql_free_result(res);
2150        }
2151
2152        //Get uOwner
2153        sprintf(gcQuery,"SELECT uClient FROM tClient WHERE cLabel='%s'",cOwner);
2154        mysql_query(&gMysql,gcQuery);
2155        if(mysql_errno(&gMysql))
2156        {
2157                printf(mysql_error(&gMysql));
2158                mysql_close(&gMysql);
2159                exit(2);
2160        }
2161        res=mysql_store_result(&gMysql);
2162        if((field=mysql_fetch_row(res)))
2163                sscanf(field[0],"%u",&uOwner);
2164        mysql_free_result(res);
2165        if(!uOwner)
2166        {
2167                printf("No such owner: \"%s\"\n",cOwner);
2168                exit(1);
2169        }
2170        printf("uNode=%u uDatacenter=%u uOwner=%u\n",uNode,uDatacenter,uOwner);
2171
2172        n=scandir(cPath,&namelist,0,0);
2173        if(n<0)
2174        {
2175                printf("scandir() error.\n");
2176                exit(1);
2177        }
2178        else if(n==2)
2179        {
2180                printf("No files found.\n");
2181                exit(1);
2182        }
2183        for(i=0;i<n;i++)
2184        {
2185
2186                //Added some end of list test hack a long time ago. Remove?
2187                if(namelist[i]->d_name[0]=='.' ||
2188                        strstr(namelist[i]->d_name+strlen(namelist[i]->d_name)-5,
2189                                ".done"))
2190                {
2191                        ;
2192                }
2193                else
2194                {
2195                        if(!strcmp(namelist[i]->d_name+strlen(namelist[i]->d_name)-6,"tar.gz"))
2196                        {
2197                                unsigned uOSTemplate=0;
2198
2199                                sprintf(cLabel,"%.100s",namelist[i]->d_name);
2200
2201                                //Chop off .tar.gz
2202                                if((cp=strstr(cLabel,".tar.gz")))
2203                                        *cp=0;
2204
2205                                //Ignore if already in tOSTemplate
2206                                sprintf(gcQuery,"SELECT uOSTemplate FROM tOSTemplate WHERE cLabel='%s'",cLabel);
2207                                mysql_query(&gMysql,gcQuery);
2208                                if(mysql_errno(&gMysql))
2209                                {
2210                                        printf(mysql_error(&gMysql));
2211                                        mysql_close(&gMysql);
2212                                        exit(2);
2213                                }
2214                                res=mysql_store_result(&gMysql);
2215                                if(mysql_num_rows(res))
2216                                {
2217                                        mysql_free_result(res);
2218                                        continue;
2219                                }
2220                                mysql_free_result(res);
2221
2222                                //Add new record
2223                                sprintf(gcQuery,"INSERT INTO tOSTemplate SET cLabel='%s',uOwner=%u,uCreatedBy=1,"
2224                                        "uCreatedDate=UNIX_TIMESTAMP(NOW())",TextAreaSave(cLabel),uOwner);
2225                                mysql_query(&gMysql,gcQuery);
2226                                if(mysql_errno(&gMysql))
2227                                {
2228                                        printf(mysql_error(&gMysql));
2229                                        mysql_close(&gMysql);
2230                                        exit(2);
2231                                }
2232                                uOSTemplate=mysql_insert_id(&gMysql);
2233                                sprintf(gcQuery,"INSERT INTO tProperty SET uKey=%u,uType="PROP_OSTEMPLATE
2234                                                ",cName='cDatacenter',cValue='%s',uOwner=%u,uCreatedBy=1"
2235                                                ",uCreatedDate=UNIX_TIMESTAMP(NOW())"
2236                                                        ,uOSTemplate,ForeignKey("tDatacenter","cLabel",uDatacenter),uOwner);
2237                                mysql_query(&gMysql,gcQuery);
2238                                if(mysql_errno(&gMysql))
2239                                {
2240                                        printf(mysql_error(&gMysql));
2241                                        mysql_close(&gMysql);
2242                                        exit(2);
2243                                }
2244                                printf("%s\n",cLabel);
2245                        }
2246                }
2247        }
2248
2249        printf("ImportOSTemplates(): End\n");
2250
2251}//void ImportOSTemplates()
2252
2253
2254void MassCreateContainers(char *cConfigfileName)
2255{
2256        char cHostname[100]={""};
2257        unsigned uNode=0;
2258        unsigned uDatacenter=0;
2259        char *cp;
2260        FILE *fp;
2261        MYSQL_RES *res;
2262        MYSQL_ROW field;
2263
2264        printf("MassCreateContainers(): Start\n\n");
2265
2266        if(TextConnectDb())
2267                exit(1);
2268
2269        if(gethostname(cHostname,99)!=0)
2270        {
2271                printf("gethostname() failed\n");
2272                exit(1);
2273        }
2274
2275        //
2276        //Get node and datacenter via hostname
2277        //
2278        sprintf(gcQuery,"SELECT uNode,uDatacenter FROM tNode WHERE cLabel='%.99s'",cHostname);
2279        mysql_query(&gMysql,gcQuery);
2280        if(mysql_errno(&gMysql))
2281        {
2282                printf(mysql_error(&gMysql));
2283                mysql_close(&gMysql);
2284                exit(2);
2285        }
2286        res=mysql_store_result(&gMysql);
2287        if((field=mysql_fetch_row(res)))
2288        {
2289                sscanf(field[0],"%u",&uNode);
2290                sscanf(field[1],"%u",&uDatacenter);
2291        }
2292        mysql_free_result(res);
2293        //FQDN vs short name of 2nd NIC mess
2294        if(!uNode)
2295        {
2296                if((cp=strchr(cHostname,'.')))
2297                        *cp=0;
2298                sprintf(gcQuery,"SELECT uNode,uDatacenter FROM tNode WHERE cLabel='%.99s'",cHostname);
2299                mysql_query(&gMysql,gcQuery);
2300                if(mysql_errno(&gMysql))
2301                {
2302                        printf(mysql_error(&gMysql));
2303                        mysql_close(&gMysql);
2304                        exit(2);
2305                }
2306                res=mysql_store_result(&gMysql);
2307                if((field=mysql_fetch_row(res)))
2308                {
2309                        sscanf(field[0],"%u",&uNode);
2310                        sscanf(field[1],"%u",&uDatacenter);
2311                }
2312                mysql_free_result(res);
2313        }
2314        printf("uNode=%u uDatacenter=%u\n",uNode,uDatacenter);
2315
2316        //
2317        //Now we can read the config file
2318        //
2319        if((fp=fopen(cConfigfileName,"r"))==NULL)
2320        {
2321                printf("Could not open %s\n",cConfigfileName);
2322                exit(1);
2323        }
2324
2325
2326        //config file has two sections
2327        unsigned uList=0;
2328
2329        //these two are for section two
2330        char cLabel[33]={""};
2331        char cCloneLabel[33]={""};
2332        char cCloneHostname[100]={""};
2333        char cAltLabel[33]={""};
2334        //char cHostname[100]={""};
2335
2336        char cIPv4ClassC[16]={""};
2337        unsigned uIPv4=0;
2338
2339        char cPasswd[16]={""};
2340        char cTimeZone[32]={""};//PST8PDT
2341
2342        char cIPv4CloneClassC[16]={""};
2343        unsigned uCloneIPv4=0;
2344
2345        unsigned uConfig=0;
2346        unsigned uNameserver=0;
2347        unsigned uSearchdomain=0;
2348        unsigned uGroup=0;
2349        unsigned uOwner=0;
2350        unsigned uOSTemplate=0;
2351        unsigned uOSLoopTemplate=0;
2352        unsigned uDNSJob=0;
2353        unsigned uSyncPeriod=0;
2354        unsigned uCloneTargetNode=0;
2355        unsigned uCloneStopped=1;
2356
2357        while(fgets(gcQuery,1024,fp)!=NULL)
2358        {
2359                if(gcQuery[0]=='#')
2360                        continue;
2361
2362                if(!strncmp(gcQuery,"ContainerList",strlen("ContainerList")))
2363                {
2364                        uList=1;
2365                        printf("Global settings\n");
2366                        printf("\tcIPv4ClassC=%s\n",cIPv4ClassC);
2367                        printf("\tcIPv4CloneClassC=%s\n",cIPv4CloneClassC);
2368                        printf("\tcPasswd=%s\n",cPasswd);
2369                        printf("\tcTimeZone=%s\n",cTimeZone);
2370                        printf("\tuOwner=%u\n",uOwner);
2371                        printf("\tuConfig=%u\n",uConfig);
2372                        printf("\tuNameserver=%u\n",uNameserver);
2373                        printf("\tuSearchdomain=%u\n",uSearchdomain);
2374                        printf("\tuGroup=%u\n",uGroup);
2375                        printf("\tuOSTemplate=%u\n",uOSTemplate);
2376                        printf("\tuSyncPeriod=%u\n",uSyncPeriod);
2377                        printf("\tuDNSJob=%u\n",uDNSJob);
2378                        printf("\tuCloneTargetNode=%u\n",uCloneTargetNode);
2379                        printf("\tuCloneStopped=%u\n",uCloneStopped);
2380                        continue;
2381                }
2382
2383                if(!uList)
2384                {
2385                        if(!strncmp(gcQuery,"cIPv4ClassC=",strlen("cIPv4ClassC")))
2386                        {
2387                                sprintf(cIPv4ClassC,"%.15s",gcQuery+strlen("cIPv4ClassC="));
2388                                if((cp=strchr(cIPv4ClassC,';')))
2389                                        *cp=0;
2390                        }
2391                        else if(!strncmp(gcQuery,"cIPv4CloneClassC=",strlen("cIPv4CloneClassC")))
2392                        {
2393                                sprintf(cIPv4CloneClassC,"%.15s",gcQuery+strlen("cIPv4CloneClassC="));
2394                                if((cp=strchr(cIPv4CloneClassC,';')))
2395                                        *cp=0;
2396                        }
2397                        else if(!strncmp(gcQuery,"cPasswd=",strlen("cPasswd")))
2398                        {
2399                                sprintf(cPasswd,"%.15s",gcQuery+strlen("cPasswd="));
2400                                if((cp=strchr(cPasswd,';')))
2401                                        *cp=0;
2402                        }
2403                        else if(!strncmp(gcQuery,"cTimeZone=",strlen("cTimeZone")))
2404                        {
2405                                sprintf(cTimeZone,"%.31s",gcQuery+strlen("cTimeZone="));
2406                                if((cp=strchr(cTimeZone,';')))
2407                                        *cp=0;
2408                        }
2409                        else if(!strncmp(gcQuery,"uOwner=",strlen("uOwner=")))
2410                                sscanf(gcQuery,"uOwner=%u;",&uOwner);
2411                        else if(!strncmp(gcQuery,"uConfig=",strlen("uConfig=")))
2412                                sscanf(gcQuery,"uConfig=%u;",&uConfig);
2413                        else if(!strncmp(gcQuery,"uNameserver=",strlen("uNameserver=")))
2414                                sscanf(gcQuery,"uNameserver=%u;",&uNameserver);
2415                        else if(!strncmp(gcQuery,"uSearchdomain=",strlen("uSearchdomain=")))
2416                                sscanf(gcQuery,"uSearchdomain=%u;",&uSearchdomain);
2417                        else if(!strncmp(gcQuery,"uGroup=",strlen("uGroup=")))
2418                                sscanf(gcQuery,"uGroup=%u;",&uGroup);
2419                        else if(!strncmp(gcQuery,"uOSTemplate=",strlen("uOSTemplate=")))
2420                                sscanf(gcQuery,"uOSTemplate=%u;",&uOSTemplate);
2421                        else if(!strncmp(gcQuery,"uSyncPeriod=",strlen("uSyncPeriod=")))
2422                                sscanf(gcQuery,"uSyncPeriod=%u;",&uSyncPeriod);
2423                        else if(!strncmp(gcQuery,"uDNSJob=",strlen("uDNSJob=")))
2424                                sscanf(gcQuery,"uDNSJob=%u;",&uDNSJob);
2425                        else if(!strncmp(gcQuery,"uCloneTargetNode=",strlen("uCloneTargetNode=")))
2426                                sscanf(gcQuery,"uCloneTargetNode=%u;",&uCloneTargetNode);
2427                        else if(!strncmp(gcQuery,"uCloneStopped=",strlen("uCloneStopped=")))
2428                                sscanf(gcQuery,"uCloneStopped=%u;",&uCloneStopped);
2429                }
2430                else
2431                {
2432                        cHostname[0]=0;
2433                        cLabel[0]=0;
2434                        cAltLabel[0]=0;
2435                        if((cp=strchr(gcQuery,'.')))
2436                        {
2437                                *cp=0;
2438                                sprintf(cLabel,"%.31s",gcQuery);
2439                                *cp='.';
2440                                if((cp=strchr(gcQuery,',')))
2441                                {
2442                                        *cp=0;
2443                                        sprintf(cAltLabel,"%.31s",cp+1);
2444                                }
2445                                sprintf(cHostname,"%.99s",gcQuery);
2446                                if((cp=strchr(cHostname,'\n')))
2447                                        *cp=0;
2448                                if((cp=strchr(cAltLabel,'\n')))
2449                                        *cp=0;
2450                                printf("\ncHostname=%s cLabel=%s",cHostname,cLabel);
2451                                if(cAltLabel[0])
2452                                        printf(" cAltLabel=%s\n",cAltLabel);
2453                                else
2454                                        printf("\n");
2455
2456
2457                                //
2458                                //Gather data from config settings
2459                                //
2460
2461                                //Get some available IPs for this new container
2462                                if(!cIPv4ClassC[0])
2463                                {
2464                                        printf("cIPv4ClassC must be specified\n");
2465                                        continue;
2466                                }
2467                                if(!cIPv4CloneClassC[0])
2468                                {
2469                                        printf("cIPv4CloneClassC must be specified\n");
2470                                        continue;
2471                                }
2472                                sprintf(gcQuery,"SELECT uIP,cLabel FROM tIP WHERE uAvailable=1 AND"
2473                                                " cLabel LIKE '%s%%'"
2474                                                " AND uOwner=%u AND uDatacenter=%u",cIPv4ClassC,uOwner,uDatacenter);
2475                                mysql_query(&gMysql,gcQuery);
2476                                if(mysql_errno(&gMysql))
2477                                                htmlPlainTextError(mysql_error(&gMysql));
2478                                res=mysql_store_result(&gMysql);
2479                                if((field=mysql_fetch_row(res)))
2480                                {
2481                                        sscanf(field[0],"%u",&uIPv4);
2482                                        printf("cIPv4ClassC IP %s\n",field[1]);
2483                                }
2484                                mysql_free_result(res);
2485                                sprintf(gcQuery,"SELECT uIP,cLabel FROM tIP WHERE uAvailable=1 AND"
2486                                                " cLabel LIKE '%s%%'"
2487                                                " AND uOwner=%u AND uDatacenter=%u",cIPv4CloneClassC,uOwner,uDatacenter);
2488                                mysql_query(&gMysql,gcQuery);
2489                                if(mysql_errno(&gMysql))
2490                                                htmlPlainTextError(mysql_error(&gMysql));
2491                                res=mysql_store_result(&gMysql);
2492                                if((field=mysql_fetch_row(res)))
2493                                {
2494                                        sscanf(field[0],"%u",&uCloneIPv4);
2495                                        printf("cIPv4CloneClassC IP %s\n",field[1]);
2496                                }
2497                                mysql_free_result(res);
2498
2499                                if(!uOSTemplate)
2500                                {
2501                                        uOSLoopTemplate=0;
2502
2503                                        if(!cAltLabel[0])
2504                                                sprintf(cAltLabel,"%31s",cLabel);
2505
2506                                        //Try to find a matching tOSTemplate
2507                                        sprintf(gcQuery,"SELECT uOSTemplate,cLabel FROM tOSTemplate WHERE "
2508                                                " cLabel LIKE '%%%s%%'",cAltLabel);
2509                                        mysql_query(&gMysql,gcQuery);
2510                                        if(mysql_errno(&gMysql))
2511                                                htmlPlainTextError(mysql_error(&gMysql));
2512                                        res=mysql_store_result(&gMysql);
2513                                        if(mysql_num_rows(res)==1)
2514                                        {
2515                                                field=mysql_fetch_row(res);
2516                                                sscanf(field[0],"%u",&uOSLoopTemplate);
2517                                                printf("tOSTemplate %s\n",field[1]);
2518                                        }
2519                                        else
2520                                        {
2521                                                printf("No single tOSTemplate match found based on:%s\n",cAltLabel);
2522                                                //printf("%s\n",gcQuery);
2523                                        }
2524                                        mysql_free_result(res);
2525                                }
2526                                else
2527                                {
2528                                        uOSLoopTemplate=uOSTemplate;
2529                                }
2530
2531                                //
2532                                //here we start creating the new container jobs
2533                                //after input validation
2534                                //
2535                                if(uDatacenter==0)
2536                                {
2537                                        printf("Unexpected uDatacenter==0!\n");
2538                                        continue;
2539                                }
2540                                if(uNode==0)
2541                                {
2542                                        printf("Unexpected uNode==0!\n");
2543                                        continue;
2544                                }
2545
2546                                char cNCMDatacenter[256]={""};
2547                                GetDatacenterProp(uDatacenter,"NewContainerMode",cNCMDatacenter);
2548                                if(cNCMDatacenter[0] && strcmp(cNCMDatacenter,"Active"))
2549                                {
2550                                        printf("Selected datacenter is full or not active. Select another.\n");
2551                                        continue;
2552                                }
2553
2554                                char cNCMNode[256]={""};
2555                                GetNodeProp(uNode,"NewContainerMode",cNCMNode);
2556                                if(cNCMNode[0] && strcmp(cNCMNode,"Active"))
2557                                {
2558                                        printf("Selected node is not configured for active containers."
2559                                                        "Select another.\n");
2560                                        continue;
2561                                }
2562
2563                                unsigned uLabelLen=0;
2564                                if((uLabelLen=strlen(cLabel))<2)
2565                                {
2566                                        printf("cLabel is too short\n");
2567                                        continue;
2568                                }
2569                                if(strchr(cLabel,'.'))
2570                                {
2571                                        printf("cLabel has at least one '.'\n");
2572                                        continue;
2573                                }
2574                                if(strstr(cLabel,"-clone"))
2575                                {
2576                                        printf("cLabel can't have '-clone'\n");
2577                                        continue;
2578                                }
2579                                unsigned uCreateAppliance=0;
2580                                char gcIPv4[32]={""};
2581                                if(uCreateAppliance)
2582                                {
2583                                        if(!strstr(cLabel+(uLabelLen-strlen("-app")-1),"-app"))
2584                                        {
2585                                                printf("Appliance cLabel must end with '-app'.\n");
2586                                                continue;
2587                                        }
2588                                        if(strlen(gcIPv4)<7 || strlen(gcIPv4)>15)
2589                                        {
2590                                                printf("Appliance requires valid gcIPv4.\n");
2591                                                continue;
2592                                        }
2593
2594                                        unsigned a=0,b=0,c=0,d=0;
2595                                        sscanf(gcIPv4,"%u.%u.%u.%u",&a,&b,&c,&d);
2596                                        if(a==0 || d==0)
2597                                        {
2598                                                printf("Appliance requires valid gcIPv4.\n");
2599                                                continue;
2600                                        }
2601                                }
2602                                else
2603                                {
2604                                        if(strstr(cLabel,"-app"))
2605                                        {
2606                                                printf("Normal container cLabel can't have '-app'\n");
2607                                                continue;
2608                                        }
2609                                }
2610
2611                                unsigned uHostnameLen=0;
2612                                if((uHostnameLen=strlen(cHostname))<5)
2613                                {
2614                                        printf("cHostname is too short\n");
2615                                        continue;
2616                                }
2617                                if(cHostname[uHostnameLen-1]=='.')
2618                                {
2619                                        printf("cHostname can't end with a '.'\n");
2620                                        continue;
2621                                }
2622                                if(strstr(cHostname+(uHostnameLen-strlen(".cloneNN")-1),".clone"))
2623                                {
2624                                        printf("cHostname can't end with '.cloneN'\n");
2625                                        continue;
2626                                }
2627                                //New rule: cLabel must be first part (first stop) of cHostname.
2628                                if(strncmp(cLabel,cHostname,uLabelLen))
2629                                {
2630                                        printf("cLabel must be first part of cHostname.\n");
2631                                        continue;
2632                                }
2633                                if(uIPv4==0)
2634                                {
2635                                        printf("You must select a uIPv4\n");
2636                                        continue;
2637                                }
2638
2639                                //Let's not allow same cLabel containers in our system for now.
2640                                sprintf(gcQuery,"SELECT uContainer FROM tContainer WHERE cLabel='%s'",cLabel);
2641                                mysql_query(&gMysql,gcQuery);
2642                                if(mysql_errno(&gMysql))
2643                                                htmlPlainTextError(mysql_error(&gMysql));
2644                                res=mysql_store_result(&gMysql);
2645                                if(mysql_num_rows(res)>0)
2646                                {
2647                                        mysql_free_result(res);
2648                                        printf("cLabel already in use\n");
2649                                        continue;
2650                                }
2651                                mysql_free_result(res);
2652
2653                                char cNCCloneRange[256]={""};
2654                                GetDatacenterProp(uDatacenter,"NewContainerCloneRange",cNCCloneRange);
2655                                if(cNCCloneRange[0] && uIpv4InCIDR4(ForeignKey("tIP","cLabel",uIPv4),cNCCloneRange))
2656                                {
2657                                        printf("uIPv4 must not be in datacenter clone IP range\n");
2658                                        continue;
2659                                }
2660
2661                                if(uOSLoopTemplate==0)
2662                                {
2663                                        printf("You must select a uOSTemplate\n");
2664                                        continue;
2665                                }
2666                                if(uConfig==0)
2667                                {
2668                                        printf("You must select a uConfig\n");
2669                                        continue;
2670                                }
2671                                if(uNameserver==0)
2672                                {
2673                                        printf("You must select a uNameserver\n");
2674                                        continue;
2675                                }
2676                                if(uSearchdomain==0)
2677                                {
2678                                        printf("You must select a uSearchdomain\n");
2679                                        continue;
2680                                }
2681
2682                                if(uGroup==0)
2683                                {
2684                                        printf("Group is now required\n");
2685                                        continue;
2686                                }
2687
2688                                //DNS sanity check
2689                                if(uDNSJob)
2690                                {
2691                                        char cunxsBindARecordJobZone[256]={""};
2692                                        GetConfiguration("cunxsBindARecordJobZone",cunxsBindARecordJobZone,uDatacenter,0,0,0);
2693                                        if(!cunxsBindARecordJobZone[0])
2694                                        {
2695                                                printf("Create job for unxsBind,"
2696                                                                " but no cunxsBindARecordJobZone\n");
2697                                                continue;
2698                                        }
2699                                       
2700                                        if(!strstr(cHostname+(uHostnameLen-strlen(cunxsBindARecordJobZone)-1),cunxsBindARecordJobZone))
2701                                        {
2702                                                printf("cHostname must end with cunxsBindARecordJobZone\n");
2703                                                continue;
2704                                        }
2705                                }
2706                                       
2707                                if(cPasswd[0] && strlen(cPasswd)<6)
2708                                {
2709                                        printf("Optional password must be at least 6 chars\n");
2710                                        continue;
2711                                }
2712                                //Direct datacenter checks
2713                                unsigned uIPv4Datacenter=0;
2714                                sscanf(ForeignKey("tIP","uDatacenter",uIPv4),"%u",&uIPv4Datacenter);
2715                                if(uDatacenter!=uIPv4Datacenter)
2716                                {
2717                                        printf("The specified uIPv4 does not "
2718                                                        "belong to the specified uDatacenter.\n");
2719                                        continue;
2720                                }
2721                                unsigned uNodeDatacenter=0;
2722                                sscanf(ForeignKey("tNode","uDatacenter",uNode),"%u",&uNodeDatacenter);
2723                                if(uDatacenter!=uNodeDatacenter)
2724                                {
2725                                        printf("The specified uNode does not "
2726                                                        "belong to the specified uDatacenter.\n");
2727                                        continue;
2728                                }
2729
2730                                //If auto clone setup check required values
2731                                char cAutoCloneNode[256]={""};
2732                                GetConfiguration("cAutoCloneNode",cAutoCloneNode,uDatacenter,0,0,0);
2733                                if(cAutoCloneNode[0])
2734                                {
2735                                        if(uCloneTargetNode==0)
2736                                        {
2737                                                printf("Please select a valid target node"
2738                                                                " for the clone\n");
2739                                                continue;
2740                                        }
2741                                        if(uCloneTargetNode==uNode)
2742                                        {
2743                                                printf("Can't clone to same node\n");
2744                                                continue;
2745                                        }
2746
2747                                        GetNodeProp(uCloneTargetNode,"NewContainerMode",cNCMNode);
2748                                        if(cNCMNode[0] && strcmp(cNCMNode,"Clone"))
2749                                        {
2750                                                printf("Selected clone target node is not configured for clone containers."
2751                                                        "Select another.\n");
2752                                                continue;
2753                                        }
2754
2755                                        sscanf(ForeignKey("tNode","uDatacenter",uCloneTargetNode),"%u",&uNodeDatacenter);
2756                                        if(uDatacenter!=uNodeDatacenter)
2757                                        {
2758                                                printf("The specified clone uNode does not "
2759                                                        "belong to the specified uDatacenter.\n");
2760                                                continue;
2761                                        }
2762
2763                                        char cTargetNodeIPv4[256]={""};
2764                                        GetNodeProp(uCloneTargetNode,"cIPv4",cTargetNodeIPv4);
2765                                        if(!cTargetNodeIPv4[0])
2766                                        {
2767                                                printf("Your target node is"
2768                                                        " missing it's cIPv4 property\n");
2769                                                continue;
2770                                        }
2771                                        if(!uCloneIPv4)
2772                                        {
2773                                                printf("You must select an IP for the clone\n");
2774                                                continue;
2775                                        }
2776                                        if(uCloneIPv4==uIPv4)
2777                                        {
2778                                                printf("You must select a different IP for the"
2779                                                                                " clone\n");
2780                                                continue;
2781                                        }
2782                                        sscanf(ForeignKey("tIP","uDatacenter",uCloneIPv4),"%u",&uIPv4Datacenter);
2783                                        if(uDatacenter!=uIPv4Datacenter)
2784                                        {
2785                                                printf("The specified uIPv4 does not "
2786                                                        "belong to the specified uDatacenter.\n");
2787                                                continue;
2788                                        }
2789                                        if(cNCCloneRange[0] && !uIpv4InCIDR4(ForeignKey("tIP","cLabel",uCloneIPv4),cNCCloneRange))
2790                                        {
2791                                                printf("Clone start uIPv4 must be in datacenter clone IP range\n");
2792                                                continue;
2793                                        }
2794                                        if(uSyncPeriod>86400*30 || (uSyncPeriod && uSyncPeriod<300))
2795                                        {
2796                                                printf("Clone uSyncPeriod out of range:"
2797                                                                " Max 30 days, min 5 minutes or 0 off.\n");
2798                                                continue;
2799                                        }
2800                                }//if(cAutoCloneNode[0])
2801
2802                                //TODO review this policy.
2803                                //No same names or hostnames for same datacenter allowed.
2804                                //TODO periods "." should be expanded to "[.]"
2805                                //for correct cHostname REGEXP.
2806                                sprintf(gcQuery,"SELECT uContainer FROM tContainer WHERE ("
2807                                                        " cHostname REGEXP '^%s[0-9]+%s$'"
2808                                                        " OR cLabel REGEXP '%s[0-9]+$'"
2809                                                        " ) AND uDatacenter=%u LIMIT 1",
2810                                                                cLabel,cHostname,cLabel,uDatacenter);
2811                                mysql_query(&gMysql,gcQuery);
2812                                if(mysql_errno(&gMysql))
2813                                                htmlPlainTextError(mysql_error(&gMysql));
2814                                res=mysql_store_result(&gMysql);
2815                                if(mysql_num_rows(res)>0)
2816                                {
2817                                        mysql_free_result(res);
2818                                        printf("Similar cHostname cLabel pattern already used at this datacenter!\n");
2819                                        continue;
2820                                }
2821                                mysql_free_result(res);
2822
2823                                //
2824                                //Everything is ready and checked so we start modifying things
2825                                //
2826                                unsigned uContainer=0;
2827                                sprintf(gcQuery,"INSERT INTO tContainer SET cLabel='%s',cHostname='%s',"
2828                                                        "uIPv4=%u,"
2829                                                        "uDatacenter=%u,"
2830                                                        "uNode=%u,"
2831                                                        "uOSTemplate=%u,"
2832                                                        "uConfig=%u,"
2833                                                        "uNameserver=%u,"
2834                                                        "uSearchdomain=%u,"
2835                                                        "uStatus=%u,"
2836                                                        "uOwner=%u,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
2837                                                                cLabel,cHostname,
2838                                                                uIPv4,
2839                                                                uDatacenter,
2840                                                                uNode,
2841                                                                uOSLoopTemplate,
2842                                                                uConfig,
2843                                                                uNameserver,
2844                                                                uSearchdomain,
2845                                                                uINITSETUP,
2846                                                                uOwner);
2847                                mysql_query(&gMysql,gcQuery);
2848                                if(mysql_errno(&gMysql))
2849                                                htmlPlainTextError(mysql_error(&gMysql));
2850                                uContainer=mysql_insert_id(&gMysql);
2851                                if(!uContainer)
2852                                {
2853                                        printf("uContainer not determined!!");
2854                                        continue;
2855                                }
2856
2857                                //Add to group
2858                                if(uGroup)
2859                                        ChangeGroup(uContainer,uGroup);
2860
2861                                //tIP
2862                                sprintf(gcQuery,"UPDATE tIP SET uAvailable=0"
2863                                                " WHERE uIP=%u AND uAvailable=1 AND uDatacenter=%u",
2864                                                                        uIPv4,uDatacenter);
2865                                mysql_query(&gMysql,gcQuery);
2866                                if(mysql_errno(&gMysql))
2867                                        htmlPlainTextError(mysql_error(&gMysql));
2868                                if(mysql_affected_rows(&gMysql)!=1)
2869                                {
2870                                        sprintf(gcQuery,"DELETE FROM tContainer WHERE uContainer=%u",
2871                                                uContainer);
2872                                        mysql_query(&gMysql,gcQuery);
2873                                        if(mysql_errno(&gMysql))
2874                                                htmlPlainTextError(mysql_error(&gMysql));
2875                                        printf("Someone grabbed your IP container creation aborted!");
2876                                        continue;
2877                                }
2878                               
2879                                //Add properties
2880                                //Name property
2881                                sprintf(gcQuery,"INSERT INTO tProperty SET uKey=%u,uType=3"
2882                                        ",uOwner=%u,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())"
2883                                        ",cName='Name',cValue='%s'",
2884                                                uContainer,uOwner,cLabel);
2885                                mysql_query(&gMysql,gcQuery);
2886                                if(mysql_errno(&gMysql))
2887                                        htmlPlainTextError(mysql_error(&gMysql));
2888                                //cPasswd property
2889                                sprintf(gcQuery,"INSERT INTO tProperty SET uKey=%u,uType=3"
2890                                        ",uOwner=%u,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())"
2891                                        ",cName='cPasswd',cValue='%s'",
2892                                                uContainer,uOwner,cPasswd);
2893                                mysql_query(&gMysql,gcQuery);
2894                                if(mysql_errno(&gMysql))
2895                                        htmlPlainTextError(mysql_error(&gMysql));
2896                                //Optional timezone note the --- not selected value.
2897                                if(cTimeZone[0])
2898                                {
2899                                        sprintf(gcQuery,"INSERT INTO tProperty SET cName='cOrg_TimeZone',cValue='%s',uType=3,uKey=%u"
2900                                                ",uOwner=%u,uCreatedBy=1,uCreatedDate=UNIX_TIMESTAMP(NOW())",
2901                                                        cTimeZone,uContainer,uOwner);
2902                                        mysql_query(&gMysql,gcQuery);
2903                                        if(mysql_errno(&gMysql))
2904                                                htmlPlainTextError(mysql_error(&gMysql));
2905                                }
2906
2907                                if(cAutoCloneNode[0])
2908                                {
2909                                        unsigned uNewVeid=0;
2910                                        unsigned uStatus=uINITSETUP;
2911
2912                                        uNewVeid=CommonCloneContainer(  uContainer,
2913                                                                        uOSLoopTemplate,
2914                                                                        uConfig,
2915                                                                        uNameserver,
2916                                                                        uSearchdomain,
2917                                                                        uDatacenter,
2918                                                                        uDatacenter,
2919                                                                        uOwner,
2920                                                                        cLabel,
2921                                                                        uNode,
2922                                                                        uStatus,
2923                                                                        cHostname,
2924                                                                        cIPv4CloneClassC,
2925                                                                        uCloneIPv4,
2926                                                                        cCloneLabel,
2927                                                                        cCloneHostname,
2928                                                                        uCloneTargetNode,
2929                                                                        uSyncPeriod,
2930                                                                        1,
2931                                                                        uCloneStopped,7);
2932                                        if(!uNewVeid)
2933                                        {
2934                                                printf("Clone container %s creation failed!",cCloneHostname);
2935                                        }
2936                                        else
2937                                        {
2938                                                SetContainerStatus(uContainer,uINITSETUP);//See CommonCloneContainer()
2939                                                if(uGroup)
2940                                                        ChangeGroup(uNewVeid,uGroup);
2941                                        }
2942                                }//cAutoCloneNode
2943
2944                                if(uDNSJob)
2945                                        CreateDNSJob(uIPv4,uOwner,NULL,cHostname,uDatacenter,1);
2946
2947                        }//valid hostname and label
2948                }
2949        }
2950
2951
2952        fclose(fp);
2953
2954        printf("\nMassCreateContainers(): End\n");
2955
2956}//void MassCreateContainers(char *cConfigfileName)
Note: See TracBrowser for help on using the browser.