main.c deleted because it was not written in the same spirit
This commit is contained in:
		
							parent
							
								
									f6254d0cf9
								
							
						
					
					
						commit
						2fe12ac7dc
					
				
					 1 changed files with 0 additions and 312 deletions
				
			
		
							
								
								
									
										312
									
								
								main.c
									
										
									
									
									
								
							
							
						
						
									
										312
									
								
								main.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,312 +0,0 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <mysql/mysql.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#define HOST "10.8.0.10"
 | 
			
		||||
#define USER "vpsm"
 | 
			
		||||
#define PASS "bla"
 | 
			
		||||
#define BASE "vpsm"
 | 
			
		||||
 | 
			
		||||
int my_atoi (char * str )
 | 
			
		||||
{
 | 
			
		||||
	int res=atoi(str);
 | 
			
		||||
	free(str);
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char   **my_explode(char *str, char separator)
 | 
			
		||||
{
 | 
			
		||||
	char **res = NULL;
 | 
			
		||||
	int  nbstr = 1;
 | 
			
		||||
	int  len;
 | 
			
		||||
	int  from = 0;
 | 
			
		||||
	int  i;
 | 
			
		||||
	int  j;
 | 
			
		||||
 | 
			
		||||
	res = (char **) malloc(sizeof (char *));
 | 
			
		||||
	len = strlen(str);
 | 
			
		||||
	for (i = 0; i <= len; ++i)
 | 
			
		||||
	{
 | 
			
		||||
		if ((i == len) || (str[i] == separator))
 | 
			
		||||
		{
 | 
			
		||||
			res = (char **) realloc(res, ++nbstr * sizeof (char *));
 | 
			
		||||
			res[nbstr - 2] = (char *) malloc((i - from + 1) * sizeof (char));
 | 
			
		||||
			for (j = 0; j < (i - from); ++j)
 | 
			
		||||
				res[nbstr - 2][j] = str[j + from];
 | 
			
		||||
			res[nbstr - 2][i - from] = '\0';
 | 
			
		||||
			from = i + 1;
 | 
			
		||||
			++i;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	res[nbstr - 1] =  NULL;
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * The va_list method for str() above
 | 
			
		||||
 **/
 | 
			
		||||
 | 
			
		||||
char *vstr(char *format, va_list args)
 | 
			
		||||
{
 | 
			
		||||
  char *buffer = NULL;
 | 
			
		||||
  int va_size = 256;
 | 
			
		||||
  /* Parse the format and generate a proper string output */
 | 
			
		||||
  do
 | 
			
		||||
  {
 | 
			
		||||
    va_size *= 2;
 | 
			
		||||
    buffer = (char*)realloc(buffer, va_size);
 | 
			
		||||
    memset(buffer, 0, va_size);
 | 
			
		||||
  } while (vsnprintf(buffer, va_size, format, args) < 0);
 | 
			
		||||
 | 
			
		||||
  /* Trim any white space at the end */
 | 
			
		||||
  char *output = (char*)malloc(strlen(buffer) + 1);
 | 
			
		||||
  strcpy(output, buffer);
 | 
			
		||||
  free(buffer);
 | 
			
		||||
  return output;
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
 * Method to produce a malloc()'d char*, similar to printf()
 | 
			
		||||
 **/
 | 
			
		||||
char *str(char *format, ...)
 | 
			
		||||
{
 | 
			
		||||
  va_list args;
 | 
			
		||||
  va_start(args,format);
 | 
			
		||||
  char *ret = vstr(format, args);
 | 
			
		||||
  va_end(args);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
// Fonction pour logger un message dans le fichier de logs
 | 
			
		||||
void log_message(char * message)
 | 
			
		||||
{
 | 
			
		||||
    FILE *file;
 | 
			
		||||
    char infotime[80];
 | 
			
		||||
    time_t rawtime;
 | 
			
		||||
    struct tm * timeinfo;
 | 
			
		||||
    time ( &rawtime );
 | 
			
		||||
    timeinfo = localtime ( &rawtime );
 | 
			
		||||
    strftime (infotime,80,"[%d/%m/%y - %X] ",timeinfo);
 | 
			
		||||
	if((file = fopen("log.txt","a"))) // Ouverture du fichier en append
 | 
			
		||||
	{
 | 
			
		||||
	    message=str("%s%s\n",infotime,message);
 | 
			
		||||
	    fwrite(message,sizeof(char),strlen(message),file);
 | 
			
		||||
	}
 | 
			
		||||
	free(message);
 | 
			
		||||
	fclose(file);
 | 
			
		||||
}
 | 
			
		||||
int do_query(char * query)
 | 
			
		||||
{
 | 
			
		||||
	int res=-1;
 | 
			
		||||
	MYSQL mysql;
 | 
			
		||||
	mysql_init(&mysql);
 | 
			
		||||
	mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");
 | 
			
		||||
  	if(mysql_real_connect(&mysql,HOST,USER,PASS,BASE,0,NULL,0))
 | 
			
		||||
  	{
 | 
			
		||||
  	    if(mysql_query(&mysql,query))
 | 
			
		||||
  	    {
 | 
			
		||||
  	        res=1;
 | 
			
		||||
  	    }
 | 
			
		||||
  	}
 | 
			
		||||
    	mysql_close(&mysql);
 | 
			
		||||
    	free(query);
 | 
			
		||||
  	return res;
 | 
			
		||||
}
 | 
			
		||||
void update_status()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
        int vmid=0;
 | 
			
		||||
        int status=0;
 | 
			
		||||
	FILE *process;
 | 
			
		||||
	process = popen("{ vzlist && qm list; } | grep -vi 'status' | tr -s ' ' | cut -d ' ' -f 2,4 | sort -gk1 | sed 's/running/1/' | sed 's/stopped/2/'","r");
 | 
			
		||||
	char data[50];
 | 
			
		||||
	char **line;
 | 
			
		||||
	int vmids[30];
 | 
			
		||||
        int vmstatus[30];
 | 
			
		||||
        int i=0;
 | 
			
		||||
        char* tstatus[3];
 | 
			
		||||
        tstatus[0]="";
 | 
			
		||||
        tstatus[1]="Actif";
 | 
			
		||||
        tstatus[2]="Éteind";
 | 
			
		||||
	while(fgets(data,50,process))
 | 
			
		||||
	{
 | 
			
		||||
		line=my_explode(data,' ');
 | 
			
		||||
		vmid=atoi(line[0]);
 | 
			
		||||
		status=atoi(line[1]);
 | 
			
		||||
		vmids[i]=vmid;
 | 
			
		||||
		vmstatus[i]=status;
 | 
			
		||||
		//printf("%d is %d \n",vmid,status);
 | 
			
		||||
		i++;
 | 
			
		||||
		free(line[0]);
 | 
			
		||||
		free(line[1]);
 | 
			
		||||
		free(line);
 | 
			
		||||
	}
 | 
			
		||||
	fclose(process);
 | 
			
		||||
	int length=i;
 | 
			
		||||
	MYSQL mysql;
 | 
			
		||||
	mysql_init(&mysql);
 | 
			
		||||
	mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");
 | 
			
		||||
	mysql_real_connect(&mysql,HOST,USER,PASS,BASE,0,NULL,0);
 | 
			
		||||
        mysql_query(&mysql,"SELECT vmid,status FROM vps ORDER BY vmid");
 | 
			
		||||
        MYSQL_RES *result=NULL;
 | 
			
		||||
        MYSQL_ROW row;
 | 
			
		||||
        result=mysql_use_result(&mysql);
 | 
			
		||||
        i=0;
 | 
			
		||||
        //printf("test database : \n");
 | 
			
		||||
        while((i<length) && (row=mysql_fetch_row(result)))
 | 
			
		||||
        {
 | 
			
		||||
		unsigned long *lengths=mysql_fetch_lengths(result);
 | 
			
		||||
		vmid=my_atoi(str("%.*s", (int) lengths[0], row[0]));
 | 
			
		||||
		status=my_atoi(str("%.*s", (int) lengths[1], row[1]));
 | 
			
		||||
		//printf("i = %d, vmid=%d, status=%d, dvmid=%d, vstatus=%d\n",i,vmid,status,vmids[i],vmstatus[i]);
 | 
			
		||||
		while(i<length && vmids[i]<vmid)
 | 
			
		||||
		{
 | 
			
		||||
			//log_message(str("VPS %d non trouvé dans la base, passage au VPS %d",vmids[i],vmids[i+1]));
 | 
			
		||||
			i++;
 | 
			
		||||
		}
 | 
			
		||||
		if(vmids[i]==vmid)
 | 
			
		||||
		{
 | 
			
		||||
			if(vmstatus[i]!=status)
 | 
			
		||||
			{
 | 
			
		||||
				log_message(str("Changement d'état du VPS %d à %s",vmid,tstatus[vmstatus[i]]));
 | 
			
		||||
				do_query(str("UPDATE vps SET status=%d WHERE vmid=%d",vmstatus[i],vmid));
 | 
			
		||||
				//printf("%d status updated to %d",vmid,vmstatus[i]);
 | 
			
		||||
			}
 | 
			
		||||
			i++;
 | 
			
		||||
		}
 | 
			
		||||
		else if (status==1)
 | 
			
		||||
		{
 | 
			
		||||
			log_message(str("Statut du VPS %d non récupéré, passage a État %s",vmid,tstatus[2]));
 | 
			
		||||
			do_query(str("UPDATE vps SET status=2 WHERE vmid=%d",vmid));
 | 
			
		||||
			//printf("vps %d not found, setting to 2",vmid);
 | 
			
		||||
		}
 | 
			
		||||
			
 | 
			
		||||
        }
 | 
			
		||||
        mysql_free_result(result);
 | 
			
		||||
        mysql_close(&mysql);
 | 
			
		||||
}
 | 
			
		||||
int exec_process(char * command)
 | 
			
		||||
{
 | 
			
		||||
	FILE * process = popen(str("%s &>/dev/stdout",command),"r");
 | 
			
		||||
	char data[100];
 | 
			
		||||
	char **line;
 | 
			
		||||
	while(fgets(data,100,process))
 | 
			
		||||
	{
 | 
			
		||||
		line=my_explode(data,'\n');
 | 
			
		||||
		log_message(str("%s: %s",command, line[0]));
 | 
			
		||||
		free(line[0]);
 | 
			
		||||
		free(line);
 | 
			
		||||
	}
 | 
			
		||||
	int res=pclose(process);
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
void exec_task(char * command,int id)
 | 
			
		||||
{
 | 
			
		||||
	do_query(str("UPDATE tasks SET status=3 WHERE id=%d",id));
 | 
			
		||||
	log_message(str("[Tâche %d] Exécution de : %s",id,command));
 | 
			
		||||
	int res=exec_process(command);
 | 
			
		||||
	if(res) // Si commande échouée
 | 
			
		||||
	{
 | 
			
		||||
	    log_message(str("[Tâche %d] Une Erreur est survenue",id));
 | 
			
		||||
	    do_query(str("UPDATE tasks SET status=2 WHERE id=%d",id));
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
	    //exec_process("php update.php");
 | 
			
		||||
	    update_status();
 | 
			
		||||
	    log_message(str("[Tâche %d] Exécution Terminée",id));
 | 
			
		||||
	    do_query(str("UPDATE tasks SET status=1 WHERE id=%d",id));
 | 
			
		||||
	}
 | 
			
		||||
	free(command);
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int continuer=1;
 | 
			
		||||
 | 
			
		||||
void sighandler(int signum)
 | 
			
		||||
{
 | 
			
		||||
	continuer=0;
 | 
			
		||||
	log_message(str("Signal %d attrapé, Fermeture...",signum));
 | 
			
		||||
	exit(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	struct sigaction act;
 | 
			
		||||
 | 
			
		||||
	act.sa_handler = sighandler;
 | 
			
		||||
	sigfillset(&act.sa_mask);
 | 
			
		||||
	act.sa_flags = 0;
 | 
			
		||||
	sigaction(15, &act, NULL);
 | 
			
		||||
	sigaction(11, &act, NULL);
 | 
			
		||||
 | 
			
		||||
	char* vctype[3]; // Type du contrôlleur de VPS
 | 
			
		||||
	vctype[0]=""; // Rien
 | 
			
		||||
	vctype[1]="vzctl"; // OpenVZ
 | 
			
		||||
	vctype[2]="qm"; // KVM
 | 
			
		||||
	char* ttype[4]; // Type de la commande (tâche)
 | 
			
		||||
	ttype[0]=""; //Rien
 | 
			
		||||
	ttype[1]="start"; // Démarrage de la VM
 | 
			
		||||
	ttype[2]="stop"; // Éteindre la VM
 | 
			
		||||
	ttype[3]="shutdown"; // Éteindre la VM par ACPI
 | 
			
		||||
	MYSQL mysql;
 | 
			
		||||
	mysql_init(&mysql);
 | 
			
		||||
	mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");
 | 
			
		||||
        int id=0;
 | 
			
		||||
        int vid=0;
 | 
			
		||||
        int type=0;
 | 
			
		||||
        int status=0;
 | 
			
		||||
        int vtype=0;
 | 
			
		||||
        unsigned long *lengths;
 | 
			
		||||
  	if(mysql_real_connect(&mysql,HOST,USER,PASS,BASE,0,NULL,0))
 | 
			
		||||
  	{
 | 
			
		||||
  		log_message("Connexion réussie");
 | 
			
		||||
  		// Création du daemon
 | 
			
		||||
  		int p=fork();
 | 
			
		||||
  		if(p!=0) // Si c'est le parent
 | 
			
		||||
  		{
 | 
			
		||||
  		    // On détache...
 | 
			
		||||
  		    printf("VPSMd: Démarrage et détachement de la console...\n");
 | 
			
		||||
  		    exit(0);
 | 
			
		||||
  		}
 | 
			
		||||
  		else
 | 
			
		||||
  		{
 | 
			
		||||
  		    // On commence le daemon
 | 
			
		||||
  		    log_message("Daemon démarré");
 | 
			
		||||
  		    while(continuer)
 | 
			
		||||
  		    {
 | 
			
		||||
  		        // exec_process("php update.php");
 | 
			
		||||
  		        update_status();
 | 
			
		||||
		        // Rercherche des tâches à effectuer (status 0 : à traiter)
 | 
			
		||||
		        mysql_query(&mysql,"SELECT t.id,t.vid,t.type,t.status,v.type AS vtype FROM tasks t JOIN vps v ON t.vid=v.vmid WHERE t.status=0");
 | 
			
		||||
		        MYSQL_RES *result=NULL;
 | 
			
		||||
		        MYSQL_ROW row;
 | 
			
		||||
 | 
			
		||||
		        result=mysql_use_result(&mysql);
 | 
			
		||||
		        while((row=mysql_fetch_row(result)))
 | 
			
		||||
		        {
 | 
			
		||||
		           lengths=mysql_fetch_lengths(result);
 | 
			
		||||
		           id=my_atoi(str("%.*s", (int) lengths[0], row[0]));
 | 
			
		||||
		           vid=my_atoi(str("%.*s", (int) lengths[1], row[1]));
 | 
			
		||||
		           type=my_atoi(str("%.*s", (int) lengths[2], row[2]));
 | 
			
		||||
		           status=my_atoi(str("%.*s", (int) lengths[3], row[3]));
 | 
			
		||||
		           vtype=my_atoi(str("%.*s", (int) lengths[4], row[4]));
 | 
			
		||||
		           log_message(str("Tâche numéro %d pour le VPS numero %d, de type %d, statut %d",id,vid,type,status));
 | 
			
		||||
		           exec_task(str("%s %s %d",vctype[vtype],ttype[type],vid),id);
 | 
			
		||||
		        }
 | 
			
		||||
		        mysql_free_result(result);
 | 
			
		||||
		        sleep(3);
 | 
			
		||||
		    }
 | 
			
		||||
        }
 | 
			
		||||
        mysql_close(&mysql);
 | 
			
		||||
        log_message("Connexion fermée");
 | 
			
		||||
        log_message("Fermeture du daemon");
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		log_message("Erreur de connexion ! Fermeture du daemon");
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue