summaryrefslogtreecommitdiffstats
path: root/eurephiadm/eurephiadm.c
diff options
context:
space:
mode:
authorDavid Sommerseth <dazo@users.sourceforge.net>2008-11-30 23:40:51 +0100
committerDavid Sommerseth <dazo@users.sourceforge.net>2008-11-30 23:40:51 +0100
commitf8ba36e41f07b46c5f82e0c8a075edb5e9502280 (patch)
tree6ca5aafddd0f2d10d2e4b80f409efab7e2911c3c /eurephiadm/eurephiadm.c
parentd09caa1b495ab49911a77ccdba9521a2633a2e04 (diff)
downloadeurephia-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/eurephiadm.c')
-rw-r--r--eurephiadm/eurephiadm.c179
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;
}