#!/usr/local/bin/kermit
;
; f t p s y n c u p
;
; Synchronizes a server directory tree from a local one.
;  . Local files that don't exist on the server are uploaded.
;  . Local files that exist on the server are uploaded only if newer.
;  . Local file timestamps are not preserved (FTP doesn't allow that).
;  . Server file permissions are not preserved 
;  . Ditto for file owner, group, ACLs, etc.
;  . Works across platforms via automatic text/binary mode switching.
;  . Works quietly but keeps a log of what it did.
;
; Directories are created on the server automatically as we descend through
; the local tree.
;
; Local file permissions are preserved on the server if the server and
; client are both Unix-based and the server permits SITE CHMOD.
;
; Server files that don't exist on the client are NOT deleted.
; It would be possible to script this, but ugly.  If this script was to
; handle only a single flat directory and not a directory tree, then it
; would be easy to delete extraneous files from the server (get file list
; with "mget /namelist:xxx *" then read filenames from xxx, "if exist"
; each one, ldelete it).
; 
; Requires: C-Kermit 80 or later or K95 2.0 or later
;
; F. da Cruz, Columbia University, 24 Feb 2003

; Parameters - Change as needed (or turn them into arguments)

.host = kermit.columbia.edu         ; Change to desired host
.rdirectory = kermit/g              ; Change to desired host directory
.ldirectory = ~/g                   ; Change to desired local directory
.logfile := \v(home)ftpsync.log     ; Change to desired logfile name

; End of parameter defintions.

set transaction-log brief           ; Choose brief transaction-log format
set exit warning off                ; No "OK to exit?" prompts
set quiet on                        ; Suppress progress messages

lcd \m(ldirectory)                  ; CD to desired local directory
if fail exit 1 "LCD failed - \m(ldirectory)" ; Make sure we did

ftp open \m(host) /anonymous        ; Open and check anonymous FTP connection
if fail exit 1 Login failed
if not \v(ftp_loggedin) exit 1 "Anonymous Login failed"

log transactions \m(logfile)        ; Start log

ftp cd \m(rdirectory)               ; CD to desired server directory
if fail exit 1 "FTP CD failed - \m(rdirectory)"

ftp mput /recursive /update *       ; Put all local files in update mode
if fail exit 1 "Mput failed"        ; Check for errors

bye                                 ; Disconnect from server
close transaction-log               ; Close log
cat \m(logfile)                     ; Display log
exit 0
