diff options
author | David Sommerseth <dazo@users.sourceforge.net> | 2008-11-30 23:40:51 +0100 |
---|---|---|
committer | David Sommerseth <dazo@users.sourceforge.net> | 2008-11-30 23:40:51 +0100 |
commit | f8ba36e41f07b46c5f82e0c8a075edb5e9502280 (patch) | |
tree | 6ca5aafddd0f2d10d2e4b80f409efab7e2911c3c /eurephiadm | |
parent | d09caa1b495ab49911a77ccdba9521a2633a2e04 (diff) | |
download | eurephia-f8ba36e41f07b46c5f82e0c8a075edb5e9502280.tar.gz eurephia-f8ba36e41f07b46c5f82e0c8a075edb5e9502280.tar.xz eurephia-f8ba36e41f07b46c5f82e0c8a075edb5e9502280.zip |
Completed login/logout from eurephiadm. Added config file parser.
The config file parser will put all configuration parameters into an
eurephiaVALUES stack. eGet_value(...) functions can be used for further
processing.
Diffstat (limited to 'eurephiadm')
-rw-r--r-- | eurephiadm/eurephiadm.c | 179 |
1 files changed, 160 insertions, 19 deletions
diff --git a/eurephiadm/eurephiadm.c b/eurephiadm/eurephiadm.c index 96da617..fda9be8 100644 --- a/eurephiadm/eurephiadm.c +++ b/eurephiadm/eurephiadm.c @@ -29,6 +29,7 @@ #include <eurephia_context.h> #include <eurephia_nullsafe.h> #include <eurephia_log.h> +#include <eurephia_values.h> #include <eurephiadb_driver.h> #include <eurephiadb_session_common.h> #include <eurephiadb.h> @@ -116,23 +117,27 @@ int eurephia_ConnectDB(eurephiaCTX *ctx, const char *argstr) { return 1; } -char *get_session_file() { +char *get_config_file(const char *env, const char *file) { struct stat chk; static char fname[1026]; char *ptr; + int flen = 1024 - strlen_nullsafe(file); + assert( (file != NULL)); memset(&fname, 0, 1026); - // Use the explicit eurephia session file, if set in environment - if( (ptr = getenv("EUREPHIA_SESSION")) != NULL ) { - snprintf(fname, 1024, "%s", ptr); - return fname; + if( env != NULL ) { + // Use the explicit eurephia session file, if set in environment + if( (ptr = getenv(env)) != NULL ) { + snprintf(fname, 1024, "%s", ptr); + return fname; + } } // Use the explicit set eurephia session directory for a session file if( ((ptr = getenv("EUREPHIA_DIR")) != NULL) && (strlen_nullsafe(ptr) <= 1016) ) { - snprintf(fname, 1024, "%.1016s/session", ptr); - + strncat(fname, ptr, flen); + strcat(fname, file); // Make sure we have this directory if( stat(ptr, &chk) == -1 ) { if( mkdir(ptr, S_IRWXU) == -1 ) { @@ -145,7 +150,9 @@ char *get_session_file() { // Use default ~/.eurephia directory for session file if( ((ptr = getenv("HOME")) != NULL) && (strlen_nullsafe(ptr) <= 1016) ) { - snprintf(fname, 1024, "%.1006s/.eurephia", ptr); + flen -= 10; + strncat(fname, ptr, flen); + strcat(fname, "/.eurephia"); // Make sure we have this directory if( stat(fname, &chk) == -1 ) { @@ -154,12 +161,104 @@ char *get_session_file() { return NULL; } } - strcat(fname, "/session"); + strcat(fname, "/"); + strcat(fname, file); + return fname; + } + return NULL; +} + +eurephiaVALUES *parse_config_line(const char *line) { + char *cp = NULL, *key = NULL, *val = NULL, *ptr = NULL;; + eurephiaVALUES *ret = NULL; + + cp = strdup(line); + key = cp; + val = strpbrk(cp, "="); + *val = '\0'; val++; + + // Left trim + while( ((*key == 0x20) || (*key == 0x0A) || (*key == 0x0D)) ) { + key++; + } + while( ((*val == 0x20) || (*val == 0x0A) || (*val == 0x0D)) ) { + val++; + } + + // Right trim + ptr = key + strlen_nullsafe(key) - 1; + while( ((*ptr == 0x20) || (*ptr == 0x0A) || (*ptr == 0x0D)) && (ptr > key) ) { + ptr--; + } + ptr++; + *ptr = '\0'; + + ptr = val + strlen_nullsafe(val) - 1; + while( ((*ptr == 0x20) || (*ptr == 0x0A) || (*ptr == 0x0D)) && (ptr > val) ) { + ptr--; + } + ptr++; + *ptr = '\0'; + + // Put key/value into a eurephiaVALUES struct and return it + ret = eCreate_value_space(NULL, 20); + ret->key = strdup(key); + ret->val = strdup(val); + + free_nullsafe(cp); + return ret; +} + + +eurephiaVALUES *ReadConfig(const char *env, const char *cfgname) { + char *fname = NULL; + FILE *fp = NULL; + char *buf = NULL; + eurephiaVALUES *cfg = NULL; + struct stat fi; + + fname = get_config_file(env, cfgname); + if( fname == NULL ) { + fprintf(stderr, "Could not find a valid path for the config file\n"); + return NULL; + } + + if( stat(fname, &fi) == -1 ) { + fprintf(stderr, "Could not open the config file: %s\n", fname); + return NULL; + } + + if( (fp = fopen(fname, "r")) == NULL ) { + fprintf(stderr, "Could not open the config file: %s\n", fname); + return NULL; + } + + buf = (char *) malloc(fi.st_size+2); + memset(buf, 0, fi.st_size+2); + + cfg = eCreate_value_space(NULL, 20); + while( fgets(buf, fi.st_size, fp) != NULL ) { + eurephiaVALUES *prm = parse_config_line(buf); + eAdd_valuestruct(NULL, cfg, prm); + }; + free_nullsafe(buf); + + return cfg; +} + + + + +char *get_session_file() { + char *fname = NULL; + + fname = get_config_file("EUREPHIADM_SESSION","/session"); + if( fname == NULL ) { + // If even default ~/.eurephia dir failed, create one in /tmp + snprintf(fname, 1024, "/tmp/.eurepia-%i.sess", getuid()); return fname; } - // If even default ~/.eurephia dir failed, create one in /tmp - snprintf(fname, 1024, "/tmp/.eurepia-%i.sess", getuid()); return fname; } @@ -336,43 +435,85 @@ eurephiaSESSION *do_login(eurephiaCTX *ctx) { int main(int argc, char **argv) { eurephiaCTX *ctx = NULL; eurephiaSESSION *session = NULL; + eurephiaVALUES *cfg = NULL; char *sesskey_file = NULL; + char *dbdriver = NULL, *dbparams = NULL; + int rc = 0; - ctx = eurephiaCTX_init(stderr, 50, "../database/sqlite/edb-sqlite.so"); - if( ctx == NULL ) { - fprintf(stderr, "Could not initialise a eurephia context.\n"); + if( argc < 2 ) { + fprintf(stderr, "Usage: %s <command> [options]\n", argv[0]); return 1; } - if( !eurephia_ConnectDB(ctx, argv[1]) ) { + // Read configuration file + cfg = ReadConfig("EUREPHIADM_CONFIG", "eurephiadm.cfg"); + if( cfg == NULL ) { + fprintf(stderr, "No configuration file found.\n"); return 2; } - // Check session file + // Get database and connection ifo + dbdriver = eGet_value(cfg, "database_driver"); + dbparams = eGet_value(cfg, "database_params"); + + // Create an eurephia context and load database driver + ctx = eurephiaCTX_init(stderr, 50, dbdriver); + if( ctx == NULL ) { + fprintf(stderr, "Could not initialise a eurephia context.\n"); + return 3; + } + + // Connect to the database + if( !eurephia_ConnectDB(ctx, dbparams) ) { + return 4; + } + + // Load session file, if it exists. if( (sesskey_file = read_session_file(ctx)) == NULL ) { + // No session file - go straight to login + if( strcmp(argv[1], "logout") == 0) { + fprintf(stderr, "You are already logged out\n"); + return 0; + } session = do_login(ctx); } else { + // Session file found, check if it still is a valid session if( eDBadminValidateSession(ctx, sesskey_file) ) {; + // If valid, load this session session = create_session(ctx, sesskey_file); } else { + // If not valid, remove session file and go to login remove_session_file(ctx); + if( strcmp(argv[1], "logout") == 0) { + fprintf(stderr, "You are already logged out\n"); + return 0; + } session = do_login(ctx); } } + free_nullsafe(sesskey_file); if(session != NULL ) { + // If we have an open session now, write a session file if( !write_session_file(ctx, session) ) { eurephia_log(ctx, LOG_ERROR, 0, "Could not write session file. Login needed for actions"); }; // Process admin commands here + if( strcmp(argv[1], "logout") == 0) { + rc = eDBadminLogout(ctx, session); + } - free_nullsafe(session); + // Remove session info from memory + eDBfree_session(ctx, session); } else { + // If not an open session, make sure the session file is gone remove_session_file(ctx); } - eDBfree_session(ctx, session); + // Disconnect from the database, and remove config and our context before exiting + eFree_values(ctx, cfg); + eDBdisconnect(ctx); eurephiaCTX_destroy(ctx); - return 0; + return rc; } |