adding stuff
git-svn-id: file:///raid/svn-personal/mokou/trunk@5 35d6bad2-6c5c-c749-ada2-a2c82cb3bd79
This commit is contained in:
parent
0fb0373460
commit
ed540f43b2
|
@ -5,7 +5,7 @@ include $(PWD)/Platform/$(PLATFORM).mk
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
.SUFFIXES: .c .o
|
.SUFFIXES: .c .o
|
||||||
|
|
||||||
OBJS = main.o log.o service.o util.o version.o
|
OBJS = main.o log.o service.o util.o version.o server.o
|
||||||
|
|
||||||
all: mokou$(EXEC)
|
all: mokou$(EXEC)
|
||||||
|
|
||||||
|
|
|
@ -33,4 +33,6 @@ int main(int argc, char** argv){
|
||||||
mk_log(log);
|
mk_log(log);
|
||||||
free(log);
|
free(log);
|
||||||
mk_service_scan();
|
mk_service_scan();
|
||||||
|
mk_start_services();
|
||||||
|
mk_log("Mokou is up, creating the server socket");
|
||||||
}
|
}
|
||||||
|
|
7
Mokou/mk_server.h
Normal file
7
Mokou/mk_server.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#ifndef __MK_SERVER_H__
|
||||||
|
#define __MK_SERVER_H__
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -3,12 +3,20 @@
|
||||||
#ifndef __MK_SERVICE_H__
|
#ifndef __MK_SERVICE_H__
|
||||||
#define __MK_SERVICE_H__
|
#define __MK_SERVICE_H__
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
struct mk_service {
|
struct mk_service {
|
||||||
|
char* name;
|
||||||
char* description;
|
char* description;
|
||||||
char* exec;
|
char* exec;
|
||||||
char* pidfile;
|
char* pidfile;
|
||||||
|
char* stop;
|
||||||
|
bool stopped;
|
||||||
};
|
};
|
||||||
|
|
||||||
void mk_service_scan(void);
|
void mk_service_scan(void);
|
||||||
|
int mk_start_service(const char* name);
|
||||||
|
int mk_stop_service(const char* name);
|
||||||
|
void mk_start_services(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
3
Mokou/server.c
Normal file
3
Mokou/server.c
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
#include "mk_server.h"
|
228
Mokou/service.c
228
Mokou/service.c
|
@ -2,11 +2,15 @@
|
||||||
|
|
||||||
#include "mk_service.h"
|
#include "mk_service.h"
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
#include "mk_log.h"
|
#include "mk_log.h"
|
||||||
#include "mk_util.h"
|
#include "mk_util.h"
|
||||||
|
@ -17,6 +21,8 @@ void mk_service_scan(void){
|
||||||
if(services != NULL){
|
if(services != NULL){
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; services[i] != NULL; i++){
|
for(i = 0; services[i] != NULL; i++){
|
||||||
|
if(services[i]->name != NULL) free(services[i]->name);
|
||||||
|
if(services[i]->stop != NULL) free(services[i]->stop);
|
||||||
if(services[i]->description != NULL) free(services[i]->description);
|
if(services[i]->description != NULL) free(services[i]->description);
|
||||||
if(services[i]->exec != NULL) free(services[i]->exec);
|
if(services[i]->exec != NULL) free(services[i]->exec);
|
||||||
if(services[i]->pidfile != NULL) free(services[i]->pidfile);
|
if(services[i]->pidfile != NULL) free(services[i]->pidfile);
|
||||||
|
@ -52,6 +58,7 @@ void mk_service_scan(void){
|
||||||
|
|
||||||
char* desc = NULL;
|
char* desc = NULL;
|
||||||
char* exec = NULL;
|
char* exec = NULL;
|
||||||
|
char* stop = NULL;
|
||||||
char* pidfile = NULL;
|
char* pidfile = NULL;
|
||||||
|
|
||||||
for(i = 0;; i++){
|
for(i = 0;; i++){
|
||||||
|
@ -79,6 +86,9 @@ void mk_service_scan(void){
|
||||||
}else if(strcmp(key, "pidfile") == 0){
|
}else if(strcmp(key, "pidfile") == 0){
|
||||||
if(pidfile != NULL) free(pidfile);
|
if(pidfile != NULL) free(pidfile);
|
||||||
pidfile = mk_strdup(value);
|
pidfile = mk_strdup(value);
|
||||||
|
}else if(strcmp(key, "stop") == 0){
|
||||||
|
if(stop != NULL) free(stop);
|
||||||
|
stop = mk_strdup(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -111,10 +121,32 @@ void mk_service_scan(void){
|
||||||
mk_log(log);
|
mk_log(log);
|
||||||
free(log);
|
free(log);
|
||||||
|
|
||||||
|
int i;
|
||||||
struct mk_service* serv = malloc(sizeof(*serv));
|
struct mk_service* serv = malloc(sizeof(*serv));
|
||||||
|
serv->name = mk_strdup(d->d_name);
|
||||||
|
|
||||||
|
for(i = strlen(d->d_name) - 1; i >= 0; i--){
|
||||||
|
if(serv->name[i] == '.'){
|
||||||
|
serv->name[i] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
serv->description = desc != NULL ? mk_strdup(desc) : NULL;
|
serv->description = desc != NULL ? mk_strdup(desc) : NULL;
|
||||||
|
serv->stop = stop != NULL ? mk_strdup(stop) : NULL;
|
||||||
serv->exec = mk_strdup(exec);
|
serv->exec = mk_strdup(exec);
|
||||||
serv->pidfile = mk_strdup(pidfile);
|
serv->pidfile = mk_strdup(pidfile);
|
||||||
|
serv->stopped = false;
|
||||||
|
|
||||||
|
struct mk_service** oldsrvs = services;
|
||||||
|
for(i = 0; oldsrvs[i] != NULL; i++);
|
||||||
|
services = malloc(sizeof(*services) * (i + 2));
|
||||||
|
for(i = 0; oldsrvs[i] != NULL; i++){
|
||||||
|
services[i] = oldsrvs[i];
|
||||||
|
}
|
||||||
|
services[i] = serv;
|
||||||
|
services[i + 1] = NULL;
|
||||||
|
free(oldsrvs);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(desc != NULL) free(desc);
|
if(desc != NULL) free(desc);
|
||||||
|
@ -130,3 +162,199 @@ void mk_service_scan(void){
|
||||||
mk_log("Cannot open the directory.");
|
mk_log("Cannot open the directory.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* errors[] = {
|
||||||
|
"Success",
|
||||||
|
"No such service",
|
||||||
|
"Service is alive",
|
||||||
|
"Failed to start",
|
||||||
|
"Service is dead",
|
||||||
|
"Bad signal",
|
||||||
|
"Could not stop the service"
|
||||||
|
};
|
||||||
|
|
||||||
|
int mk_stop_service(const char* name){
|
||||||
|
int i;
|
||||||
|
for(i = 0; services[i] != NULL; i++){
|
||||||
|
if(strcmp(services[i]->name, name) == 0){
|
||||||
|
struct mk_service* srv = services[i];
|
||||||
|
char* log = mk_strcat("Stopping ", name);
|
||||||
|
mk_log(log);
|
||||||
|
free(log);
|
||||||
|
|
||||||
|
bool alive = false;
|
||||||
|
|
||||||
|
FILE* f = fopen(srv->pidfile, "r");
|
||||||
|
unsigned long long pid;
|
||||||
|
if(f != NULL){
|
||||||
|
fscanf(f, "%llu", &pid);
|
||||||
|
fclose(f);
|
||||||
|
alive = kill(pid, 0) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!alive){
|
||||||
|
mk_log("Process seems to be dead, not stopping");
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(srv->stop == NULL || srv->stop[0] == '#'){
|
||||||
|
int sig = -1;
|
||||||
|
if(srv->stop == NULL){
|
||||||
|
sig = SIGINT;
|
||||||
|
}
|
||||||
|
if(sig == -1){
|
||||||
|
int i;
|
||||||
|
for(i = 1; i < NSIG; i++){
|
||||||
|
if(strcmp(sys_signame[i], srv->stop + 1) == 0){
|
||||||
|
sig = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(sig == -1){
|
||||||
|
mk_log("Bad signal");
|
||||||
|
return 5;
|
||||||
|
}else{
|
||||||
|
log = mk_strcat("Sending SIG", sys_signame[sig]);
|
||||||
|
mk_log(log);
|
||||||
|
free(log);
|
||||||
|
bool dead = false;
|
||||||
|
kill(pid, sig);
|
||||||
|
for(i = 0; i < 3; i++){
|
||||||
|
if(kill(pid, 0) == -1){
|
||||||
|
mk_log("Process died");
|
||||||
|
dead = true;
|
||||||
|
break;
|
||||||
|
}else{
|
||||||
|
mk_log("Process is still alive");
|
||||||
|
}
|
||||||
|
if(i != 2) sleep(1);
|
||||||
|
}
|
||||||
|
if(!dead){
|
||||||
|
mk_log("Could not kill the process");
|
||||||
|
return 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
char** pargv = malloc(sizeof(*pargv));
|
||||||
|
pargv[0] = NULL;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int incr = 0;
|
||||||
|
for(i = 0;; i++){
|
||||||
|
if(srv->stop[i] == 0 || srv->stop[i] == ' '){
|
||||||
|
char* str = malloc(i - incr + 1);
|
||||||
|
memcpy(str, srv->stop + incr, i - incr);
|
||||||
|
str[i - incr] = 0;
|
||||||
|
|
||||||
|
char** oldargv = pargv;
|
||||||
|
int j;
|
||||||
|
for(j = 0; oldargv[j] != NULL; j++);
|
||||||
|
pargv = malloc(sizeof(*pargv) * (j + 2));
|
||||||
|
for(j = 0; oldargv[j] != NULL; j++) pargv[j] = oldargv[j];
|
||||||
|
pargv[j] = str;
|
||||||
|
pargv[j + 1] = NULL;
|
||||||
|
free(oldargv);
|
||||||
|
|
||||||
|
incr = i + 1;
|
||||||
|
if(srv->exec[i] == 0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
srv->stopped = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mk_start_service(const char* name){
|
||||||
|
int i;
|
||||||
|
for(i = 0; services[i] != NULL; i++){
|
||||||
|
if(strcmp(services[i]->name, name) == 0){
|
||||||
|
struct mk_service* srv = services[i];
|
||||||
|
char* log = mk_strcat("Starting ", name);
|
||||||
|
mk_log(log);
|
||||||
|
free(log);
|
||||||
|
|
||||||
|
bool alive = false;
|
||||||
|
|
||||||
|
FILE* f = fopen(srv->pidfile, "r");
|
||||||
|
if(f != NULL){
|
||||||
|
unsigned long long pid;
|
||||||
|
fscanf(f, "%llu", &pid);
|
||||||
|
fclose(f);
|
||||||
|
alive = kill(pid, 0) == 0;
|
||||||
|
}
|
||||||
|
if(alive){
|
||||||
|
mk_log("Process seems to be alive, not starting");
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
char** pargv = malloc(sizeof(*pargv));
|
||||||
|
pargv[0] = NULL;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
int incr = 0;
|
||||||
|
for(i = 0;; i++){
|
||||||
|
if(srv->exec[i] == 0 || srv->exec[i] == ' '){
|
||||||
|
char* str = malloc(i - incr + 1);
|
||||||
|
memcpy(str, srv->exec + incr, i - incr);
|
||||||
|
str[i - incr] = 0;
|
||||||
|
|
||||||
|
char** oldargv = pargv;
|
||||||
|
int j;
|
||||||
|
for(j = 0; oldargv[j] != NULL; j++);
|
||||||
|
pargv = malloc(sizeof(*pargv) * (j + 2));
|
||||||
|
for(j = 0; oldargv[j] != NULL; j++) pargv[j] = oldargv[j];
|
||||||
|
pargv[j] = str;
|
||||||
|
pargv[j + 1] = NULL;
|
||||||
|
free(oldargv);
|
||||||
|
|
||||||
|
incr = i + 1;
|
||||||
|
if(srv->exec[i] == 0) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool fail = false;
|
||||||
|
|
||||||
|
pid_t pid = fork();
|
||||||
|
if(pid == 0){
|
||||||
|
int n = open("/dev/null", O_RDWR);
|
||||||
|
dup2(n, 1);
|
||||||
|
dup2(n, 2);
|
||||||
|
execvp(pargv[0], pargv);
|
||||||
|
_exit(-1);
|
||||||
|
}else{
|
||||||
|
int status;
|
||||||
|
waitpid(pid, &status, 0);
|
||||||
|
if(WEXITSTATUS(status) != 0) fail = true;
|
||||||
|
}
|
||||||
|
for(i = 0; pargv[i] != NULL; i++) free(pargv[i]);
|
||||||
|
free(pargv);
|
||||||
|
if(fail){
|
||||||
|
log = mk_strcat("Failed to start ", name);
|
||||||
|
mk_log(log);
|
||||||
|
free(log);
|
||||||
|
srv->stopped = false;
|
||||||
|
return 3;
|
||||||
|
}else{
|
||||||
|
log = mk_strcat("Started ", name);
|
||||||
|
mk_log(log);
|
||||||
|
free(log);
|
||||||
|
srv->stopped = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mk_start_services(void){
|
||||||
|
int i;
|
||||||
|
for(i = 0; services[i] != NULL; i++){
|
||||||
|
mk_start_service(services[i]->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user