* ctdlmigrate utility (not finished)
authorArt Cancro <ajc@citadel.org>
Fri, 24 Apr 2009 03:21:22 +0000 (03:21 +0000)
committerArt Cancro <ajc@citadel.org>
Fri, 24 Apr 2009 03:21:22 +0000 (03:21 +0000)
citadel/Makefile.in
citadel/ctdlmigrate.c [new file with mode: 0644]

index 8b227a0faaecb803201765c60322df9a44db888c..4e0743d255fbf86e65786fb4209c4fb08d988f08 100644 (file)
@@ -40,7 +40,8 @@ UTIL_TARGETS=citmail$(EXEEXT) sendcommand$(EXEEXT)
 
 UTILBIN_TARGETS= base64$(EXEEXT) setup$(EXEEXT) \
        chkpw$(EXEEXT) chkpwd$(EXEEXT) userlist$(EXEEXT) \
-       getmail$(EXEEXT) aidepost$(EXEEXT) msgform$(EXEEXT)
+       getmail$(EXEEXT) aidepost$(EXEEXT) msgform$(EXEEXT) \
+       ctdlmigrate$(EXEEXT)
 
 prefix=@prefix@
 srcdir=@srcdir@
@@ -81,7 +82,7 @@ SOURCES=aidepost.c auth.c base64.c chkpwd.c chkpw.c citadel.c citadel_ipc.c \
        screen.c sendcommand.c getmail.c \
        server_main.c setup.c snprintf.c ldap.c \
        stress.c support.c sysdep.c user_ops.c userlist.c \
-       whobbs.c journaling.c citadel_dirs.c threads.c
+       whobbs.c journaling.c citadel_dirs.c threads.c ctdlmigrate.c
 
 
 include Make_sources
@@ -148,6 +149,9 @@ citmail$(EXEEXT): citmail.o citadel_dirs.o
 setup$(EXEEXT): setup.o citadel_dirs.o
        $(CC) setup.o citadel_dirs.o $(LDFLAGS) -o setup$(EXEEXT) $(LIBS) $(SETUP_LIBS)
 
+ctdlmigrate$(EXEEXT): ctdlmigrate.o citadel_dirs.o
+       $(CC) ctdlmigrate.o citadel_dirs.o $(LDFLAGS) -o ctdlmigrate$(EXEEXT) $(LIBS)
+
 chkpwd$(EXEEXT): chkpwd.o auth.o
        $(CC) chkpwd.o auth.o $(LDFLAGS) -o chkpwd$(EXEEXT) $(chkpwd_LIBS)
 
diff --git a/citadel/ctdlmigrate.c b/citadel/ctdlmigrate.c
new file mode 100644 (file)
index 0000000..7a53a8f
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * $Id: $
+ *
+ * Across-the-wire migration utility for Citadel
+ *
+ * Copyright (c) 2009 citadel.org
+ *
+ * This program is licensed to you under the terms of the GNU General Public License v3
+ *
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/utsname.h>
+#include <sys/wait.h>
+#include <signal.h>
+#include <netdb.h>
+#include <errno.h>
+#include <limits.h>
+#include <pwd.h>
+#include <time.h>
+#include <libcitadel.h>
+#include "citadel.h"
+#include "axdefs.h"
+#include "sysdep.h"
+#include "config.h"
+#include "citadel_dirs.h"
+#if HAVE_BACKTRACE
+#include <execinfo.h>
+#endif
+
+
+
+
+int main(int argc, char *argv[])
+{
+       int relh=0;
+       int home=0;
+       char relhome[PATH_MAX]="";
+       char ctdldir[PATH_MAX]=CTDLDIR;
+       char yesno[5];
+       char sendcommand[PATH_MAX];
+       int exitcode;
+       char cmd[PATH_MAX];
+       char socket_path[PATH_MAX];
+       char remote_user[256];
+       char remote_host[256];
+       
+       calc_dirs_n_files(relh, home, relhome, ctdldir, 0);
+       CtdlMakeTempFileName(socket_path, sizeof socket_path);
+
+       system("clear");
+       printf( "-------------------------------------------\n"
+               "Over-the-wire migration utility for Citadel\n"
+               "-------------------------------------------\n"
+               "\n"
+               "This utility is designed to migrate your Citadel installation\n"
+               "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"
+               "either the same version or a newer version.  You will also need\n"
+               "the 'rsync' utility, and OpenSSH v4 or newer.\n"
+               "\n"
+               "You must run this utility on the TARGET SYSTEM.  Any existing data\n"
+               "on this system will be ERASED.\n"
+               "\n"
+               "Do you wish to continue? "
+               ,
+               EXPORT_REV_MIN / 100,
+               EXPORT_REV_MIN % 100
+       );
+
+       if ((fgets(yesno, sizeof yesno, stdin) == NULL) || (tolower(yesno[0]) != 'y')) {
+               exit(0);
+       }
+
+       printf("\n\nGreat!  First we will check some things out here on our target\n"
+               "system to make sure it is ready to receive data.\n\n");
+
+       printf("Locating 'sendcommand' and checking connectivity to Citadel...\n");
+       snprintf(sendcommand, sizeof sendcommand, "%s/sendcommand", ctdl_utilbin_dir);
+       snprintf(cmd, sizeof cmd, "%s 'NOOP'", sendcommand);
+       exitcode = system(cmd);
+       if (exitcode != 0) {
+               printf("\nctdlmigrate was unable to attach to the Citadel server\n"
+                       "here on the target system.  Is Citadel running?\n\n");
+               exit(1);
+       }
+       printf("\nOK, this side is ready to go.  Now we must connect to the source system.\n\n");
+
+       printf("Enter the host name or IP address of the source system\n"
+               "(example: ctdl.foo.org)\n"
+               "--> ");
+       gets(remote_host);
+       printf("\nEnter the name of a user on %s who has full access to Citadel files\n"
+               "(usually root)\n--> ",
+               remote_host);
+       gets(remote_user);
+
+       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);
+       exitcode = system(cmd);
+       if (exitcode != 0) {
+               printf("\nctdlmigrate was unable to establish an SSH connection to the\n"
+                       "source system, and cannot continue.\n\n");
+               exit(exitcode);
+       }
+
+       printf("\nTesting a command over the connection...\n\n");
+       snprintf(cmd, sizeof cmd, "ssh -S %s %s@%s 'echo Remote commands are executing successfully.'",
+               socket_path, remote_user, remote_host);
+       exitcode = system(cmd);
+       printf("\n");
+       if (exitcode != 0) {
+               printf("Remote commands are not succeeding.\n\n");
+               exit(exitcode);
+       }
+
+
+
+       // FIXME kill the master ssh session
+       printf("If this program was finished we would do more.  FIXME\n");
+       exit(0);
+}