File : archive.bush
#!/usr/local/bin/bush
-- Basic Directory Archive/Backup Script
pragma annotate( "Backup" );
pragma annotate( "" );
pragma annotate( "A basic directory archive and backup script" );
pragma annotate( "by Ken O. Burtch" );
procedure archive is
-- Global constants
expire_period_days : constant natural := 30;
-- number of days to hold files in the archive directory
procedure usage is
-- show help
begin
put( "usage: " ) @ ( source_info.file );
put_line( " source-dir archive-dir" );
new_line;
put_line( "Backup files in source directory in the archive directory." );
put_line( "Subdirectories are not searched. Archive directory files" );
put_line( "will be cleaned." );
new_line;
end usage;
begin
-- There should be two parameters. Any other number of parameters, or
-- -h or --help, should show script usage
command_line.set_exit_status( 0 ); -- status OK
if $# /= 2 then -- not 2 params?
usage; -- show usage
return; -- and quit
elsif $1 = "-h" or $1 = "--help" then -- help request?
usage; -- show usage
return; -- and quit
end if;
-- main block that does the work
declare
source_directory : constant string := directory_operations.format_pathname( $1 );
-- first param - convert path to operating system format
archive_directory : constant string := directory_operations.format_pathname( $2 );
-- second param - convert to operating system format
file_name : string; -- file to bckup
target_name : string; -- backup name
backup_file_list : string; -- files to bckup
i : natural;
begin
-- Verify the source and archive directories exist and that they are
-- directories
if not files.is_directory( source_directory ) then
put( standard_error, source_info.file )
@( standard_error, ": source is not a directory" );
command_line.set_exit_status( 192 );
return;
end if;
if not files.is_directory( archive_directory ) then
put( standard_error, source_info.file )
@( standard_error, ": archive is not a directory" );
command_line.set_exit_status( 192 );
return;
end if;
-- Since there is no files.is_readable (yet), try to cd to the directory
-- to make sure BUSH can read the directories.
if not files.is_readable( source_directory ) then
put( standard_error, source_info.file )
@( standard_error, ": cannot access archive directory" );
command_line.set_exit_status( 192 );
return;
end if;
if not files.is_writable( archive_directory ) then
put( standard_error, source_info.file )
@( standard_error, ": cannot access source directory" );
command_line.set_exit_status( 192 );
return;
end if;
-- Directories look good. Create a lock file, waiting until any other
-- copies of the script are finished running.
lock_files.lock_file( source_info.file & ".lck" );
-- Expire the archive directory
cd "$archive_directory" ;
find . -type f -mtime +$expire_period_days -exec rm {} \; ;
cd - ;
-- Move to the source directory. Get a list of files to back up. Each
-- line will be separated by a line feed.
cd "$source_directory" ;
backup_file_list := `ls -1 ;` ;
-- Loop through the names of all the files to back up. strings.field will
-- return an empty string when the loop has examined all the files.
i := 1;
loop
file_name := strings.field( backup_file_list, i, ASCII.LF );
exit when file_name = "";
-- The target name will have the date appended to the base filename.
-- For example, "test.log" becomes "test-year:month:day.tgz".
target_name := archive_directory & directory_operations.dir_separator &
file_name & "-" &
strings.trim( strings.image( calendar.year( calendar.clock ) ), trim_end.left ) & ":" &
strings.trim( strings.image( calendar.month( calendar.clock ) ), trim_end.left ) & ":" &
strings.trim( strings.image( calendar.day( calendar.clock ) ), trim_end.left ) & amp;
".tgz";
-- If the file is readable, back it up using the tar command
if files.is_readable_file( file_name ) then
tar cfz "$target_name" "$file_name" ;
end if;
i := @ + 1;
end loop;
end;
-- Release the lock file and return a successful status
lock_files.unlock_file( source_info.file & ".lck" );
command_line.set_exit_status( 0 );
end archive;
-- VIM editor formatting instructions -- vim: ft=bush