mirror of https://github.com/GOSTSec/sgminer
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
5.4 KiB
270 lines
5.4 KiB
/* |
|
* Copyright 2013-2014 sgminer developers (see AUTHORS.md) |
|
* Copyright 2011-2013 Con Kolivas |
|
* Copyright 2011-2012 Luke Dashjr |
|
* Copyright 2010 Jeff Garzik |
|
* |
|
* This program is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License as published by the Free |
|
* Software Foundation; either version 3 of the License, or (at your option) |
|
* any later version. See COPYING for more details. |
|
*/ |
|
|
|
#include "config.h" |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <stdbool.h> |
|
#include <stdint.h> |
|
#include <unistd.h> |
|
#include <sys/time.h> |
|
#include <time.h> |
|
#include <math.h> |
|
#include <stdarg.h> |
|
#include <assert.h> |
|
#include <signal.h> |
|
#include <limits.h> |
|
|
|
#include <sys/stat.h> |
|
#include <sys/types.h> |
|
|
|
#include "compat.h" |
|
#include "miner.h" |
|
#include "events.h" |
|
#include "config_parser.h" |
|
|
|
// global event list |
|
event_t *events = NULL, *last_event = NULL; |
|
|
|
/*************************************************** |
|
* Helper functions |
|
**************************************************/ |
|
static void *cmd_thread(void *cmdp) |
|
{ |
|
const char *cmd = (const char*)cmdp; |
|
|
|
applog(LOG_DEBUG, "Executing command: %s", cmd); |
|
system(cmd); |
|
|
|
return NULL; |
|
} |
|
|
|
static void runcmd(const char *cmd) |
|
{ |
|
if (empty_string(cmd)) |
|
return; |
|
|
|
pthread_t pth; |
|
pthread_create(&pth, NULL, cmd_thread, (void*)cmd); |
|
} |
|
|
|
/**************************************************** |
|
* Event list functions |
|
****************************************************/ |
|
//find an event by event_type |
|
static event_t *get_event(const char *event_type) |
|
{ |
|
event_t *p = events; |
|
|
|
while (p != NULL) |
|
{ |
|
if(!strcasecmp(p->event_type, event_type)) |
|
return p; |
|
|
|
p = p->next; |
|
} |
|
|
|
return NULL; |
|
} |
|
|
|
// add event to the list |
|
static event_t *add_event(unsigned int id) |
|
{ |
|
event_t *event; |
|
|
|
// allocate memory |
|
if (!(event = (event_t *)malloc(sizeof(event_t)))) |
|
quit(1, "malloc() failed in add_event()"); |
|
|
|
// set defaults |
|
event->id = id; |
|
event->event_type = ""; |
|
event->runcmd = ""; |
|
event->reboot = false; |
|
event->reboot_delay = 0; |
|
event->quit = false; |
|
event->quit_msg = ""; |
|
event->prev = event->next = NULL; |
|
|
|
// first event? |
|
if(events == NULL) |
|
{ |
|
events = event; |
|
last_event = event; |
|
} |
|
// no, append to the list |
|
else |
|
{ |
|
last_event->next = event; |
|
event->prev = last_event; |
|
last_event = event; |
|
} |
|
|
|
return event; |
|
} |
|
|
|
// remove event from the list |
|
static void remove_event(event_t *event) |
|
{ |
|
// only event? |
|
if(event == events && event == last_event) |
|
events = last_event = NULL; |
|
// first event? |
|
else if(event == events) |
|
{ |
|
event->next->prev = NULL; |
|
events = event->next; |
|
} |
|
// last event? |
|
else if(event == last_event) |
|
{ |
|
event->prev->next = NULL; |
|
last_event = event->prev; |
|
} |
|
// in the middle |
|
else |
|
{ |
|
event->prev->next = event->next; |
|
event->next->prev = event->prev; |
|
} |
|
|
|
// free memory |
|
free(event); |
|
} |
|
|
|
#ifndef EVENT_ADD_CHECK |
|
#define EVENT_ADD_CHECK if (!last_event || (last_event->id != json_array_index)) add_event(json_array_index); |
|
#endif |
|
|
|
/******************************************** |
|
* Config functions |
|
*********************************************/ |
|
char *set_event_type(const char *event_type) |
|
{ |
|
event_t *event; |
|
|
|
// make sure event type doesn't already exist |
|
if ((event = get_event(event_type)) != NULL) |
|
return NULL; |
|
|
|
EVENT_ADD_CHECK; |
|
|
|
last_event->event_type = event_type; |
|
|
|
return NULL; |
|
} |
|
|
|
char *set_event_runcmd(const char *cmd) |
|
{ |
|
EVENT_ADD_CHECK; |
|
|
|
last_event->runcmd = cmd; |
|
|
|
return NULL; |
|
} |
|
|
|
char *set_event_reboot(const char *arg) |
|
{ |
|
EVENT_ADD_CHECK; |
|
|
|
if (empty_string(arg)) |
|
return NULL; |
|
|
|
last_event->reboot = strtobool(arg); |
|
|
|
applog(LOG_NOTICE, "Event %s reboot = %s", last_event->event_type, ((last_event->reboot)?"true":"false")); |
|
|
|
return NULL; |
|
} |
|
|
|
char *set_event_reboot_delay(const char *delay) |
|
{ |
|
EVENT_ADD_CHECK; |
|
|
|
last_event->reboot_delay = atoi(delay); |
|
|
|
// if the reboot delay is greater than 0 seconds, automatically turn on reboot |
|
if (last_event->reboot_delay > 0) |
|
last_event->reboot = true; |
|
|
|
return NULL; |
|
} |
|
|
|
char *set_event_quit(const char *arg) |
|
{ |
|
EVENT_ADD_CHECK; |
|
|
|
if (empty_string(arg)) |
|
return NULL; |
|
|
|
last_event->quit = strtobool(arg); |
|
|
|
applog(LOG_DEBUG, "Event %s quit = %s", last_event->event_type, ((last_event->quit)?"true":"false")); |
|
|
|
return NULL; |
|
} |
|
|
|
char *set_event_quit_message(const char *msg) |
|
{ |
|
EVENT_ADD_CHECK; |
|
|
|
last_event->quit_msg = msg; |
|
|
|
// if the quit message is set, automatically turn on quit |
|
if (!empty_string(last_event->quit_msg)) |
|
last_event->quit = true; |
|
|
|
return NULL; |
|
} |
|
|
|
/****************************************** |
|
* Event functions |
|
*******************************************/ |
|
void event_notify(const char *event_type) |
|
{ |
|
event_t *event; |
|
|
|
// find an event of the specified type |
|
if ((event = get_event(event_type)) == NULL) |
|
return; |
|
|
|
applog(LOG_DEBUG, "Executing event %s", event_type); |
|
|
|
// run command if defined |
|
if (!empty_string(event->runcmd)) |
|
runcmd(event->runcmd); |
|
|
|
// reboot if set |
|
if (event->reboot == true) |
|
{ |
|
//wait specified amount of time |
|
if (event->reboot_delay > 0) |
|
{ |
|
applog(LOG_NOTICE, "waiting %d to reboot", event->reboot_delay); |
|
sleep(event->reboot_delay); |
|
} |
|
|
|
#ifdef WIN32 |
|
runcmd("shutdown /r /t 0"); |
|
#else |
|
applog(LOG_NOTICE, "running shutdown -r now"); |
|
runcmd("/sbin/shutdown -r now"); |
|
#endif |
|
} |
|
|
|
// quit sgminer if set |
|
if (event->quit == true) |
|
quit(0, ((empty_string(event->quit_msg))?event_type:event->quit_msg)); |
|
|
|
} |