From f06ff46151c38b2259c5ee4ae83d38c6f6fc0c8c Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Sun, 12 Jul 2020 02:30:31 +0200 Subject: Teach minecctl to create proper mcserver files, auto-generate systemd service names as necessary --- minecproxy/server.c | 71 ++++++++++++++++++++--------------------------------- 1 file changed, 27 insertions(+), 44 deletions(-) (limited to 'minecproxy/server.c') diff --git a/minecproxy/server.c b/minecproxy/server.c index b1e9b05..7a992d1 100644 --- a/minecproxy/server.c +++ b/minecproxy/server.c @@ -46,9 +46,8 @@ static void server_free(struct uring_task *task) assert_return(task); - debug(DBG_SRV, "freeing server %s (%p)", server->name, server); + debug(DBG_SRV, "freeing server (%p)", server); list_del(&server->list); - xfree(server->name); xfree(server); } @@ -59,7 +58,7 @@ void server_delete(struct server *server) assert_return(server); - verbose("Removing server %s", server->name); + verbose("Removing server %s", server->scfg.name); server->state = SERVER_STATE_DEAD; rcon_delete(server); @@ -101,7 +100,7 @@ static void server_dump(struct server *server) assert_return(server); - verbose("Server %s:", server->name); + verbose("Server %s:", server->scfg.name); verbose(" * Filename: %s", server->scfg.filename); switch (server->scfg.type) { case SERVER_TYPE_ANNOUNCE: @@ -225,7 +224,7 @@ static bool server_check_running(struct server *server) /* FIXME: other methods, rcon? */ if (server->scfg.systemd_service) { verbose("%s: checking if systemd service is running", - server->name); + server->scfg.name); if (systemd_service_running(&server->scfg, &error)) { server->state = SERVER_STATE_RUNNING; return true; @@ -246,12 +245,12 @@ bool server_start(struct server *server) switch (server->scfg.start_method) { case SERVER_START_METHOD_EXEC: verbose("Starting server %s via external cmd", - server->name); + server->scfg.name); return server_exec(server, server->scfg.start_exec); case SERVER_START_METHOD_SYSTEMD: verbose("Starting server %s via systemd (%s)", - server->name, + server->scfg.name, server->scfg.systemd_service); if (systemd_service_start(&server->scfg)) { @@ -276,12 +275,12 @@ bool server_stop(struct server *server) switch (server->scfg.stop_method) { case SERVER_STOP_METHOD_EXEC: verbose("Stopping server %s via external cmd", - server->name); + server->scfg.name); return server_exec(server, server->scfg.stop_exec); case SERVER_STOP_METHOD_SYSTEMD: verbose("Stopping server %s via systemd (%s)", - server->name, + server->scfg.name, server->scfg.systemd_service); if (systemd_service_stop(&server->scfg)) { server->state = SERVER_STATE_STOPPED; @@ -290,7 +289,7 @@ bool server_stop(struct server *server) return server_check_running(server); case SERVER_STOP_METHOD_RCON: - verbose("Stopping server %s via rcon", server->name); + verbose("Stopping server %s via rcon", server->scfg.name); rcon_stop(server); return true; @@ -315,7 +314,7 @@ void server_update_active_players(struct server *server, int count) assert_task_alive(DBG_IDLE, &server->idle_task); debug(DBG_IDLE, "%s: currently %i active players", - server->name, count); + server->scfg.name, count); if (count < 0) return; @@ -327,7 +326,7 @@ void server_update_active_players(struct server *server, int count) server->idle_count++; if (server->idle_count > server->scfg.idle_timeout) { - verbose("stopping idle server %s", server->name); + verbose("stopping idle server %s", server->scfg.name); server_stop(server); } } @@ -342,7 +341,7 @@ static void server_idle_connected_cb(struct connection *conn, bool connected) if (!connected) { debug(DBG_IDLE, "idle check connection to remote server (%s) failed", - server->name); + server->scfg.name); server->idle_count = 0; server->state = SERVER_STATE_STOPPED; return; @@ -390,11 +389,11 @@ static void server_announce_cb(struct uring_task *task, int res) assert_return(task); if (res < 0) - error("%s: failure %i", server->name, res); + error("%s: failure %i", server->scfg.name, res); else if (res == server->ann_buf.len) - debug(DBG_ANN, "%s: ok (%i)", server->name, res); + debug(DBG_ANN, "%s: ok (%i)", server->scfg.name, res); else - debug(DBG_ANN, "%s: unexpected result: %i", server->name, res); + debug(DBG_ANN, "%s: unexpected result: %i", server->scfg.name, res); uring_task_set_fd(&server->ann_task, -1); } @@ -410,7 +409,7 @@ bool server_announce(struct server *server, int fd) server->state != SERVER_STATE_RUNNING)) return false; - debug(DBG_ANN, "announcing server: %s", server->name); + debug(DBG_ANN, "announcing server: %s", server->scfg.name); uring_task_set_fd(&server->ann_task, fd); uring_tbuf_sendmsg(&server->ann_task, server_announce_cb); return true; @@ -422,12 +421,12 @@ bool server_commit(struct server *server) struct saddr *saddr, *tmp; int r; - assert_return(server && server->name, false); + assert_return(server && server->scfg.name, false); assert_task_alive_or(DBG_SRV, &server->task, return false); if (!list_empty(&server->scfg.dnslookups)) { debug(DBG_SRV, "%s: called with pending DNS requests", - server->name); + server->scfg.name); return false; } @@ -437,23 +436,23 @@ bool server_commit(struct server *server) } if (!list_empty(&server->proxys)) { - error("%s: proxys not empty?", server->name); + error("%s: proxys not empty?", server->scfg.name); return false; } if (!scfg_validate(&server->scfg, &error)) { error("%s: failed to validate config file (%s)", - server->name, error); + server->scfg.name, error); server_delete(server); return false; } r = snprintf(server->ann_buf.buf, sizeof(server->ann_buf.buf), "[MOTD]%s[/MOTD][AD]%" PRIu16 "[/AD]", - server->scfg.pretty_name ? server->scfg.pretty_name : server->name, + server->scfg.pretty_name ? server->scfg.pretty_name : server->scfg.name, server->scfg.announce_port); if (r < 1 || r >= sizeof(server->ann_buf.buf)) { - error("%s: unable to create announce msg: %i\n", server->name, + error("%s: unable to create announce msg: %i\n", server->scfg.name, r); return false; } @@ -469,14 +468,14 @@ bool server_commit(struct server *server) local = local_new(server, saddr); if (!local) { error("%s: failed to create local listener", - server->name); + server->scfg.name); server_delete(server); return false; } list_add(&local->list, &server->listenings); if (!local_open(local)) { error("%s: failed to open listening port", - server->name); + server->scfg.name); server_delete(server); return false; } @@ -486,19 +485,18 @@ bool server_commit(struct server *server) server_check_running(server); - debug(DBG_SRV, "%s: success", server->name); + debug(DBG_SRV, "%s: success", server->scfg.name); return true; } struct server *server_new(const char *filename) { struct server *server; - const char *suffix; assert_return(!empty_str(filename), NULL); list_for_each_entry(server, &cfg->servers, list) { - if (!streq(filename, server->name)) + if (!streq(filename, server->scfg.filename)) continue; error("attempt to add duplicate server: %s", filename); return server; @@ -511,29 +509,14 @@ struct server *server_new(const char *filename) return NULL; } - suffix = strrchr(filename, '.'); - if (!suffix || suffix == filename) { - error("invalid filename: %s", filename); - xfree(server); - return NULL; - } - - server->name = xstrndup(filename, suffix - filename); - if (!server->name) { - error("failed to create server name: %s", filename); - xfree(server); - return NULL; - } - if (!scfg_init(&server->scfg, filename)) { - xfree(server->name); xfree(server); return NULL; } server->state = SERVER_STATE_INIT; - uring_task_init(&server->task, server->name, uring_parent(), + uring_task_init(&server->task, server->scfg.name, uring_parent(), server_free); uring_task_set_buf(&server->task, &server->tbuf); -- cgit v1.2.3