]> code.citadel.org Git - citadel.git/blobdiff - citadel/ctdlmigrate.c
removed StartLibCitadel()
[citadel.git] / citadel / ctdlmigrate.c
index ad50ea9d9dfec03bdced89ef60b2b306985b3d09..21dad4b24f87f331956542a95ced05e13db28ace 100644 (file)
@@ -1,17 +1,21 @@
 /*
- * $Id$
- *
  * Across-the-wire migration utility for Citadel
  *
  * Yes, we used goto, and gets(), and committed all sorts of other heinous sins here.
  * The scope of this program isn't wide enough to make a difference.  If you don't like
  * it you can rewrite it.
  *
- * Copyright (c) 2009 citadel.org
+ * Copyright (c) 2009-2021 citadel.org
+ *
+ * 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.
  *
- * This program is licensed to you under the terms of the GNU General Public License v3
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
  *
- * FIXME handle -h on both sides
+ * (Note: a useful future enhancement might be to support "-h" on both sides)
  *
  */
 
@@ -37,9 +41,6 @@
 #include "sysdep.h"
 #include "config.h"
 #include "citadel_dirs.h"
-#if HAVE_BACKTRACE
-#include <execinfo.h>
-#endif
 
 
 
@@ -51,7 +52,7 @@
 void getz(char *buf) {
        char *ptr;
 
-       ptr = fgets(buf, 32767, stdin);
+       ptr = fgets(buf, SIZ, stdin);
        if (!ptr) {
                buf[0] = 0;
                return;
@@ -65,11 +66,7 @@ void getz(char *buf) {
 
 
 
-int main(int argc, char *argv[])
-{
-       int relh=0;
-       int home=0;
-       char relhome[PATH_MAX]="";
+int main(int argc, char *argv[]) {
        char ctdldir[PATH_MAX]=CTDLDIR;
        char yesno[5];
        char sendcommand[PATH_MAX];
@@ -77,21 +74,24 @@ int main(int argc, char *argv[])
        char cmd[PATH_MAX];
        char buf[PATH_MAX];
        char socket_path[PATH_MAX];
-       char remote_user[256];
-       char remote_host[256];
+       char remote_user[SIZ];
+       char remote_host[SIZ];
        char remote_sendcommand[PATH_MAX];
        FILE *sourcefp = NULL;
        FILE *targetfp = NULL;
        int linecount = 0;
        char spinning[4] = "-\\|/" ;
        int exitcode = 0;
-       pid_t sshpid;
        
-       calc_dirs_n_files(relh, home, relhome, ctdldir, 0);
        CtdlMakeTempFileName(socket_path, sizeof socket_path);
+       if (chdir(ctdldir) != 0) {
+               fprintf(stderr, "sendcommand: %s: %s\n", ctdldir, strerror(errno));
+               exit(errno);
+       }
 
-       cmdexit = system("clear");
-       printf( "-------------------------------------------\n"
+
+       printf( "\033[2J\033[H\n"
+               "-------------------------------------------\n"
                "Over-the-wire migration utility for Citadel\n"
                "-------------------------------------------\n"
                "\n"
@@ -99,7 +99,7 @@ int main(int argc, char *argv[])
                "to a new host system via a network connection, without disturbing\n"
                "the source system.  The target may be a different CPU architecture\n"
                "and/or operating system.  The source system should be running\n"
-               "Citadel %d.%02d or newer, and the target system should be running\n"
+               "Citadel version %d or newer, and the target system should be running\n"
                "either the same version or a newer version.  You will also need\n"
                "the 'rsync' utility, and OpenSSH v4 or newer.\n"
                "\n"
@@ -108,8 +108,7 @@ int main(int argc, char *argv[])
                "\n"
                "Do you wish to continue? "
                ,
-               EXPORT_REV_MIN / 100,
-               EXPORT_REV_MIN % 100
+               EXPORT_REV_MIN
        );
 
        if ((fgets(yesno, sizeof yesno, stdin) == NULL) || (tolower(yesno[0]) != 'y')) {
@@ -134,45 +133,23 @@ int main(int argc, char *argv[])
                "(example: ctdl.foo.org)\n"
                "--> ");
        getz(remote_host);
+
+get_remote_user:
        printf("\nEnter the name of a user on %s who has full access to Citadel files\n"
                "(usually root)\n--> ",
                remote_host);
        getz(remote_user);
+       if (IsEmptyStr(remote_user))
+               goto get_remote_user;
 
-       sshpid = fork();
-       if (sshpid < 0)
-       {
-               printf("\n%s\n", strerror(errno));
-               exitcode = errno;
-               goto THEEND;
-       }
-       else if (sshpid == 0)
-       {
-               printf("\nEstablishing an SSH connection to the source system...\n\n");
-               unlink(socket_path);
-               snprintf(cmd, sizeof cmd, "%s@%s", remote_user, remote_host);
-               execlp("ssh", "ssh", "-MNf", "-S", socket_path, cmd, NULL);
-               cmdexit = errno;
-               printf("\n%s\n", strerror(cmdexit));
-               exit(cmdexit);          /* child process exits */
-       }
-
-       /* If we get here we are the parent process */
-       if (waitpid(sshpid, &cmdexit, 0) <= 0) {
-               exitcode = errno;
-               printf("\n%s\n", strerror(errno));
-               goto THEEND;
-       }
-
-       if (WIFSIGNALED(cmdexit)) {
-               exitcode = errno;
-               printf("\n%s\n", strerror(errno));
-               goto THEEND;
-       }
-
-       if ((WIFEXITED(cmdexit)) && (WEXITSTATUS(cmdexit) != 0)) {
-               exitcode = WEXITSTATUS(cmdexit);
-               printf("\n%s\n", strerror(errno));
+       printf("\nEstablishing an SSH connection to the source system...\n\n");
+       unlink(socket_path);
+       snprintf(cmd, sizeof cmd, "ssh -MNf -S %s %s@%s", socket_path, remote_user, remote_host);
+       cmdexit = system(cmd);
+       printf("\n");
+       if (cmdexit != 0) {
+               printf("This program was unable to establish an SSH session to the source system.\n\n");
+               exitcode = cmdexit;
                goto THEEND;
        }
 
@@ -217,6 +194,8 @@ int main(int argc, char *argv[])
        }
 
        printf("ctdlmigrate will now begin a database migration...\n");
+       printf("  if the system doesn't start working, \n");
+       printf("  have a look at the syslog for pending jobs needing to be terminated.\n");
 
        snprintf(cmd, sizeof cmd, "ssh -S %s %s@%s %s -w3600 MIGR export",
                socket_path, remote_user, remote_host, remote_sendcommand);
@@ -265,38 +244,18 @@ FAIL:     if (sourcefp) pclose(sourcefp);
        while ((fgets(buf, sizeof buf, sourcefp)) && (strcmp(buf, "000"))) {
                buf[strlen(buf)-1] = 0;
 
-               if (!strncasecmp(buf, "bio|", 4)) {
-                       snprintf(cmd, sizeof cmd, "rsync -va --rsh='ssh -S %s' %s@%s:%s/ %s/",
-                               socket_path, remote_user, remote_host, &buf[4], ctdl_bio_dir);
-               }
-               else if (!strncasecmp(buf, "files|", 6)) {
+               if (!strncasecmp(buf, "files|", 6)) {
                        snprintf(cmd, sizeof cmd, "rsync -va --rsh='ssh -S %s' %s@%s:%s/ %s/",
                                socket_path, remote_user, remote_host, &buf[6], ctdl_file_dir);
                }
-               else if (!strncasecmp(buf, "userpics|", 9)) {
-                       snprintf(cmd, sizeof cmd, "rsync -va --rsh='ssh -S %s' %s@%s:%s/ %s/",
-                               socket_path, remote_user, remote_host, &buf[9], ctdl_usrpic_dir);
-               }
                else if (!strncasecmp(buf, "messages|", 9)) {
                        snprintf(cmd, sizeof cmd, "rsync -va --rsh='ssh -S %s' %s@%s:%s/ %s/",
                                socket_path, remote_user, remote_host, &buf[9], ctdl_message_dir);
                }
-               else if (!strncasecmp(buf, "netconfigs|", 11)) {
-                       snprintf(cmd, sizeof cmd, "rsync -va --rsh='ssh -S %s' %s@%s:%s/ %s/",
-                               socket_path, remote_user, remote_host, &buf[11], ctdl_netcfg_dir);
-               }
                else if (!strncasecmp(buf, "keys|", 5)) {
                        snprintf(cmd, sizeof cmd, "rsync -va --rsh='ssh -S %s' %s@%s:%s/ %s/",
                                socket_path, remote_user, remote_host, &buf[5], ctdl_key_dir);
                }
-               else if (!strncasecmp(buf, "images|", 7)) {
-                       snprintf(cmd, sizeof cmd, "rsync -va --rsh='ssh -S %s' %s@%s:%s/ %s/",
-                               socket_path, remote_user, remote_host, &buf[7], ctdl_image_dir);
-               }
-               else if (!strncasecmp(buf, "info|", 5)) {
-                       snprintf(cmd, sizeof cmd, "rsync -va --rsh='ssh -S %s' %s@%s:%s/ %s/",
-                               socket_path, remote_user, remote_host, &buf[5], ctdl_info_dir);
-               }
                else {
                        strcpy(cmd, "false");   /* cheap and sleazy way to throw an error */
                }
@@ -308,7 +267,22 @@ FAIL:      if (sourcefp) pclose(sourcefp);
        }
        pclose(sourcefp);
 
-THEEND:        kill(sshpid, SIGKILL);
+THEEND:        if (exitcode == 0) {
+               printf("\n\n *** Citadel migration was successful! *** \n\n");
+       }
+       else {
+               printf("\n\n *** Citadel migration was unsuccessful. *** \n\n");
+       }
+       printf("\nShutting down the socket connection...\n\n");
+       snprintf(cmd, sizeof cmd, "ssh -S %s -N -O exit %s@%s",
+               socket_path, remote_user, remote_host);
+       cmdexit = system(cmd);
+       printf("\n");
+       if (cmdexit != 0) {
+               printf("There was an error shutting down the socket.\n\n");
+               exitcode = cmdexit;
+       }
+
        unlink(socket_path);
        exit(exitcode);
 }