reply("HSMSG_MANAGER_DELETED", hi->handle, slfh_name, tlfh_name);
}
-static int hostserv_saxdb_read(struct dict *conf_db) {
- return 1;
+static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ARG(void *extra));
+static int hostserv_saxdb_read_assignments(const char *name, void *data, UNUSED_ARG(void *extra));
+
+static int hostserv_saxdb_read_toplevel(const char *name, void *data, UNUSED_ARG(void *extra)) {
+ struct record_data *rd = data;
+ struct hs_toplevel *tlfh;
+ struct hs_manager *managerTL;
+ struct hs_user *user;
+ struct dict *object;
+
+ if (rd->type == RECDB_OBJECT) {
+ dict_t db = GET_RECORD_OBJECT(rd);
+ dict_iterator_t it;
+
+ tlfh = hs_add_toplevel(name);
+
+ if ((object = database_get_data(db, KEY_MANAGERS, RECDB_OBJECT))) {
+ for (it = dict_first(object); it; it = iter_next(it)) {
+ user = hs_get_user(get_handle_info(iter_key(it)), 1);
+ //rd = iter_data(it);
+ /* nothing in here, yet */
+ managerTL = hs_add_manager_toplevel(tlfh, user);
+ if (database_get_data(db, KEY_ACTIVE, RECDB_QSTRING))
+ managerTL->active = 1;
+ else
+ managerTL->active = 0;
+ }
+ }
+
+ if ((object = database_get_data(db, KEY_SECONDLEVEL, RECDB_OBJECT)))
+ dict_foreach(object, hostserv_saxdb_read_secondlevel, tlfh);
+ }
+ return 0;
+}
+
+static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_ARG(void *extra)) {
+ struct record_data *rd = data;
+ struct hs_toplevel *tlfh = extra;
+ struct hs_secondlevel *slfh;
+ struct hs_manager *managerSL;
+ struct hs_user *user;
+ struct dict *object;
+
+ if (rd->type == RECDB_OBJECT) {
+ dict_t db = GET_RECORD_OBJECT(rd);
+ dict_iterator_t it;
+
+ slfh = hs_add_secondlevel(tlfh, name);
+
+ if ((object = database_get_data(db, KEY_MANAGERS, RECDB_OBJECT))) {
+ for (it = dict_first(object); it; it = iter_next(it)) {
+ user = hs_get_user(get_handle_info(iter_key(it)), 1);
+ //rd = iter_data(it);
+ /* nothing in here, yet */
+ managerSL = hs_add_manager_secondlevel(slfh, user);
+ if (database_get_data(db, KEY_ACTIVE, RECDB_QSTRING))
+ managerSL->active = 1;
+ else
+ managerSL->active = 0;
+ }
+ }
+
+ if ((object = database_get_data(db, KEY_ASSIGNMENTS, RECDB_OBJECT)))
+ dict_foreach(object, hostserv_saxdb_read_assignments, slfh);
+ }
+ return 0;
}
-static int hostserv_saxdb_write(struct saxdb_context *ctx) {
-
- return 0;
+static int hostserv_saxdb_read_assignments(const char *name, void *data, UNUSED_ARG(void *extra)) {
+ struct record_data *rd = data;
+ struct hs_secondlevel *slfh = extra;
+ struct hs_user *user;
+ struct hs_assignment *assng;
+
+ if (rd->type == RECDB_OBJECT) {
+ dict_t db = GET_RECORD_OBJECT(rd);
+
+ user = hs_get_user(get_handle_info(name), 1);
+ assng = hs_add_assignment(slfh, user);
+
+ if (database_get_data(db, KEY_ACTIVE, RECDB_QSTRING))
+ assng->active = 1;
+ else
+ assng->active = 0;
+ }
+
+ return 0;
}
-static void hostserv_conf_read(void)
+static int
+hostserv_saxdb_read(struct dict *db)
{
- dict_t conf_node;
- const char *str;
+ struct dict *object;
- str = "modules/hostserv";
- if (!(conf_node = conf_get_data(str, RECDB_OBJECT))) {
- log_module(HS_LOG, LOG_ERROR, "config node `%s' is missing or has wrong type.", str);
- return;
- }
+ if ((object = database_get_data(db, KEY_TOPLEVEL, RECDB_OBJECT)))
+ dict_foreach(object, hostserv_saxdb_read_toplevel, NULL);
- str = database_get_data(conf_node, "nick", RECDB_QSTRING);
- if(hostserv_conf.nick && strcmp(hostserv_conf.nick, str)) {
- //nick changed
+ return 1;
+}
+
+static int
+hostserv_saxdb_write(struct saxdb_context *ctx)
+{
+ struct hs_toplevel *tlfh;
+ struct hs_secondlevel *slfh;
+ struct hs_assignment *assng;
+ struct hs_manager *manager;
+
+ saxdb_start_record(ctx, KEY_TOPLEVEL, 1);
+ for(tlfh = toplevels; tlfh; tlfh = tlfh->next) {
+ saxdb_start_record(ctx, tlfh->fakehost, 1);
+
+ saxdb_start_record(ctx, KEY_MANAGERS, 1);
+ for(manager = tlfh->managers; manager; manager = manager->next) {
+ saxdb_start_record(ctx, manager->user->hi->handle, 0);
+ //additional manager information?
+ if(manager->active)
+ saxdb_write_int(ctx, KEY_ACTIVE, manager->active);
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ saxdb_start_record(ctx, KEY_SECONDLEVEL, 1);
+ for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
+ saxdb_start_record(ctx, slfh->fakehost, 1);
+
+ saxdb_start_record(ctx, KEY_MANAGERS, 1);
+ for(manager = slfh->managers; manager; manager = manager->next) {
+ saxdb_start_record(ctx, manager->user->hi->handle, 0);
+ //additional manager information?
+ if(manager->active)
+ saxdb_write_int(ctx, KEY_ACTIVE, manager->active);
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ saxdb_start_record(ctx, KEY_ASSIGNMENTS, 1);
+ for(assng = slfh->assignments; assng; assng = assng->next) {
+ saxdb_start_record(ctx, assng->user->hi->handle, 0);
+ //additional assignment information?
+ if(assng->active)
+ saxdb_write_int(ctx, KEY_ACTIVE, assng->active);
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ saxdb_end_record(ctx);
+ }
+ saxdb_end_record(ctx);
+
+ saxdb_end_record(ctx);
}
- hostserv_conf.nick = str;
+ saxdb_end_record(ctx);
- str = database_get_data(conf_node, "modes", RECDB_QSTRING);
- hostserv_conf.modes = (str ? str : NULL);
-
- /*str = database_get_data(conf_node, "description", RECDB_QSTRING);
- hostserv_conf.description = (str ? str : NULL);*/
+ return 0;
}
-static void hostserv_db_cleanup(void) {
- shutting_down=1;
- close_helpfile(hostserv_helpfile);
- dict_delete(hostserv_func_dict);
- if (reqlog_f)
- fclose(reqlog_f);
+static void hostserv_db_cleanup(void) {
+ hs_free_all();
}
-/* to be continued - some day in the future - maybe? */
int hostserv_init() {
HS_LOG = log_register_type("HostServ", "file:hostserv.log");
- hostserv_func_dict = dict_new();
- /*dict_set_free_data(hosts, delete_memo_account);*/
- /*reg_auth_func(hostserv_check_messages);
- reg_handle_rename_func(hostserv_rename_account);
- reg_unreg_func(hostserv_unreg_account);*/
+
+ const char *nick, *modes;
+ if((nick = conf_get_data("modules/hostserv/nick", RECDB_QSTRING))) {
+ modes = conf_get_data("modules/hostserv/modes", RECDB_QSTRING);
+ hostserv = AddLocalUser(nick, nick, NULL, "Host Service", modes);
+ hostserv_service = service_register(hostserv);
+ hostserv_service->trigger = '*';
+ }
+
conf_register_reload(hostserv_conf_read);
reg_exit_func(hostserv_db_cleanup);
saxdb_register("HostServ", hostserv_saxdb_read, hostserv_saxdb_write);
hostserv_module = module_register("HostServ", HS_LOG, "mod-hostserv.help", NULL);
- modcmd_register(hostserv_module, "view", cmd_view, 3, MODCMD_REQUIRE_AUTHED, NULL);
- modcmd_register(hostserv_module, "addmanager", cmd_addmanager, 1, MODCMD_REQUIRE_AUTHED, NULL);
- modcmd_register(hostserv_module, "delmanager", cmd_delmanager, 2, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "view", cmd_view, 0, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "addmanager", cmd_addmanager, 3, MODCMD_REQUIRE_AUTHED, NULL);
+ modcmd_register(hostserv_module, "delmanager", cmd_delmanager, 3, MODCMD_REQUIRE_AUTHED, NULL);
message_register_table(msgtab);
return 1;
}
int hostserv_finalize(void) {
+ dict_t conf_node;
+ const char *str;
+
+ str = "modules/hostserv";
+ if (!(conf_node = conf_get_data(str, RECDB_OBJECT))) {
+ log_module(HS_LOG, LOG_ERROR, "config node `%s' is missing or has wrong type.", str);
+ return 0;
+ }
+
+ str = database_get_data(conf_node, "nick", RECDB_QSTRING);
+ if (str) hostserv_conf.nick = str;
+
+ str = database_get_data(conf_node, "modes", RECDB_QSTRING);
+ if (str) hostserv_conf.modes = str;
return 1;
-}
\ No newline at end of file
+}