From a0f5e337ee57df78939e9ddaccf9a18bcf811435 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sun, 5 Feb 2012 12:40:53 +0100 Subject: [PATCH] added "first time" configuration (set up first bot and admin user) --- database.defaults.sql | 8 --- src/ClientSocket.c | 7 ++- src/ClientSocket.h | 2 +- src/main.c | 126 ++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 127 insertions(+), 16 deletions(-) diff --git a/database.defaults.sql b/database.defaults.sql index 86a99b9..36b56a7 100644 --- a/database.defaults.sql +++ b/database.defaults.sql @@ -1,11 +1,3 @@ --- --- Daten für Tabelle `bots` --- - -INSERT INTO `bots` (`id`, `active`, `nick`, `server`, `port`, `pass`, `ssl`, `bind`, `ident`, `realname`, `automodes`, `botclass`, `textbot`, `queue`, `defaulttrigger`, `max_channels`, `register_priority`) VALUES -(1, 1, 'NeonTest', 'irc.WebGamesNet.net', 6667, '', 0, NULL, 'NeonServ', 'NeonServ Test Bot', 'iIncx', 1, 1, 0, '+', 20, 4), -(5, 1, 'SpamTest', 'irc.WebGamesNet.net', 6667, '', 0, NULL, 'SpamServ', 'NeonServ Anti Spam Service', '+xiIcn', 2, 1, 0, '~', 20, 5); - -- -- Daten für Tabelle `bot_binds` -- diff --git a/src/ClientSocket.c b/src/ClientSocket.c index 6d2c34e..ad634dc 100644 --- a/src/ClientSocket.c +++ b/src/ClientSocket.c @@ -418,8 +418,8 @@ int clientsocket_parseorder_top(unsigned int tid) { } #endif -void socket_loop(int timeout_seconds) { - if(sockets == NULL) return; +int socket_loop(int timeout_seconds) { + if(sockets == NULL) return 0; int is_synchronized = 1; SYNCHRONIZE(synchronized_recv); fd_set fds; @@ -439,7 +439,7 @@ void socket_loop(int timeout_seconds) { ret = select(ret + 1, &fds, NULL, NULL, &timeout); if(ret == 0) { DESYNCHRONIZE(synchronized_recv); - return; + return 1; } for (sock = sockets->data; sock; sock = next) { next = sock->next; @@ -530,6 +530,7 @@ void socket_loop(int timeout_seconds) { if(is_synchronized) { DESYNCHRONIZE(synchronized_recv); } + return (ret + 1); } void diff --git a/src/ClientSocket.h b/src/ClientSocket.h index 3754399..78e207c 100644 --- a/src/ClientSocket.h +++ b/src/ClientSocket.h @@ -86,7 +86,7 @@ int write_socket(struct ClientSocket *client, char* msg, int len); #ifdef HAVE_THREADS int clientsocket_parseorder_top(unsigned int tid); #endif -void socket_loop(int timeout_seconds); +int socket_loop(int timeout_seconds); void putsock(struct ClientSocket *client, const char *text, ...) PRINTF_LIKE(2, 3); struct ClientSocket* getBots(int flags, struct ClientSocket* last_bot); void init_sockets(); diff --git a/src/main.c b/src/main.c index 6486d6c..dc76d7a 100644 --- a/src/main.c +++ b/src/main.c @@ -58,6 +58,8 @@ pthread_mutex_t whohandler_sync, whohandler_mass_sync; static pthread_mutex_t log_sync; #endif +static void check_firstrun(); + void cleanup() { free_sockets(); qserver_free(); @@ -112,7 +114,11 @@ void * thread_main(void *arg) { while(running) { socket_wait = time(0) + SOCKET_SELECT_TIME; do { - socket_loop(SOCKET_SELECT_TIME); + if(!socket_loop(SOCKET_SELECT_TIME)) { + putlog(LOGLEVEL_ERROR, "No more active Bots... shutting down."); + cleanup(); + exit(0); + } } while(time(0) < socket_wait); clearTempUsers(); destroyEvents(); @@ -182,6 +188,11 @@ int main(int argc, char *argv[]) { #if HAVE_THREADS THREAD_MUTEX_INIT(log_sync); #endif + if(!load_mysql_config()) { + fprintf(stderr, "Unable to connect to MySQL\n"); + exit(0); + } + check_firstrun(); if (run_as_daemon) { /* Attempt to fork into the background if daemon mode is on. */ pid_t pid = fork(); @@ -234,8 +245,6 @@ main: } #endif - if(!load_mysql_config()) return 0; - statistics_enabled = get_int_field("statistics.enable"); #ifdef HAVE_THREADS @@ -297,7 +306,11 @@ main: while(running) { socket_wait = time(0) + SOCKET_SELECT_TIME; do { - socket_loop(SOCKET_SELECT_TIME); + if(!socket_loop(SOCKET_SELECT_TIME)) { + putlog(LOGLEVEL_ERROR, "No more active Bots... shutting down."); + cleanup(); + exit(0); + } } while(time(0) < socket_wait); timeq_tick(); loop_bots(); @@ -527,3 +540,108 @@ void putlog(int loglevel, const char *text, ...) { write_log(loglevel, logBuf, pos); } +static void check_firstrun() { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_access` = 1000 LIMIT 1"); + res = mysql_use(); + if (mysql_fetch_row(res) == NULL) { + //first run! + printf("No superuser found...\n"); + check_firstrun_admin: + printf("AuthServ account name of admin user: "); + char *ptr; + char adminuser[31]; + fgets(adminuser, 30, stdin); + for(ptr = adminuser; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(strlen(adminuser) < 2) goto check_firstrun_admin; + printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(adminuser)); + res = mysql_use(); + if ((row = mysql_fetch_row(res)) != NULL) + printf_mysql_query("UPDATE `users` SET `user_access` = 1000 WHERE `user_id` = '%s'", row[0]); + else + printf_mysql_query("INSERT INTO `users` (`user_user`, `user_access`) VALUES ('%s', 1000)", escape_string(adminuser)); + } + printf_mysql_query("SELECT `id` FROM `bots` WHERE `active` = 1 LIMIT 1"); + res = mysql_use(); + if (mysql_fetch_row(res) == NULL) { + //no bot active + printf("No active bot found...\n\n"); + printf("ADD NEW BOT\n"); + char *ptr; + char bot_nick[31]; + check_firstrun_bot_nick: + printf("Nick: "); + fgets(bot_nick, 30, stdin); + for(ptr = bot_nick; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(strlen(bot_nick) < 2) goto check_firstrun_bot_nick; + char bot_ident[16]; + check_firstrun_bot_ident: + printf("Ident: "); + fgets(bot_ident, 15, stdin); + for(ptr = bot_ident; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(strlen(bot_ident) < 2) goto check_firstrun_bot_ident; + char bot_realname[101]; + check_firstrun_bot_realname: + printf("Realname: "); + fgets(bot_realname, 100, stdin); + for(ptr = bot_realname; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(strlen(bot_realname) < 2) goto check_firstrun_bot_realname; + char bot_server[101]; + check_firstrun_bot_server: + printf("Server: [irc.onlinegamesnet.net] "); + fgets(bot_server, 100, stdin); + for(ptr = bot_server; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(*bot_server && strlen(bot_nick) < 5) goto check_firstrun_bot_server; + if(!*bot_server) + strcpy(bot_server, "irc.onlinegamesnet.net"); + int bot_port; + char bot_port_buf[7]; + printf("Port: [6667] "); + fgets(bot_port_buf, 6, stdin); + for(ptr = bot_port_buf; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(!*bot_port_buf) + bot_port = 6667; + else + bot_port = atoi(bot_port_buf); + int bot_ssl; + char bot_ssl_buf[5]; + check_firstrun_bot_ssl: + printf("SSL: [y/N] "); + fgets(bot_ssl_buf, 4, stdin); + for(ptr = bot_ssl_buf; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(!*bot_ssl_buf || tolower(*bot_ssl_buf) == 'n') + bot_ssl = 0; + else if(tolower(*bot_ssl_buf) == 'y') + bot_ssl = 1; + else + goto check_firstrun_bot_ssl; + char bot_pass[101]; + printf("Server Password: [] "); + fgets(bot_pass, 100, stdin); + for(ptr = bot_pass; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + int bot_maxchan; + char bot_maxchan_buf[5]; + printf("MaxChannel: [20] "); + fgets(bot_maxchan_buf, 5, stdin); + for(ptr = bot_maxchan_buf; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(*bot_maxchan_buf) + bot_maxchan = atoi(bot_maxchan_buf); + else + bot_maxchan = 20; + int bot_queue; + char bot_queue_buf[5]; + check_firstrun_bot_queue: + printf("Queue (prevents excess floods): [Y/n] "); + fgets(bot_queue_buf, 4, stdin); + for(ptr = bot_queue_buf; *ptr; ptr++) { if(*ptr == '\n' || *ptr == '\r') *ptr = '\0'; } + if(!*bot_queue_buf || tolower(*bot_queue_buf) == 'y') + bot_queue = 1; + else if(tolower(*bot_queue_buf) == 'n') + bot_queue = 0; + else + goto check_firstrun_bot_queue; + printf_mysql_query("INSERT INTO `bots` (`active`, `nick`, `server`, `port`, `pass`, `ssl`, `ident`, `realname`, `botclass`, `textbot`, `queue`, `defaulttrigger`, `max_channels`) VALUES ('1', '%s', '%s', '%d', '%s', '%d', '%s', '%s', '1', '1', '%d', '+', '%d')", escape_string(bot_nick), escape_string(bot_server), bot_port, escape_string(bot_pass), bot_ssl, escape_string(bot_ident), escape_string(bot_realname), bot_queue, bot_maxchan); + } +} + -- 2.20.1