mirror of https://github.com/deajan/osync
Added unit tests
parent
62cce235c0
commit
1ceb7901aa
@ -0,0 +1,185 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###### osync - Rsync based two way sync engine with fault tolerance
|
||||
###### (C) 2013-2016 by Orsiris de Jong (www.netpower.fr)
|
||||
###### osync v1.1x / v1.2x config file rev 2016102101
|
||||
|
||||
## ---------- GENERAL OPTIONS
|
||||
|
||||
## Sync job identification
|
||||
INSTANCE_ID="local"
|
||||
|
||||
## Directories to synchronize.
|
||||
## Initiator is the system osync runs on. The initiator directory must be a local path.
|
||||
INITIATOR_SYNC_DIR="${HOME}/osync-tests/initiator"
|
||||
|
||||
## Target is the system osync synchronizes to (can be the same system as the initiator in case of local sync tasks). The target directory can be a local or remote path.
|
||||
TARGET_SYNC_DIR="${HOME}/osync-tests/target"
|
||||
#TARGET_SYNC_DIR="ssh://backupuser@yourhost.old:22//home/git/osync/dir2"
|
||||
|
||||
## If the target system is remote, you can specify a RSA key (please use full path). If not defined, the default ~/.ssh/id_rsa will be used. See documentation for further information.
|
||||
SSH_RSA_PRIVATE_KEY="/home/backupuser/.ssh/id_rsa"
|
||||
|
||||
## Alternatively, you may specify an SSH password file (less secure). Needs sshpass utility installed.
|
||||
SSH_PASSWORD_FILE=""
|
||||
|
||||
## Create sync directories if they do not exist
|
||||
CREATE_DIRS=no
|
||||
|
||||
## Log file location. Leaving this empty will create a logfile at /var/log/osync_version_SYNC_ID.log (or current directory if /var/log doesn't exist)
|
||||
LOGFILE=""
|
||||
|
||||
## Generate an alert if initiator or target replicas have less free space than given value in KB. Set this to zero to skip disk space tests.
|
||||
MINIMUM_SPACE=10240
|
||||
|
||||
## Bandwidth limit Kbytes / second. Leave 0 to disable limitation
|
||||
BANDWIDTH=0
|
||||
|
||||
## If enabled, synchronization on remote system will be processed as superuser. See documentation for /etc/sudoers file configuration.
|
||||
SUDO_EXEC=no
|
||||
## Paranoia option. Don't change this unless you read the documentation.
|
||||
RSYNC_EXECUTABLE=rsync
|
||||
## Remote rsync executable path. Leave this empty in most cases
|
||||
RSYNC_REMOTE_PATH=""
|
||||
|
||||
## Rsync exclude / include order (the option set here will be set first, eg: include will make include then exclude patterns)
|
||||
RSYNC_PATTERN_FIRST=include
|
||||
|
||||
## List of files / directories to incldue / exclude from sync on both sides (see rsync patterns, wildcards work).
|
||||
## Paths are relative to sync dirs. List elements are separated by a semicolon.
|
||||
RSYNC_INCLUDE_PATTERN=""
|
||||
RSYNC_EXCLUDE_PATTERN="*.php"
|
||||
#RSYNC_EXCLUDE_PATTERN="tmp;archives"
|
||||
|
||||
## Files that contains lists of files / directories to include / exclude from sync on both sides. Leave this empty if you don't want to use an exclusion file.
|
||||
## This file has to be in the same directory as the config file
|
||||
## Paths are relative to sync dirs. One element per line.
|
||||
RSYNC_INCLUDE_FROM=""
|
||||
RSYNC_EXCLUDE_FROM=""
|
||||
#RSYNC_EXCLUDE_FROM="exclude.list"
|
||||
|
||||
## List elements separator char. You may set an alternative separator char for your directories lists above.
|
||||
PATH_SEPARATOR_CHAR=";"
|
||||
|
||||
## ---------- REMOTE SYNC OPTIONS
|
||||
|
||||
## ssh compression should be used unless your remote connection is good enough (LAN)
|
||||
SSH_COMPRESSION=yes
|
||||
|
||||
## Ignore ssh known hosts. DANGER WILL ROBINSON DANGER ! This can lead to security issues. Only enable this if you know what you're doing.
|
||||
SSH_IGNORE_KNOWN_HOSTS=no
|
||||
|
||||
## Check for connectivity to remote host before launching remote sync task. Be sure the hosts responds to ping. Failing to ping will stop sync.
|
||||
REMOTE_HOST_PING=no
|
||||
|
||||
## Check for internet access by pinging one or more 3rd party hosts before remote sync task. Leave empty if you don't want this check to be be performed. Failing to ping will stop sync.
|
||||
## If you use this function, you should set more than one 3rd party host, and be sure you can ping them.
|
||||
## Be aware some DNS like opendns redirect false hostnames. Also, this adds an extra execution time of a bit less than a minute.
|
||||
REMOTE_3RD_PARTY_HOSTS="www.kernel.org www.google.com"
|
||||
|
||||
## ---------- MISC OPTIONS
|
||||
|
||||
## Preserve basic linux permissions
|
||||
PRESERVE_PERMISSIONS=yes
|
||||
PRESERVE_OWNER=yes
|
||||
PRESERVE_GROUP=yes
|
||||
## On MACOS X, does not work and will be ignored
|
||||
PRESERVE_EXECUTABILITY=yes
|
||||
|
||||
## Preserve ACLS. Make sure source and target FS can manage same ACLs or you'll get loads of errors.
|
||||
PRESERVE_ACL=yes
|
||||
## Preserve Xattr. Make sure source and target FS can manage same Xattrs or you'll get loads of errors.
|
||||
PRESERVE_XATTR=yes
|
||||
## Transforms symlinks into referent files/dirs
|
||||
COPY_SYMLINKS=no
|
||||
## Treat symlinked dirs as dirs. CAUTION: This also follows symlinks outside of the replica root.
|
||||
KEEP_DIRLINKS=no
|
||||
## Preserve hard links. Make sure source and target FS can manage hard links or you will lose them.
|
||||
PRESERVE_HARDLINKS=no
|
||||
## Do a full checksum on all files that have identical sizes, they are checksummed to see if they actually are identical. This can take a long time.
|
||||
CHECKSUM=no
|
||||
|
||||
## Let RSYNC compress file transfers. Do not use this if both initator and target replicas are on local system. Also, do not use this if you already enabled SSH compression.
|
||||
RSYNC_COMPRESS=yes
|
||||
|
||||
## Maximum execution time (in seconds) for sync process. Set these values zero will disable max execution times.
|
||||
## Soft exec time only generates a warning. Hard exec time will generate a warning and stop sync process.
|
||||
SOFT_MAX_EXEC_TIME=7200
|
||||
HARD_MAX_EXEC_TIME=10600
|
||||
|
||||
## Log a message every KEEP_LOGGING seconds just to know the task is still alive
|
||||
KEEP_LOGGING=1801
|
||||
|
||||
## Minimum time (in seconds) in file monitor /daemon mode between modification detection and sync task in order to let copy operations finish.
|
||||
MIN_WAIT=60
|
||||
|
||||
## Maximum time (in seconds) waiting in file monitor / daemon mode. After this time, sync is run.
|
||||
## Use 0 to wait indefinitely.
|
||||
MAX_WAIT=7200
|
||||
|
||||
## ---------- BACKUP AND DELETION OPTIONS
|
||||
|
||||
## Enabling this option will keep a backup of a file on the target replica if it gets updated from the source replica. Backups will be made to .osync_workdir/backups
|
||||
CONFLICT_BACKUP=yes
|
||||
## Keep multiple backup versions of the same file. Warning, This can be very space consuming.
|
||||
CONFLICT_BACKUP_MULTIPLE=yes
|
||||
## Osync will clean backup files after a given number of days. Setting this to 0 will disable cleaning and keep backups forever. Warning: This can be very space consuming.
|
||||
CONFLICT_BACKUP_DAYS=30
|
||||
## If the same file exists on both replicas, newer version will be synced. However, if both files have the same timestamp but differ, CONFILCT_PREVALANCE sets winner replica.
|
||||
CONFLICT_PREVALANCE=initiator
|
||||
|
||||
## On deletion propagation to the target replica, a backup of the deleted files can be kept. Deletions will be kept in .osync_workdir/deleted
|
||||
SOFT_DELETE=yes
|
||||
## Osync will clean deleted files after a given number of days. Setting this to 0 will disable cleaning and keep deleted files forever. Warning: This can be very space consuming.
|
||||
SOFT_DELETE_DAYS=30
|
||||
|
||||
## Optional deletion skip on replicas. Valid values are "initiator", "target", or "initiator,target"
|
||||
SKIP_DELETION=
|
||||
|
||||
## ---------- RESUME OPTIONS
|
||||
|
||||
## Try to resume an aborted sync task
|
||||
RESUME_SYNC=yes
|
||||
## Number maximum resume tries before initiating a fresh sync.
|
||||
RESUME_TRY=2
|
||||
## When a pidlock exists on slave replica that does not correspond to the initiator's instance-id, force pidlock removal. Be careful with this option if you have multiple initiators.
|
||||
FORCE_STRANGER_LOCK_RESUME=no
|
||||
|
||||
## Keep partial uploads that can be resumed on next run, experimental feature
|
||||
PARTIAL=no
|
||||
|
||||
## Use delta copy algortithm (usefull when local paths are network drives), defaults to yes
|
||||
DELTA_COPIES=yes
|
||||
|
||||
## ---------- ALERT OPTIONS
|
||||
|
||||
## List of alert mails separated by spaces
|
||||
DESTINATION_MAILS="your@alert.tld"
|
||||
|
||||
## Windows specific (msys / cygwin environment) only mail options (used with mailsend.exe from muquit, http://github.com/muquit/mailsend or from sendemail.exe from Brandon Zehm, http://caspian.dotconf.net/menu/Software/SendEmail/)
|
||||
SENDER_MAIL="alert@your.system.tld"
|
||||
SMTP_SERVER=smtp.your.isp.tld
|
||||
SMTP_PORT=25
|
||||
# encryption can be tls, ssl or none
|
||||
SMTP_ENCRYPTION=none
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
|
||||
## ---------- EXECUTION HOOKS
|
||||
|
||||
## Commands can will be run before and / or after sync process (remote execution will only happen if REMOTE_OPERATION is set).
|
||||
LOCAL_RUN_BEFORE_CMD=""
|
||||
LOCAL_RUN_AFTER_CMD=""
|
||||
|
||||
REMOTE_RUN_BEFORE_CMD=""
|
||||
REMOTE_RUN_AFTER_CMD=""
|
||||
|
||||
## Max execution time of commands before they get force killed. Leave 0 if you don't wan't this to happen. Time is specified in seconds.
|
||||
MAX_EXEC_TIME_PER_CMD_BEFORE=0
|
||||
MAX_EXEC_TIME_PER_CMD_AFTER=0
|
||||
|
||||
## Stops osync execution if one of the above commands fail
|
||||
STOP_ON_CMD_ERROR=yes
|
||||
|
||||
## Run local and remote after sync commands even on failure
|
||||
RUN_AFTER_CMD_ON_ERROR=no
|
@ -0,0 +1,185 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###### osync - Rsync based two way sync engine with fault tolerance
|
||||
###### (C) 2013-2016 by Orsiris de Jong (www.netpower.fr)
|
||||
###### osync v1.1x / v1.2x config file rev 2016102101
|
||||
|
||||
## ---------- GENERAL OPTIONS
|
||||
|
||||
## Sync job identification
|
||||
INSTANCE_ID="local"
|
||||
|
||||
## Directories to synchronize.
|
||||
## Initiator is the system osync runs on. The initiator directory must be a local path.
|
||||
INITIATOR_SYNC_DIR="${HOME}/osync-tests/initiator"
|
||||
|
||||
## Target is the system osync synchronizes to (can be the same system as the initiator in case of local sync tasks). The target directory can be a local or remote path.
|
||||
TARGET_SYNC_DIR="${HOME}/osync-tests/target"
|
||||
#TARGET_SYNC_DIR="ssh://backupuser@yourhost.old:22//home/git/osync/dir2"
|
||||
|
||||
## If the target system is remote, you can specify a RSA key (please use full path). If not defined, the default ~/.ssh/id_rsa will be used. See documentation for further information.
|
||||
SSH_RSA_PRIVATE_KEY="/home/backupuser/.ssh/id_rsa"
|
||||
|
||||
## Alternatively, you may specify an SSH password file (less secure). Needs sshpass utility installed.
|
||||
SSH_PASSWORD_FILE=""
|
||||
|
||||
## Create sync directories if they do not exist
|
||||
CREATE_DIRS=no
|
||||
|
||||
## Log file location. Leaving this empty will create a logfile at /var/log/osync_version_SYNC_ID.log (or current directory if /var/log doesn't exist)
|
||||
LOGFILE=""
|
||||
|
||||
## Generate an alert if initiator or target replicas have less free space than given value in KB. Set this to zero to skip disk space tests.
|
||||
MINIMUM_SPACE=10240
|
||||
|
||||
## Bandwidth limit Kbytes / second. Leave 0 to disable limitation
|
||||
BANDWIDTH=0
|
||||
|
||||
## If enabled, synchronization on remote system will be processed as superuser. See documentation for /etc/sudoers file configuration.
|
||||
SUDO_EXEC=no
|
||||
## Paranoia option. Don't change this unless you read the documentation.
|
||||
RSYNC_EXECUTABLE=rsync
|
||||
## Remote rsync executable path. Leave this empty in most cases
|
||||
RSYNC_REMOTE_PATH=""
|
||||
|
||||
## Rsync exclude / include order (the option set here will be set first, eg: include will make include then exclude patterns)
|
||||
RSYNC_PATTERN_FIRST=include
|
||||
|
||||
## List of files / directories to incldue / exclude from sync on both sides (see rsync patterns, wildcards work).
|
||||
## Paths are relative to sync dirs. List elements are separated by a semicolon.
|
||||
RSYNC_INCLUDE_PATTERN=""
|
||||
RSYNC_EXCLUDE_PATTERN="*.php"
|
||||
#RSYNC_EXCLUDE_PATTERN="tmp;archives"
|
||||
|
||||
## Files that contains lists of files / directories to include / exclude from sync on both sides. Leave this empty if you don't want to use an exclusion file.
|
||||
## This file has to be in the same directory as the config file
|
||||
## Paths are relative to sync dirs. One element per line.
|
||||
RSYNC_INCLUDE_FROM=""
|
||||
RSYNC_EXCLUDE_FROM=""
|
||||
#RSYNC_EXCLUDE_FROM="exclude.list"
|
||||
|
||||
## List elements separator char. You may set an alternative separator char for your directories lists above.
|
||||
PATH_SEPARATOR_CHAR=";"
|
||||
|
||||
## ---------- REMOTE SYNC OPTIONS
|
||||
|
||||
## ssh compression should be used unless your remote connection is good enough (LAN)
|
||||
SSH_COMPRESSION=yes
|
||||
|
||||
## Ignore ssh known hosts. DANGER WILL ROBINSON DANGER ! This can lead to security issues. Only enable this if you know what you're doing.
|
||||
SSH_IGNORE_KNOWN_HOSTS=no
|
||||
|
||||
## Check for connectivity to remote host before launching remote sync task. Be sure the hosts responds to ping. Failing to ping will stop sync.
|
||||
REMOTE_HOST_PING=no
|
||||
|
||||
## Check for internet access by pinging one or more 3rd party hosts before remote sync task. Leave empty if you don't want this check to be be performed. Failing to ping will stop sync.
|
||||
## If you use this function, you should set more than one 3rd party host, and be sure you can ping them.
|
||||
## Be aware some DNS like opendns redirect false hostnames. Also, this adds an extra execution time of a bit less than a minute.
|
||||
REMOTE_3RD_PARTY_HOSTS="www.kernel.org www.google.com"
|
||||
|
||||
## ---------- MISC OPTIONS
|
||||
|
||||
## Preserve basic linux permissions
|
||||
PRESERVE_PERMISSIONS=yes
|
||||
PRESERVE_OWNER=yes
|
||||
PRESERVE_GROUP=yes
|
||||
## On MACOS X, does not work and will be ignored
|
||||
PRESERVE_EXECUTABILITY=yes
|
||||
|
||||
## Preserve ACLS. Make sure source and target FS can manage same ACLs or you'll get loads of errors.
|
||||
PRESERVE_ACL=yes
|
||||
## Preserve Xattr. Make sure source and target FS can manage same Xattrs or you'll get loads of errors.
|
||||
PRESERVE_XATTR=yes
|
||||
## Transforms symlinks into referent files/dirs
|
||||
COPY_SYMLINKS=no
|
||||
## Treat symlinked dirs as dirs. CAUTION: This also follows symlinks outside of the replica root.
|
||||
KEEP_DIRLINKS=no
|
||||
## Preserve hard links. Make sure source and target FS can manage hard links or you will lose them.
|
||||
PRESERVE_HARDLINKS=no
|
||||
## Do a full checksum on all files that have identical sizes, they are checksummed to see if they actually are identical. This can take a long time.
|
||||
CHECKSUM=no
|
||||
|
||||
## Let RSYNC compress file transfers. Do not use this if both initator and target replicas are on local system. Also, do not use this if you already enabled SSH compression.
|
||||
RSYNC_COMPRESS=yes
|
||||
|
||||
## Maximum execution time (in seconds) for sync process. Set these values zero will disable max execution times.
|
||||
## Soft exec time only generates a warning. Hard exec time will generate a warning and stop sync process.
|
||||
SOFT_MAX_EXEC_TIME=7200
|
||||
HARD_MAX_EXEC_TIME=10600
|
||||
|
||||
## Log a message every KEEP_LOGGING seconds just to know the task is still alive
|
||||
KEEP_LOGGING=1801
|
||||
|
||||
## Minimum time (in seconds) in file monitor /daemon mode between modification detection and sync task in order to let copy operations finish.
|
||||
MIN_WAIT=60
|
||||
|
||||
## Maximum time (in seconds) waiting in file monitor / daemon mode. After this time, sync is run.
|
||||
## Use 0 to wait indefinitely.
|
||||
MAX_WAIT=7200
|
||||
|
||||
## ---------- BACKUP AND DELETION OPTIONS
|
||||
|
||||
## Enabling this option will keep a backup of a file on the target replica if it gets updated from the source replica. Backups will be made to .osync_workdir/backups
|
||||
CONFLICT_BACKUP=yes
|
||||
## Keep multiple backup versions of the same file. Warning, This can be very space consuming.
|
||||
CONFLICT_BACKUP_MULTIPLE=yes
|
||||
## Osync will clean backup files after a given number of days. Setting this to 0 will disable cleaning and keep backups forever. Warning: This can be very space consuming.
|
||||
CONFLICT_BACKUP_DAYS=30
|
||||
## If the same file exists on both replicas, newer version will be synced. However, if both files have the same timestamp but differ, CONFILCT_PREVALANCE sets winner replica.
|
||||
CONFLICT_PREVALANCE=initiator
|
||||
|
||||
## On deletion propagation to the target replica, a backup of the deleted files can be kept. Deletions will be kept in .osync_workdir/deleted
|
||||
SOFT_DELETE=yes
|
||||
## Osync will clean deleted files after a given number of days. Setting this to 0 will disable cleaning and keep deleted files forever. Warning: This can be very space consuming.
|
||||
SOFT_DELETE_DAYS=30
|
||||
|
||||
## Optional deletion skip on replicas. Valid values are "initiator", "target", or "initiator,target"
|
||||
SKIP_DELETION=
|
||||
|
||||
## ---------- RESUME OPTIONS
|
||||
|
||||
## Try to resume an aborted sync task
|
||||
RESUME_SYNC=yes
|
||||
## Number maximum resume tries before initiating a fresh sync.
|
||||
RESUME_TRY=2
|
||||
## When a pidlock exists on slave replica that does not correspond to the initiator's instance-id, force pidlock removal. Be careful with this option if you have multiple initiators.
|
||||
FORCE_STRANGER_LOCK_RESUME=no
|
||||
|
||||
## Keep partial uploads that can be resumed on next run, experimental feature
|
||||
PARTIAL=no
|
||||
|
||||
## Use delta copy algortithm (usefull when local paths are network drives), defaults to yes
|
||||
DELTA_COPIES=yes
|
||||
|
||||
## ---------- ALERT OPTIONS
|
||||
|
||||
## List of alert mails separated by spaces
|
||||
DESTINATION_MAILS="your@alert.tld"
|
||||
|
||||
## Windows specific (msys / cygwin environment) only mail options (used with mailsend.exe from muquit, http://github.com/muquit/mailsend or from sendemail.exe from Brandon Zehm, http://caspian.dotconf.net/menu/Software/SendEmail/)
|
||||
SENDER_MAIL="alert@your.system.tld"
|
||||
SMTP_SERVER=smtp.your.isp.tld
|
||||
SMTP_PORT=25
|
||||
# encryption can be tls, ssl or none
|
||||
SMTP_ENCRYPTION=none
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
|
||||
## ---------- EXECUTION HOOKS
|
||||
|
||||
## Commands can will be run before and / or after sync process (remote execution will only happen if REMOTE_OPERATION is set).
|
||||
LOCAL_RUN_BEFORE_CMD=""
|
||||
LOCAL_RUN_AFTER_CMD=""
|
||||
|
||||
REMOTE_RUN_BEFORE_CMD=""
|
||||
REMOTE_RUN_AFTER_CMD=""
|
||||
|
||||
## Max execution time of commands before they get force killed. Leave 0 if you don't wan't this to happen. Time is specified in seconds.
|
||||
MAX_EXEC_TIME_PER_CMD_BEFORE=0
|
||||
MAX_EXEC_TIME_PER_CMD_AFTER=0
|
||||
|
||||
## Stops osync execution if one of the above commands fail
|
||||
STOP_ON_CMD_ERROR=yes
|
||||
|
||||
## Run local and remote after sync commands even on failure
|
||||
RUN_AFTER_CMD_ON_ERROR=no
|
@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
|
||||
###### Osync - Rsync based two way sync engine with fault tolerance
|
||||
###### (L) 2013 by Orsiris "Ozy" de Jong (www.netpower.fr)
|
||||
#### Config file rev 0211201302
|
||||
|
||||
## ---------- GENERAL OPTIONS
|
||||
|
||||
## Sync job identification
|
||||
SYNC_ID="old"
|
||||
|
||||
## Directories to synchronize. Master must be on the system Osync runs on. Slave can be either on the same system, or on a remote one.
|
||||
MASTER_SYNC_DIR="${HOME}/osync-tests/initiator"
|
||||
SLAVE_SYNC_DIR="${HOME}/osync-tests/target"
|
||||
|
||||
## Create sync directories if they do not exist
|
||||
CREATE_DIRS=no
|
||||
|
||||
## Log file location. Leaving this empty will create a logfile at /var/log/osync_version_SYNC_ID.log (or current directory if /var/log doesn't exist)
|
||||
LOGFILE=""
|
||||
|
||||
## List of directories to exclude from sync on both sides (rsync patterns, wildcards work).
|
||||
## Paths are relative to sync dirs. List elements are separated by a semicolon.
|
||||
RSYNC_EXCLUDE_PATTERN="tmp;archives"
|
||||
## List elements separator char. You may set an alternative seperator char for your directories lists above.
|
||||
PATH_SEPARATOR_CHAR=";"
|
||||
|
||||
## Generate an alert if master or slave replicas have less free space than given value in KB.
|
||||
MINIMUM_SPACE=10240
|
||||
|
||||
## Bandwidth limit Kbytes / second. Leave 0 to disable limitation
|
||||
BANDWIDTH=0
|
||||
|
||||
## If enabled, synchronization will be processed as superuser. See documentation for /etc/sudoers file configuration.
|
||||
SUDO_EXEC=no
|
||||
## Paranoia option. Don't change this unless you read the documentation.
|
||||
RSYNC_EXECUTABLE=rsync
|
||||
|
||||
## ---------- REMOTE SYNC OPTIONS
|
||||
|
||||
## The following options allow Osync to sync a slave replica on a remote system via an SSH tunnel.
|
||||
## Needs public RSA key need to be put into ~/.ssh/authorized_keys in remote users home directory. See documentation for remote sync.
|
||||
REMOTE_SYNC=no
|
||||
SSH_RSA_PRIVATE_KEY=~/.ssh/id_rsa
|
||||
REMOTE_USER=syncuser
|
||||
REMOTE_HOST=your-remote-host.tld
|
||||
REMOTE_PORT=22
|
||||
## ssh compression should be used unless your remote connection is good enough (LAN)
|
||||
SSH_COMPRESSION=yes
|
||||
|
||||
## Check for connectivity to remote host before launching remote sync task. Be sure the hosts responds to ping. Failing to ping will stop sync.
|
||||
REMOTE_HOST_PING=no
|
||||
|
||||
## Check for internet access by pinging one or more 3rd party hosts before remote sync task. Leave empty if you don't want this check to be be performed. Failing to ping will stop sync.
|
||||
## If you use this function, you should set more than one 3rd party host, and be sure you can ping them.
|
||||
## Be aware some DNS like opendns redirect false hostnames. Also, this adds an extra execution time of a bit less than a minute.
|
||||
REMOTE_3RD_PARTY_HOSTS="www.kernel.org www.google.fr"
|
||||
|
||||
## Remote rsync executable path. Leave this empty in most cases
|
||||
REMOTE_RSYNC_PATH=""
|
||||
|
||||
## ---------- MISC OPTIONS
|
||||
|
||||
## Preserve ACLS. Make sure source and target FS can manage same ACLs or you'll get loads of errors.
|
||||
PRESERVE_ACL=no
|
||||
## Preserve Xattr. Make sure source and target FS can manage same Xattrs or you'll get loads of errors.
|
||||
PRESERVE_XATTR=no
|
||||
|
||||
## Let RSYNC compress file transfers. Do not use this if both master and slave replicas are on local system. Also, do not use this if you already enabled SSH compression.
|
||||
RSYNC_COMPRESS=yes
|
||||
|
||||
## Maximum execution time (in seconds) for sync process. Soft exec time only generates a warning. Hard exec time will generate a warning and stop sync process.
|
||||
SOFT_MAX_EXEC_TIME=7200
|
||||
HARD_MAX_EXEC_TIME=10600
|
||||
|
||||
## ---------- BACKUP AND TRASH OPTIONS
|
||||
|
||||
## Enabling this option will keep a backup of a file on the target replica if it gets updated from the source replica. Backups will be made to .osync_workdir/backups
|
||||
CONFLICT_BACKUP=yes
|
||||
## Keep multiple backup versions of the same file. Warning, This can be very space consuming.
|
||||
CONFLICT_BACKUP_MULTIPLE=no
|
||||
## Osync will clean backup files after a given number of days. Setting this to 0 will disable cleaning and keep backups forever. Warning: This can be very space consuming.
|
||||
CONFLICT_BACKUP_DAYS=30
|
||||
## If the same file exists on both replicas, newer version will be synced. However, if both files have the same timestamp but differ, CONFILCT_PREVALANCE sets winner replica.
|
||||
CONFLICT_PREVALANCE=master
|
||||
|
||||
## On deletition propagation to the target replica, a backup of the deleted files can be kept. Deletions will be kept in .osync_workdir/deleted
|
||||
SOFT_DELETE=yes
|
||||
## Osync will clean deleted files after a given number of days. Setting this to 0 will disable cleaning and keep deleted files forever. Warning: This can be very space consuming.
|
||||
SOFT_DELETE_DAYS=30
|
||||
|
||||
## ---------- RESUME OPTIONS
|
||||
|
||||
## Try to resume an aborted sync task
|
||||
RESUME_SYNC=yes
|
||||
## Number maximum resume tries before initating a fresh sync.
|
||||
RESUME_TRY=2
|
||||
## When a pidlock exists on slave replica that does not correspond to master's sync-id, force pidlock removal. Be carefull with this option if you have multiple masters.
|
||||
FORCE_STRANGER_LOCK_RESUME=no
|
||||
|
||||
## ---------- ALERT OPTIONS
|
||||
|
||||
## List of alert mails separated by spaces
|
||||
DESTINATION_MAILS="your@alert.tld"
|
||||
|
||||
## Windows (MSYS environment) only mail options (used by sendemail.exe)
|
||||
SENDER_MAIL="alert@your.system"
|
||||
SMTP_SERVER=smtp.your.isp.com
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
|
||||
## ---------- EXECUTION HOOKS
|
||||
|
||||
## Commands can will be run before and / or after sync process (remote execution will only happen if REMOTE_SYNC is set).
|
||||
LOCAL_RUN_BEFORE_CMD=""
|
||||
LOCAL_RUN_AFTER_CMD=""
|
||||
|
||||
REMOTE_RUN_BEFORE_CMD=""
|
||||
REMOTE_RUN_AFTER_CMD=""
|
||||
|
||||
## Max execution time of commands before they get force killed. Leave 0 if you don't wan't this to happen. Time is specified in seconds.
|
||||
MAX_EXEC_TIME_PER_CMD_BEFORE=0
|
||||
MAX_EXEC_TIME_PER_CMD_AFTER=0
|
||||
|
||||
## Stops Osync execution if one of the above commands fail
|
||||
STOP_ON_CMD_ERROR=yes
|
@ -0,0 +1,185 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###### osync - Rsync based two way sync engine with fault tolerance
|
||||
###### (C) 2013-2016 by Orsiris de Jong (www.netpower.fr)
|
||||
###### osync v1.1x / v1.2x config file rev 2016102101
|
||||
|
||||
## ---------- GENERAL OPTIONS
|
||||
|
||||
## Sync job identification
|
||||
INSTANCE_ID="remote"
|
||||
|
||||
## Directories to synchronize.
|
||||
## Initiator is the system osync runs on. The initiator directory must be a local path.
|
||||
INITIATOR_SYNC_DIR="${HOME}/osync-tests/initiator"
|
||||
|
||||
## Target is the system osync synchronizes to (can be the same system as the initiator in case of local sync tasks). The target directory can be a local or remote path.
|
||||
#TARGET_SYNC_DIR="${HOME}/osync-tests/target"
|
||||
TARGET_SYNC_DIR="ssh://root@localhost:49999/${HOME}/osync-tests/target"
|
||||
|
||||
## If the target system is remote, you can specify a RSA key (please use full path). If not defined, the default ~/.ssh/id_rsa will be used. See documentation for further information.
|
||||
SSH_RSA_PRIVATE_KEY="${HOME}/.ssh/id_rsa_local"
|
||||
|
||||
## Alternatively, you may specify an SSH password file (less secure). Needs sshpass utility installed.
|
||||
SSH_PASSWORD_FILE=""
|
||||
|
||||
## Create sync directories if they do not exist
|
||||
CREATE_DIRS=no
|
||||
|
||||
## Log file location. Leaving this empty will create a logfile at /var/log/osync_version_SYNC_ID.log (or current directory if /var/log doesn't exist)
|
||||
LOGFILE=""
|
||||
|
||||
## Generate an alert if initiator or target replicas have less free space than given value in KB. Set this to zero to skip disk space tests.
|
||||
MINIMUM_SPACE=10240
|
||||
|
||||
## Bandwidth limit Kbytes / second. Leave 0 to disable limitation
|
||||
BANDWIDTH=0
|
||||
|
||||
## If enabled, synchronization on remote system will be processed as superuser. See documentation for /etc/sudoers file configuration.
|
||||
SUDO_EXEC=no
|
||||
## Paranoia option. Don't change this unless you read the documentation.
|
||||
RSYNC_EXECUTABLE=rsync
|
||||
## Remote rsync executable path. Leave this empty in most cases
|
||||
RSYNC_REMOTE_PATH=""
|
||||
|
||||
## Rsync exclude / include order (the option set here will be set first, eg: include will make include then exclude patterns)
|
||||
RSYNC_PATTERN_FIRST=include
|
||||
|
||||
## List of files / directories to incldue / exclude from sync on both sides (see rsync patterns, wildcards work).
|
||||
## Paths are relative to sync dirs. List elements are separated by a semicolon.
|
||||
RSYNC_INCLUDE_PATTERN=""
|
||||
RSYNC_EXCLUDE_PATTERN="*.php"
|
||||
#RSYNC_EXCLUDE_PATTERN="tmp;archives"
|
||||
|
||||
## Files that contains lists of files / directories to include / exclude from sync on both sides. Leave this empty if you don't want to use an exclusion file.
|
||||
## This file has to be in the same directory as the config file
|
||||
## Paths are relative to sync dirs. One element per line.
|
||||
RSYNC_INCLUDE_FROM=""
|
||||
RSYNC_EXCLUDE_FROM=""
|
||||
#RSYNC_EXCLUDE_FROM="exclude.list"
|
||||
|
||||
## List elements separator char. You may set an alternative separator char for your directories lists above.
|
||||
PATH_SEPARATOR_CHAR=";"
|
||||
|
||||
## ---------- REMOTE SYNC OPTIONS
|
||||
|
||||
## ssh compression should be used unless your remote connection is good enough (LAN)
|
||||
SSH_COMPRESSION=yes
|
||||
|
||||
## Ignore ssh known hosts. DANGER WILL ROBINSON DANGER ! This can lead to security issues. Only enable this if you know what you're doing.
|
||||
SSH_IGNORE_KNOWN_HOSTS=no
|
||||
|
||||
## Check for connectivity to remote host before launching remote sync task. Be sure the hosts responds to ping. Failing to ping will stop sync.
|
||||
REMOTE_HOST_PING=no
|
||||
|
||||
## Check for internet access by pinging one or more 3rd party hosts before remote sync task. Leave empty if you don't want this check to be be performed. Failing to ping will stop sync.
|
||||
## If you use this function, you should set more than one 3rd party host, and be sure you can ping them.
|
||||
## Be aware some DNS like opendns redirect false hostnames. Also, this adds an extra execution time of a bit less than a minute.
|
||||
REMOTE_3RD_PARTY_HOSTS="www.kernel.org www.google.com"
|
||||
|
||||
## ---------- MISC OPTIONS
|
||||
|
||||
## Preserve basic linux permissions
|
||||
PRESERVE_PERMISSIONS=yes
|
||||
PRESERVE_OWNER=yes
|
||||
PRESERVE_GROUP=yes
|
||||
## On MACOS X, does not work and will be ignored
|
||||
PRESERVE_EXECUTABILITY=yes
|
||||
|
||||
## Preserve ACLS. Make sure source and target FS can manage same ACLs or you'll get loads of errors.
|
||||
PRESERVE_ACL=yes
|
||||
## Preserve Xattr. Make sure source and target FS can manage same Xattrs or you'll get loads of errors.
|
||||
PRESERVE_XATTR=yes
|
||||
## Transforms symlinks into referent files/dirs
|
||||
COPY_SYMLINKS=no
|
||||
## Treat symlinked dirs as dirs. CAUTION: This also follows symlinks outside of the replica root.
|
||||
KEEP_DIRLINKS=no
|
||||
## Preserve hard links. Make sure source and target FS can manage hard links or you will lose them.
|
||||
PRESERVE_HARDLINKS=no
|
||||
## Do a full checksum on all files that have identical sizes, they are checksummed to see if they actually are identical. This can take a long time.
|
||||
CHECKSUM=no
|
||||
|
||||
## Let RSYNC compress file transfers. Do not use this if both initator and target replicas are on local system. Also, do not use this if you already enabled SSH compression.
|
||||
RSYNC_COMPRESS=yes
|
||||
|
||||
## Maximum execution time (in seconds) for sync process. Set these values zero will disable max execution times.
|
||||
## Soft exec time only generates a warning. Hard exec time will generate a warning and stop sync process.
|
||||
SOFT_MAX_EXEC_TIME=7200
|
||||
HARD_MAX_EXEC_TIME=10600
|
||||
|
||||
## Log a message every KEEP_LOGGING seconds just to know the task is still alive
|
||||
KEEP_LOGGING=1801
|
||||
|
||||
## Minimum time (in seconds) in file monitor /daemon mode between modification detection and sync task in order to let copy operations finish.
|
||||
MIN_WAIT=60
|
||||
|
||||
## Maximum time (in seconds) waiting in file monitor / daemon mode. After this time, sync is run.
|
||||
## Use 0 to wait indefinitely.
|
||||
MAX_WAIT=7200
|
||||
|
||||
## ---------- BACKUP AND DELETION OPTIONS
|
||||
|
||||
## Enabling this option will keep a backup of a file on the target replica if it gets updated from the source replica. Backups will be made to .osync_workdir/backups
|
||||
CONFLICT_BACKUP=yes
|
||||
## Keep multiple backup versions of the same file. Warning, This can be very space consuming.
|
||||
CONFLICT_BACKUP_MULTIPLE=yes
|
||||
## Osync will clean backup files after a given number of days. Setting this to 0 will disable cleaning and keep backups forever. Warning: This can be very space consuming.
|
||||
CONFLICT_BACKUP_DAYS=30
|
||||
## If the same file exists on both replicas, newer version will be synced. However, if both files have the same timestamp but differ, CONFILCT_PREVALANCE sets winner replica.
|
||||
CONFLICT_PREVALANCE=initiator
|
||||
|
||||
## On deletion propagation to the target replica, a backup of the deleted files can be kept. Deletions will be kept in .osync_workdir/deleted
|
||||
SOFT_DELETE=yes
|
||||
## Osync will clean deleted files after a given number of days. Setting this to 0 will disable cleaning and keep deleted files forever. Warning: This can be very space consuming.
|
||||
SOFT_DELETE_DAYS=30
|
||||
|
||||
## Optional deletion skip on replicas. Valid values are "initiator", "target", or "initiator,target"
|
||||
SKIP_DELETION=
|
||||
|
||||
## ---------- RESUME OPTIONS
|
||||
|
||||
## Try to resume an aborted sync task
|
||||
RESUME_SYNC=yes
|
||||
## Number maximum resume tries before initiating a fresh sync.
|
||||
RESUME_TRY=2
|
||||
## When a pidlock exists on slave replica that does not correspond to the initiator's instance-id, force pidlock removal. Be careful with this option if you have multiple initiators.
|
||||
FORCE_STRANGER_LOCK_RESUME=no
|
||||
|
||||
## Keep partial uploads that can be resumed on next run, experimental feature
|
||||
PARTIAL=no
|
||||
|
||||
## Use delta copy algortithm (usefull when local paths are network drives), defaults to yes
|
||||
DELTA_COPIES=yes
|
||||
|
||||
## ---------- ALERT OPTIONS
|
||||
|
||||
## List of alert mails separated by spaces
|
||||
DESTINATION_MAILS="your@alert.tld"
|
||||
|
||||
## Windows specific (msys / cygwin environment) only mail options (used with mailsend.exe from muquit, http://github.com/muquit/mailsend or from sendemail.exe from Brandon Zehm, http://caspian.dotconf.net/menu/Software/SendEmail/)
|
||||
SENDER_MAIL="alert@your.system.tld"
|
||||
SMTP_SERVER=smtp.your.isp.tld
|
||||
SMTP_PORT=25
|
||||
# encryption can be tls, ssl or none
|
||||
SMTP_ENCRYPTION=none
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
|
||||
## ---------- EXECUTION HOOKS
|
||||
|
||||
## Commands can will be run before and / or after sync process (remote execution will only happen if REMOTE_OPERATION is set).
|
||||
LOCAL_RUN_BEFORE_CMD=""
|
||||
LOCAL_RUN_AFTER_CMD=""
|
||||
|
||||
REMOTE_RUN_BEFORE_CMD=""
|
||||
REMOTE_RUN_AFTER_CMD=""
|
||||
|
||||
## Max execution time of commands before they get force killed. Leave 0 if you don't wan't this to happen. Time is specified in seconds.
|
||||
MAX_EXEC_TIME_PER_CMD_BEFORE=0
|
||||
MAX_EXEC_TIME_PER_CMD_AFTER=0
|
||||
|
||||
## Stops osync execution if one of the above commands fail
|
||||
STOP_ON_CMD_ERROR=yes
|
||||
|
||||
## Run local and remote after sync commands even on failure
|
||||
RUN_AFTER_CMD_ON_ERROR=no
|
@ -0,0 +1,185 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###### osync - Rsync based two way sync engine with fault tolerance
|
||||
###### (C) 2013-2016 by Orsiris de Jong (www.netpower.fr)
|
||||
###### osync v1.1x / v1.2x config file rev 2016102101
|
||||
|
||||
## ---------- GENERAL OPTIONS
|
||||
|
||||
## Sync job identification
|
||||
INSTANCE_ID="remote"
|
||||
|
||||
## Directories to synchronize.
|
||||
## Initiator is the system osync runs on. The initiator directory must be a local path.
|
||||
INITIATOR_SYNC_DIR="${HOME}/osync-tests/initiator"
|
||||
|
||||
## Target is the system osync synchronizes to (can be the same system as the initiator in case of local sync tasks). The target directory can be a local or remote path.
|
||||
#TARGET_SYNC_DIR="${HOME}/osync-tests/target"
|
||||
TARGET_SYNC_DIR="ssh://root@localhost:49999/${HOME}/osync-tests/target"
|
||||
|
||||
## If the target system is remote, you can specify a RSA key (please use full path). If not defined, the default ~/.ssh/id_rsa will be used. See documentation for further information.
|
||||
SSH_RSA_PRIVATE_KEY="${HOME}/.ssh/id_rsa_local"
|
||||
|
||||
## Alternatively, you may specify an SSH password file (less secure). Needs sshpass utility installed.
|
||||
SSH_PASSWORD_FILE=""
|
||||
|
||||
## Create sync directories if they do not exist
|
||||
CREATE_DIRS=no
|
||||
|
||||
## Log file location. Leaving this empty will create a logfile at /var/log/osync_version_SYNC_ID.log (or current directory if /var/log doesn't exist)
|
||||
LOGFILE=""
|
||||
|
||||
## Generate an alert if initiator or target replicas have less free space than given value in KB. Set this to zero to skip disk space tests.
|
||||
MINIMUM_SPACE=10240
|
||||
|
||||
## Bandwidth limit Kbytes / second. Leave 0 to disable limitation
|
||||
BANDWIDTH=0
|
||||
|
||||
## If enabled, synchronization on remote system will be processed as superuser. See documentation for /etc/sudoers file configuration.
|
||||
SUDO_EXEC=no
|
||||
## Paranoia option. Don't change this unless you read the documentation.
|
||||
RSYNC_EXECUTABLE=rsync
|
||||
## Remote rsync executable path. Leave this empty in most cases
|
||||
RSYNC_REMOTE_PATH=""
|
||||
|
||||
## Rsync exclude / include order (the option set here will be set first, eg: include will make include then exclude patterns)
|
||||
RSYNC_PATTERN_FIRST=include
|
||||
|
||||
## List of files / directories to incldue / exclude from sync on both sides (see rsync patterns, wildcards work).
|
||||
## Paths are relative to sync dirs. List elements are separated by a semicolon.
|
||||
RSYNC_INCLUDE_PATTERN=""
|
||||
RSYNC_EXCLUDE_PATTERN="*.php"
|
||||
#RSYNC_EXCLUDE_PATTERN="tmp;archives"
|
||||
|
||||
## Files that contains lists of files / directories to include / exclude from sync on both sides. Leave this empty if you don't want to use an exclusion file.
|
||||
## This file has to be in the same directory as the config file
|
||||
## Paths are relative to sync dirs. One element per line.
|
||||
RSYNC_INCLUDE_FROM=""
|
||||
RSYNC_EXCLUDE_FROM=""
|
||||
#RSYNC_EXCLUDE_FROM="exclude.list"
|
||||
|
||||
## List elements separator char. You may set an alternative separator char for your directories lists above.
|
||||
PATH_SEPARATOR_CHAR=";"
|
||||
|
||||
## ---------- REMOTE SYNC OPTIONS
|
||||
|
||||
## ssh compression should be used unless your remote connection is good enough (LAN)
|
||||
SSH_COMPRESSION=yes
|
||||
|
||||
## Ignore ssh known hosts. DANGER WILL ROBINSON DANGER ! This can lead to security issues. Only enable this if you know what you're doing.
|
||||
SSH_IGNORE_KNOWN_HOSTS=no
|
||||
|
||||
## Check for connectivity to remote host before launching remote sync task. Be sure the hosts responds to ping. Failing to ping will stop sync.
|
||||
REMOTE_HOST_PING=no
|
||||
|
||||
## Check for internet access by pinging one or more 3rd party hosts before remote sync task. Leave empty if you don't want this check to be be performed. Failing to ping will stop sync.
|
||||
## If you use this function, you should set more than one 3rd party host, and be sure you can ping them.
|
||||
## Be aware some DNS like opendns redirect false hostnames. Also, this adds an extra execution time of a bit less than a minute.
|
||||
REMOTE_3RD_PARTY_HOSTS="www.kernel.org www.google.com"
|
||||
|
||||
## ---------- MISC OPTIONS
|
||||
|
||||
## Preserve basic linux permissions
|
||||
PRESERVE_PERMISSIONS=yes
|
||||
PRESERVE_OWNER=yes
|
||||
PRESERVE_GROUP=yes
|
||||
## On MACOS X, does not work and will be ignored
|
||||
PRESERVE_EXECUTABILITY=yes
|
||||
|
||||
## Preserve ACLS. Make sure source and target FS can manage same ACLs or you'll get loads of errors.
|
||||
PRESERVE_ACL=yes
|
||||
## Preserve Xattr. Make sure source and target FS can manage same Xattrs or you'll get loads of errors.
|
||||
PRESERVE_XATTR=yes
|
||||
## Transforms symlinks into referent files/dirs
|
||||
COPY_SYMLINKS=no
|
||||
## Treat symlinked dirs as dirs. CAUTION: This also follows symlinks outside of the replica root.
|
||||
KEEP_DIRLINKS=no
|
||||
## Preserve hard links. Make sure source and target FS can manage hard links or you will lose them.
|
||||
PRESERVE_HARDLINKS=no
|
||||
## Do a full checksum on all files that have identical sizes, they are checksummed to see if they actually are identical. This can take a long time.
|
||||
CHECKSUM=no
|
||||
|
||||
## Let RSYNC compress file transfers. Do not use this if both initator and target replicas are on local system. Also, do not use this if you already enabled SSH compression.
|
||||
RSYNC_COMPRESS=yes
|
||||
|
||||
## Maximum execution time (in seconds) for sync process. Set these values zero will disable max execution times.
|
||||
## Soft exec time only generates a warning. Hard exec time will generate a warning and stop sync process.
|
||||
SOFT_MAX_EXEC_TIME=7200
|
||||
HARD_MAX_EXEC_TIME=10600
|
||||
|
||||
## Log a message every KEEP_LOGGING seconds just to know the task is still alive
|
||||
KEEP_LOGGING=1801
|
||||
|
||||
## Minimum time (in seconds) in file monitor /daemon mode between modification detection and sync task in order to let copy operations finish.
|
||||
MIN_WAIT=60
|
||||
|
||||
## Maximum time (in seconds) waiting in file monitor / daemon mode. After this time, sync is run.
|
||||
## Use 0 to wait indefinitely.
|
||||
MAX_WAIT=7200
|
||||
|
||||
## ---------- BACKUP AND DELETION OPTIONS
|
||||
|
||||
## Enabling this option will keep a backup of a file on the target replica if it gets updated from the source replica. Backups will be made to .osync_workdir/backups
|
||||
CONFLICT_BACKUP=yes
|
||||
## Keep multiple backup versions of the same file. Warning, This can be very space consuming.
|
||||
CONFLICT_BACKUP_MULTIPLE=yes
|
||||
## Osync will clean backup files after a given number of days. Setting this to 0 will disable cleaning and keep backups forever. Warning: This can be very space consuming.
|
||||
CONFLICT_BACKUP_DAYS=30
|
||||
## If the same file exists on both replicas, newer version will be synced. However, if both files have the same timestamp but differ, CONFILCT_PREVALANCE sets winner replica.
|
||||
CONFLICT_PREVALANCE=initiator
|
||||
|
||||
## On deletion propagation to the target replica, a backup of the deleted files can be kept. Deletions will be kept in .osync_workdir/deleted
|
||||
SOFT_DELETE=yes
|
||||
## Osync will clean deleted files after a given number of days. Setting this to 0 will disable cleaning and keep deleted files forever. Warning: This can be very space consuming.
|
||||
SOFT_DELETE_DAYS=30
|
||||
|
||||
## Optional deletion skip on replicas. Valid values are "initiator", "target", or "initiator,target"
|
||||
SKIP_DELETION=
|
||||
|
||||
## ---------- RESUME OPTIONS
|
||||
|
||||
## Try to resume an aborted sync task
|
||||
RESUME_SYNC=yes
|
||||
## Number maximum resume tries before initiating a fresh sync.
|
||||
RESUME_TRY=2
|
||||
## When a pidlock exists on slave replica that does not correspond to the initiator's instance-id, force pidlock removal. Be careful with this option if you have multiple initiators.
|
||||
FORCE_STRANGER_LOCK_RESUME=no
|
||||
|
||||
## Keep partial uploads that can be resumed on next run, experimental feature
|
||||
PARTIAL=no
|
||||
|
||||
## Use delta copy algortithm (usefull when local paths are network drives), defaults to yes
|
||||
DELTA_COPIES=yes
|
||||
|
||||
## ---------- ALERT OPTIONS
|
||||
|
||||
## List of alert mails separated by spaces
|
||||
DESTINATION_MAILS="your@alert.tld"
|
||||
|
||||
## Windows specific (msys / cygwin environment) only mail options (used with mailsend.exe from muquit, http://github.com/muquit/mailsend or from sendemail.exe from Brandon Zehm, http://caspian.dotconf.net/menu/Software/SendEmail/)
|
||||
SENDER_MAIL="alert@your.system.tld"
|
||||
SMTP_SERVER=smtp.your.isp.tld
|
||||
SMTP_PORT=25
|
||||
# encryption can be tls, ssl or none
|
||||
SMTP_ENCRYPTION=none
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
|
||||
## ---------- EXECUTION HOOKS
|
||||
|
||||
## Commands can will be run before and / or after sync process (remote execution will only happen if REMOTE_OPERATION is set).
|
||||
LOCAL_RUN_BEFORE_CMD=""
|
||||
LOCAL_RUN_AFTER_CMD=""
|
||||
|
||||
REMOTE_RUN_BEFORE_CMD=""
|
||||
REMOTE_RUN_AFTER_CMD=""
|
||||
|
||||
## Max execution time of commands before they get force killed. Leave 0 if you don't wan't this to happen. Time is specified in seconds.
|
||||
MAX_EXEC_TIME_PER_CMD_BEFORE=0
|
||||
MAX_EXEC_TIME_PER_CMD_AFTER=0
|
||||
|
||||
## Stops osync execution if one of the above commands fail
|
||||
STOP_ON_CMD_ERROR=yes
|
||||
|
||||
## Run local and remote after sync commands even on failure
|
||||
RUN_AFTER_CMD_ON_ERROR=no
|
@ -0,0 +1,185 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###### osync - Rsync based two way sync engine with fault tolerance
|
||||
###### (C) 2013-2016 by Orsiris de Jong (www.netpower.fr)
|
||||
###### osync v1.1x / v1.2x config file rev 2016102101
|
||||
|
||||
## ---------- GENERAL OPTIONS
|
||||
|
||||
## Sync job identification
|
||||
INSTANCE_ID="local"
|
||||
|
||||
## Directories to synchronize.
|
||||
## Initiator is the system osync runs on. The initiator directory must be a local path.
|
||||
INITIATOR_SYNC_DIR="${HOME}/osync-tests/initiator"
|
||||
|
||||
## Target is the system osync synchronizes to (can be the same system as the initiator in case of local sync tasks). The target directory can be a local or remote path.
|
||||
TARGET_SYNC_DIR="${HOME}/osync-tests/target"
|
||||
#TARGET_SYNC_DIR="ssh://backupuser@yourhost.old:22//home/git/osync/dir2"
|
||||
|
||||
## If the target system is remote, you can specify a RSA key (please use full path). If not defined, the default ~/.ssh/id_rsa will be used. See documentation for further information.
|
||||
SSH_RSA_PRIVATE_KEY="/home/backupuser/.ssh/id_rsa"
|
||||
|
||||
## Alternatively, you may specify an SSH password file (less secure). Needs sshpass utility installed.
|
||||
SSH_PASSWORD_FILE=""
|
||||
|
||||
## Create sync directories if they do not exist
|
||||
CREATE_DIRS=no
|
||||
|
||||
## Log file location. Leaving this empty will create a logfile at /var/log/osync_version_SYNC_ID.log (or current directory if /var/log doesn't exist)
|
||||
LOGFILE=""
|
||||
|
||||
## Generate an alert if initiator or target replicas have less free space than given value in KB. Set this to zero to skip disk space tests.
|
||||
MINIMUM_SPACE=10240
|
||||
|
||||
## Bandwidth limit Kbytes / second. Leave 0 to disable limitation
|
||||
BANDWIDTH=0
|
||||
|
||||
## If enabled, synchronization on remote system will be processed as superuser. See documentation for /etc/sudoers file configuration.
|
||||
SUDO_EXEC=no
|
||||
## Paranoia option. Don't change this unless you read the documentation.
|
||||
RSYNC_EXECUTABLE=rsync
|
||||
## Remote rsync executable path. Leave this empty in most cases
|
||||
RSYNC_REMOTE_PATH=""
|
||||
|
||||
## Rsync exclude / include order (the option set here will be set first, eg: include will make include then exclude patterns)
|
||||
RSYNC_PATTERN_FIRST=include
|
||||
|
||||
## List of files / directories to incldue / exclude from sync on both sides (see rsync patterns, wildcards work).
|
||||
## Paths are relative to sync dirs. List elements are separated by a semicolon.
|
||||
RSYNC_INCLUDE_PATTERN=""
|
||||
RSYNC_EXCLUDE_PATTERN="*.php"
|
||||
#RSYNC_EXCLUDE_PATTERN="tmp;archives"
|
||||
|
||||
## Files that contains lists of files / directories to include / exclude from sync on both sides. Leave this empty if you don't want to use an exclusion file.
|
||||
## This file has to be in the same directory as the config file
|
||||
## Paths are relative to sync dirs. One element per line.
|
||||
RSYNC_INCLUDE_FROM=""
|
||||
RSYNC_EXCLUDE_FROM=""
|
||||
#RSYNC_EXCLUDE_FROM="exclude.list"
|
||||
|
||||
## List elements separator char. You may set an alternative separator char for your directories lists above.
|
||||
PATH_SEPARATOR_CHAR=";"
|
||||
|
||||
## ---------- REMOTE SYNC OPTIONS
|
||||
|
||||
## ssh compression should be used unless your remote connection is good enough (LAN)
|
||||
SSH_COMPRESSION=yes
|
||||
|
||||
## Ignore ssh known hosts. DANGER WILL ROBINSON DANGER ! This can lead to security issues. Only enable this if you know what you're doing.
|
||||
SSH_IGNORE_KNOWN_HOSTS=no
|
||||
|
||||
## Check for connectivity to remote host before launching remote sync task. Be sure the hosts responds to ping. Failing to ping will stop sync.
|
||||
REMOTE_HOST_PING=no
|
||||
|
||||
## Check for internet access by pinging one or more 3rd party hosts before remote sync task. Leave empty if you don't want this check to be be performed. Failing to ping will stop sync.
|
||||
## If you use this function, you should set more than one 3rd party host, and be sure you can ping them.
|
||||
## Be aware some DNS like opendns redirect false hostnames. Also, this adds an extra execution time of a bit less than a minute.
|
||||
REMOTE_3RD_PARTY_HOSTS="www.kernel.org www.google.com"
|
||||
|
||||
## ---------- MISC OPTIONS
|
||||
|
||||
## Preserve basic linux permissions
|
||||
PRESERVE_PERMISSIONS=yes
|
||||
PRESERVE_OWNER=yes
|
||||
PRESERVE_GROUP=yes
|
||||
## On MACOS X, does not work and will be ignored
|
||||
PRESERVE_EXECUTABILITY=yes
|
||||
|
||||
## Preserve ACLS. Make sure source and target FS can manage same ACLs or you'll get loads of errors.
|
||||
PRESERVE_ACL=yes
|
||||
## Preserve Xattr. Make sure source and target FS can manage same Xattrs or you'll get loads of errors.
|
||||
PRESERVE_XATTR=yes
|
||||
## Transforms symlinks into referent files/dirs
|
||||
COPY_SYMLINKS=no
|
||||
## Treat symlinked dirs as dirs. CAUTION: This also follows symlinks outside of the replica root.
|
||||
KEEP_DIRLINKS=no
|
||||
## Preserve hard links. Make sure source and target FS can manage hard links or you will lose them.
|
||||
PRESERVE_HARDLINKS=no
|
||||
## Do a full checksum on all files that have identical sizes, they are checksummed to see if they actually are identical. This can take a long time.
|
||||
CHECKSUM=no
|
||||
|
||||
## Let RSYNC compress file transfers. Do not use this if both initator and target replicas are on local system. Also, do not use this if you already enabled SSH compression.
|
||||
RSYNC_COMPRESS=yes
|
||||
|
||||
## Maximum execution time (in seconds) for sync process. Set these values zero will disable max execution times.
|
||||
## Soft exec time only generates a warning. Hard exec time will generate a warning and stop sync process.
|
||||
SOFT_MAX_EXEC_TIME=7200
|
||||
HARD_MAX_EXEC_TIME=10600
|
||||
|
||||
## Log a message every KEEP_LOGGING seconds just to know the task is still alive
|
||||
KEEP_LOGGING=1801
|
||||
|
||||
## Minimum time (in seconds) in file monitor /daemon mode between modification detection and sync task in order to let copy operations finish.
|
||||
MIN_WAIT=60
|
||||
|
||||
## Maximum time (in seconds) waiting in file monitor / daemon mode. After this time, sync is run.
|
||||
## Use 0 to wait indefinitely.
|
||||
MAX_WAIT=7200
|
||||
|
||||
## ---------- BACKUP AND DELETION OPTIONS
|
||||
|
||||
## Enabling this option will keep a backup of a file on the target replica if it gets updated from the source replica. Backups will be made to .osync_workdir/backups
|
||||
CONFLICT_BACKUP=yes
|
||||
## Keep multiple backup versions of the same file. Warning, This can be very space consuming.
|
||||
CONFLICT_BACKUP_MULTIPLE=no
|
||||
## Osync will clean backup files after a given number of days. Setting this to 0 will disable cleaning and keep backups forever. Warning: This can be very space consuming.
|
||||
CONFLICT_BACKUP_DAYS=30
|
||||
## If the same file exists on both replicas, newer version will be synced. However, if both files have the same timestamp but differ, CONFILCT_PREVALANCE sets winner replica.
|
||||
CONFLICT_PREVALANCE=initiator
|
||||
|
||||
## On deletion propagation to the target replica, a backup of the deleted files can be kept. Deletions will be kept in .osync_workdir/deleted
|
||||
SOFT_DELETE=yes
|
||||
## Osync will clean deleted files after a given number of days. Setting this to 0 will disable cleaning and keep deleted files forever. Warning: This can be very space consuming.
|
||||
SOFT_DELETE_DAYS=30
|
||||
|
||||
## Optional deletion skip on replicas. Valid values are "initiator", "target", or "initiator,target"
|
||||
SKIP_DELETION=
|
||||
|
||||
## ---------- RESUME OPTIONS
|
||||
|
||||
## Try to resume an aborted sync task
|
||||
RESUME_SYNC=yes
|
||||
## Number maximum resume tries before initiating a fresh sync.
|
||||
RESUME_TRY=2
|
||||
## When a pidlock exists on slave replica that does not correspond to the initiator's instance-id, force pidlock removal. Be careful with this option if you have multiple initiators.
|
||||
FORCE_STRANGER_LOCK_RESUME=no
|
||||
|
||||
## Keep partial uploads that can be resumed on next run, experimental feature
|
||||
PARTIAL=no
|
||||
|
||||
## Use delta copy algortithm (usefull when local paths are network drives), defaults to yes
|
||||
DELTA_COPIES=yes
|
||||
|
||||
## ---------- ALERT OPTIONS
|
||||
|
||||
## List of alert mails separated by spaces
|
||||
DESTINATION_MAILS="your@alert.tld"
|
||||
|
||||
## Windows specific (msys / cygwin environment) only mail options (used with mailsend.exe from muquit, http://github.com/muquit/mailsend or from sendemail.exe from Brandon Zehm, http://caspian.dotconf.net/menu/Software/SendEmail/)
|
||||
SENDER_MAIL="alert@your.system.tld"
|
||||
SMTP_SERVER=smtp.your.isp.tld
|
||||
SMTP_PORT=25
|
||||
# encryption can be tls, ssl or none
|
||||
SMTP_ENCRYPTION=none
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
|
||||
## ---------- EXECUTION HOOKS
|
||||
|
||||
## Commands can will be run before and / or after sync process (remote execution will only happen if REMOTE_OPERATION is set).
|
||||
LOCAL_RUN_BEFORE_CMD=""
|
||||
LOCAL_RUN_AFTER_CMD=""
|
||||
|
||||
REMOTE_RUN_BEFORE_CMD=""
|
||||
REMOTE_RUN_AFTER_CMD=""
|
||||
|
||||
## Max execution time of commands before they get force killed. Leave 0 if you don't wan't this to happen. Time is specified in seconds.
|
||||
MAX_EXEC_TIME_PER_CMD_BEFORE=0
|
||||
MAX_EXEC_TIME_PER_CMD_AFTER=0
|
||||
|
||||
## Stops osync execution if one of the above commands fail
|
||||
STOP_ON_CMD_ERROR=yes
|
||||
|
||||
## Run local and remote after sync commands even on failure
|
||||
RUN_AFTER_CMD_ON_ERROR=no
|
@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
|
||||
###### Osync - Rsync based two way sync engine with fault tolerance
|
||||
###### (L) 2013 by Orsiris "Ozy" de Jong (www.netpower.fr)
|
||||
#### Config file rev 0211201302
|
||||
|
||||
## ---------- GENERAL OPTIONS
|
||||
|
||||
## Sync job identification
|
||||
SYNC_ID="old"
|
||||
|
||||
## Directories to synchronize. Master must be on the system Osync runs on. Slave can be either on the same system, or on a remote one.
|
||||
MASTER_SYNC_DIR="${HOME}/osync-tests/initiator"
|
||||
SLAVE_SYNC_DIR="${HOME}/osync-tests/target"
|
||||
|
||||
## Create sync directories if they do not exist
|
||||
CREATE_DIRS=no
|
||||
|
||||
## Log file location. Leaving this empty will create a logfile at /var/log/osync_version_SYNC_ID.log (or current directory if /var/log doesn't exist)
|
||||
LOGFILE=""
|
||||
|
||||
## List of directories to exclude from sync on both sides (rsync patterns, wildcards work).
|
||||
## Paths are relative to sync dirs. List elements are separated by a semicolon.
|
||||
RSYNC_EXCLUDE_PATTERN="tmp;archives"
|
||||
## List elements separator char. You may set an alternative seperator char for your directories lists above.
|
||||
PATH_SEPARATOR_CHAR=";"
|
||||
|
||||
## Generate an alert if master or slave replicas have less free space than given value in KB.
|
||||
MINIMUM_SPACE=10240
|
||||
|
||||
## Bandwidth limit Kbytes / second. Leave 0 to disable limitation
|
||||
BANDWIDTH=0
|
||||
|
||||
## If enabled, synchronization will be processed as superuser. See documentation for /etc/sudoers file configuration.
|
||||
SUDO_EXEC=no
|
||||
## Paranoia option. Don't change this unless you read the documentation.
|
||||
RSYNC_EXECUTABLE=rsync
|
||||
|
||||
## ---------- REMOTE SYNC OPTIONS
|
||||
|
||||
## The following options allow Osync to sync a slave replica on a remote system via an SSH tunnel.
|
||||
## Needs public RSA key need to be put into ~/.ssh/authorized_keys in remote users home directory. See documentation for remote sync.
|
||||
REMOTE_SYNC=no
|
||||
SSH_RSA_PRIVATE_KEY=~/.ssh/id_rsa
|
||||
REMOTE_USER=syncuser
|
||||
REMOTE_HOST=your-remote-host.tld
|
||||
REMOTE_PORT=22
|
||||
## ssh compression should be used unless your remote connection is good enough (LAN)
|
||||
SSH_COMPRESSION=yes
|
||||
|
||||
## Check for connectivity to remote host before launching remote sync task. Be sure the hosts responds to ping. Failing to ping will stop sync.
|
||||
REMOTE_HOST_PING=no
|
||||
|
||||
## Check for internet access by pinging one or more 3rd party hosts before remote sync task. Leave empty if you don't want this check to be be performed. Failing to ping will stop sync.
|
||||
## If you use this function, you should set more than one 3rd party host, and be sure you can ping them.
|
||||
## Be aware some DNS like opendns redirect false hostnames. Also, this adds an extra execution time of a bit less than a minute.
|
||||
REMOTE_3RD_PARTY_HOSTS=""
|
||||
|
||||
## Remote rsync executable path. Leave this empty in most cases
|
||||
REMOTE_RSYNC_PATH=""
|
||||
|
||||
## ---------- MISC OPTIONS
|
||||
|
||||
## Preserve ACLS. Make sure source and target FS can manage same ACLs or you'll get loads of errors.
|
||||
PRESERVE_ACL=no
|
||||
## Preserve Xattr. Make sure source and target FS can manage same Xattrs or you'll get loads of errors.
|
||||
PRESERVE_XATTR=no
|
||||
|
||||
## Let RSYNC compress file transfers. Do not use this if both master and slave replicas are on local system. Also, do not use this if you already enabled SSH compression.
|
||||
RSYNC_COMPRESS=yes
|
||||
|
||||
## Maximum execution time (in seconds) for sync process. Soft exec time only generates a warning. Hard exec time will generate a warning and stop sync process.
|
||||
SOFT_MAX_EXEC_TIME=7200
|
||||
HARD_MAX_EXEC_TIME=10600
|
||||
|
||||
## ---------- BACKUP AND TRASH OPTIONS
|
||||
|
||||
## Enabling this option will keep a backup of a file on the target replica if it gets updated from the source replica. Backups will be made to .osync_workdir/backups
|
||||
CONFLICT_BACKUP=yes
|
||||
## Keep multiple backup versions of the same file. Warning, This can be very space consuming.
|
||||
CONFLICT_BACKUP_MULTIPLE=no
|
||||
## Osync will clean backup files after a given number of days. Setting this to 0 will disable cleaning and keep backups forever. Warning: This can be very space consuming.
|
||||
CONFLICT_BACKUP_DAYS=30
|
||||
## If the same file exists on both replicas, newer version will be synced. However, if both files have the same timestamp but differ, CONFILCT_PREVALANCE sets winner replica.
|
||||
CONFLICT_PREVALANCE=master
|
||||
|
||||
## On deletition propagation to the target replica, a backup of the deleted files can be kept. Deletions will be kept in .osync_workdir/deleted
|
||||
SOFT_DELETE=yes
|
||||
## Osync will clean deleted files after a given number of days. Setting this to 0 will disable cleaning and keep deleted files forever. Warning: This can be very space consuming.
|
||||
SOFT_DELETE_DAYS=30
|
||||
|
||||
## ---------- RESUME OPTIONS
|
||||
|
||||
## Try to resume an aborted sync task
|
||||
RESUME_SYNC=yes
|
||||
## Number maximum resume tries before initating a fresh sync.
|
||||
RESUME_TRY=2
|
||||
## When a pidlock exists on slave replica that does not correspond to master's sync-id, force pidlock removal. Be carefull with this option if you have multiple masters.
|
||||
FORCE_STRANGER_LOCK_RESUME=no
|
||||
|
||||
## ---------- ALERT OPTIONS
|
||||
|
||||
## List of alert mails separated by spaces
|
||||
DESTINATION_MAILS="your@alert.tld"
|
||||
|
||||
## Windows (MSYS environment) only mail options (used by sendemail.exe)
|
||||
SENDER_MAIL="alert@your.system"
|
||||
SMTP_SERVER=smtp.your.isp.com
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
|
||||
## ---------- EXECUTION HOOKS
|
||||
|
||||
## Commands can will be run before and / or after sync process (remote execution will only happen if REMOTE_SYNC is set).
|
||||
LOCAL_RUN_BEFORE_CMD=""
|
||||
LOCAL_RUN_AFTER_CMD=""
|
||||
|
||||
REMOTE_RUN_BEFORE_CMD=""
|
||||
REMOTE_RUN_AFTER_CMD=""
|
||||
|
||||
## Max execution time of commands before they get force killed. Leave 0 if you don't wan't this to happen. Time is specified in seconds.
|
||||
MAX_EXEC_TIME_PER_CMD_BEFORE=0
|
||||
MAX_EXEC_TIME_PER_CMD_AFTER=0
|
||||
|
||||
## Stops Osync execution if one of the above commands fail
|
||||
STOP_ON_CMD_ERROR=yes
|
@ -0,0 +1,185 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
###### osync - Rsync based two way sync engine with fault tolerance
|
||||
###### (C) 2013-2016 by Orsiris de Jong (www.netpower.fr)
|
||||
###### osync v1.1x / v1.2x config file rev 2016102101
|
||||
|
||||
## ---------- GENERAL OPTIONS
|
||||
|
||||
## Sync job identification
|
||||
INSTANCE_ID="remote"
|
||||
|
||||
## Directories to synchronize.
|
||||
## Initiator is the system osync runs on. The initiator directory must be a local path.
|
||||
INITIATOR_SYNC_DIR="${HOME}/osync-tests/initiator"
|
||||
|
||||
## Target is the system osync synchronizes to (can be the same system as the initiator in case of local sync tasks). The target directory can be a local or remote path.
|
||||
#TARGET_SYNC_DIR="${HOME}/osync-tests/target"
|
||||
TARGET_SYNC_DIR="ssh://travis@localhost:22/${HOME}/osync-tests/target"
|
||||
|
||||
## If the target system is remote, you can specify a RSA key (please use full path). If not defined, the default ~/.ssh/id_rsa will be used. See documentation for further information.
|
||||
SSH_RSA_PRIVATE_KEY="${HOME}/.ssh/id_rsa_local"
|
||||
|
||||
## Alternatively, you may specify an SSH password file (less secure). Needs sshpass utility installed.
|
||||
SSH_PASSWORD_FILE=""
|
||||
|
||||
## Create sync directories if they do not exist
|
||||
CREATE_DIRS=no
|
||||
|
||||
## Log file location. Leaving this empty will create a logfile at /var/log/osync_version_SYNC_ID.log (or current directory if /var/log doesn't exist)
|
||||
LOGFILE=""
|
||||
|
||||
## Generate an alert if initiator or target replicas have less free space than given value in KB. Set this to zero to skip disk space tests.
|
||||
MINIMUM_SPACE=10240
|
||||
|
||||
## Bandwidth limit Kbytes / second. Leave 0 to disable limitation
|
||||
BANDWIDTH=0
|
||||
|
||||
## If enabled, synchronization on remote system will be processed as superuser. See documentation for /etc/sudoers file configuration.
|
||||
SUDO_EXEC=no
|
||||
## Paranoia option. Don't change this unless you read the documentation.
|
||||
RSYNC_EXECUTABLE=rsync
|
||||
## Remote rsync executable path. Leave this empty in most cases
|
||||
RSYNC_REMOTE_PATH=""
|
||||
|
||||
## Rsync exclude / include order (the option set here will be set first, eg: include will make include then exclude patterns)
|
||||
RSYNC_PATTERN_FIRST=include
|
||||
|
||||
## List of files / directories to incldue / exclude from sync on both sides (see rsync patterns, wildcards work).
|
||||
## Paths are relative to sync dirs. List elements are separated by a semicolon.
|
||||
RSYNC_INCLUDE_PATTERN=""
|
||||
RSYNC_EXCLUDE_PATTERN="*.php"
|
||||
#RSYNC_EXCLUDE_PATTERN="tmp;archives"
|
||||
|
||||
## Files that contains lists of files / directories to include / exclude from sync on both sides. Leave this empty if you don't want to use an exclusion file.
|
||||
## This file has to be in the same directory as the config file
|
||||
## Paths are relative to sync dirs. One element per line.
|
||||
RSYNC_INCLUDE_FROM=""
|
||||
RSYNC_EXCLUDE_FROM=""
|
||||
#RSYNC_EXCLUDE_FROM="exclude.list"
|
||||
|
||||
## List elements separator char. You may set an alternative separator char for your directories lists above.
|
||||
PATH_SEPARATOR_CHAR=";"
|
||||
|
||||
## ---------- REMOTE SYNC OPTIONS
|
||||
|
||||
## ssh compression should be used unless your remote connection is good enough (LAN)
|
||||
SSH_COMPRESSION=yes
|
||||
|
||||
## Ignore ssh known hosts. DANGER WILL ROBINSON DANGER ! This can lead to security issues. Only enable this if you know what you're doing.
|
||||
SSH_IGNORE_KNOWN_HOSTS=no
|
||||
|
||||
## Check for connectivity to remote host before launching remote sync task. Be sure the hosts responds to ping. Failing to ping will stop sync.
|
||||
REMOTE_HOST_PING=no
|
||||
|
||||
## Check for internet access by pinging one or more 3rd party hosts before remote sync task. Leave empty if you don't want this check to be be performed. Failing to ping will stop sync.
|
||||
## If you use this function, you should set more than one 3rd party host, and be sure you can ping them.
|
||||
## Be aware some DNS like opendns redirect false hostnames. Also, this adds an extra execution time of a bit less than a minute.
|
||||
REMOTE_3RD_PARTY_HOSTS=""
|
||||
|
||||
## ---------- MISC OPTIONS
|
||||
|
||||
## Preserve basic linux permissions
|
||||
PRESERVE_PERMISSIONS=yes
|
||||
PRESERVE_OWNER=yes
|
||||
PRESERVE_GROUP=yes
|
||||
## On MACOS X, does not work and will be ignored
|
||||
PRESERVE_EXECUTABILITY=yes
|
||||
|
||||
## Preserve ACLS. Make sure source and target FS can manage same ACLs or you'll get loads of errors.
|
||||
PRESERVE_ACL=yes
|
||||
## Preserve Xattr. Make sure source and target FS can manage same Xattrs or you'll get loads of errors.
|
||||
PRESERVE_XATTR=yes
|
||||
## Transforms symlinks into referent files/dirs
|
||||
COPY_SYMLINKS=no
|
||||
## Treat symlinked dirs as dirs. CAUTION: This also follows symlinks outside of the replica root.
|
||||
KEEP_DIRLINKS=no
|
||||
## Preserve hard links. Make sure source and target FS can manage hard links or you will lose them.
|
||||
PRESERVE_HARDLINKS=no
|
||||
## Do a full checksum on all files that have identical sizes, they are checksummed to see if they actually are identical. This can take a long time.
|
||||
CHECKSUM=no
|
||||
|
||||
## Let RSYNC compress file transfers. Do not use this if both initator and target replicas are on local system. Also, do not use this if you already enabled SSH compression.
|
||||
RSYNC_COMPRESS=yes
|
||||
|
||||
## Maximum execution time (in seconds) for sync process. Set these values zero will disable max execution times.
|
||||
## Soft exec time only generates a warning. Hard exec time will generate a warning and stop sync process.
|
||||
SOFT_MAX_EXEC_TIME=7200
|
||||
HARD_MAX_EXEC_TIME=10600
|
||||
|
||||
## Log a message every KEEP_LOGGING seconds just to know the task is still alive
|
||||
KEEP_LOGGING=1801
|
||||
|
||||
## Minimum time (in seconds) in file monitor /daemon mode between modification detection and sync task in order to let copy operations finish.
|
||||
MIN_WAIT=60
|
||||
|
||||
## Maximum time (in seconds) waiting in file monitor / daemon mode. After this time, sync is run.
|
||||
## Use 0 to wait indefinitely.
|
||||
MAX_WAIT=7200
|
||||
|
||||
## ---------- BACKUP AND DELETION OPTIONS
|
||||
|
||||
## Enabling this option will keep a backup of a file on the target replica if it gets updated from the source replica. Backups will be made to .osync_workdir/backups
|
||||
CONFLICT_BACKUP=yes
|
||||
## Keep multiple backup versions of the same file. Warning, This can be very space consuming.
|
||||
CONFLICT_BACKUP_MULTIPLE=no
|
||||
## Osync will clean backup files after a given number of days. Setting this to 0 will disable cleaning and keep backups forever. Warning: This can be very space consuming.
|
||||
CONFLICT_BACKUP_DAYS=30
|
||||
## If the same file exists on both replicas, newer version will be synced. However, if both files have the same timestamp but differ, CONFILCT_PREVALANCE sets winner replica.
|
||||
CONFLICT_PREVALANCE=initiator
|
||||
|
||||
## On deletion propagation to the target replica, a backup of the deleted files can be kept. Deletions will be kept in .osync_workdir/deleted
|
||||
SOFT_DELETE=yes
|
||||
## Osync will clean deleted files after a given number of days. Setting this to 0 will disable cleaning and keep deleted files forever. Warning: This can be very space consuming.
|
||||
SOFT_DELETE_DAYS=30
|
||||
|
||||
## Optional deletion skip on replicas. Valid values are "initiator", "target", or "initiator,target"
|
||||
SKIP_DELETION=
|
||||
|
||||
## ---------- RESUME OPTIONS
|
||||
|
||||
## Try to resume an aborted sync task
|
||||
RESUME_SYNC=yes
|
||||
## Number maximum resume tries before initiating a fresh sync.
|
||||
RESUME_TRY=2
|
||||
## When a pidlock exists on slave replica that does not correspond to the initiator's instance-id, force pidlock removal. Be careful with this option if you have multiple initiators.
|
||||
FORCE_STRANGER_LOCK_RESUME=no
|
||||
|
||||
## Keep partial uploads that can be resumed on next run, experimental feature
|
||||
PARTIAL=no
|
||||
|
||||
## Use delta copy algortithm (usefull when local paths are network drives), defaults to yes
|
||||
DELTA_COPIES=yes
|
||||
|
||||
## ---------- ALERT OPTIONS
|
||||
|
||||
## List of alert mails separated by spaces
|
||||
DESTINATION_MAILS="your@alert.tld"
|
||||
|
||||
## Windows specific (msys / cygwin environment) only mail options (used with mailsend.exe from muquit, http://github.com/muquit/mailsend or from sendemail.exe from Brandon Zehm, http://caspian.dotconf.net/menu/Software/SendEmail/)
|
||||
SENDER_MAIL="alert@your.system.tld"
|
||||
SMTP_SERVER=smtp.your.isp.tld
|
||||
SMTP_PORT=25
|
||||
# encryption can be tls, ssl or none
|
||||
SMTP_ENCRYPTION=none
|
||||
SMTP_USER=
|
||||
SMTP_PASSWORD=
|
||||
|
||||
## ---------- EXECUTION HOOKS
|
||||
|
||||
## Commands can will be run before and / or after sync process (remote execution will only happen if REMOTE_OPERATION is set).
|
||||
LOCAL_RUN_BEFORE_CMD=""
|
||||
LOCAL_RUN_AFTER_CMD=""
|
||||
|
||||
REMOTE_RUN_BEFORE_CMD=""
|
||||
REMOTE_RUN_AFTER_CMD=""
|
||||
|
||||
## Max execution time of commands before they get force killed. Leave 0 if you don't wan't this to happen. Time is specified in seconds.
|
||||
MAX_EXEC_TIME_PER_CMD_BEFORE=0
|
||||
MAX_EXEC_TIME_PER_CMD_AFTER=0
|
||||
|
||||
## Stops osync execution if one of the above commands fail
|
||||
STOP_ON_CMD_ERROR=yes
|
||||
|
||||
## Run local and remote after sync commands even on failure
|
||||
RUN_AFTER_CMD_ON_ERROR=no
|
@ -1,8 +1,707 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Basic run test to make travis happy
|
||||
# osync test suite 2016111505
|
||||
|
||||
mkdir t1
|
||||
mkdir t2
|
||||
# 4 tests:
|
||||
# quicklocal
|
||||
# quickremote
|
||||
# conflocal
|
||||
# confremote
|
||||
|
||||
./osync.sh --initiator=t1 --target=t2
|
||||
# for each test:
|
||||
# files with spaces, subdirs
|
||||
# largefileset (...large ?)
|
||||
# exclusions
|
||||
# conflict resolution initiator with backups / multiple backups
|
||||
# conflict resolution target with backups / multiple backups
|
||||
# deletion propagation, failed deletion repropagation
|
||||
# lock checks
|
||||
# file attribute tests
|
||||
|
||||
#TODO: lock checks missing
|
||||
#TODO: skip deletion tests
|
||||
#TODO: daemon mode tests
|
||||
#TODO: check file contents on attribute updates
|
||||
|
||||
#TODO: enable teardown after tests
|
||||
|
||||
LARGE_FILESET_URL="http://ftp.drupal.org/files/projects/drupal-8.1.9.tar.gz"
|
||||
|
||||
OSYNC_DIR="$(pwd)"
|
||||
OSYNC_DIR=${OSYNC_DIR%%/dev*}
|
||||
DEV_DIR="$OSYNC_DIR/dev"
|
||||
TESTS_DIR="$DEV_DIR/tests"
|
||||
|
||||
LOCAL_CONF="local.conf"
|
||||
REMOTE_CONF="remote.conf"
|
||||
OLD_CONF="old.conf"
|
||||
TMP_OLD_CONF="tmp.old.conf"
|
||||
|
||||
OSYNC_EXECUTABLE="osync.sh"
|
||||
OSYNC_UPGRADE="upgrade-v1.0x-v1.2x.sh"
|
||||
TMP_FILE="$DEV_DIR/tmp"
|
||||
|
||||
|
||||
|
||||
if [ "$TRAVIS_RUN" == true ]; then
|
||||
echo "Running with travis settings"
|
||||
CONF_DIR="$TESTS_DIR/conf-travis"
|
||||
SSH_PORT=22
|
||||
else
|
||||
echo "Running with local settings"
|
||||
CONF_DIR="$TESTS_DIR/conf-local"
|
||||
SSH_PORT=49999
|
||||
fi
|
||||
|
||||
OSYNC_TESTS_DIR="${HOME}/osync-tests"
|
||||
INITIATOR_DIR="$OSYNC_TESTS_DIR/initiator"
|
||||
TARGET_DIR="$OSYNC_TESTS_DIR/target"
|
||||
OSYNC_WORKDIR=".osync_workdir"
|
||||
OSYNC_STATE_DIR="$OSYNC_WORKDIR/state"
|
||||
OSYNC_DELETE_DIR="$OSYNC_WORKDIR/deleted"
|
||||
OSYNC_BACKUP_DIR="$OSYNC_WORKDIR/backup"
|
||||
|
||||
# Setup an array with all function modes
|
||||
declare -Ag osyncParameters
|
||||
|
||||
osyncParameters[quicklocal]="--initiator=$INITIATOR_DIR --target=$TARGET_DIR --instance-id=quicklocal"
|
||||
osyncParameters[quickRemote]="--initiator=$INITIATOR_DIR --target=ssh://localhost:$SSH_PORT/$TARGET_DIR --rsakey=${HOME}/.ssh/id_rsa_local --instance-id=quickremote"
|
||||
osyncParameters[confLocal]="$CONF_DIR/$LOCAL_CONF"
|
||||
osyncParameters[confRemote]="$CONF_DIR/$REMOTE_CONF"
|
||||
#osyncParameters[daemonlocal]="$CONF_DIR/$LOCAL_CONF --on-changes"
|
||||
#osyncParameters[daemonlocal]="$CONF_DIR/$REMOTE_CONF --on-changes"
|
||||
|
||||
function GetConfFileValue () {
|
||||
local file="${1}"
|
||||
local name="${2}"
|
||||
local value
|
||||
|
||||
value=$(grep "^$name=" "$file")
|
||||
if [ $? == 0 ]; then
|
||||
value="${value##*=}"
|
||||
echo "$value"
|
||||
else
|
||||
assertEquals "$name does not exist in [$file." "1" "0"
|
||||
fi
|
||||
}
|
||||
|
||||
function SetConfFileValue () {
|
||||
local file="${1}"
|
||||
local name="${2}"
|
||||
local value="${3}"
|
||||
|
||||
if grep "^$name=" "$file" > /dev/null; then
|
||||
sed -i.tmp "s/^$name=.*/$name=$value/" "$file"
|
||||
assertEquals "Set $name to [$value]." "0" $?
|
||||
else
|
||||
assertEquals "$name does not exist in [$file]." "1" "0"
|
||||
fi
|
||||
}
|
||||
|
||||
function SetStableToYes () {
|
||||
if grep "^IS_STABLE=YES" "$OSYNC_DIR/$OSYNC_EXECUTABLE" > /dev/null; then
|
||||
IS_STABLE=yes
|
||||
else
|
||||
IS_STABLE=no
|
||||
sed -i.tmp 's/^IS_STABLE=no/IS_STABLE=yes/' "$OSYNC_DIR/$OSYNC_EXECUTABLE"
|
||||
assertEquals "Set stable to yes" "0" $?
|
||||
fi
|
||||
}
|
||||
|
||||
function SetStableToOrigin () {
|
||||
if [ "$IS_STABLE" == "no" ]; then
|
||||
sed -i.tmp 's/^IS_STABLE=yes/IS_STABLE=no/' "$OSYNC_DIR/$OSYNC_EXECUTABLE"
|
||||
assertEquals "Set stable to origin value" "0" $?
|
||||
fi
|
||||
}
|
||||
|
||||
function SetupSSH {
|
||||
echo -e 'y\n'| ssh-keygen -t rsa -b 2048 -N "" -f "${HOME}/.ssh/id_rsa_local"
|
||||
cat "${HOME}/.ssh/id_rsa_local.pub" >> "${HOME}/.ssh/authorized_keys"
|
||||
chmod 600 "${HOME}/.ssh/authorized_keys"
|
||||
|
||||
# Add localhost to known hosts so self connect works
|
||||
if [ -z $(ssh-keygen -F localhost) ]; then
|
||||
ssh-keyscan -H localhost >> ~/.ssh/known_hosts
|
||||
fi
|
||||
}
|
||||
|
||||
function DownloadLargeFileSet() {
|
||||
local destinationPath="${1}"
|
||||
|
||||
cd "$OSYNC_DIR"
|
||||
wget -q "$LARGE_FILESET_URL" > /dev/null
|
||||
assertEquals "Download [$LARGE_FILESET_URL]." "0" $?
|
||||
|
||||
tar xvf "$(basename $LARGE_FILESET_URL)" -C "$destinationPath" > /dev/null
|
||||
assertEquals "Extract $(basename $LARGE_FILESET_URL)" "0" $?
|
||||
|
||||
rm -f "$(basename $LARGE_FILESET_URL)"
|
||||
}
|
||||
|
||||
function CreateOldFile () {
|
||||
local drive
|
||||
local filePath="${1}"
|
||||
|
||||
touch "$filePath"
|
||||
assertEquals "touch [$filePath]" "0" $?
|
||||
|
||||
# Get current drive
|
||||
drive=$(df "$OSYNC_DIR" | tail -1 | awk '{print $1}')
|
||||
|
||||
# modify ctime on ext4 so osync thinks it has to delete the old files
|
||||
debugfs -w -R 'set_inode_field "'$filePath'" ctime 201001010101' $drive
|
||||
assertEquals "CreateOldFile [$filePath]" "0" $?
|
||||
|
||||
# force update of inodes (ctimes)
|
||||
echo 3 > /proc/sys/vm/drop_caches
|
||||
assertEquals "Drop caches" "0" $?
|
||||
}
|
||||
|
||||
function PrepareLocalDirs () {
|
||||
# Remote dirs are the same as local dirs, so no problem here
|
||||
if [ -d "$INITIATOR_DIR" ]; then
|
||||
rm -rf "$INITIATOR_DIR"
|
||||
fi
|
||||
mkdir -p "$INITIATOR_DIR"
|
||||
|
||||
if [ -d "$TARGET_DIR" ]; then
|
||||
rm -rf "$TARGET_DIR"
|
||||
fi
|
||||
mkdir -p "$TARGET_DIR"
|
||||
}
|
||||
|
||||
function oneTimeSetUp () {
|
||||
source "$DEV_DIR/ofunctions.sh"
|
||||
SetupSSH
|
||||
|
||||
# Get osync version
|
||||
OSYNC_VERSION=$(grep "PROGRAM_VERSION" "$OSYNC_DIR/$OSYNC_EXECUTABLE")
|
||||
OSYNC_VERSION="${OSYNC_VERSION##*=}"
|
||||
OSYNC_MIN_VERSION="${OSYNC_VERSION:2:1}"
|
||||
}
|
||||
|
||||
function oneTimeTearDown () {
|
||||
SetStableToOrigin
|
||||
#rm -rf "$OSYNC_TESTS_DIR"
|
||||
}
|
||||
|
||||
function setUp () {
|
||||
rm -rf "$INITIATOR_DIR"
|
||||
rm -rf "$TARGET_DIR"
|
||||
}
|
||||
|
||||
# This test has to be done everytime in order for osync executable to be fresh
|
||||
function test_Merge () {
|
||||
cd "$DEV_DIR"
|
||||
./merge.sh
|
||||
assertEquals "Merging code" "0" $?
|
||||
SetStableToYes
|
||||
}
|
||||
|
||||
function test_LargeFileSet () {
|
||||
for i in "${osyncParameters[@]}"; do
|
||||
cd "$OSYNC_DIR"
|
||||
|
||||
PrepareLocalDirs
|
||||
DownloadLargeFileSet "$INITIATOR_DIR"
|
||||
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "LargeFileSet test with parameters [$i]." "0" $?
|
||||
|
||||
[ -d "$INITIATOR_DIR/$OSYNC_STATE_DIR" ]
|
||||
assertEquals "Initiator state dir exists" "0" $?
|
||||
|
||||
[ -d "$TARGET_DIR/$OSYNC_STATE_DIR" ]
|
||||
assertEquals "Target state dir exists" "0" $?
|
||||
done
|
||||
}
|
||||
|
||||
function test_Exclusions () {
|
||||
# Will sync except php files
|
||||
# RSYNC_EXCLUDE_PATTERN="*.php" is set at runtime for quicksync and in config files for other runs
|
||||
|
||||
local numberOfPHPFiles
|
||||
local numberOfExcludedFiles
|
||||
local numberOfInitiatorFiles
|
||||
local numberOfTargetFiles
|
||||
|
||||
for i in "${osyncParameters[@]}"; do
|
||||
cd "$OSYNC_DIR"
|
||||
|
||||
PrepareLocalDirs
|
||||
DownloadLargeFileSet "$INITIATOR_DIR"
|
||||
|
||||
numberOfPHPFiles=$(find "$INITIATOR_DIR" ! -wholename "$INITIATOR_DIR/$OSYNC_WORKDIR*" -name "*.php" | wc -l)
|
||||
|
||||
REMOTE_HOST_PING=no RSYNC_EXCLUDE_PATTERN="*.php" ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "Exclusions with parameters [$i]." "0" $?
|
||||
|
||||
#WIP Add exclusion from file tests here
|
||||
numberOfInitiatorFiles=$(find "$INITIATOR_DIR" ! -wholename "$INITIATOR_DIR/$OSYNC_WORKDIR*" | wc -l)
|
||||
numberOfTargetFiles=$(find "$TARGET_DIR" ! -wholename "$TARGET_DIR/$OSYNC_WORKDIR*" | wc -l)
|
||||
numberOfExcludedFiles=$((numberOfInitiatorFiles-numberOfTargetFiles))
|
||||
|
||||
assertEquals "Number of php files: $numberOfPHPFiles - Number of excluded files: $numberOfExcludedFiles" $numberOfPHPFiles $numberOfExcludedFiles
|
||||
done
|
||||
}
|
||||
|
||||
function test_Deletetion () {
|
||||
local iFile1="$INITIATOR_DIR/ific"
|
||||
local iFile2="$INITIATOR_DIR/ifoc"
|
||||
local tFile1="$TARGET_DIR/tfic"
|
||||
local tFile2="$TARGET_DIR/tfoc"
|
||||
|
||||
|
||||
for i in "${osyncParameters[@]}"; do
|
||||
cd "$OSYNC_DIR"
|
||||
|
||||
PrepareLocalDirs
|
||||
touch "$iFile1"
|
||||
touch "$iFile2"
|
||||
touch "$tFile1"
|
||||
touch "$tFile2"
|
||||
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
rm -f "$iFile1"
|
||||
rm -f "$tFile1"
|
||||
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "Second deletion run with parameters [$i]." "0" $?
|
||||
|
||||
[ -f "$TARGET_DIR/$OSYNC_DELETE_DIR/$(basename $iFile1)" ]
|
||||
assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$(basename $iFile1)] has been soft deleted on target" "0" $?
|
||||
[ -f "$iFile1" ]
|
||||
assertEquals "File [$iFile1] is still in initiator" "1" $?
|
||||
|
||||
# The variable substitution is not the best comprehensible code
|
||||
[ -f "${iFile1/$INITIATOR_DIR/TARGET_DIR}" ]
|
||||
assertEquals "File [${iFile1/$INITIATOR_DIR/TARGET_DIR}] is still in target" "1" $?
|
||||
|
||||
[ -f "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$(basename $tFile1)" ]
|
||||
assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$(basename $tFile1)] has been soft deleted on initiator" "0" $?
|
||||
[ -f "$tFile1" ]
|
||||
assertEquals "File [$tFile1] is still in target" "1" $?
|
||||
|
||||
[ -f "${tFile1/$TARGET_DIR/INITIATOR_DIR}" ]
|
||||
assertEquals "File [${tFile1/$TARGET_DIR/INITIATOR_DIR}] is still in initiator" "1" $?
|
||||
done
|
||||
}
|
||||
|
||||
function test_deletion_failure () {
|
||||
|
||||
if [ "$TRAVIS_RUN" == true ]; then
|
||||
echo "Skipping deletionFailure tests as travis does not support chattr."
|
||||
return 0
|
||||
fi
|
||||
|
||||
for i in "${osyncParameters[@]}"; do
|
||||
cd "$OSYNC_DIR"
|
||||
|
||||
PrepareLocalDirs
|
||||
|
||||
DirA="some directory with spaces"
|
||||
DirB="another directoy/and sub directory"
|
||||
|
||||
mkdir -p "$INITIATOR_DIR/$DirA"
|
||||
mkdir -p "$TARGET_DIR/$DirB"
|
||||
|
||||
FileA="$DirA/File A"
|
||||
FileB="$DirB/File B"
|
||||
|
||||
touch "$INITIATOR_DIR/$FileA"
|
||||
touch "$TARGET_DIR/$FileB"
|
||||
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
rm -f "$INITIATOR_DIR/$FileA"
|
||||
rm -f "$TARGET_DIR/$FileB"
|
||||
|
||||
# Prevent files from being deleted
|
||||
chattr +i "$TARGET_DIR/$FileA"
|
||||
chattr +i "$INITIATOR_DIR/$FileB"
|
||||
|
||||
# This shuold fail with exitcode 1
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "Second deletion run with parameters [$i]." "1" $?
|
||||
|
||||
[ -f "$TARGET_DIR/$FileA" ]
|
||||
assertEquals "File [$TARGET_DIR/$FileA] is still present in deletion dir." "0" $?
|
||||
[ ! -f "$TARGET_DIR/$OSYNC_DELETE_DIR/$FileA" ]
|
||||
assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$FileA] is not present in deletion dir." "0" $?
|
||||
|
||||
[ -f "$INITIATOR_DIR/$FileB" ]
|
||||
assertEquals "File [$INITIATOR_DIR/$FileB] is still present in deletion dir." "0" $?
|
||||
[ ! -f "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileB" ]
|
||||
assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileB] is not present in deletion dir." "0" $?
|
||||
|
||||
# Allow files from being deleted
|
||||
chattr -i "$TARGET_DIR/$FileA"
|
||||
chattr -i "$INITIATOR_DIR/$FileB"
|
||||
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "Third deletion run with parameters [$i]." "0" $?
|
||||
|
||||
[ ! -f "$TARGET_DIR/$FileA" ]
|
||||
assertEquals "File [$TARGET_DIR/$FileA] is still present in deletion dir." "0" $?
|
||||
[ -f "$TARGET_DIR/$OSYNC_DELETE_DIR/$FileA" ]
|
||||
assertEquals "File [$TARGET_DIR/$OSYNC_DELETE_DIR/$FileA] is not present in deletion dir." "0" $?
|
||||
|
||||
[ ! -f "$INITIATOR_DIR/$FileB" ]
|
||||
assertEquals "File [$INITIATOR_DIR/$FileB] is still present in deletion dir." "0" $?
|
||||
[ -f "$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileB" ]
|
||||
assertEquals "File [$INITIATOR_DIR/$OSYNC_DELETE_DIR/$FileB] is not present in deletion dir." "0" $?
|
||||
done
|
||||
}
|
||||
|
||||
function test_skip_deletion () {
|
||||
echo "Not implemented yet"
|
||||
}
|
||||
|
||||
function test_softdeletion_cleanup () {
|
||||
declare -A files
|
||||
|
||||
files[deletedFileInitiator]="$INITIATOR_DIR/$OSYNC_DELETE_DIR/someDeletedFileInitiator"
|
||||
files[deletedFileTarget]="$TARGET_DIR/$OSYNC_DELETE_DIR/someDeletedFileTarget"
|
||||
files[backedUpFileInitiator]="$INITIATOR_DIR/$OSYNC_BACKUP_DIR/someBackedUpFileInitiator"
|
||||
files[backedUpFileTarget]="$TARGET_DIR/$OSYNC_BACKUP_DIR/someBackedUpFileTarget"
|
||||
|
||||
for i in "${osyncParameters[@]}"; do
|
||||
cd "$OSYNC_DIR"
|
||||
PrepareLocalDirs
|
||||
|
||||
# First run
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
# Get current drive
|
||||
drive=$(df "$OSYNC_DIR" | tail -1 | awk '{print $1}')
|
||||
|
||||
# Create some deleted & backed up files, some new and some old
|
||||
for file in "${files[@]}"; do
|
||||
# Create directories first if they do not exist (deletion dir is created by osync, backup dir is created by rsync only when needed)
|
||||
if [ ! -d "$(dirname $file)" ]; then
|
||||
mkdir --parents "$(dirname $file)"
|
||||
fi
|
||||
|
||||
touch "$file.new"
|
||||
|
||||
if [ "$TRAVIS_RUN" != true ]; then
|
||||
CreateOldFile "$file.old"
|
||||
else
|
||||
echo "Skipping changing ctime on file because travis does not support debugfs"
|
||||
fi
|
||||
done
|
||||
|
||||
# Second run
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
|
||||
# Check file presence
|
||||
for file in "${files[@]}"; do
|
||||
[ -f "$file.new" ]
|
||||
assertEquals "New softdeleted / backed up file [$file.new] exists." "0" $?
|
||||
|
||||
if [ "$TRAVIS_RUN" != true ]; then
|
||||
[ ! -f "$file.old" ]
|
||||
assertEquals "Old softdeleted / backed up file [$file.old] is deleted permanently." "1" $?
|
||||
else
|
||||
[ ! -f "$file.old" ]
|
||||
assertEquals "Old softdeleted / backed up file [$file.old] is deleted permanently." "0" $?
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
function test_FileAttributePropagation () {
|
||||
|
||||
if [ "$TRAVIS_RUN" == true ]; then
|
||||
echo "Skipping FileAttributePropagation tests as travis does not support getfacl / setfacl."
|
||||
return 0
|
||||
fi
|
||||
|
||||
for i in "${osyncParameters[@]}"; do
|
||||
cd "$OSYNC_DIR"
|
||||
PrepareLocalDirs
|
||||
|
||||
DirA="dir a"
|
||||
DirB="dir b"
|
||||
|
||||
mkdir "$INITIATOR_DIR/$DirA"
|
||||
mkdir "$TARGET_DIR/$DirB"
|
||||
|
||||
FileA="$DirA/FileA"
|
||||
FileB="$DirB/FileB"
|
||||
|
||||
touch "$INITIATOR_DIR/$FileA"
|
||||
touch "$TARGET_DIR/$FileB"
|
||||
|
||||
# First run
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
sleep 1
|
||||
|
||||
getfacl -p "$INITIATOR_DIR/$FileA" | grep "other::r--" > /dev/null
|
||||
assertEquals "Check getting ACL on initiator." "0" $?
|
||||
|
||||
getfacl -p "$TARGET_DIR/$FileB" | grep "other::r--" > /dev/null
|
||||
assertEquals "Check getting ACL on target." "0" $?
|
||||
|
||||
setfacl -m o:r-x "$INITIATOR_DIR/$FileA"
|
||||
assertEquals "Set ACL on initiator" "0" $?
|
||||
setfacl -m o:-w- "$TARGET_DIR/$FileB"
|
||||
assertEquals "Set ACL on target" "0" $?
|
||||
|
||||
# Second run
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
getfacl -p "$TARGET_DIR/$FileA" | grep "other::r-x" > /dev/null
|
||||
assertEquals "ACLs matched original value on target." "0" $?
|
||||
|
||||
getfacl -p "$INITIATOR_DIR/$FileB" | grep "other::-w-" > /dev/null
|
||||
assertEquals "ACLs matched original value on initiator." "0" $?
|
||||
|
||||
getfacl -p "$TARGET_DIR/$FileA"
|
||||
getfacl -p "$INITIATOR_DIR/$FileB"
|
||||
done
|
||||
}
|
||||
|
||||
function test_ConflictBackups () {
|
||||
for i in "${osyncParameters[@]}"; do
|
||||
cd "$OSYNC_DIR"
|
||||
PrepareLocalDirs
|
||||
|
||||
DirA="some dir"
|
||||
DirB="some other dir"
|
||||
|
||||
mkdir -p "$INITIATOR_DIR/$DirA"
|
||||
mkdir -p "$TARGET_DIR/$DirB"
|
||||
|
||||
FileA="$DirA/FileA"
|
||||
FileB="$DirB/File B"
|
||||
|
||||
echo "$FileA" > "$INITIATOR_DIR/$FileA"
|
||||
echo "$FileB" > "$TARGET_DIR/$FileB"
|
||||
|
||||
# First run
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
echo "$FileA+" > "$TARGET_DIR/$FileA"
|
||||
echo "$FileB+" > "$INITIATOR_DIR/$FileB"
|
||||
|
||||
# Second run
|
||||
REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
[ -f "$INITIATOR_DIR/$OSYNC_BACKUP_DIR/$FileA" ]
|
||||
assertEquals "Backup file is present in [$INITIATOR_DIR/$OSYNC_BACKUP_DIR/$FileA]." "0" $?
|
||||
|
||||
[ -f "$TARGET_DIR/$OSYNC_BACKUP_DIR/$FileB" ]
|
||||
assertEquals "Backup file is present in [$TARGET_DIR/$OSYNC_BACKUP_DIR/$FileB]." "0" $?
|
||||
done
|
||||
}
|
||||
|
||||
function test_MultipleConflictBackups () {
|
||||
local conflictBackupMultipleLocal
|
||||
local conflictBackupMultipleRemote
|
||||
|
||||
local additionalParameters
|
||||
|
||||
# modify config files
|
||||
conflictBackupMultipleLocal=$(GetConfFileValue "$CONF_DIR/$LOCAL_CONF" "CONFLICT_BACKUP_MULTIPLE")
|
||||
conflictBackupMultipleRemote=$(GetConfFileValue "$CONF_DIR/$REMOTE_CONF" "CONFLICT_BACKUP_MULTIPLE")
|
||||
|
||||
SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "CONFLICT_BACKUP_MULTIPLE" "yes"
|
||||
SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "CONFLICT_BACKUP_MULTIPLE" "yes"
|
||||
|
||||
if [ "$OSYNC_MIN_VERSION" != "1" ]; then
|
||||
additionalParameters="--errors-only --summary --no-prefix"
|
||||
fi
|
||||
|
||||
for i in "${osyncParameters[@]}"; do
|
||||
|
||||
|
||||
|
||||
cd "$OSYNC_DIR"
|
||||
PrepareLocalDirs
|
||||
|
||||
FileA="FileA"
|
||||
FileB="FileB"
|
||||
|
||||
echo "$FileA" > "$INITIATOR_DIR/$FileA"
|
||||
echo "$FileB" > "$TARGET_DIR/$FileB"
|
||||
|
||||
# First run
|
||||
CONFLICT_BACKUP_MULTIPLE=yes REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i $additionalParameters
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
echo "$FileA+" > "$TARGET_DIR/$FileA"
|
||||
echo "$FileB+" > "$INITIATOR_DIR/$FileB"
|
||||
|
||||
# Second run
|
||||
CONFLICT_BACKUP_MULTIPLE=yes REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i $additionalParameters
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
echo "$FileA-" > "$TARGET_DIR/$FileA"
|
||||
echo "$FileB-" > "$INITIATOR_DIR/$FileB"
|
||||
|
||||
# Third run
|
||||
CONFLICT_BACKUP_MULTIPLE=yes REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i $additionalParameters
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
echo "$FileA*" > "$TARGET_DIR/$FileA"
|
||||
echo "$FileB*" > "$INITIATOR_DIR/$FileB"
|
||||
|
||||
# Fouth run
|
||||
CONFLICT_BACKUP_MULTIPLE=yes REMOTE_HOST_PING=no ./$OSYNC_EXECUTABLE $i $additionalParameters
|
||||
assertEquals "First deletion run with parameters [$i]." "0" $?
|
||||
|
||||
# This test may fail only on 31th December at 23:59 :)
|
||||
[ $(find "$INITIATOR_DIR/$OSYNC_BACKUP_DIR/" -type f -name "FileA.$(date '+%Y')*" | wc -l) -eq 3 ]
|
||||
assertEquals "3 Backup files are present in [$INITIATOR_DIR/$OSYNC_BACKUP_DIR/]." "0" $?
|
||||
|
||||
[ $(find "$TARGET_DIR/$OSYNC_BACKUP_DIR/" -type f -name "FileB.$(date '+%Y')*" | wc -l) -eq 3 ]
|
||||
assertEquals "3 Backup files are present in [$TARGET_DIR/$OSYNC_BACKUP_DIR/]." "0" $?
|
||||
done
|
||||
|
||||
SetConfFileValue "$CONF_DIR/$LOCAL_CONF" "CONFLICT_BACKUP_MULTIPLE" "$conflictBackupMultipleLocal"
|
||||
SetConfFileValue "$CONF_DIR/$REMOTE_CONF" "CONFLICT_BACKUP_MULTIPLE" "$conflictBackupMultipleRemote"
|
||||
|
||||
}
|
||||
|
||||
|
||||
function test_WaitForTaskCompletion () {
|
||||
if [ "$OSYNC_MIN_VERSION" != "1" ]; then
|
||||
echo "Skipping WaitForTaskCompletion test because osync v1.1 does not support multiple pid monitoring"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local pids
|
||||
|
||||
# Tests if wait for task completion works correctly
|
||||
|
||||
# Standard wait
|
||||
sleep 1 &
|
||||
pids="$!"
|
||||
sleep 2 &
|
||||
pids="$pids;$!"
|
||||
WaitForTaskCompletion $pids 0 0 ${FUNCNAME[0]} true 0
|
||||
assertEquals "WaitForTaskCompletion test 1" "0" $?
|
||||
|
||||
# Standard wait with warning
|
||||
sleep 2 &
|
||||
pids="$!"
|
||||
sleep 5 &
|
||||
pids="$pids;$!"
|
||||
|
||||
WaitForTaskCompletion $pids 3 0 ${FUNCNAME[0]} true 0
|
||||
assertEquals "WaitForTaskCompletion test 2" "0" $?
|
||||
|
||||
# Both pids are killed
|
||||
sleep 5 &
|
||||
pids="$!"
|
||||
sleep 5 &
|
||||
pids="$pids;$!"
|
||||
|
||||
WaitForTaskCompletion $pids 0 2 ${FUNCNAME[0]} true 0
|
||||
assertEquals "WaitForTaskCompletion test 3" "2" $?
|
||||
|
||||
# One of two pids are killed
|
||||
sleep 2 &
|
||||
pids="$!"
|
||||
sleep 10 &
|
||||
pids="$pids;$!"
|
||||
|
||||
WaitForTaskCompletion $pids 0 3 ${FUNCNAME[0]} true 0
|
||||
assertEquals "WaitForTaskCompletion test 4" "1" $?
|
||||
|
||||
# Count since script begin, the following should output two warnings and both pids should get killed
|
||||
sleep 20 &
|
||||
pids="$!"
|
||||
sleep 20 &
|
||||
pids="$pids;$!"
|
||||
|
||||
WaitForTaskCompletion $pids 3 5 ${FUNCNAME[0]} false 0
|
||||
assertEquals "WaitForTaskCompletion test 5" "2" $?
|
||||
}
|
||||
|
||||
function test_ParallelExec () {
|
||||
if [ "$OSYNC_MIN_VERSION" != "1" ]; then
|
||||
echo "Skipping ParallelExec test because osync v1.1 didn't have this"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local cmd
|
||||
|
||||
|
||||
|
||||
# Test if parallelExec works correctly in array mode
|
||||
|
||||
cmd="sleep 2;sleep 2;sleep 2;sleep 2"
|
||||
ParallelExec 4 "$cmd"
|
||||
assertEquals "ParallelExec test 1" "0" $?
|
||||
|
||||
cmd="sleep 2;du /none;sleep 2"
|
||||
ParallelExec 2 "$cmd"
|
||||
assertEquals "ParallelExec test 2" "1" $?
|
||||
|
||||
cmd="sleep 4;du /none;sleep 3;du /none;sleep 2"
|
||||
ParallelExec 3 "$cmd"
|
||||
assertEquals "ParallelExec test 3" "2" $?
|
||||
|
||||
# Test if parallelExec works correctly in file mode
|
||||
|
||||
echo "sleep 2" > "$TMP_FILE"
|
||||
echo "sleep 2" >> "$TMP_FILE"
|
||||
echo "sleep 2" >> "$TMP_FILE"
|
||||
echo "sleep 2" >> "$TMP_FILE"
|
||||
ParallelExec 4 "$TMP_FILE" true
|
||||
assertEquals "ParallelExec test 4" "0" $?
|
||||
|
||||
echo "sleep 2" > "$TMP_FILE"
|
||||
echo "du /nome" >> "$TMP_FILE"
|
||||
echo "sleep 2" >> "$TMP_FILE"
|
||||
ParallelExec 2 "$TMP_FILE" true
|
||||
assertEquals "ParallelExec test 5" "1" $?
|
||||
|
||||
echo "sleep 4" > "$TMP_FILE"
|
||||
echo "du /none" >> "$TMP_FILE"
|
||||
echo "sleep 3" >> "$TMP_FILE"
|
||||
echo "du /none" >> "$TMP_FILE"
|
||||
echo "sleep 2" >> "$TMP_FILE"
|
||||
ParallelExec 3 "$TMP_FILE" true
|
||||
assertEquals "ParallelExec test 6" "2" $?
|
||||
|
||||
}
|
||||
|
||||
function test_UpgradeConfRun () {
|
||||
if [ "$OSYNC_MIN_VERSION" != "1" ]; then
|
||||
echo "Skipping Upgrade script test because no further dev will happen on this for v1.1"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Basic return code tests. Need to go deep into file presence testing
|
||||
cd "$OSYNC_DIR"
|
||||
|
||||
PrepareLocalDirs
|
||||
|
||||
# Make a security copy of the old config file
|
||||
cp "$CONF_DIR/$OLD_CONF" "$CONF_DIR/$TMP_OLD_CONF"
|
||||
|
||||
./$OSYNC_UPGRADE "$CONF_DIR/$TMP_OLD_CONF"
|
||||
assertEquals "Conf file upgrade" "0" $?
|
||||
./$OSYNC_EXECUTABLE "$CONF_DIR/$TMP_OLD_CONF"
|
||||
assertEquals "Upgraded conf file execution test" "0" $?
|
||||
|
||||
rm -f "$CONF_DIR/$TMP_OLD_CONF"
|
||||
rm -f "$CONF_DIR/$TMP_OLD_CONF.save"
|
||||
}
|
||||
|
||||
|
||||
. "$TESTS_DIR/shunit2/shunit2"
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,124 @@
|
||||
#! /bin/sh
|
||||
# $Id$
|
||||
# vim:et:ft=sh:sts=2:sw=2
|
||||
#
|
||||
# Copyright 2008 Kate Ward. All Rights Reserved.
|
||||
# Released under the LGPL (GNU Lesser General Public License)
|
||||
# Author: kate.ward@forestent.com (Kate Ward)
|
||||
#
|
||||
# shUnit2 unit test suite runner.
|
||||
#
|
||||
# This script runs all the unit tests that can be found, and generates a nice
|
||||
# report of the tests.
|
||||
|
||||
MY_NAME=`basename $0`
|
||||
MY_PATH=`dirname $0`
|
||||
|
||||
PREFIX='shunit2_test_'
|
||||
SHELLS='/bin/sh /bin/bash /bin/dash /bin/ksh /bin/pdksh /bin/zsh'
|
||||
TESTS=''
|
||||
for test in ${PREFIX}[a-z]*.sh; do
|
||||
TESTS="${TESTS} ${test}"
|
||||
done
|
||||
|
||||
# load common unit test functions
|
||||
. ../lib/versions
|
||||
. ./shunit2_test_helpers
|
||||
|
||||
usage()
|
||||
{
|
||||
echo "usage: ${MY_NAME} [-e key=val ...] [-s shell(s)] [-t test(s)]"
|
||||
}
|
||||
|
||||
env=''
|
||||
|
||||
# process command line flags
|
||||
while getopts 'e:hs:t:' opt; do
|
||||
case ${opt} in
|
||||
e) # set an environment variable
|
||||
key=`expr "${OPTARG}" : '\([^=]*\)='`
|
||||
val=`expr "${OPTARG}" : '[^=]*=\(.*\)'`
|
||||
if [ -z "${key}" -o -z "${val}" ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
eval "${key}='${val}'"
|
||||
export ${key}
|
||||
env="${env:+${env} }${key}"
|
||||
;;
|
||||
h) usage; exit 0 ;; # output help
|
||||
s) shells=${OPTARG} ;; # list of shells to run
|
||||
t) tests=${OPTARG} ;; # list of tests to run
|
||||
*) usage; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
shift `expr ${OPTIND} - 1`
|
||||
|
||||
# fill shells and/or tests
|
||||
shells=${shells:-${SHELLS}}
|
||||
tests=${tests:-${TESTS}}
|
||||
|
||||
# error checking
|
||||
if [ -z "${tests}" ]; then
|
||||
th_error 'no tests found to run; exiting'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
#------------------------------------------------------------------------------
|
||||
# System data
|
||||
#
|
||||
|
||||
# test run info
|
||||
shells: ${shells}
|
||||
tests: ${tests}
|
||||
EOF
|
||||
for key in ${env}; do
|
||||
eval "echo \"${key}=\$${key}\""
|
||||
done
|
||||
echo
|
||||
|
||||
# output system data
|
||||
echo "# system info"
|
||||
echo "$ date"
|
||||
date
|
||||
echo
|
||||
|
||||
echo "$ uname -mprsv"
|
||||
uname -mprsv
|
||||
|
||||
#
|
||||
# run tests
|
||||
#
|
||||
|
||||
for shell in ${shells}; do
|
||||
echo
|
||||
|
||||
# check for existance of shell
|
||||
if [ ! -x ${shell} ]; then
|
||||
th_warn "unable to run tests with the ${shell} shell"
|
||||
continue
|
||||
fi
|
||||
|
||||
cat <<EOF
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Running the test suite with ${shell}
|
||||
#
|
||||
EOF
|
||||
|
||||
SHUNIT_SHELL=${shell} # pass shell onto tests
|
||||
shell_name=`basename ${shell}`
|
||||
shell_version=`versions_shellVersion "${shell}"`
|
||||
|
||||
echo "shell name: ${shell_name}"
|
||||
echo "shell version: ${shell_version}"
|
||||
|
||||
# execute the tests
|
||||
for suite in ${tests}; do
|
||||
suiteName=`expr "${suite}" : "${PREFIX}\(.*\).sh"`
|
||||
echo
|
||||
echo "--- Executing the '${suiteName}' test suite ---"
|
||||
( exec ${shell} ./${suite} 2>&1; )
|
||||
done
|
||||
done
|
@ -0,0 +1,206 @@
|
||||
#! /bin/sh
|
||||
# $Id$
|
||||
# vim:et:ft=sh:sts=2:sw=2
|
||||
#
|
||||
# Copyright 2008 Kate Ward. All Rights Reserved.
|
||||
# Released under the LGPL (GNU Lesser General Public License)
|
||||
#
|
||||
# Author: kate.ward@forestent.com (Kate Ward)
|
||||
#
|
||||
# shUnit2 unit test for assert functions
|
||||
|
||||
# load test helpers
|
||||
. ./shunit2_test_helpers
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# suite tests
|
||||
#
|
||||
|
||||
commonEqualsSame()
|
||||
{
|
||||
fn=$1
|
||||
|
||||
( ${fn} 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'equal' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} "${MSG}" 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'equal; with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} 'abc def' 'abc def' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'equal with spaces' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'not equal' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} '' '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'null values' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} arg1 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too few arguments' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} arg1 arg2 arg3 arg4 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
commonNotEqualsSame()
|
||||
{
|
||||
fn=$1
|
||||
|
||||
( ${fn} 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'not same' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} "${MSG}" 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'not same, with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'same' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} '' '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'null values' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} arg1 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too few arguments' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( ${fn} arg1 arg2 arg3 arg4 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
testAssertEquals()
|
||||
{
|
||||
commonEqualsSame 'assertEquals'
|
||||
}
|
||||
|
||||
testAssertNotEquals()
|
||||
{
|
||||
commonNotEqualsSame 'assertNotEquals'
|
||||
}
|
||||
|
||||
testAssertSame()
|
||||
{
|
||||
commonEqualsSame 'assertSame'
|
||||
}
|
||||
|
||||
testAssertNotSame()
|
||||
{
|
||||
commonNotEqualsSame 'assertNotSame'
|
||||
}
|
||||
|
||||
testAssertNull()
|
||||
{
|
||||
( assertNull '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'null' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNull "${MSG}" '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'null, with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNull 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'not null' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNull >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too few arguments' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNull arg1 arg2 arg3 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
testAssertNotNull()
|
||||
{
|
||||
( assertNotNull 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'not null' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNotNull "${MSG}" 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'not null, with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNotNull 'x"b' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'not null, with double-quote' $? \
|
||||
"${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNotNull "x'b" >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'not null, with single-quote' $? \
|
||||
"${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNotNull 'x$b' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'not null, with dollar' $? \
|
||||
"${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNotNull 'x`b' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'not null, with backtick' $? \
|
||||
"${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertNotNull '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'null' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
# there is no test for too few arguments as $1 might actually be null
|
||||
|
||||
( assertNotNull arg1 arg2 arg3 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
testAssertTrue()
|
||||
{
|
||||
( assertTrue 0 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'true' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertTrue "${MSG}" 0 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'true, with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertTrue '[ 0 -eq 0 ]' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'true condition' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertTrue 1 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'false' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertTrue '[ 0 -eq 1 ]' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'false condition' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertTrue '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'null' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertTrue >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too few arguments' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertTrue arg1 arg2 arg3 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
testAssertFalse()
|
||||
{
|
||||
( assertFalse 1 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'false' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertFalse "${MSG}" 1 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'false, with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertFalse '[ 0 -eq 1 ]' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertTrueWithNoOutput 'false condition' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertFalse 0 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'true' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertFalse '[ 0 -eq 0 ]' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'true condition' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertFalse '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'true condition' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertFalse >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too few arguments' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( assertFalse arg1 arg2 arg3 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# suite functions
|
||||
#
|
||||
|
||||
oneTimeSetUp()
|
||||
{
|
||||
th_oneTimeSetUp
|
||||
|
||||
MSG='This is a test message'
|
||||
}
|
||||
|
||||
# load and run shUnit2
|
||||
[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
|
||||
. ${TH_SHUNIT}
|
@ -0,0 +1,86 @@
|
||||
#! /bin/sh
|
||||
# $Id$
|
||||
# vim:et:ft=sh:sts=2:sw=2
|
||||
#
|
||||
# Copyright 2008 Kate Ward. All Rights Reserved.
|
||||
# Released under the LGPL (GNU Lesser General Public License)
|
||||
#
|
||||
# Author: kate.ward@forestent.com (Kate Ward)
|
||||
#
|
||||
# shUnit2 unit test for failure functions
|
||||
|
||||
# load common unit-test functions
|
||||
. ./shunit2_test_helpers
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# suite tests
|
||||
#
|
||||
|
||||
testFail()
|
||||
{
|
||||
( fail >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'fail' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( fail "${MSG}" >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'fail with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( fail arg1 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
testFailNotEquals()
|
||||
{
|
||||
( failNotEquals 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'same' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failNotEquals "${MSG}" 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'same with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failNotEquals 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'not same' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failNotEquals '' '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'null values' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failNotEquals >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too few arguments' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failNotEquals arg1 arg2 arg3 arg4 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
testFailSame()
|
||||
{
|
||||
( failSame 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'same' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failSame "${MSG}" 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'same with msg' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failSame 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'not same' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failSame '' '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithOutput 'null values' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failSame >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too few arguments' $? "${stdoutF}" "${stderrF}"
|
||||
|
||||
( failSame arg1 arg2 arg3 arg4 >"${stdoutF}" 2>"${stderrF}" )
|
||||
th_assertFalseWithError 'too many arguments' $? "${stdoutF}" "${stderrF}"
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# suite functions
|
||||
#
|
||||
|
||||
oneTimeSetUp()
|
||||
{
|
||||
th_oneTimeSetUp
|
||||
|
||||
MSG='This is a test message'
|
||||
}
|
||||
|
||||
# load and run shUnit2
|
||||
[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
|
||||
. ${TH_SHUNIT}
|
@ -0,0 +1,229 @@
|
||||
# $Id$
|
||||
# vim:et:ft=sh:sts=2:sw=2
|
||||
#
|
||||
# Copyright 2008 Kate Ward. All Rights Reserved.
|
||||
# Released under the LGPL (GNU Lesser General Public License)
|
||||
#
|
||||
# Author: kate.ward@forestent.com (Kate Ward)
|
||||
#
|
||||
# shUnit2 unit test common functions
|
||||
|
||||
# treat unset variables as an error when performing parameter expansion
|
||||
set -u
|
||||
|
||||
# set shwordsplit for zsh
|
||||
[ -n "${ZSH_VERSION:-}" ] && setopt shwordsplit
|
||||
|
||||
#
|
||||
# constants
|
||||
#
|
||||
|
||||
# path to shUnit2 library. can be overridden by setting SHUNIT_INC
|
||||
TH_SHUNIT=${SHUNIT_INC:-./shunit2}
|
||||
|
||||
# configure debugging. set the DEBUG environment variable to any
|
||||
# non-empty value to enable debug output, or TRACE to enable trace
|
||||
# output.
|
||||
TRACE=${TRACE:+'th_trace '}
|
||||
[ -n "${TRACE}" ] && DEBUG=1
|
||||
[ -z "${TRACE}" ] && TRACE=':'
|
||||
|
||||
DEBUG=${DEBUG:+'th_debug '}
|
||||
[ -z "${DEBUG}" ] && DEBUG=':'
|
||||
|
||||
#
|
||||
# variables
|
||||
#
|
||||
|
||||
th_RANDOM=0
|
||||
|
||||
#
|
||||
# functions
|
||||
#
|
||||
|
||||
# message functions
|
||||
th_trace() { echo "${MY_NAME}:TRACE $@" >&2; }
|
||||
th_debug() { echo "${MY_NAME}:DEBUG $@" >&2; }
|
||||
th_info() { echo "${MY_NAME}:INFO $@" >&2; }
|
||||
th_warn() { echo "${MY_NAME}:WARN $@" >&2; }
|
||||
th_error() { echo "${MY_NAME}:ERROR $@" >&2; }
|
||||
th_fatal() { echo "${MY_NAME}:FATAL $@" >&2; }
|
||||
|
||||
# output subtest name
|
||||
th_subtest() { echo " $@" >&2; }
|
||||
|
||||
th_oneTimeSetUp()
|
||||
{
|
||||
# these files will be cleaned up automatically by shUnit2
|
||||
stdoutF="${SHUNIT_TMPDIR}/stdout"
|
||||
stderrF="${SHUNIT_TMPDIR}/stderr"
|
||||
returnF="${SHUNIT_TMPDIR}/return"
|
||||
expectedF="${SHUNIT_TMPDIR}/expected"
|
||||
}
|
||||
|
||||
# generate a random number
|
||||
th_generateRandom()
|
||||
{
|
||||
tfgr_random=${th_RANDOM}
|
||||
|
||||
while [ "${tfgr_random}" = "${th_RANDOM}" ]; do
|
||||
if [ -n "${RANDOM:-}" ]; then
|
||||
# $RANDOM works
|
||||
tfgr_random=${RANDOM}${RANDOM}${RANDOM}$$
|
||||
elif [ -r '/dev/urandom' ]; then
|
||||
tfgr_random=`od -vAn -N4 -tu4 </dev/urandom |sed 's/^[^0-9]*//'`
|
||||
else
|
||||
tfgr_date=`date '+%H%M%S'`
|
||||
tfgr_random=`expr ${tfgr_date} \* $$`
|
||||
unset tfgr_date
|
||||
fi
|
||||
[ "${tfgr_random}" = "${th_RANDOM}" ] && sleep 1
|
||||
done
|
||||
|
||||
th_RANDOM=${tfgr_random}
|
||||
unset tfgr_random
|
||||
}
|
||||
|
||||
# this section returns the data section from the specified section of a file. a
|
||||
# datasection is defined by a [header], one or more lines of data, and then a
|
||||
# blank line.
|
||||
th_getDataSect()
|
||||
{
|
||||
th_sgrep "\\[$1\\]" "$2" |sed '1d'
|
||||
}
|
||||
|
||||
# this function greps a section from a file. a section is defined as a group of
|
||||
# lines preceeded and followed by blank lines.
|
||||
th_sgrep()
|
||||
{
|
||||
th_pattern_=$1
|
||||
shift
|
||||
|
||||
sed -e '/./{H;$!d;}' -e "x;/${th_pattern_}/"'!d;' $@ |sed '1d'
|
||||
|
||||
unset th_pattern_
|
||||
}
|
||||
|
||||
# Custom assert that checks for true return value (0), and no output to STDOUT
|
||||
# or STDERR. If a non-zero return value is encountered, the output of STDERR
|
||||
# will be output.
|
||||
#
|
||||
# Args:
|
||||
# th_test_: string: name of the subtest
|
||||
# th_rtrn_: integer: the return value of the subtest performed
|
||||
# th_stdout_: string: filename where stdout was redirected to
|
||||
# th_stderr_: string: filename where stderr was redirected to
|
||||
th_assertTrueWithNoOutput()
|
||||
{
|
||||
th_test_=$1
|
||||
th_rtrn_=$2
|
||||
th_stdout_=$3
|
||||
th_stderr_=$4
|
||||
|
||||
assertTrue "${th_test_}; expected return value of zero" ${th_rtrn_}
|
||||
[ ${th_rtrn_} -ne ${SHUNIT_TRUE} ] && cat "${th_stderr_}"
|
||||
assertFalse "${th_test_}; expected no output to STDOUT" \
|
||||
"[ -s '${th_stdout_}' ]"
|
||||
assertFalse "${th_test_}; expected no output to STDERR" \
|
||||
"[ -s '${th_stderr_}' ]"
|
||||
|
||||
unset th_test_ th_rtrn_ th_stdout_ th_stderr_
|
||||
}
|
||||
|
||||
# Custom assert that checks for non-zero return value, output to STDOUT, but no
|
||||
# output to STDERR.
|
||||
#
|
||||
# Args:
|
||||
# th_test_: string: name of the subtest
|
||||
# th_rtrn_: integer: the return value of the subtest performed
|
||||
# th_stdout_: string: filename where stdout was redirected to
|
||||
# th_stderr_: string: filename where stderr was redirected to
|
||||
th_assertFalseWithOutput()
|
||||
{
|
||||
th_test_=$1
|
||||
th_rtrn_=$2
|
||||
th_stdout_=$3
|
||||
th_stderr_=$4
|
||||
|
||||
assertFalse "${th_test_}; expected non-zero return value" ${th_rtrn_}
|
||||
assertTrue "${th_test_}; expected output to STDOUT" \
|
||||
"[ -s '${th_stdout_}' ]"
|
||||
assertFalse "${th_test_}; expected no output to STDERR" \
|
||||
"[ -s '${th_stderr_}' ]"
|
||||
[ -s "${th_stdout_}" -a ! -s "${th_stderr_}" ] || \
|
||||
_th_showOutput ${SHUNIT_FALSE} "${th_stdout_}" "${th_stderr_}"
|
||||
|
||||
unset th_test_ th_rtrn_ th_stdout_ th_stderr_
|
||||
}
|
||||
|
||||
# Custom assert that checks for non-zero return value, no output to STDOUT, but
|
||||
# output to STDERR.
|
||||
#
|
||||
# Args:
|
||||
# th_test_: string: name of the subtest
|
||||
# th_rtrn_: integer: the return value of the subtest performed
|
||||
# th_stdout_: string: filename where stdout was redirected to
|
||||
# th_stderr_: string: filename where stderr was redirected to
|
||||
th_assertFalseWithError()
|
||||
{
|
||||
th_test_=$1
|
||||
th_rtrn_=$2
|
||||
th_stdout_=$3
|
||||
th_stderr_=$4
|
||||
|
||||
assertFalse "${th_test_}; expected non-zero return value" ${th_rtrn_}
|
||||
assertFalse "${th_test_}; expected no output to STDOUT" \
|
||||
"[ -s '${th_stdout_}' ]"
|
||||
assertTrue "${th_test_}; expected output to STDERR" \
|
||||
"[ -s '${th_stderr_}' ]"
|
||||
[ ! -s "${th_stdout_}" -a -s "${th_stderr_}" ] || \
|
||||
_th_showOutput ${SHUNIT_FALSE} "${th_stdout_}" "${th_stderr_}"
|
||||
|
||||
unset th_test_ th_rtrn_ th_stdout_ th_stderr_
|
||||
}
|
||||
|
||||
# Some shells, zsh on Solaris in particular, return immediately from a sub-shell
|
||||
# when a non-zero return value is encountered. To properly catch these values,
|
||||
# they are either written to disk, or recognized as an error the file is empty.
|
||||
th_clearReturn() { cp /dev/null "${returnF}"; }
|
||||
th_queryReturn()
|
||||
{
|
||||
if [ -s "${returnF}" ]; then
|
||||
th_return=`cat "${returnF}"`
|
||||
else
|
||||
th_return=${SHUNIT_ERROR}
|
||||
fi
|
||||
}
|
||||
|
||||
# Providing external and internal calls to the showOutput helper function.
|
||||
th_showOutput() { _th_showOutput $@; }
|
||||
_th_showOutput()
|
||||
{
|
||||
_th_return_=$1
|
||||
_th_stdout_=$2
|
||||
_th_stderr_=$3
|
||||
|
||||
isSkipping
|
||||
if [ $? -eq ${SHUNIT_FALSE} -a ${_th_return_} != ${SHUNIT_TRUE} ]; then
|
||||
if [ -n "${_th_stdout_}" -a -s "${_th_stdout_}" ]; then
|
||||
echo '>>> STDOUT' >&2
|
||||
cat "${_th_stdout_}" >&2
|
||||
fi
|
||||
if [ -n "${_th_stderr_}" -a -s "${_th_stderr_}" ]; then
|
||||
echo '>>> STDERR' >&2
|
||||
cat "${_th_stderr_}" >&2
|
||||
fi
|
||||
if [ -n "${_th_stdout_}" -o -n "${_th_stderr_}" ]; then
|
||||
echo '<<< end output' >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
unset _th_return_ _th_stdout_ _th_stderr_
|
||||
}
|
||||
|
||||
#
|
||||
# main
|
||||
#
|
||||
|
||||
${TRACE} 'trace output enabled'
|
||||
${DEBUG} 'debug output enabled'
|
@ -0,0 +1,246 @@
|
||||
#! /bin/sh
|
||||
# $Id$
|
||||
# vim:et:ft=sh:sts=2:sw=2
|
||||
#
|
||||
# Copyright 2008 Kate Ward. All Rights Reserved.
|
||||
# Released under the LGPL (GNU Lesser General Public License)
|
||||
# Author: kate.ward@forestent.com (Kate Ward)
|
||||
#
|
||||
# shUnit2 unit test for macros.
|
||||
|
||||
# load test helpers
|
||||
. ./shunit2_test_helpers
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# suite tests
|
||||
#
|
||||
|
||||
testAssertEquals()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_ASSERT_EQUALS_} 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_EQUALS_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_ASSERT_EQUALS_} '"some msg"' 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_EQUALS_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testAssertNotEquals()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_ASSERT_NOT_EQUALS_} 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_NOT_EQUALS_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_ASSERT_NOT_EQUALS_} '"some msg"' 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_NOT_EQUALS_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testSame()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_ASSERT_SAME_} 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_SAME_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_ASSERT_SAME_} '"some msg"' 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_SAME_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testNotSame()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_ASSERT_NOT_SAME_} 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_NOT_SAME_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_ASSERT_NOT_SAME_} '"some msg"' 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_NOT_SAME_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testNull()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_ASSERT_NULL_} 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_NULL_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_ASSERT_NULL_} '"some msg"' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_NULL_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testNotNull()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_ASSERT_NOT_NULL_} '' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_NOT_NULL_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_ASSERT_NOT_NULL_} '"some msg"' '""' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_NOT_NULL_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stdoutF}" "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testAssertTrue()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_ASSERT_TRUE_} ${SHUNIT_FALSE} >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_TRUE_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
|
||||
( ${_ASSERT_TRUE_} '"some msg"' ${SHUNIT_FALSE} >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_TRUE_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testAssertFalse()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_ASSERT_FALSE_} ${SHUNIT_TRUE} >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_FALSE_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_ASSERT_FALSE_} '"some msg"' ${SHUNIT_TRUE} >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_ASSERT_FALSE_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testFail()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_FAIL_} >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_FAIL_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_FAIL_} '"some msg"' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_FAIL_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testFailNotEquals()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_FAIL_NOT_EQUALS_} 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_FAIL_NOT_EQUALS_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_FAIL_NOT_EQUALS_} '"some msg"' 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_FAIL_NOT_EQUALS_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testFailSame()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_FAIL_SAME_} 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_FAIL_SAME_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_FAIL_SAME_} '"some msg"' 'x' 'x' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_FAIL_SAME_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testFailNotSame()
|
||||
{
|
||||
# start skipping if LINENO not available
|
||||
[ -z "${LINENO:-}" ] && startSkipping
|
||||
|
||||
( ${_FAIL_NOT_SAME_} 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_FAIL_NOT_SAME_ failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
|
||||
( ${_FAIL_NOT_SAME_} '"some msg"' 'x' 'y' >"${stdoutF}" 2>"${stderrF}" )
|
||||
grep '^ASSERT:\[[0-9]*\] *' "${stdoutF}" >/dev/null
|
||||
rtrn=$?
|
||||
assertTrue '_FAIL_NOT_SAME_ w/ msg failure' ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# suite functions
|
||||
#
|
||||
|
||||
oneTimeSetUp()
|
||||
{
|
||||
th_oneTimeSetUp
|
||||
}
|
||||
|
||||
# load and run shUnit2
|
||||
[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
|
||||
. ${TH_SHUNIT}
|
@ -0,0 +1,160 @@
|
||||
#! /bin/sh
|
||||
# $Id$
|
||||
# vim:et:ft=sh:sts=2:sw=2
|
||||
#
|
||||
# Copyright 2008 Kate Ward. All Rights Reserved.
|
||||
# Released under the LGPL (GNU Lesser General Public License)
|
||||
#
|
||||
# Author: kate.ward@forestent.com (Kate Ward)
|
||||
#
|
||||
# shUnit2 unit tests of miscellaneous things
|
||||
|
||||
# load test helpers
|
||||
. ./shunit2_test_helpers
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# suite tests
|
||||
#
|
||||
|
||||
# Note: the test script is prefixed with '#' chars so that shUnit2 does not
|
||||
# incorrectly interpret the embedded functions as real functions.
|
||||
testUnboundVariable()
|
||||
{
|
||||
unittestF="${SHUNIT_TMPDIR}/unittest"
|
||||
sed 's/^#//' >"${unittestF}" <<EOF
|
||||
## treat unset variables as an error when performing parameter expansion
|
||||
#set -u
|
||||
#
|
||||
#boom() { x=\$1; } # this function goes boom if no parameters are passed!
|
||||
#test_boom()
|
||||
#{
|
||||
# assertEquals 1 1
|
||||
# boom # No parameter given
|
||||
# assertEquals 0 \$?
|
||||
#}
|
||||
#. ${TH_SHUNIT}
|
||||
EOF
|
||||
( exec ${SHUNIT_SHELL:-sh} "${unittestF}" >"${stdoutF}" 2>"${stderrF}" )
|
||||
assertFalse 'expected a non-zero exit value' $?
|
||||
grep '^ASSERT:Unknown failure' "${stdoutF}" >/dev/null
|
||||
assertTrue 'assert message was not generated' $?
|
||||
grep '^Ran [0-9]* test' "${stdoutF}" >/dev/null
|
||||
assertTrue 'test count message was not generated' $?
|
||||
grep '^FAILED' "${stdoutF}" >/dev/null
|
||||
assertTrue 'failure message was not generated' $?
|
||||
}
|
||||
|
||||
testIssue7()
|
||||
{
|
||||
( assertEquals 'Some message.' 1 2 >"${stdoutF}" 2>"${stderrF}" )
|
||||
diff "${stdoutF}" - >/dev/null <<EOF
|
||||
ASSERT:Some message. expected:<1> but was:<2>
|
||||
EOF
|
||||
rtrn=$?
|
||||
assertEquals ${SHUNIT_TRUE} ${rtrn}
|
||||
[ ${rtrn} -ne ${SHUNIT_TRUE} ] && cat "${stderrF}" >&2
|
||||
}
|
||||
|
||||
testPrepForSourcing()
|
||||
{
|
||||
assertEquals '/abc' `_shunit_prepForSourcing '/abc'`
|
||||
assertEquals './abc' `_shunit_prepForSourcing './abc'`
|
||||
assertEquals './abc' `_shunit_prepForSourcing 'abc'`
|
||||
}
|
||||
|
||||
testEscapeCharInStr()
|
||||
{
|
||||
actual=`_shunit_escapeCharInStr '\' ''`
|
||||
assertEquals '' "${actual}"
|
||||
assertEquals 'abc\\' `_shunit_escapeCharInStr '\' 'abc\'`
|
||||
assertEquals 'abc\\def' `_shunit_escapeCharInStr '\' 'abc\def'`
|
||||
assertEquals '\\def' `_shunit_escapeCharInStr '\' '\def'`
|
||||
|
||||
actual=`_shunit_escapeCharInStr '"' ''`
|
||||
assertEquals '' "${actual}"
|
||||
assertEquals 'abc\"' `_shunit_escapeCharInStr '"' 'abc"'`
|
||||
assertEquals 'abc\"def' `_shunit_escapeCharInStr '"' 'abc"def'`
|
||||
assertEquals '\"def' `_shunit_escapeCharInStr '"' '"def'`
|
||||
|
||||
actual=`_shunit_escapeCharInStr '$' ''`
|
||||
assertEquals '' "${actual}"
|
||||
assertEquals 'abc\$' `_shunit_escapeCharInStr '$' 'abc$'`
|
||||
assertEquals 'abc\$def' `_shunit_escapeCharInStr '$' 'abc$def'`
|
||||
assertEquals '\$def' `_shunit_escapeCharInStr '$' '$def'`
|
||||
|
||||
# actual=`_shunit_escapeCharInStr "'" ''`
|
||||
# assertEquals '' "${actual}"
|
||||
# assertEquals "abc\\'" `_shunit_escapeCharInStr "'" "abc'"`
|
||||
# assertEquals "abc\\'def" `_shunit_escapeCharInStr "'" "abc'def"`
|
||||
# assertEquals "\\'def" `_shunit_escapeCharInStr "'" "'def"`
|
||||
|
||||
# # must put the backtick in a variable so the shell doesn't misinterpret it
|
||||
# # while inside a backticked sequence (e.g. `echo '`'` would fail).
|
||||
# backtick='`'
|
||||
# actual=`_shunit_escapeCharInStr ${backtick} ''`
|
||||
# assertEquals '' "${actual}"
|
||||
# assertEquals '\`abc' \
|
||||
# `_shunit_escapeCharInStr "${backtick}" ${backtick}'abc'`
|
||||
# assertEquals 'abc\`' \
|
||||
# `_shunit_escapeCharInStr "${backtick}" 'abc'${backtick}`
|
||||
# assertEquals 'abc\`def' \
|
||||
# `_shunit_escapeCharInStr "${backtick}" 'abc'${backtick}'def'`
|
||||
}
|
||||
|
||||
testEscapeCharInStr_specialChars()
|
||||
{
|
||||
# make sure our forward slash doesn't upset sed
|
||||
assertEquals '/' `_shunit_escapeCharInStr '\' '/'`
|
||||
|
||||
# some shells escape these differently
|
||||
#assertEquals '\\a' `_shunit_escapeCharInStr '\' '\a'`
|
||||
#assertEquals '\\b' `_shunit_escapeCharInStr '\' '\b'`
|
||||
}
|
||||
|
||||
# Test the various ways of declaring functions.
|
||||
#
|
||||
# Prefixing (then stripping) with comment symbol so these functions aren't
|
||||
# treated as real functions by shUnit2.
|
||||
testExtractTestFunctions()
|
||||
{
|
||||
f="${SHUNIT_TMPDIR}/extract_test_functions"
|
||||
sed 's/^#//' <<EOF >"${f}"
|
||||
#testABC() { echo 'ABC'; }
|
||||
#test_def() {
|
||||
# echo 'def'
|
||||
#}
|
||||
#testG3 ()
|
||||
#{
|
||||
# echo 'G3'
|
||||
#}
|
||||
#function test4() { echo '4'; }
|
||||
# test5() { echo '5'; }
|
||||
#some_test_function() { echo 'some func'; }
|
||||
#func_with_test_vars() {
|
||||
# testVariable=1234
|
||||
#}
|
||||
EOF
|
||||
|
||||
actual=`_shunit_extractTestFunctions "${f}"`
|
||||
assertEquals 'testABC test_def testG3 test4 test5' "${actual}"
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# suite functions
|
||||
#
|
||||
|
||||
setUp()
|
||||
{
|
||||
for f in ${expectedF} ${stdoutF} ${stderrF}; do
|
||||
cp /dev/null ${f}
|
||||
done
|
||||
}
|
||||
|
||||
oneTimeSetUp()
|
||||
{
|
||||
th_oneTimeSetUp
|
||||
}
|
||||
|
||||
# load and run shUnit2
|
||||
[ -n "${ZSH_VERSION:-}" ] && SHUNIT_PARENT=$0
|
||||
. ${TH_SHUNIT}
|
@ -0,0 +1,41 @@
|
||||
#! /bin/sh
|
||||
# $Id$
|
||||
# vim:et:ft=sh:sts=2:sw=2
|
||||
#
|
||||
# Copyright 2010 Kate Ward. All Rights Reserved.
|
||||
# Released under the LGPL (GNU Lesser General Public License)
|
||||
# Author: kate.ward@forestent.com (Kate Ward)
|
||||
#
|
||||
# shUnit2 unit test for standalone operation.
|
||||
#
|
||||
# This unit test is purely to test that calling shunit2 directly, while passing
|
||||
# the name of a unit test script, works. When run, this script determines if it
|
||||
# is running as a standalone program, and calls main() if it is.
|
||||
|
||||
ARGV0=`basename "$0"`
|
||||
|
||||
# load test helpers
|
||||
. ./shunit2_test_helpers
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# suite tests
|
||||
#
|
||||
|
||||
testStandalone()
|
||||
{
|
||||
assertTrue ${SHUNIT_TRUE}
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# main
|
||||
#
|
||||
|
||||
main()
|
||||
{
|
||||
${TH_SHUNIT} "${ARGV0}"
|
||||
}
|
||||
|
||||
# are we running as a standalone?
|
||||
if [ "${ARGV0}" = 'shunit2_test_standalone.sh' ]; then
|
||||
if [ $# -gt 0 ]; then main "$@"; else main; fi
|
||||
fi
|
Loading…
Reference in New Issue