home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
ckscripts
/
synchronize
< prev
next >
Wrap
Text File
|
2020-01-01
|
8KB
|
201 lines
#!/usr/local/bin/wermit +
;
; s y n c h r o n i z e
;
; Synchronizes parallel directory trees over a Telnet connection.
;
; Requires: C-Kermit 7.0 Beta.07 or later.
; Author: F. da Cruz, Columbia University Kermit Project
;
; Command-line parameters:
; 1. Root of source directory tree on local computer.
; 2. Root of destination directory tree on target computer.
; 3. Hostname or address of target computer.
; 4. Username on target host
; 5. Password on target host
;
; Parameters 2-5 are prompted for if not suplied.
;
; This script synchronizes parallel directory trees on two computers
; over a Telnet connection. The two computers need not be running the
; same operating system. For example, any pair from { Win32, UNIX, VMS }
; can be chosen, as long as they are running the required C-Kermit
; version.
;
; . For shell logins, the remote prompt is assumed to be "$ ".
; Change as needed (or use IKSD login).
;
; . The root directory on the target host must exist (easy to
; change).
;
; . The synchronization is in one direction only: the target
; is updated from the source.
;
; . Subdirectories are created as needed at the destination.
;
; . Files that exist in the destination tree that do not also
; exist in the source tree are deleted.
;
; . Files are transferred in update mode; only the source files
; that are newer than the corresponding destination files are
; sent.
;
; . Backup files (*.~*~) are not sent. All other files are sent.
;
; . The destination TCP port is hardwired (Telnet or IKSD).
;
; . A regular connection is made, rather than a secure one.
; The password is transmitted in the clear. This can be fixed
; by using a Kerberized or SRP-enabled C-Kermit build and then
; slightly modifying this script.
;
; Limitations:
;
; . Filenames containing spaces cause trouble. Avoid them.
;
; . Empty source directories are not replicated at the target.
;
; . Special characters in command line options might need to be
; quoted according to the rules of your shell. Also note the
; use \fcontents() around variables containing directory names;
; this is to prevent recursive evaluation when the directory
; name contains backslashes (e.g. C:\WINDOWS\SYSTEM).
;
; . C-Kermit 7.0 Beta.08 and earlier issue various gratuitous
; and/or misleading messages; this is a cosmetic problem only,
; fixed in Beta.09.
;
; Begin by checking C-Kermit version:
;
define badversion echo Sorry - C-Kermit 7.0 or later required., exit
if not equal "\v(program)" "C-Kermit" badversion
if LLT \v(version) 70000 badversion
; Define usage and fatal error macros.
define usage exit 1 {
Usage: sourcedir [ targetdir [ targethost [ username [ password ] ] ] ]
}
define giveup { bye, hangup, close, exit 1 {FATAL: \%1 (Connection closed)} }
; Runtime parameters...
.iksd = 0 ; Set to nonzero to use IKSD.
.debug = 0 ; Set to nonzero for debug messages.
; Command-line parsing...
if not def \%1 usage ; Give usage message if no arguments.
cd \fcontents(\%1) ; Change to source directory
if fail exit 1 Can't CD to "\fcontents(\%1)" ; Failure is fatal
while not def \%3 { ; If hostname/address not supplied
ask \%1 { Host: } ; prompt for one until we get it.
if > \fsplit(\%3) 1 { ; Allow only one "word" here.
echo Just the address please. ; E.g. no TCP port number.
undef \%3
}
}
while not def \%2 { ; If target directory not supplied
ask \%2 { Directory on \%3: } ; ask til we get it.
}
if not def \%4 { ; If username not supplied
ask \%4 { User [\v(user)]: } ; Prompt for one, but default
if not def \%4 assign \%4 \v(user) ; to local user ID.
}
while not defined \%5 { ; Ditto for password
askq \%5 { Password for \%4 at \%3: }
}
set telnet environment user \%4 ; Make sure correct userid is sent
set exit warning off ; No "OK to exit?" prompts please
; This script assumes that authenticated logins are not being performed
; via Kerberos, SRP, or any other supported method. It can easily be
; modified to use Kerberos or SRP.
set telopt start-tls refuse ; Do not use START_TLS option
set telopt authentication refuse ; Do not use AUTH option
set telopt encrypt refuse refuse ; Do not use ENCRYPT option
if \m(debug) {
echo Source directory: \fcontents(\%1)
echo Target directory: \fcontents(\%2)
echo Target host: \fcontents(\%3)
echo User at host: \fcontents(\%4)
echo IKSD: \m(iksd)
set input echo on
} else {
set input echo off
set quiet on
}
if \m(iksd) { ; IKSD...
echo Connecting to \%3:kermit...
set host \%3 1649 /telnet
if fail exit 1 Can't open connection to iksd@\%3.
remote login \%4 \%5
if fail exit 1 Authentication failure
} else { ; Regular shell login
echo Connecting to \%3:telnet...
set host \%3 23 /telnet
if fail exit 1 Can't open Telnet connection to \%3.
minput 20 login: Username: Password: {Password for \%3:}
if fail exit 1 Timed out waiting for initial prompt: \v(inwait) sec.
if ( = \v(minput) 1 || = \v(minput) 2 ) {
lineout \%4 ; User ID required - send it.
minput 10 Password: {Password for \%4:}
if fail exit 1 Timed out waiting for Password prompt: \v(inwait) sec.
}
lineout \%5 ; Send password
undef \%5 ; Erase password from memory
input 60 {$ } ; *** Wait for shell prompt ***
if fail echo WARNING: No shell prompt ; But ignore failure
lineout kermit -x ; Start Kermit server
input 30 READY TO SERVE... ; Courtesy but not necessary
}
; Have a connection with Kermit server on the far end.
; The rest is easy...
.m1 := Can't CD to remote directory "\fcontents(\%2)"
.m2 := WARNING: Update mode not negotiated - performing full transfer...
set transfer bell off ; Silence the bell
set transfer display brief ; Skip the fullscreen display.
rcd \fcontents(\%2) ; CD to remote target directory.
if fail giveup {\m(m1)} ; Failure is fatal
rset file collision update ; Use update mode (only send new files)
rset server cd-message off ; We don't need orientation messages
if fail echo {\m(m2)} ; Failure is not fatal
echo
send /recursive /nobackup * ; Send the source tree
if fail giveup {SEND failed} ; Update failed
; Delete all files at the remote that do not exist locally...
;;; forward fin ; Uncomment to skip deletion phase
echo
echo DELETION PHASE: Searching \%3:\fcontents(\%2)...
echo
query kermit rfiles(*) ; Get recursive remote file list
if fail giveup {QUERY failed}
.\%n := \v(query) ; How many in list
.\%m = 0 ; How many deleted
if \m(debug) echo REMOTE FILES = \%n ; Debug message
for \%i 1 \%n 1 { ; Loop through remote files
query kermit nextfile() ; Next one
if \m(debug) echo \%i. \v(query)
if not exist \v(query) { ; If it doesn't exist on this end...
rdelete \v(query) ; Delete the one on the far end
if success increment \%m ; Count it if deletion successful
}
}
if \%m echo
echo DELETED: \%m ; Say how many were deleted
:FIN
bye ; Close the server
exit 0 ; Update succeeded - done