the shell scripts..Here are the actual scripts that I use to sync corz.org with its development mirror on my Linux box. Essentially, we log changed local files, and upload only those files. The mechanism for all this is a simple site backup; a mirror of my mirror site! There are many advantages to this technique..
I don't have to keep tabs on which files I've edited; and I tend to edit lots of different site files in one session; the backup script does this for me. Only new and changed files are backed up, thereby indicating which files are new or changed!
You won't be able to use this "as-is", it will need tailoring to your environment. Still, that two minutes will save you hours and hours and hours in the future, so it's worth it. All the main scripts are included in the zip package. If you find any bugs, please report them. ta. okay, here goes..
(there's also a non-archiving version included, "cbl", for general update use)
#!/bin/sh # corz.org mirror backup script.. (run as daily cron) # this runs on a Linux box, where both the real dev mirror, and the # backup directory live (though the latter is on a separate physical # drive - it is mounted in /bax) you could backup to a different # machine, though remember to ensure the share/network-drive is # mounted first. # this script updates $backupdir with all changed files from $devmirror # all this activity is logged to a file which we parse into sftp commands # with the "website-sync" php script, running on a web server somewhere. # © corz.org 2003-> # prefs.. # log to this file (the content we will later convert into sftp commands) logfile="/home/corz_mirror.log" # crucially, this must match the $mirror_dir variable in the php script.. devmirror="/home/cor" # this script will recreate my dev mirror inside here.. backupdir="/bax" # a gzip of the whole lot will go here.. storedir="/bax/www" # make things readable.. echo >> $logfile echo "corz.org backup script: "`date "+%Y.%m.%d-%H.%M"`.. >> $logfile echo echo >> $logfile echo "corz.org backup script (full version - with archiving)" echo cd $devmirror cd .. # tar and gzip the current mirror.. echo "archiving dev mirror.." tar cfz corz-bax.tar.gz $devmirror/ >> $logfile # copy the tar.gz to the backup directory with unique dated filename echo "storing archive backup.." mv corz-bax.tar.gz $storedir/`date "+%Y.%m.%d-%H.%M"`_corz.org.bax.tar.gz >> $logfile # copy over all the newer files (Linux cp rocks! Apple take note.) echo "copying changed files to mirror.." cp -d -f -p -r -u -v $devmirror $backupdir >> $logfile echo echo >> $logfile echo "corz.org backup script complete" echo # we now have an up-to-date backup exit 0 # fin
Whenever you want to backup your dev mirror, or sync it with your live site, you run the backup script. Both versions do the exact same backup, updating only new or changed files. The above example also gzips the entire backup and stores it somewhere. Most likely, you will want to set that one as a daily/weekly cron job..
# 5.45am corz.org mirror backup [now weekly, monday].. 45 5 * * 1 /usr/local/bin/cb >> /var/log/cron 2>&1The 'lite' version (cbl) is for manual use. It simply performs a backup, updating only new or changed files, and makes no zip. When you are looking to do a quick sync, use the lite version. I often use the lite version dozens of times a day. The first time I run it, I see that there are also log entries from the earlier cron backup, and they are simply incorporated into the next upload.
If you use it as often as I do, you may want to rename it to just 'c', or some other single letter that doesn't clash with an existing executable in your $path, so it's quicker to type.
When you run your backup script ('cb', or 'cbl' - or whatever you named them), the output will be captured to a log. The log's contents are then fed into the php web sync tool (which your local Apache will be happy to server up for you at..
or wherever. The output from the web tool is then pasted into a simple sftp upload script something like this..
NOTE: This section is outdated, everything is sftp these days, and website-sync is setup to output SFTP commands. See below for more details.
#!/bin/sh # upload new files to website.. HOST='ftp.mysite.com' USER='username' PASSWD='password' ftp -n $HOST
<<FTP_QUIT quote USER $USER quote PASS $PASSWD binary verbose # paste converted ftp commands right here (replacing this line) quit FTP_QUITexit 0 # fin
Run the "up" script. That's it..
Your wesite and its mirror are one!
Running all this from Windows®..Although the scripts run on a Linux box, you can easily mastermind the whole show from a Windows workstation (I've had a couple of questions about this, and I'm here anyway, because this is where EditPlus is!). Here are some suggestions on how to get the whole thing down to a 3.62 second operation...
Keep shortcuts in a toolbar, or somewhere handy, to these three important things (which you will use, in order)..
- The mirror log (output from the update script is in here)
- URL shortcut to a local copy of the website sync tool (you are reading the other half of it).
- The "up" shell command on your Linux box
You will need to edit this file, you see, add your ftp commands.
Tools you need:
- Text editor (For Windows, I usually recommend EditPlus).
While you are working on the site, it's easier to leave the output log and
upscript open in your text editor.
- Telnet/SSH client (to run a shell on your Linux box - I definitely recommend Putty).
While you are working on the site, it's easier to leave your Linux shell running - it was open anyway, right?
- Web Browser (with your local website sync page in on of its tabs).
A few simple steps..
The whole operation takes only a few seconds, on any platform. Here's how..
- Login to a shell on your Linux box, run the "lite" backup command; that is; type "cbl<enter>" (no quotes).
- Switch to the backup log in your Text editor, (your text editor should have automatically reloaded the file, which now contains the log output we will process) and cut the log output into the clipboard.
- Switch to your browser, and paste the output into website sync tool, click 'make ftp commands!'
- Switch to your text editor and paste the output into the
upscript, save that.
- Back in your Linux shell, run the
upscript. You're done.
With practice, you can do the whole thing in under three seconds!
A note about ftp security..The ftp "up" script (above) is the "simple-and-insecure" version of things. It's easy for anyone to get working, and does the job. But there are least three things you could do to increase the security here..
Firstly, it' not very smart to keep login passwords inside files that can potentially be viewed by anyone. So you could start by keeping the script somewhere inside your home folder, as in the example above. But that's not very convenient, and it's not good organisation, either. Here's a better idea..
Remove the "-n" switch, and all the user/pass commands from the ftp script, and instead allow ftp to use auto-login; with your
~/.netrcfile. This is simply a plain text file in your home folder named
.netrc. It has single line entries that look something like this..
machine ftp.mydomain.com login MyName password MyP4$$w0Rd
This has obvious security benefits. Do
chmod 600 ~/.netrcto make it readable by only you, and then feel free to leave ftp login scripts lying around all over the place!
Automatic SFTP ScriptingRather than use plain ftp, it's possible you have access to SSH on your web server, and therefore; SFTP. It's not quite so simple to automate SFTP as it is ftp, but it is doable, and this first sftp script, using "expect", works very well, though it's not quite as secure as the second method. Without going into too much detail, you'll need two scripts; a launcher, which will "spawn" an interactive expect session..
#!/usr/bin/expect # spawn sftp -C -b /usr/local/bin/sftp/up firstname.lastname@example.org expect "password:" send "MyP4$$w0Rd\n"; interact
Which we will script (use a text file to do the interactive parts, instead of us) with a simple list of commands something like this..
progress put "/home/cor/blog/inc/cbparser.php" "/blog/inc/cbparser.php" put "/home/cor/blog/inc/cbguide.php" "/blog/inc/cbguide.php"
Note the "progress" at the start. Apart from that, it's just a list of regular SFTP commands. For more details, check out the man pages for expect and sftp. Of course, you'll also need these two programs installed for all this to work.
And of course, now you've got passwords inside your sftp scripts! Aarrrghhh!!!!
Better Automatic SFTP ScriptingThese days, I prefer to use RSA keys to authenticate with the server. While more work to setup, they are more secure and make automatic scripting a breeze. I won't go into details here. You can Google that.
Once you have your keys setup, you simply do something like this..
sftp -b commands.txt MyUserName@MyWebHost
And inside commands.txt, you drop your regular sftp commands (as created by this tool)..
put "/home/corz.org/blog/inc/cbparser.php" "httpdocs/blog/inc/cbparser.php" put "/home/corz.org/blog/inc/cbguide.php" "httpdocs/blog/inc/cbguide.php" etc..