ctdluid is now specified on the command line with the new -u option. Config file...
[citadel.git] / citadel / modules / migrate / serv_migrate.c
index 2005864a1f03f6ba4367a05098df5ddfb408f800..e4d39d0ece7407372d4413b0a038d87ed1d170ea 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This module dumps and/or loads the Citadel database in XML format.
  *
- * Copyright (c) 1987-2014 by the citadel.org team
+ * Copyright (c) 1987-2015 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.
  * GNU General Public License for more details.
  */
 
+/*
+ * Explanation of <progress> tags:
+ *
+ * 0%              nothing
+ * 1%              finished exporting config
+ * 2%              finished exporting control
+ * 7%              finished exporting users
+ * 12%             finished exporting openids
+ * 17%             finished exporting rooms
+ * 18%             finished exporting floors
+ * 25%             finished exporting visits
+ * 100%            finished exporting messages
+ */
+
 #include "sysdep.h"
 #include <stdlib.h>
 #include <unistd.h>
@@ -56,6 +70,7 @@
 char migr_tempfilename1[PATH_MAX];
 char migr_tempfilename2[PATH_MAX];
 FILE *migr_global_message_list;
+int total_msgs = 0;
 
 
 /*
@@ -69,6 +84,10 @@ void xml_strout(char *str) {
 
        char *c = str;
 
+       if (str == NULL) {
+               return;
+       }
+
        while (*c != 0) {
                if (*c == '\"') {
                        client_write("&quot;", 6);
@@ -180,6 +199,19 @@ void migr_export_rooms(void) {
        if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno);
        snprintf(cmd, sizeof cmd, "uniq <%s >%s", migr_tempfilename2, migr_tempfilename1);
        if (system(cmd) != 0) syslog(LOG_ALERT, "Error %d\n", errno);
+
+
+       snprintf(cmd, sizeof cmd, "wc -l %s", migr_tempfilename1);
+       FILE *fp = popen(cmd, "r");
+       if (fp) {
+               fgets(cmd, sizeof cmd, fp);
+               pclose(fp);
+               total_msgs = atoi(cmd);
+       }
+       else {
+               total_msgs = 1; // any nonzero just to keep it from barfing
+       }
+       syslog(LOG_DEBUG, "Total messages to be exported: %d", total_msgs);
 }
 
 
@@ -353,6 +385,8 @@ void migr_export_messages(void) {
        char buf[SIZ];
        long msgnum;
        int count = 0;
+       int progress = 0;
+       int prev_progress = 0;
        CitContext *Ctx;
 
        Ctx = CC;
@@ -366,6 +400,11 @@ void migr_export_messages(void) {
                                migr_export_message(msgnum);
                                ++count;
                        }
+                       progress = (count * 74 / total_msgs) + 25 ;
+                       if ((progress > prev_progress) && (progress < 100)) {
+                               cprintf("<progress>%d</progress>\n", progress);
+                       }
+                       prev_progress = progress;
                }
                fclose(migr_global_message_list);
        }
@@ -389,6 +428,7 @@ void migr_do_export(void) {
        client_write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n", 40);
        client_write("<citadel_migrate_data>\n", 23);
        cprintf("<version>%d</version>\n", REV_LEVEL);
+       cprintf("<progress>%d</progress>\n", 0);
 
        /* export the config file (this is done using x-macros) */
        client_write("<config>\n", 9);
@@ -396,7 +436,6 @@ void migr_do_export(void) {
        client_write("<c_fqdn>", 8);            xml_strout(config.c_fqdn);              client_write("</c_fqdn>\n", 10);
        client_write("<c_humannode>", 13);      xml_strout(config.c_humannode);         client_write("</c_humannode>\n", 15);
        client_write("<c_phonenum>", 12);       xml_strout(config.c_phonenum);          client_write("</c_phonenum>\n", 14);
-       cprintf("<c_ctdluid>%d</c_ctdluid>\n", config.c_ctdluid);
        cprintf("<c_creataide>%d</c_creataide>\n", config.c_creataide);
        cprintf("<c_sleeping>%d</c_sleeping>\n", config.c_sleeping);
        cprintf("<c_initax>%d</c_initax>\n", config.c_initax);
@@ -465,7 +504,9 @@ void migr_do_export(void) {
        cprintf("<c_pop3_fastest>%ld</c_pop3_fastest>\n", config.c_pop3_fastest);
        cprintf("<c_spam_flag_only>%d</c_spam_flag_only>\n", config.c_spam_flag_only);
        cprintf("<c_nntp_port>%d</c_nntp_port>\n", config.c_nntp_port);
+       cprintf("<c_nntps_port>%d</c_nntps_port>\n", config.c_nntps_port);
        client_write("</config>\n", 10);
+       cprintf("<progress>%d</progress>\n", 1);
        
        /* Export the control file */
        get_control();
@@ -474,16 +515,23 @@ void migr_do_export(void) {
        cprintf("<control_flags>%u</control_flags>\n", CitControl.MMflags);
        cprintf("<control_nextuser>%ld</control_nextuser>\n", CitControl.MMnextuser);
        cprintf("<control_nextroom>%ld</control_nextroom>\n", CitControl.MMnextroom);
-       cprintf("<control_version>%d</control_version>\n", CitControl.version);
+       cprintf("<control_version>%d</control_version>\n", CitControl.MM_hosted_upgrade_level);
        client_write("</control>\n", 11);
+       cprintf("<progress>%d</progress>\n", 2);
 
        if (Ctx->kill_me == 0)  migr_export_users();
+       cprintf("<progress>%d</progress>\n", 7);
        if (Ctx->kill_me == 0)  migr_export_openids();
+       cprintf("<progress>%d</progress>\n", 12);
        if (Ctx->kill_me == 0)  migr_export_rooms();
+       cprintf("<progress>%d</progress>\n", 17);
        if (Ctx->kill_me == 0)  migr_export_floors();
+       cprintf("<progress>%d</progress>\n", 18);
        if (Ctx->kill_me == 0)  migr_export_visits();
+       cprintf("<progress>%d</progress>\n", 25);
        if (Ctx->kill_me == 0)  migr_export_messages();
        client_write("</citadel_migrate_data>\n", 24);
+       cprintf("<progress>%d</progress>\n", 100);
        client_write("000\n", 4);
        Ctx->dont_term = 0;
 }
@@ -575,7 +623,6 @@ int migr_config(void *data, const char *el)
        else if (!strcasecmp(el, "c_fqdn"))                     SET_CFGSTRBUF(c_fqdn, migr_chardata);
        else if (!strcasecmp(el, "c_humannode"))                SET_CFGSTRBUF(c_humannode, migr_chardata);
        else if (!strcasecmp(el, "c_phonenum"))                 SET_CFGSTRBUF(c_phonenum, migr_chardata);
-       else if (!strcasecmp(el, "c_ctdluid"))                  config.c_ctdluid = atoi(ChrPtr(migr_chardata));
        else if (!strcasecmp(el, "c_creataide"))                config.c_creataide = atoi(ChrPtr(migr_chardata));
        else if (!strcasecmp(el, "c_sleeping"))                 config.c_sleeping = atoi(ChrPtr(migr_chardata));
        else if (!strcasecmp(el, "c_initax"))                   config.c_initax = atoi(ChrPtr(migr_chardata));
@@ -644,6 +691,7 @@ int migr_config(void *data, const char *el)
        else if (!strcasecmp(el, "c_pop3_fastest"))             config.c_pop3_fastest = atol(ChrPtr(migr_chardata));
        else if (!strcasecmp(el, "c_spam_flag_only"))           config.c_spam_flag_only = atoi(ChrPtr(migr_chardata));
        else if (!strcasecmp(el, "c_nntp_port"))                config.c_nntp_port = atoi(ChrPtr(migr_chardata));
+       else if (!strcasecmp(el, "c_nntps_port"))               config.c_nntps_port = atoi(ChrPtr(migr_chardata));
        else return 0;
        return 1; /* Found above...*/
 }
@@ -654,7 +702,7 @@ int migr_controlrecord(void *data, const char *el)
        else if (!strcasecmp(el, "control_flags"))              CitControl.MMflags = atoi(ChrPtr(migr_chardata));
        else if (!strcasecmp(el, "control_nextuser"))           CitControl.MMnextuser = atol(ChrPtr(migr_chardata));
        else if (!strcasecmp(el, "control_nextroom"))           CitControl.MMnextroom = atol(ChrPtr(migr_chardata));
-       else if (!strcasecmp(el, "control_version"))            CitControl.version = atoi(ChrPtr(migr_chardata));
+       else if (!strcasecmp(el, "control_version"))            CitControl.MM_hosted_upgrade_level = atoi(ChrPtr(migr_chardata));
 
        else if (!strcasecmp(el, "control")) {
                CitControl.MMfulltext = (-1L);  /* always flush */
@@ -1035,7 +1083,6 @@ CTDL_MODULE_INIT(migrate)
        if (!threading)
        {
                CtdlRegisterProtoHook(cmd_migr, "MIGR", "Across-the-wire migration");
-               CtdlRegisterProtoHook(cmd_migr, "ARTV", "Across-the-wire migration (legacy syntax)");
        }
        
        /* return our module name for the log */