#include "reboot_temperature.h" static float get_temperature(char *path) { char buffer[SIZE]; FILE *fp = NULL; if ((fp = fopen(path, "r")) < 0) return -1; /* 文件不存在, 则退出. */ while (fgets(buffer, SIZE, fp) != NULL) ; fclose(fp); return atof(buffer) / (float)1000; } static int error_log(float l_t, int c_t, char *log_file, char *recv_mail, int _is, int _alert) { time_t tmpcal_ptr = 0; struct tm *tmp_ptr = NULL; FILE *fp = NULL; FILE *fd = NULL; char buffer[SIZE]; char temperature[SIZE]; memset(buffer, 0, SIZE); memset(temperature, 0, SIZE); time(&tmpcal_ptr); tmp_ptr = localtime(&tmpcal_ptr); fd = fopen(log_file, "a+"); if (fd == NULL) return -1; // 写入日志文件FD fprintf(fd, "%d.%d.%d %d:%d:%d %s %.3f℃ %s %.3f℃\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, "Raspberry CPU temperature", l_t, "Restartable or shutdown temperature", (float)c_t); if (_is == 1) { if (_alert == 1) { // 关机活重启时 sprintf(temperature, "%d.%d.%d %d:%d:%d %s %.3f℃ %s %.3f℃\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, "Raspberry CPU temperature", l_t, "Restartable or shutdown temperature", (float)c_t); sprintf(buffer, "email -r %s -s \"Raspberrypi Temperature\" -t \"%s\"", recv_mail, temperature); fp = popen(buffer, "r"); pclose(fp); fp = NULL; } else { // 正常温度时 if (tmp_ptr->tm_min >= 10 && tmp_ptr->tm_min <= 12) { sprintf(temperature, "%d.%d.%d %d:%d:%d %s:%.3f℃\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, "Raspberry CPU temperature", l_t); sprintf(buffer, "email -r %s -s \"Raspberrypi Temperature\" -t \"%s\"", recv_mail, temperature); fp = popen(buffer, "r"); pclose(fp); fp = NULL; } } } fclose(fd); fd = NULL; return 0; } static 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 **env) { char buffer[SIZE]; char log_file[SIZE]; char *inifile = "conf/config.ini"; char path[SIZE] = { 0 }; char recv_mail[SIZE] = { 0 }; char executable_filename[SIZE] = { 0 }; (void)get_executable_path(path, executable_filename, sizeof(path)); inifile = strcat(path, inifile); memset(buffer, 0, SIZE); memset(log_file, 0, SIZE); memset(recv_mail, 0, SIZE); if (daemon(1, 1) == -1) { perror("daemon"); exit(1); } if (-1 == (nice(getinikeyint("global", "nice", inifile)))) // 进程优先级 perror("nice"); while (1) { getinikeystring("global", "thermal_zone", inifile, buffer); // 获取thermal_zone路径 getinikeystring("global", "log_file", inifile, log_file); // 获取日志文件名 getinikeystring("global", "recv_mail", inifile, recv_mail); // 获取接收者邮箱 if (get_temperature(buffer) >= getinikeyint("global", "temperature", inifile)) // 达到重启或者关机温度 { sync(); if (getinikeyint("global", "off_power", inifile) == 1) { error_log(get_temperature(buffer), getinikeyint("global", "temperature", inifile), log_file, recv_mail, getinikeyint("global", "is_alert", inifile), 1); return reboot(RB_POWER_OFF); // 关机 } else { error_log(get_temperature(buffer), getinikeyint("global", "temperature", inifile), log_file, recv_mail, getinikeyint("global", "is_alert", inifile), 1); return reboot(RB_AUTOBOOT); // 重启 } } else // 未达到重启或者关机温度 { error_log(get_temperature(buffer), getinikeyint("global", "temperature", inifile), log_file, recv_mail, getinikeyint("global", "is_alert", inifile), 0); } // 等待 sleep(getinikeyint("global", "second", inifile)); } return 0; }