#include #include #include #include #include #include #include #include #include "../include/daemon.h" #include "../include/utils.h" #include "../include/stats.h" #include "../include/db-sqlite.h" /* -- create_daemon -- Desc : Function which create a daemon In-param : None Out-param : None Return value : -1 : Error fork 0 : Daemon branch 1 : Parent process branch */ int create_daemon(){ /* Variables */ pid_t pid; int fd; /* Fork a new process */ pid = (pid_t) fork(); if(pid < 0){ /* Error while forking */ /* todo : add log */ return -1; } if(pid > 0){ /* Parent process branch : quit function */ return 1; } /* Son process branch */ /* Set file permissions */ (void) umask(0); /* Change working directory to root directory */ (void) chdir("/"); /* Close all open file descriptors */ for(fd = (int) sysconf(_SC_OPEN_MAX); fd >= 0; fd--){ (void) close(fd); } return 0; } /* -- ping_request -- Desc : Ping the DNS (1.1.1.1) then write the ping in log file In-param : None Out-param : None Return value : None */ static void ping_request(){ /* Variables */ char* ping; static char command[128] = "ping -c 1 1.1.1.1 > /var/log/ping-report/last-ping.log"; /* ping command */ (void) system(command); /* Get ping value as a string */ ping = get_ping_from_temp_log(); if(ping != NULL) { /* Write ping in all-ping.log */ write_ping_log(ping); } } /* -- send_check -- Desc : Send if send_stats_ping is needed and if so, do it In-param : None Out-param : None Return value : None */ static void send_check(){ /* Variables */ time_t t; struct tm* utc_time; static int flag = 1; /* Get time */ t = time(NULL); utc_time = localtime(&t); /* Set flag to avoid sending multiple time the same data at HH:00 */ if((utc_time->tm_min != 0)&& (flag == 0)){ flag = 1; } /* if time == HH:00, insert stats in db */ if((utc_time->tm_min == 0) && (flag != 0)){ set_stats_ping(); remove_file("/var/log/ping-report/all-ping.log"); flag = 0; } } /* -- check_keep_working -- Desc : Check if ping-report need to be ended In-param : None Out-param : None Return value : keep_working : 1 continue, 0 end */ static int check_keep_working(){ /* Variables */ FILE* fd; char read_line[5]; fd = fopen(STATUS_LOG,"r"); if(fd == NULL){ // Error occured while reading status log file, stop ping-report printf("Err\n"); return 0; } /* Read file */ if(fread(read_line,sizeof(char),4,fd) != 0){ (void) fclose(fd); read_line[4] = '\0'; if(strcmp(read_line,"STOP") == 0){ // stop ping-report printf("Stop\n"); return 0; }else{ // continue ping-report printf("%s : Continue\n",read_line); return 1; } }else{ // Error occured while reading status log file, stop ping-report printf("Nothing to read\n"); (void) fclose(fd); return 1; } } /* -- daemon_work -- Desc : Function which contain main loop of the daemon In-param : None Out-param : None Return value : None */ void daemon_work(){ /* Variables */ int keep_working = 1; /* Write daemon pid in log file */ write_pid_file(); /* Connect db sqlite */ if(db_connect()){ return; } /* Main loop */ while(keep_working != 0){ /* Launch ping command */ ping_request(); /* Send stats if time is correct */ send_check(); /* Check end ping-report */ keep_working = check_keep_working(); /* ping_interval 100 ms */ usleep(100*1000); } /* Disconnect sqlite db */ db_disconnect(); }