X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fmigrate%2Fserv_migrate.c;h=7c62d34652754747a03a03ab6e433f6e67965d1e;hb=9ffea7c3315046ddcea2589656c13da5f5e0c076;hp=83173268239cbc2f69074ee6e24d7ce8f5c2f2f6;hpb=9571de81331e169c042c630800bff1bde499c8a9;p=citadel.git diff --git a/citadel/modules/migrate/serv_migrate.c b/citadel/modules/migrate/serv_migrate.c index 831732682..7c62d3465 100644 --- a/citadel/modules/migrate/serv_migrate.c +++ b/citadel/modules/migrate/serv_migrate.c @@ -1,7 +1,7 @@ /* * This module dumps and/or loads the Citadel database in XML format. * - * Copyright (c) 1987-2015 by the citadel.org team + * Copyright (c) 1987-2019 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3. @@ -69,6 +69,7 @@ char migr_tempfilename1[PATH_MAX]; char migr_tempfilename2[PATH_MAX]; FILE *migr_global_message_list; int total_msgs = 0; +char *ikey = NULL; // If we're importing a config key we store it here. /****************************************************************************** @@ -76,7 +77,7 @@ int total_msgs = 0; ******************************************************************************/ /* - * Output a string to the client with these characters escaped: & < > + * Output a string to the client with these characters escaped: & < > " ' */ void xml_strout(char *str) { @@ -113,19 +114,27 @@ void xml_strout(char *str) { /* * Export a user record as XML */ -void migr_export_users_backend(struct ctdluser *buf, void *data) { +void migr_export_users_backend(char *username, void *data) { + + struct ctdluser u; + if (CtdlGetUser(&u, username) != 0) { + return; + } + client_write(HKEY("\n")); - cprintf("%d\n", buf->version); - cprintf("%ld\n", (long)buf->uid); - client_write(HKEY("")); xml_strout(buf->password); client_write(HKEY("\n")); - cprintf("%u\n", buf->flags); - cprintf("%ld\n", buf->timescalled); - cprintf("%ld\n", buf->posted); - cprintf("%d\n", buf->axlevel); - cprintf("%ld\n", buf->usernum); - cprintf("%ld\n", (long)buf->lastcall); - cprintf("%d\n", buf->USuserpurge); - client_write(HKEY("")); xml_strout(buf->fullname); client_write(HKEY("\n")); + cprintf("%d\n", u.version); + cprintf("%ld\n", (long)u.uid); + client_write(HKEY("")); xml_strout(u.password); client_write(HKEY("\n")); + cprintf("%u\n", u.flags); + cprintf("%ld\n", u.timescalled); + cprintf("%ld\n", u.posted); + cprintf("%d\n", u.axlevel); + cprintf("%ld\n", u.usernum); + cprintf("%ld\n", (long)u.lastcall); + cprintf("%d\n", u.USuserpurge); + client_write(HKEY("")); xml_strout(u.fullname); client_write(HKEY("\n")); + cprintf("%ld\n", u.msgnum_bio); + cprintf("%ld\n", u.msgnum_pic); client_write(HKEY("\n")); } @@ -154,7 +163,6 @@ void migr_export_rooms_backend(struct ctdlroom *buf, void *data) { xml_strout(buf->QRdirname); client_write(HKEY("\n")); } - cprintf("%ld\n", buf->QRinfo); cprintf("%d\n", buf->QRfloor); cprintf("%ld\n", (long)buf->QRmtime); cprintf("%d\n", buf->QRep.expire_mode); @@ -163,6 +171,8 @@ void migr_export_rooms_backend(struct ctdlroom *buf, void *data) { cprintf("%d\n", buf->QRorder); cprintf("%u\n", buf->QRflags2); cprintf("%d\n", buf->QRdefaultview); + cprintf("%ld\n", buf->msgnum_info); + cprintf("%ld\n", buf->msgnum_pic); client_write(HKEY("\n")); /* message list goes inside this tag */ @@ -194,9 +204,9 @@ void migr_export_rooms(void) { * exporting the message multiple times.) */ snprintf(cmd, sizeof cmd, "sort -n <%s >%s", migr_tempfilename1, migr_tempfilename2); - if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno); + if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d", errno); snprintf(cmd, sizeof cmd, "uniq <%s >%s", migr_tempfilename2, migr_tempfilename1); - if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno); + if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d", errno); snprintf(cmd, sizeof cmd, "wc -l %s", migr_tempfilename1); @@ -249,7 +259,6 @@ int is_sequence_set(char *s) { } - /* * Traverse the visits file... */ @@ -326,7 +335,6 @@ void migr_export_message(long msgnum) { cprintf("%d\n", smi.meta_refcount); cprintf("%ld\n", smi.meta_rfc822_length); client_write(HKEY("")); xml_strout(smi.meta_content_type); client_write(HKEY("\n")); - client_write(HKEY("")); xml_strout(smi.mimetype); client_write(HKEY("\n")); client_write(HKEY("")); CtdlSerializeMessage(&smr, msg); @@ -356,14 +364,13 @@ void migr_export_message(long msgnum) { } - void migr_export_openids(void) { struct cdbdata *cdboi; long usernum; char url[512]; - cdb_rewind(CDB_OPENID); - while (cdboi = cdb_next_item(CDB_OPENID), cdboi != NULL) { + cdb_rewind(CDB_EXTAUTH); + while (cdboi = cdb_next_item(CDB_EXTAUTH), cdboi != NULL) { if (cdboi->len > sizeof(long)) { client_write(HKEY("\n")); memcpy(&usernum, cdboi->ptr, sizeof(long)); @@ -402,8 +409,6 @@ void migr_export_configs(void) { } - - void migr_export_messages(void) { char buf[SIZ]; long msgnum; @@ -415,7 +420,7 @@ void migr_export_messages(void) { Ctx = CC; migr_global_message_list = fopen(migr_tempfilename1, "r"); if (migr_global_message_list != NULL) { - syslog(LOG_INFO, "Opened %s\n", migr_tempfilename1); + syslog(LOG_INFO, "Opened %s", migr_tempfilename1); while ((Ctx->kill_me == 0) && (fgets(buf, sizeof(buf), migr_global_message_list) != NULL)) { msgnum = atol(buf); @@ -431,16 +436,17 @@ void migr_export_messages(void) { } fclose(migr_global_message_list); } - if (Ctx->kill_me == 0) - syslog(LOG_INFO, "Exported %d messages.\n", count); - else - syslog(LOG_ERR, "Export aborted due to client disconnect! \n"); + if (Ctx->kill_me == 0) { + syslog(LOG_INFO, "Exported %d messages.", count); + } + else { + syslog(LOG_ERR, "Export aborted due to client disconnect!"); + } migr_export_message(-1L); /* This frees the encoding buffer */ } - void migr_do_export(void) { CitContext *Ctx; @@ -475,8 +481,6 @@ void migr_do_export(void) { } - - /****************************************************************************** * Import code * * Here's the code that implements the import side. It's going to end up * @@ -533,7 +537,7 @@ void migr_xml_start(void *data, const char *el, const char **attr) { } if (citadel_migrate_data != 1) { - syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!\n", el); + syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!", el); return; } @@ -552,7 +556,16 @@ void migr_xml_start(void *data, const char *el, const char **attr) { import_msgnum = 0; } else if (!strcasecmp(el, "config")) { - syslog(LOG_DEBUG, "\033[31m IMPORT OF CONFIG START ELEMENT FIXME\033\0m"); + if (ikey != NULL) { + free(ikey); + ikey = NULL; + } + while (*attr) { + if (!strcasecmp(attr[0], "key")) { + ikey = strdup(attr[1]); + } + attr += 2; + } } } @@ -571,20 +584,22 @@ int migr_userrecord(void *data, const char *el) else if (!strcasecmp(el, "u_lastcall")) usbuf.lastcall = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "u_USuserpurge")) usbuf.USuserpurge = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "u_fullname")) safestrncpy(usbuf.fullname, ChrPtr(migr_chardata), sizeof usbuf.fullname); + else if (!strcasecmp(el, "u_msgnum_bio")) usbuf.msgnum_bio = atol(ChrPtr(migr_chardata)); + else if (!strcasecmp(el, "u_msgnum_pic")) usbuf.msgnum_pic = atol(ChrPtr(migr_chardata)); else return 0; return 1; } + int migr_roomrecord(void *data, const char *el) { - if (!strcasecmp(el, "QRname")) safestrncpy(qrbuf.QRname, ChrPtr(migr_chardata), sizeof qrbuf.QRname); + if (!strcasecmp(el, "QRname")) safestrncpy(qrbuf.QRname, ChrPtr(migr_chardata), sizeof qrbuf.QRname); else if (!strcasecmp(el, "QRpasswd")) safestrncpy(qrbuf.QRpasswd, ChrPtr(migr_chardata), sizeof qrbuf.QRpasswd); else if (!strcasecmp(el, "QRroomaide")) qrbuf.QRroomaide = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRhighest")) qrbuf.QRhighest = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRgen")) qrbuf.QRgen = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRflags")) qrbuf.QRflags = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRdirname")) safestrncpy(qrbuf.QRdirname, ChrPtr(migr_chardata), sizeof qrbuf.QRdirname); - else if (!strcasecmp(el, "QRinfo")) qrbuf.QRinfo = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRfloor")) qrbuf.QRfloor = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRmtime")) qrbuf.QRmtime = atol(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRexpire_mode")) qrbuf.QRep.expire_mode = atoi(ChrPtr(migr_chardata)); @@ -593,13 +608,16 @@ int migr_roomrecord(void *data, const char *el) else if (!strcasecmp(el, "QRorder")) qrbuf.QRorder = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRflags2")) qrbuf.QRflags2 = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "QRdefaultview")) qrbuf.QRdefaultview = atoi(ChrPtr(migr_chardata)); + else if (!strcasecmp(el, "msgnum_info")) qrbuf.msgnum_info = atol(ChrPtr(migr_chardata)); + else if (!strcasecmp(el, "msgnum_pic")) qrbuf.msgnum_pic = atol(ChrPtr(migr_chardata)); else return 0; return 1; } + int migr_floorrecord(void *data, const char *el) { - if (!strcasecmp(el, "f_num")) floornum = atoi(ChrPtr(migr_chardata)); + if (!strcasecmp(el, "f_num")) floornum = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "f_flags")) flbuf.f_flags = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "f_name")) safestrncpy(flbuf.f_name, ChrPtr(migr_chardata), sizeof flbuf.f_name); else if (!strcasecmp(el, "f_ref_count")) flbuf.f_ref_count = atoi(ChrPtr(migr_chardata)); @@ -609,6 +627,7 @@ int migr_floorrecord(void *data, const char *el) return 1; } + int migr_visitrecord(void *data, const char *el) { if (!strcasecmp(el, "v_roomnum")) vbuf.v_roomnum = atol(ChrPtr(migr_chardata)); @@ -652,7 +671,7 @@ void migr_xml_end(void *data, const char *el) } if (citadel_migrate_data != 1) { - syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!\n", el); + syslog(LOG_ALERT, "Out-of-sequence tag <%s> detected. Warning: ODD-DATA!", el); return; } @@ -662,8 +681,16 @@ void migr_xml_end(void *data, const char *el) if (!strcasecmp(el, "config")) { - syslog(LOG_DEBUG, "\033[31m IMPORT OF CONFIG END ELEMENT FIXME\033\0m"); - CtdlSetConfigInt("c_enable_fulltext", 0); /* always disable FIXME put this somewhere more appropriate */ + syslog(LOG_DEBUG, "Imported config key=%s", ikey); + + if (ikey != NULL) { + CtdlSetConfigStr(ikey, (char *)ChrPtr(migr_chardata)); + free(ikey); + ikey = NULL; + } + else { + syslog(LOG_INFO, "Closed a tag but no key name was supplied."); + } } /*** USER ***/ @@ -672,7 +699,7 @@ void migr_xml_end(void *data, const char *el) ; /* Nothing to do anymore */ else if (!strcasecmp(el, "user")) { CtdlPutUser(&usbuf); - syslog(LOG_INFO, "Imported user: %s\n", usbuf.fullname); + syslog(LOG_INFO, "Imported user: %s", usbuf.fullname); } /*** OPENID ***/ @@ -687,9 +714,9 @@ void migr_xml_end(void *data, const char *el) oid_data = malloc(oid_data_len); memcpy(oid_data, &openid_usernum, sizeof(long)); memcpy(&oid_data[sizeof(long)], openid_url, strlen(openid_url) + 1); - cdb_store(CDB_OPENID, openid_url, strlen(openid_url), oid_data, oid_data_len); + cdb_store(CDB_EXTAUTH, openid_url, strlen(openid_url), oid_data, oid_data_len); free(oid_data); - syslog(LOG_INFO, "Imported OpenID: %s (%ld)\n", openid_url, openid_usernum); + syslog(LOG_INFO, "Imported OpenID: %s (%ld)", openid_url, openid_usernum); } /*** ROOM ***/ @@ -698,7 +725,7 @@ void migr_xml_end(void *data, const char *el) ; /* Nothing to do anymore */ else if (!strcasecmp(el, "room")) { CtdlPutRoom(&qrbuf); - syslog(LOG_INFO, "Imported room: %s\n", qrbuf.QRname); + syslog(LOG_INFO, "Imported room: %s", qrbuf.QRname); } /*** ROOM MESSAGE POINTERS ***/ @@ -711,7 +738,7 @@ void migr_xml_end(void *data, const char *el) msglist_alloc = 1000; msglist = malloc(sizeof(long) * msglist_alloc); - syslog(LOG_DEBUG, "Message list for: %s\n", FRname); + syslog(LOG_DEBUG, "Message list for: %s", FRname); ptr = ChrPtr(migr_chardata); while (*ptr != 0) { @@ -739,7 +766,7 @@ void migr_xml_end(void *data, const char *el) free(msglist); msglist = NULL; msglist_alloc = 0; - syslog(LOG_DEBUG, "Imported %d messages.\n", msgcount); + syslog(LOG_DEBUG, "Imported %d messages.", msgcount); if (server_shutting_down) { return; } @@ -752,16 +779,16 @@ void migr_xml_end(void *data, const char *el) else if (!strcasecmp(el, "floor")) { CtdlPutFloor(&flbuf, floornum); - syslog(LOG_INFO, "Imported floor #%d (%s)\n", floornum, flbuf.f_name); + syslog(LOG_INFO, "Imported floor #%d (%s)", floornum, flbuf.f_name); } /*** VISITS ***/ - else if ((!strncasecmp(el, HKEY("v_"))) && - migr_visitrecord(data, el)) + else if ((!strncasecmp(el, HKEY("v_"))) && migr_visitrecord(data, el)) { ; /* Nothing to do anymore */ + } else if (!strcasecmp(el, "visit")) { put_visit(&vbuf); - syslog(LOG_INFO, "Imported visit: %ld/%ld/%ld\n", vbuf.v_roomnum, vbuf.v_roomgen, vbuf.v_usernum); + syslog(LOG_INFO, "Imported visit: %ld/%ld/%ld", vbuf.v_roomnum, vbuf.v_roomgen, vbuf.v_usernum); } /*** MESSAGES ***/ @@ -770,7 +797,6 @@ void migr_xml_end(void *data, const char *el) else if (!strcasecmp(el, "msg_meta_refcount")) smi.meta_refcount = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "msg_meta_rfc822_length")) smi.meta_rfc822_length = atoi(ChrPtr(migr_chardata)); else if (!strcasecmp(el, "msg_meta_content_type")) safestrncpy(smi.meta_content_type, ChrPtr(migr_chardata), sizeof smi.meta_content_type); - else if (!strcasecmp(el, "msg_mimetype")) safestrncpy(smi.mimetype, ChrPtr(migr_chardata), sizeof smi.mimetype); else if (!strcasecmp(el, "msg_text")) { @@ -795,14 +821,14 @@ void migr_xml_end(void *data, const char *el) } syslog(LOG_INFO, - "%s message #%ld, size=%d, refcount=%d, bodylength=%ld, content-type: %s / %s \n", + "%s message #%ld, size=%d, refcount=%d, bodylength=%ld, content-type: %s", (rc!= 0)?"failed to import ":"Imported ", import_msgnum, StrLength(migr_MsgData), smi.meta_refcount, smi.meta_rfc822_length, - smi.meta_content_type, - smi.mimetype); + smi.meta_content_type + ); memset(&smi, 0, sizeof(smi)); } @@ -812,8 +838,6 @@ void migr_xml_end(void *data, const char *el) } - - /* * Import begins here */ @@ -842,9 +866,7 @@ void migr_do_import(void) { client_set_inbound_buf(SIZ * 10); while (!Finished && client_read_random_blob(Buf, -1) >= 0) { - if ((StrLength(Buf) > 4) && - !strcmp(ChrPtr(Buf) + StrLength(Buf) - 4, "000\n")) - { + if ((StrLength(Buf) > 4) && !strcmp(ChrPtr(Buf) + StrLength(Buf) - 4, "000\n")) { Finished = 1; StrBufCutAt(Buf, StrLength(Buf) - 4, NULL); } @@ -865,11 +887,11 @@ void migr_do_import(void) { FreeStrBuf(&migr_MsgData); rebuild_euid_index(); rebuild_usersbynumber(); + CtdlSetConfigInt("MM_fulltext_wordbreaker", -1); // Set an invalid wordbreaker to force re-indexing CC->dont_term = 0; } - /****************************************************************************** * Dispatcher, Common code * ******************************************************************************/ @@ -878,17 +900,13 @@ void migr_do_import(void) { */ void migr_do_listdirs(void) { cprintf("%d Don't forget these:\n", LISTING_FOLLOWS); - cprintf("bio|%s\n", ctdl_bio_dir); cprintf("files|%s\n", ctdl_file_dir); - cprintf("userpics|%s\n", ctdl_usrpic_dir); cprintf("messages|%s\n", ctdl_message_dir); - cprintf("netconfigs|%s\n", ctdl_netcfg_dir); cprintf("keys|%s\n", ctdl_key_dir); - cprintf("images|%s\n", ctdl_image_dir); - cprintf("info|%s\n", ctdl_info_dir); cprintf("000\n"); } + /****************************************************************************** * Repair database integrity * ******************************************************************************/ @@ -959,14 +977,13 @@ int migr_restore_message_metadata(long msgnum, int refcount) smi.meta_rfc822_length = StrLength(CCC->redirect_buffer); CCC->redirect_buffer = NULL; - syslog(LOG_INFO, - "Setting message #%ld meta data to: refcount=%d, bodylength=%ld, content-type: %s / %s \n", + "Setting message #%ld meta data to: refcount=%d, bodylength=%ld, content-type: %s", smi.meta_msgnum, smi.meta_refcount, smi.meta_rfc822_length, - smi.meta_content_type, - smi.mimetype); + smi.meta_content_type + ); PutMetaData(&smi); @@ -975,6 +992,7 @@ int migr_restore_message_metadata(long msgnum, int refcount) return 0; } + void migr_check_room_msg(long msgnum, void *userdata) { fprintf(migr_global_message_list, "%ld %s\n", msgnum, CC->room.QRname); } @@ -988,6 +1006,7 @@ void migr_check_rooms_backend(struct ctdlroom *buf, void *data) { CtdlForEachMessage(MSGS_ALL, 0L, NULL, NULL, NULL, migr_check_room_msg, NULL); } + void RemoveMessagesFromRooms(StrBuf *RoomNameVec, long msgnum) { struct MetaData smi; const char *Pos = NULL; @@ -1000,13 +1019,14 @@ void RemoveMessagesFromRooms(StrBuf *RoomNameVec, long msgnum) { CtdlDeleteMessages(ChrPtr(oneRoom), &msgnum, 1, ""); }; GetMetaData(&smi, msgnum); - TDAP_AdjRefCount(msgnum, -smi.meta_refcount); + AdjRefCount(msgnum, -smi.meta_refcount); } + void migr_do_restore_meta(void) { char buf[SIZ]; int failGetMessage; - long msgnum; + long msgnum = 0; int lastnum = 0; int refcount = 0; CitContext *Ctx; @@ -1027,13 +1047,13 @@ void migr_do_restore_meta(void) { * exporting the message multiple times.) */ snprintf(cmd, sizeof cmd, "sort -n <%s >%s", migr_tempfilename1, migr_tempfilename2); - if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno); + if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d", errno); RoomNames = NewStrBuf(); Ctx = CC; migr_global_message_list = fopen(migr_tempfilename2, "r"); if (migr_global_message_list != NULL) { - syslog(LOG_INFO, "Opened %s\n", migr_tempfilename1); + syslog(LOG_INFO, "Opened %s", migr_tempfilename1); while ((Ctx->kill_me == 0) && (fgets(buf, sizeof(buf), migr_global_message_list) != NULL)) { msgnum = atol(buf); @@ -1050,14 +1070,16 @@ void migr_do_restore_meta(void) { } refcount = 1; lastnum = msgnum; - if (prn != NULL) + if (prn != NULL) { StrBufPlain(RoomNames, prn + 1, -1); + } StrBufTrim(RoomNames); } else { if (prn != NULL) { - if (StrLength(RoomNames) > 0) + if (StrLength(RoomNames) > 0) { StrBufAppendBufPlain(RoomNames, HKEY("|"), 0); + } StrBufAppendBufPlain(RoomNames, prn, -1, 1); StrBufTrim(RoomNames); } @@ -1078,8 +1100,6 @@ void migr_do_restore_meta(void) { } - - /****************************************************************************** * Dispatcher, Common code * ******************************************************************************/ @@ -1088,8 +1108,7 @@ void cmd_migr(char *cmdbuf) { if (CtdlAccessCheck(ac_internal)) return; - if (CtdlTrySingleUser()) - { + if (CtdlTrySingleUser()) { CtdlDisableHouseKeeping(); CtdlMakeTempFileName(migr_tempfilename1, sizeof migr_tempfilename1); CtdlMakeTempFileName(migr_tempfilename2, sizeof migr_tempfilename2); @@ -1117,12 +1136,12 @@ void cmd_migr(char *cmdbuf) { CtdlEnableHouseKeeping(); CtdlEndSingleUser(); } - else - { + else { cprintf("%d The migrator is already running.\n", ERROR + RESOURCE_BUSY); } } + /****************************************************************************** * Module Hook * ******************************************************************************/