commit 3235a97987ef36e5d663b9e1cd81d966aa1c2bff Author: aixiao Date: Wed May 19 09:43:30 2021 +0800 initial diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..fa607ae --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +CROSS_COMPILE ?= +CC := $(CROSS_COMPILE)gcc +CFLAGS += -g -Wall -L../libini -I../libini -fno-builtin +LIB += -lini -static -g +BIN = reboot_temperature + +all: reboot_temperature.o + $(CC) $(CFLAGS) $^ -o $(BIN) $(LIB) + +clean: + rm -rf *.o + rm $(BIN) diff --git a/conf/config.ini b/conf/config.ini new file mode 100644 index 0000000..5907076 --- /dev/null +++ b/conf/config.ini @@ -0,0 +1,7 @@ +[server] +thermal_zone = "/sys/class/thermal/thermal_zone0/temp"; +temperature = 80 +log_file = "reboot.log"; +second = 10 +off_power = 0 + diff --git a/reboot_temperature b/reboot_temperature new file mode 100644 index 0000000..6d63f9b Binary files /dev/null and b/reboot_temperature differ diff --git a/reboot_temperature.c b/reboot_temperature.c new file mode 100644 index 0000000..f9df0e2 --- /dev/null +++ b/reboot_temperature.c @@ -0,0 +1,110 @@ +#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; +} diff --git a/reboot_temperature.h b/reboot_temperature.h new file mode 100644 index 0000000..7c8f916 --- /dev/null +++ b/reboot_temperature.h @@ -0,0 +1,10 @@ +#include +#include +#include +#include +#include +#include +#include +#include "libini.h" + +#define SIZE 270 diff --git a/reboot_temperature.o b/reboot_temperature.o new file mode 100644 index 0000000..da0f0d4 Binary files /dev/null and b/reboot_temperature.o differ