From 5353be73570cffd8d53a4eb86d0f73669fd68283 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Fri, 24 Apr 2009 03:21:22 +0000 Subject: [PATCH] * ctdlmigrate utility (not finished) --- citadel/Makefile.in | 8 ++- citadel/ctdlmigrate.c | 132 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 citadel/ctdlmigrate.c diff --git a/citadel/Makefile.in b/citadel/Makefile.in index 8b227a0fa..4e0743d25 100644 --- a/citadel/Makefile.in +++ b/citadel/Makefile.in @@ -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 index 000000000..7a53a8fb9 --- /dev/null +++ b/citadel/ctdlmigrate.c @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "citadel.h" +#include "axdefs.h" +#include "sysdep.h" +#include "config.h" +#include "citadel_dirs.h" +#if HAVE_BACKTRACE +#include +#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); +} -- 2.39.2