#include "reboot_temperature.h" int get_temperature(char *path) { char buffer[SIZE]; FILE *fp; if ((fp = fopen(path, "r")) < 0) { return 1; /* 文件不存在,则退出. */ } while (fgets(buffer, SIZE, fp) != NULL) { ; } fclose(fp); return atoi(buffer) / 1000; } int log(int l_t, int c_t, char *log_file) { time_t tmpcal_ptr; struct tm *tmp_ptr = NULL; time(&tmpcal_ptr); tmp_ptr = localtime(&tmpcal_ptr); FILE *fd = fopen(log_file, "a+"); if (fd == NULL) { return 0; } fprintf(fd, "%d.%d.%d %d:%d:%d %s %d %s %d\n", (1900 + tmp_ptr->tm_year), (1 + tmp_ptr->tm_mon), tmp_ptr->tm_mday, tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec, "树莓CPU温度", l_t, "达到可重启温度", c_t); fclose(fd); char temperature[270]; sprintf(temperature, "%d.%d.%d %d:%d:%d %s %d %s %d\n", (1900 + tmp_ptr->tm_year), (1 + tmp_ptr->tm_mon), tmp_ptr->tm_mday, tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec, "树莓CPU温度", l_t, "达到可重启温度", c_t); // 发送告警邮件 //char *argv[]={"/root/qqMail/qqMail", "-l", "smtp.qq.com", "-p", "25", "-f", "1605227279", "-e", "dqqpbbbxoazibafd", "-q", "NIUYULING", "-r", "1605227279@QQ.COM", "-n", "NIUYULING", "-s", "Raspberrypi Temperature", "-t", temperature, (char*)0}; //execv("/root/qqMail/qqMail", argv); char buffer[2700]; sprintf(buffer, "/root/qqMail/qqMail -l smtp.qq.com -p 25 -f 1605227279 -e dqqpbbbxoazibafd -q NIUYULING -r 1605227279@QQ.COM -n NIUYULING -s \"Raspberrypi Temperature\" -t \"%s\"", temperature); //printf("%s\n", buffer); FILE *fp; fp = popen(buffer, "r"); pclose(fp); return 0; } int get_executable_path(char *processdir, char *processname, int len) { char *filename; if (readlink("/proc/self/exe", processdir, len) <= 0) { return -1; } filename = strrchr(processdir, '/'); if (filename == NULL) return -1; ++filename; strcpy(processname, filename); *filename = '\0'; return (int)(filename - processdir); } int main(int argc, char *argv[]) { char buffer[SIZE]; char log_file[SIZE]; memset(buffer, 0, SIZE); memset(log_file, 0, SIZE); char *inifile = "conf/config.ini"; char path[SIZE] = { 0 }; char executable_filename[SIZE] = { 0 }; (void)get_executable_path(path, executable_filename, sizeof(path)); inifile=strcat(path, inifile); if (daemon(1, 1) == -1) { perror("daemon"); exit(1); } while (1) { getinikeystring("server", "thermal_zone", inifile, buffer); // 获取thermal_zone路径 getinikeystring("server", "log_file", inifile, log_file); // 获取日志文件名 if (get_temperature(buffer) >= getinikeyint("server", "temperature", inifile)) { sync(); if (getinikeyint("server", "off_power", inifile) == 1) { log(get_temperature(buffer), getinikeyint("server", "temperature", inifile), log_file); return reboot(RB_POWER_OFF); // 关机 } else { log(get_temperature(buffer), getinikeyint("server", "temperature", inifile), log_file); return reboot(RB_AUTOBOOT); // 重启 } } sleep(getinikeyint("server", "second", inifile)); } return 1; }