rsnapshot-1.4.2/0000775000175000017500000000000012632661210013142 5ustar travistravisrsnapshot-1.4.2/autom4te.cache/0000755000175000017500000000000012632661202015745 5ustar travistravisrsnapshot-1.4.2/autom4te.cache/output.10000664000175000017500000036226412632661202017406 0ustar travistravis@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.68 for rsnapshot 1.4.2. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software @%:@ Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: rsnapshot-discuss@lists.sourceforge.net about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in @%:@( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='rsnapshot' PACKAGE_TARNAME='rsnapshot' PACKAGE_VERSION='1.4.2' PACKAGE_STRING='rsnapshot 1.4.2' PACKAGE_BUGREPORT='rsnapshot-discuss@lists.sourceforge.net' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIB@&t@OBJS TEST_SSH_USER CMD_DU TEST_DU DU CMD_LOGGER TEST_LOGGER LOGGER CMD_UMOUNT UMOUNT CMD_MOUNT MOUNT CMD_LVREMOVE LVREMOVE CMD_LVCREATE LVCREATE CMD_SSH TEST_SSH SSH CMD_RM TEST_RM RM CMD_CP CP TEST_CP RSYNC CMD_RSYNC PERL TEMP SNAP TEST CWD am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_perl with_rsync with_cp with_rm with_ssh with_logger with_du with_test_ssh_user ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures rsnapshot 1.4.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/rsnapshot@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of rsnapshot 1.4.2:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-perl=PATH Specify the path to perl --with-rsync=PATH Specify the path to rsync --with-cp=PATH Specify the path to cp --with-rm=PATH Specify the path to rm --with-ssh=PATH Specify the path to ssh --with-logger=PATH Specify the path to logger --with-du=PATH Specify the path to du --with-test-ssh-user=USER Specify the path to rsync Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF rsnapshot configure 1.4.2 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by rsnapshot $as_me 1.4.2, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='rsnapshot' VERSION='1.4.2' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_config_files="$ac_config_files Makefile" CWD=`eval echo \`pwd\`` CWD="$CWD/" TEST="$CWD/t/" SNAP="$CWD/t/support/snapshots" TEMP="$CWD/t/support/files/template" @%:@ Check whether --with-perl was given. if test "${with_perl+set}" = set; then : withval=$with_perl; if test "x$withval" != "xno"; then if test -x "$withval"; then PERL=$withval else as_fn_error $? "perl not found" "$LINENO" 5 fi else as_fn_error $? "perl is required" "$LINENO" 5 fi fi if test "$PERL" = ""; then # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no" ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$PERL" = "no"; then as_fn_error $? "perl is required" "$LINENO" 5 fi @%:@ Check whether --with-rsync was given. if test "${with_rsync+set}" = set; then : withval=$with_rsync; if test "x$withval" != "xno"; then if test -x "$withval"; then RSYNC=$withval CMD_RSYNC="cmd_rsync $RSYNC" else as_fn_error $? "rsync not found" "$LINENO" 5 fi else as_fn_error $? "rsync is required" "$LINENO" 5 fi fi if test "$RSYNC" = ""; then # Extract the first word of "rsync", so it can be a program name with args. set dummy rsync; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RSYNC+:} false; then : $as_echo_n "(cached) " >&6 else case $RSYNC in [\\/]* | ?:[\\/]*) ac_cv_path_RSYNC="$RSYNC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RSYNC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_RSYNC" && ac_cv_path_RSYNC="no" ;; esac fi RSYNC=$ac_cv_path_RSYNC if test -n "$RSYNC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RSYNC" >&5 $as_echo "$RSYNC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi RSYNC="$RSYNC" CMD_RSYNC="cmd_rsync $RSYNC" fi if test "$RSYNC" = "no"; then as_fn_error $? "rsync is required" "$LINENO" 5 fi @%:@ Check whether --with-cp was given. if test "${with_cp+set}" = set; then : withval=$with_cp; if test "x$withval" != "xno"; then if test -x "$withval"; then CP=$withval else as_fn_error $? "cp not found" "$LINENO" 5 fi else CP=no fi fi TEST_CP="$CP" if test "$CP" != "no"; then # Extract the first word of "cp", so it can be a program name with args. set dummy cp; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CP+:} false; then : $as_echo_n "(cached) " >&6 else case $CP in [\\/]* | ?:[\\/]*) ac_cv_path_CP="$CP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_CP" && ac_cv_path_CP="no" ;; esac fi CP=$ac_cv_path_CP if test -n "$CP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CP" >&5 $as_echo "$CP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$CP" = "no"; then CP=/bin/cp fi CMD_CP="cmd_cp $CP" @%:@ Check whether --with-rm was given. if test "${with_rm+set}" = set; then : withval=$with_rm; if test "x$withval" != "xno"; then if test -x "$withval"; then RM=$withval else as_fn_error $? "rm not found" "$LINENO" 5 fi else RM=no fi fi if test "$RM" != "no"; then # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RM+:} false; then : $as_echo_n "(cached) " >&6 else case $RM in [\\/]* | ?:[\\/]*) ac_cv_path_RM="$RM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_RM" && ac_cv_path_RM="no" ;; esac fi RM=$ac_cv_path_RM if test -n "$RM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 $as_echo "$RM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_RM="$RM" if test "$RM" = "no"; then RM=/bin/rm fi CMD_RM="cmd_rm $RM" @%:@ Check whether --with-ssh was given. if test "${with_ssh+set}" = set; then : withval=$with_ssh; if test "x$withval" != "xno"; then if test -x "$withval"; then SSH=$withval else as_fn_error $? "ssh not found" "$LINENO" 5 fi else SSH=no fi fi if test "$SSH" != "no"; then # Extract the first word of "ssh", so it can be a program name with args. set dummy ssh; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SSH+:} false; then : $as_echo_n "(cached) " >&6 else case $SSH in [\\/]* | ?:[\\/]*) ac_cv_path_SSH="$SSH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SSH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SSH" && ac_cv_path_SSH="no" ;; esac fi SSH=$ac_cv_path_SSH if test -n "$SSH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SSH" >&5 $as_echo "$SSH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_SSH="$SSH" if test "$SSH" = "no"; then SSH=/path/to/ssh fi CMD_SSH="cmd_ssh $SSH" # Extract the first word of "lvcreate", so it can be a program name with args. set dummy lvcreate; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LVCREATE+:} false; then : $as_echo_n "(cached) " >&6 else case $LVCREATE in [\\/]* | ?:[\\/]*) ac_cv_path_LVCREATE="$LVCREATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LVCREATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LVCREATE" && ac_cv_path_LVCREATE="no" ;; esac fi LVCREATE=$ac_cv_path_LVCREATE if test -n "$LVCREATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LVCREATE" >&5 $as_echo "$LVCREATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$LVCREATE" = "no"; then LVCREATE=/path/to/lvcreate fi CMD_LVCREATE="$LVCREATE" # Extract the first word of "lvremove", so it can be a program name with args. set dummy lvremove; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LVREMOVE+:} false; then : $as_echo_n "(cached) " >&6 else case $LVREMOVE in [\\/]* | ?:[\\/]*) ac_cv_path_LVREMOVE="$LVREMOVE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LVREMOVE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LVREMOVE" && ac_cv_path_LVREMOVE="no" ;; esac fi LVREMOVE=$ac_cv_path_LVREMOVE if test -n "$LVREMOVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LVREMOVE" >&5 $as_echo "$LVREMOVE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$LVREMOVE" = "no"; then LVREMOVE=/path/to/lvremove fi CMD_LVREMOVE="$LVREMOVE" # Extract the first word of "mount", so it can be a program name with args. set dummy mount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MOUNT+:} false; then : $as_echo_n "(cached) " >&6 else case $MOUNT in [\\/]* | ?:[\\/]*) ac_cv_path_MOUNT="$MOUNT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MOUNT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MOUNT" && ac_cv_path_MOUNT="no" ;; esac fi MOUNT=$ac_cv_path_MOUNT if test -n "$MOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOUNT" >&5 $as_echo "$MOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MOUNT" = "no"; then MOUNT=/path/to/mount fi CMD_MOUNT="$MOUNT" # Extract the first word of "umount", so it can be a program name with args. set dummy umount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_UMOUNT+:} false; then : $as_echo_n "(cached) " >&6 else case $UMOUNT in [\\/]* | ?:[\\/]*) ac_cv_path_UMOUNT="$UMOUNT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_UMOUNT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_UMOUNT" && ac_cv_path_UMOUNT="no" ;; esac fi UMOUNT=$ac_cv_path_UMOUNT if test -n "$UMOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UMOUNT" >&5 $as_echo "$UMOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$UMOUNT" = "no"; then UMOUNT=/path/to/umount fi CMD_UMOUNT="$UMOUNT" @%:@ Check whether --with-logger was given. if test "${with_logger+set}" = set; then : withval=$with_logger; if test "x$withval" != "xno"; then if test -x "$withval"; then LOGGER=$withval else as_fn_error $? "logger not found" "$LINENO" 5 fi else LOGGER=no fi fi if test "$LOGGER" != "no"; then # Extract the first word of "logger", so it can be a program name with args. set dummy logger; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LOGGER+:} false; then : $as_echo_n "(cached) " >&6 else case $LOGGER in [\\/]* | ?:[\\/]*) ac_cv_path_LOGGER="$LOGGER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LOGGER="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LOGGER" && ac_cv_path_LOGGER="no" ;; esac fi LOGGER=$ac_cv_path_LOGGER if test -n "$LOGGER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LOGGER" >&5 $as_echo "$LOGGER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_LOGGER="$LOGGER" if test "$LOGGER" = "no"; then LOGGER=/path/to/logger fi CMD_LOGGER="cmd_logger $LOGGER" @%:@ Check whether --with-du was given. if test "${with_du+set}" = set; then : withval=$with_du; if test "x$withval" != "xno"; then if test -x "$withval"; then DU=$withval else as_fn_error $? "du not found" "$LINENO" 5 fi else DU=no fi fi if test "$DU" != "no"; then # Extract the first word of "du", so it can be a program name with args. set dummy du; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DU+:} false; then : $as_echo_n "(cached) " >&6 else case $DU in [\\/]* | ?:[\\/]*) ac_cv_path_DU="$DU" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DU="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_DU" && ac_cv_path_DU="no" ;; esac fi DU=$ac_cv_path_DU if test -n "$DU"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DU" >&5 $as_echo "$DU" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_DU="$DU" if test "$DU" = "no"; then DU=/path/to/du fi CMD_DU="cmd_du $DU" @%:@ Check whether --with-test-ssh-user was given. if test "${with_test_ssh_user+set}" = set; then : withval=$with_test_ssh_user; if test "x$withval" != "xno"; then TEST_SSH_USER="$withval" TEST_SSH_USER="$TEST_SSH_USER" fi fi if test "$TEST_SSH_USER" = ""; then TEST_SSH_USER="$USER" fi # replace perl paths ac_config_files="$ac_config_files rsnapshot:rsnapshot-program.pl" ac_config_files="$ac_config_files rsnapshot-diff:rsnapshot-diff.pl" ac_config_files="$ac_config_files rsnapshot.conf.default:rsnapshot.conf.default.in" # this part is autogenerated by autogen.sh ac_config_files="$ac_config_files t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t" ac_config_files="$ac_config_files t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf" ac_config_files="$ac_config_files t/relative_delete_bugfix/relative_delete_bugfix.t" ac_config_files="$ac_config_files t/relative_delete_bugfix/conf/relative_delete_bugfix.conf" ac_config_files="$ac_config_files t/snapshot_root_with_space/snapshot_root_with_space.t" ac_config_files="$ac_config_files t/snapshot_root_with_space/conf/snapshot_root_with_space.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/cmd-post_pre-exec.t" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-false-post-true.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-true-post-true.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-true-post-false.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-false-post-false.conf" ac_config_files="$ac_config_files t/SysWrap.pm" ac_config_files="$ac_config_files t/backup_exec/conf/backup_exec_fail.conf" ac_config_files="$ac_config_files t/backup_exec/conf/backup_exec.conf" ac_config_files="$ac_config_files t/backup_exec/backup_exec.t" ac_config_files="$ac_config_files t/rsync-exitcode/rsync-exitcode.t" ac_config_files="$ac_config_files t/rsync-exitcode/conf/rsync-exitcode-good.conf" ac_config_files="$ac_config_files t/rsync-exitcode/conf/rsync-exitcode-bad.conf" ac_config_files="$ac_config_files t/configtest/configtest.t" ac_config_files="$ac_config_files t/configtest/conf/configtest.conf" ac_config_files="$ac_config_files t/rsync/rsync.t" ac_config_files="$ac_config_files t/rsync/conf/rsync.conf" ac_config_files="$ac_config_files t/gnu_cp/gnu_cp.t" ac_config_files="$ac_config_files t/gnu_cp/conf/gnu_cp.conf" ac_config_files="$ac_config_files t/ssh_args/conf/ssh_args.conf" ac_config_files="$ac_config_files t/ssh_args/ssh_args.t" # this part had been autogenerated by autogen.sh cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in @%:@( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by rsnapshot $as_me 1.4.2, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ rsnapshot config.status 1.4.2 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "rsnapshot") CONFIG_FILES="$CONFIG_FILES rsnapshot:rsnapshot-program.pl" ;; "rsnapshot-diff") CONFIG_FILES="$CONFIG_FILES rsnapshot-diff:rsnapshot-diff.pl" ;; "rsnapshot.conf.default") CONFIG_FILES="$CONFIG_FILES rsnapshot.conf.default:rsnapshot.conf.default.in" ;; "t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t") CONFIG_FILES="$CONFIG_FILES t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t" ;; "t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf") CONFIG_FILES="$CONFIG_FILES t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf" ;; "t/relative_delete_bugfix/relative_delete_bugfix.t") CONFIG_FILES="$CONFIG_FILES t/relative_delete_bugfix/relative_delete_bugfix.t" ;; "t/relative_delete_bugfix/conf/relative_delete_bugfix.conf") CONFIG_FILES="$CONFIG_FILES t/relative_delete_bugfix/conf/relative_delete_bugfix.conf" ;; "t/snapshot_root_with_space/snapshot_root_with_space.t") CONFIG_FILES="$CONFIG_FILES t/snapshot_root_with_space/snapshot_root_with_space.t" ;; "t/snapshot_root_with_space/conf/snapshot_root_with_space.conf") CONFIG_FILES="$CONFIG_FILES t/snapshot_root_with_space/conf/snapshot_root_with_space.conf" ;; "t/cmd-post_pre-exec/cmd-post_pre-exec.t") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/cmd-post_pre-exec.t" ;; "t/cmd-post_pre-exec/conf/pre-false-post-true.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-false-post-true.conf" ;; "t/cmd-post_pre-exec/conf/pre-true-post-true.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-true-post-true.conf" ;; "t/cmd-post_pre-exec/conf/pre-true-post-false.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-true-post-false.conf" ;; "t/cmd-post_pre-exec/conf/pre-false-post-false.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-false-post-false.conf" ;; "t/SysWrap.pm") CONFIG_FILES="$CONFIG_FILES t/SysWrap.pm" ;; "t/backup_exec/conf/backup_exec_fail.conf") CONFIG_FILES="$CONFIG_FILES t/backup_exec/conf/backup_exec_fail.conf" ;; "t/backup_exec/conf/backup_exec.conf") CONFIG_FILES="$CONFIG_FILES t/backup_exec/conf/backup_exec.conf" ;; "t/backup_exec/backup_exec.t") CONFIG_FILES="$CONFIG_FILES t/backup_exec/backup_exec.t" ;; "t/rsync-exitcode/rsync-exitcode.t") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/rsync-exitcode.t" ;; "t/rsync-exitcode/conf/rsync-exitcode-good.conf") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/conf/rsync-exitcode-good.conf" ;; "t/rsync-exitcode/conf/rsync-exitcode-bad.conf") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/conf/rsync-exitcode-bad.conf" ;; "t/configtest/configtest.t") CONFIG_FILES="$CONFIG_FILES t/configtest/configtest.t" ;; "t/configtest/conf/configtest.conf") CONFIG_FILES="$CONFIG_FILES t/configtest/conf/configtest.conf" ;; "t/rsync/rsync.t") CONFIG_FILES="$CONFIG_FILES t/rsync/rsync.t" ;; "t/rsync/conf/rsync.conf") CONFIG_FILES="$CONFIG_FILES t/rsync/conf/rsync.conf" ;; "t/gnu_cp/gnu_cp.t") CONFIG_FILES="$CONFIG_FILES t/gnu_cp/gnu_cp.t" ;; "t/gnu_cp/conf/gnu_cp.conf") CONFIG_FILES="$CONFIG_FILES t/gnu_cp/conf/gnu_cp.conf" ;; "t/ssh_args/conf/ssh_args.conf") CONFIG_FILES="$CONFIG_FILES t/ssh_args/conf/ssh_args.conf" ;; "t/ssh_args/ssh_args.t") CONFIG_FILES="$CONFIG_FILES t/ssh_args/ssh_args.t" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo "Now type \"make test\" to run the regression test suite." echo "Then type \"make install\" to install the program." echo "" if test ! -e "$RSNAPSHOT_SYSCONFDIR/rsnapshot.conf"; then echo "After rsnapshot is installed, don't forget to copy" echo "$RSNAPSHOT_SYSCONFDIR/rsnapshot.conf.default to $RSNAPSHOT_SYSCONFDIR/rsnapshot.conf" echo "" fi rsnapshot-1.4.2/autom4te.cache/traces.00000664000175000017500000010105512632661202017313 0ustar travistravism4trace:/usr/share/aclocal-1.11/amversion.m4:17: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) m4trace:/usr/share/aclocal-1.11/amversion.m4:36: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) m4trace:/usr/share/aclocal-1.11/auxdir.m4:49: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) m4trace:/usr/share/aclocal-1.11/cond.m4:15: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) m4trace:/usr/share/aclocal-1.11/depend.m4:28: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) m4trace:/usr/share/aclocal-1.11/depend.m4:164: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) m4trace:/usr/share/aclocal-1.11/depend.m4:172: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) m4trace:/usr/share/aclocal-1.11/depout.m4:14: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ]) m4trace:/usr/share/aclocal-1.11/depout.m4:75: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) m4trace:/usr/share/aclocal-1.11/init.m4:26: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) m4trace:/usr/share/aclocal-1.11/init.m4:126: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) m4trace:/usr/share/aclocal-1.11/install-sh.m4:14: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) m4trace:/usr/share/aclocal-1.11/lead-dot.m4:12: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) m4trace:/usr/share/aclocal-1.11/make.m4:14: -1- AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) m4trace:/usr/share/aclocal-1.11/missing.m4:14: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) m4trace:/usr/share/aclocal-1.11/missing.m4:24: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) m4trace:/usr/share/aclocal-1.11/mkdirp.m4:14: -1- AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) m4trace:/usr/share/aclocal-1.11/options.m4:14: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) m4trace:/usr/share/aclocal-1.11/options.m4:20: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) m4trace:/usr/share/aclocal-1.11/options.m4:26: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) m4trace:/usr/share/aclocal-1.11/options.m4:32: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) m4trace:/usr/share/aclocal-1.11/runlog.m4:14: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) m4trace:/usr/share/aclocal-1.11/sanity.m4:14: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) m4trace:/usr/share/aclocal-1.11/silent.m4:14: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) case $enable_silent_rules in yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few `make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using `$V' instead of `$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) m4trace:/usr/share/aclocal-1.11/strip.m4:19: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) m4trace:/usr/share/aclocal-1.11/substnot.m4:14: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) m4trace:/usr/share/aclocal-1.11/substnot.m4:19: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) m4trace:/usr/share/aclocal-1.11/tar.m4:24: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:1: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:1: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:2: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:2: -1- AM_SET_CURRENT_AUTOMAKE_VERSION m4trace:configure.ac:2: -1- AM_AUTOMAKE_VERSION([1.11.3]) m4trace:configure.ac:2: -1- _AM_AUTOCONF_VERSION([2.68]) m4trace:configure.ac:2: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:2: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:2: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:2: -1- _AM_SET_OPTIONS([foreign]) m4trace:configure.ac:2: -1- _AM_SET_OPTION([foreign]) m4trace:configure.ac:2: -2- _AM_MANGLE_OPTION([foreign]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:2: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])]) m4trace:configure.ac:2: -2- _AM_MANGLE_OPTION([no-define]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:2: -1- AM_SANITY_CHECK m4trace:configure.ac:2: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) m4trace:configure.ac:2: -1- AM_MISSING_HAS_RUN m4trace:configure.ac:2: -1- AM_AUX_DIR_EXPAND m4trace:configure.ac:2: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:2: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:2: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:2: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:2: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) m4trace:configure.ac:2: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:2: -1- AM_PROG_INSTALL_SH m4trace:configure.ac:2: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:2: -1- AM_PROG_INSTALL_STRIP m4trace:configure.ac:2: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:2: -1- AM_PROG_MKDIR_P m4trace:configure.ac:2: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:2: -1- AM_SET_LEADING_DOT m4trace:configure.ac:2: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:2: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) m4trace:configure.ac:2: -2- _AM_MANGLE_OPTION([tar-ustar]) m4trace:configure.ac:2: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) m4trace:configure.ac:2: -2- _AM_MANGLE_OPTION([tar-pax]) m4trace:configure.ac:2: -1- _AM_PROG_TAR([v7]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:2: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:2: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) m4trace:configure.ac:2: -2- _AM_MANGLE_OPTION([no-dependencies]) m4trace:configure.ac:2: -1- _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])]) m4trace:configure.ac:2: -2- _AM_MANGLE_OPTION([silent-rules]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:10: -1- m4_pattern_allow([^CWD$]) m4trace:configure.ac:12: -1- m4_pattern_allow([^TEST$]) m4trace:configure.ac:14: -1- m4_pattern_allow([^SNAP$]) m4trace:configure.ac:16: -1- m4_pattern_allow([^TEMP$]) m4trace:configure.ac:39: -1- m4_pattern_allow([^PERL$]) m4trace:configure.ac:51: -1- m4_pattern_allow([^CMD_RSYNC$]) m4trace:configure.ac:68: -1- m4_pattern_allow([^RSYNC$]) m4trace:configure.ac:69: -1- m4_pattern_allow([^RSYNC$]) m4trace:configure.ac:70: -1- m4_pattern_allow([^CMD_RSYNC$]) m4trace:configure.ac:98: -1- m4_pattern_allow([^TEST_CP$]) m4trace:configure.ac:101: -1- m4_pattern_allow([^CP$]) m4trace:configure.ac:108: -1- m4_pattern_allow([^CMD_CP$]) m4trace:configure.ac:132: -1- m4_pattern_allow([^RM$]) m4trace:configure.ac:135: -1- m4_pattern_allow([^TEST_RM$]) m4trace:configure.ac:141: -1- m4_pattern_allow([^CMD_RM$]) m4trace:configure.ac:165: -1- m4_pattern_allow([^SSH$]) m4trace:configure.ac:168: -1- m4_pattern_allow([^TEST_SSH$]) m4trace:configure.ac:174: -1- m4_pattern_allow([^CMD_SSH$]) m4trace:configure.ac:181: -1- m4_pattern_allow([^LVCREATE$]) m4trace:configure.ac:185: -1- m4_pattern_allow([^CMD_LVCREATE$]) m4trace:configure.ac:188: -1- m4_pattern_allow([^LVREMOVE$]) m4trace:configure.ac:192: -1- m4_pattern_allow([^CMD_LVREMOVE$]) m4trace:configure.ac:195: -1- m4_pattern_allow([^MOUNT$]) m4trace:configure.ac:199: -1- m4_pattern_allow([^CMD_MOUNT$]) m4trace:configure.ac:202: -1- m4_pattern_allow([^UMOUNT$]) m4trace:configure.ac:206: -1- m4_pattern_allow([^CMD_UMOUNT$]) m4trace:configure.ac:229: -1- m4_pattern_allow([^LOGGER$]) m4trace:configure.ac:232: -1- m4_pattern_allow([^TEST_LOGGER$]) m4trace:configure.ac:238: -1- m4_pattern_allow([^CMD_LOGGER$]) m4trace:configure.ac:262: -1- m4_pattern_allow([^DU$]) m4trace:configure.ac:265: -1- m4_pattern_allow([^TEST_DU$]) m4trace:configure.ac:271: -1- m4_pattern_allow([^CMD_DU$]) m4trace:configure.ac:278: -1- m4_pattern_allow([^TEST_SSH_USER$]) m4trace:configure.ac:289: -1- m4_pattern_allow([^TEST_SSH_USER$]) m4trace:configure.ac:301: -1- m4_include([t/include.ac]) m4trace:configure.ac:304: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:304: -1- m4_pattern_allow([^LTLIBOBJS$]) rsnapshot-1.4.2/autom4te.cache/traces.10000664000175000017500000005714412632661202017325 0ustar travistravism4trace:configure.ac:1: -1- AC_INIT([rsnapshot], [m4_esyscmd_s([git describe --tags --always --dirty])], [rsnapshot-discuss@lists.sourceforge.net]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?A[CHUM]_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([_AC_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) m4trace:configure.ac:1: -1- m4_pattern_allow([^AS_FLAGS$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?m4_]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^dnl$]) m4trace:configure.ac:1: -1- m4_pattern_forbid([^_?AS_]) m4trace:configure.ac:1: -1- AC_SUBST([SHELL]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([SHELL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^SHELL$]) m4trace:configure.ac:1: -1- AC_SUBST([PATH_SEPARATOR]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PATH_SEPARATOR$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_NAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_STRING]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([PACKAGE_URL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- AC_SUBST([exec_prefix], [NONE]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([exec_prefix]) m4trace:configure.ac:1: -1- m4_pattern_allow([^exec_prefix$]) m4trace:configure.ac:1: -1- AC_SUBST([prefix], [NONE]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([prefix]) m4trace:configure.ac:1: -1- m4_pattern_allow([^prefix$]) m4trace:configure.ac:1: -1- AC_SUBST([program_transform_name], [s,x,x,]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([program_transform_name]) m4trace:configure.ac:1: -1- m4_pattern_allow([^program_transform_name$]) m4trace:configure.ac:1: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([bindir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^bindir$]) m4trace:configure.ac:1: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sbindir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sbindir$]) m4trace:configure.ac:1: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([libexecdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libexecdir$]) m4trace:configure.ac:1: -1- AC_SUBST([datarootdir], ['${prefix}/share']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([datarootdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datarootdir$]) m4trace:configure.ac:1: -1- AC_SUBST([datadir], ['${datarootdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([datadir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^datadir$]) m4trace:configure.ac:1: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sysconfdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sysconfdir$]) m4trace:configure.ac:1: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([sharedstatedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^sharedstatedir$]) m4trace:configure.ac:1: -1- AC_SUBST([localstatedir], ['${prefix}/var']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([localstatedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localstatedir$]) m4trace:configure.ac:1: -1- AC_SUBST([includedir], ['${prefix}/include']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([includedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^includedir$]) m4trace:configure.ac:1: -1- AC_SUBST([oldincludedir], ['/usr/include']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([oldincludedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^oldincludedir$]) m4trace:configure.ac:1: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], ['${datarootdir}/doc/${PACKAGE_TARNAME}'], ['${datarootdir}/doc/${PACKAGE}'])]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([docdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^docdir$]) m4trace:configure.ac:1: -1- AC_SUBST([infodir], ['${datarootdir}/info']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([infodir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^infodir$]) m4trace:configure.ac:1: -1- AC_SUBST([htmldir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([htmldir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^htmldir$]) m4trace:configure.ac:1: -1- AC_SUBST([dvidir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([dvidir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^dvidir$]) m4trace:configure.ac:1: -1- AC_SUBST([pdfdir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([pdfdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^pdfdir$]) m4trace:configure.ac:1: -1- AC_SUBST([psdir], ['${docdir}']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([psdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^psdir$]) m4trace:configure.ac:1: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([libdir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^libdir$]) m4trace:configure.ac:1: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([localedir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^localedir$]) m4trace:configure.ac:1: -1- AC_SUBST([mandir], ['${datarootdir}/man']) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([mandir]) m4trace:configure.ac:1: -1- m4_pattern_allow([^mandir$]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_NAME$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ @%:@undef PACKAGE_NAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ @%:@undef PACKAGE_TARNAME]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_VERSION$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ @%:@undef PACKAGE_VERSION]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_STRING$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ @%:@undef PACKAGE_STRING]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ @%:@undef PACKAGE_BUGREPORT]) m4trace:configure.ac:1: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) m4trace:configure.ac:1: -1- m4_pattern_allow([^PACKAGE_URL$]) m4trace:configure.ac:1: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ @%:@undef PACKAGE_URL]) m4trace:configure.ac:1: -1- AC_SUBST([DEFS]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([DEFS]) m4trace:configure.ac:1: -1- m4_pattern_allow([^DEFS$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_C]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_C]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_C$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_N]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_N]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_N$]) m4trace:configure.ac:1: -1- AC_SUBST([ECHO_T]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([ECHO_T]) m4trace:configure.ac:1: -1- m4_pattern_allow([^ECHO_T$]) m4trace:configure.ac:1: -1- AC_SUBST([LIBS]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([LIBS]) m4trace:configure.ac:1: -1- m4_pattern_allow([^LIBS$]) m4trace:configure.ac:1: -1- AC_SUBST([build_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([build_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^build_alias$]) m4trace:configure.ac:1: -1- AC_SUBST([host_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([host_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^host_alias$]) m4trace:configure.ac:1: -1- AC_SUBST([target_alias]) m4trace:configure.ac:1: -1- AC_SUBST_TRACE([target_alias]) m4trace:configure.ac:1: -1- m4_pattern_allow([^target_alias$]) m4trace:configure.ac:2: -1- AM_INIT_AUTOMAKE([foreign]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) m4trace:configure.ac:2: -1- AM_AUTOMAKE_VERSION([1.11.3]) m4trace:configure.ac:2: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:2: -1- AC_SUBST([INSTALL_PROGRAM]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) m4trace:configure.ac:2: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) m4trace:configure.ac:2: -1- AC_SUBST([INSTALL_SCRIPT]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) m4trace:configure.ac:2: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) m4trace:configure.ac:2: -1- AC_SUBST([INSTALL_DATA]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([INSTALL_DATA]) m4trace:configure.ac:2: -1- m4_pattern_allow([^INSTALL_DATA$]) m4trace:configure.ac:2: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([am__isrc]) m4trace:configure.ac:2: -1- m4_pattern_allow([^am__isrc$]) m4trace:configure.ac:2: -1- _AM_SUBST_NOTMAKE([am__isrc]) m4trace:configure.ac:2: -1- AC_SUBST([CYGPATH_W]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([CYGPATH_W]) m4trace:configure.ac:2: -1- m4_pattern_allow([^CYGPATH_W$]) m4trace:configure.ac:2: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([PACKAGE]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:2: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) m4trace:configure.ac:2: -1- m4_pattern_allow([^PACKAGE$]) m4trace:configure.ac:2: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ @%:@undef PACKAGE]) m4trace:configure.ac:2: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) m4trace:configure.ac:2: -1- m4_pattern_allow([^VERSION$]) m4trace:configure.ac:2: -1- AH_OUTPUT([VERSION], [/* Version number of package */ @%:@undef VERSION]) m4trace:configure.ac:2: -1- AC_REQUIRE_AUX_FILE([missing]) m4trace:configure.ac:2: -1- AC_SUBST([ACLOCAL]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([ACLOCAL]) m4trace:configure.ac:2: -1- m4_pattern_allow([^ACLOCAL$]) m4trace:configure.ac:2: -1- AC_SUBST([AUTOCONF]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([AUTOCONF]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AUTOCONF$]) m4trace:configure.ac:2: -1- AC_SUBST([AUTOMAKE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([AUTOMAKE]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AUTOMAKE$]) m4trace:configure.ac:2: -1- AC_SUBST([AUTOHEADER]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([AUTOHEADER]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AUTOHEADER$]) m4trace:configure.ac:2: -1- AC_SUBST([MAKEINFO]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([MAKEINFO]) m4trace:configure.ac:2: -1- m4_pattern_allow([^MAKEINFO$]) m4trace:configure.ac:2: -1- AC_SUBST([install_sh]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([install_sh]) m4trace:configure.ac:2: -1- m4_pattern_allow([^install_sh$]) m4trace:configure.ac:2: -1- AC_SUBST([STRIP]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([STRIP]) m4trace:configure.ac:2: -1- m4_pattern_allow([^STRIP$]) m4trace:configure.ac:2: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) m4trace:configure.ac:2: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) m4trace:configure.ac:2: -1- AC_REQUIRE_AUX_FILE([install-sh]) m4trace:configure.ac:2: -1- AC_SUBST([MKDIR_P]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([MKDIR_P]) m4trace:configure.ac:2: -1- m4_pattern_allow([^MKDIR_P$]) m4trace:configure.ac:2: -1- AC_SUBST([mkdir_p], ["$MKDIR_P"]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([mkdir_p]) m4trace:configure.ac:2: -1- m4_pattern_allow([^mkdir_p$]) m4trace:configure.ac:2: -1- AC_SUBST([AWK]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([AWK]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AWK$]) m4trace:configure.ac:2: -1- AC_SUBST([SET_MAKE]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.ac:2: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:2: -1- AC_SUBST([am__leading_dot]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([am__leading_dot]) m4trace:configure.ac:2: -1- m4_pattern_allow([^am__leading_dot$]) m4trace:configure.ac:2: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([AMTAR]) m4trace:configure.ac:2: -1- m4_pattern_allow([^AMTAR$]) m4trace:configure.ac:2: -1- AC_SUBST([am__tar]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([am__tar]) m4trace:configure.ac:2: -1- m4_pattern_allow([^am__tar$]) m4trace:configure.ac:2: -1- AC_SUBST([am__untar]) m4trace:configure.ac:2: -1- AC_SUBST_TRACE([am__untar]) m4trace:configure.ac:2: -1- m4_pattern_allow([^am__untar$]) m4trace:configure.ac:3: -1- AC_SUBST([SET_MAKE]) m4trace:configure.ac:3: -1- AC_SUBST_TRACE([SET_MAKE]) m4trace:configure.ac:3: -1- m4_pattern_allow([^SET_MAKE$]) m4trace:configure.ac:4: -1- AC_CONFIG_FILES([Makefile]) m4trace:configure.ac:10: -1- AC_SUBST([CWD], ["$CWD/"]) m4trace:configure.ac:10: -1- AC_SUBST_TRACE([CWD]) m4trace:configure.ac:10: -1- m4_pattern_allow([^CWD$]) m4trace:configure.ac:12: -1- AC_SUBST([TEST], ["$CWD/t/"]) m4trace:configure.ac:12: -1- AC_SUBST_TRACE([TEST]) m4trace:configure.ac:12: -1- m4_pattern_allow([^TEST$]) m4trace:configure.ac:14: -1- AC_SUBST([SNAP], ["$CWD/t/support/snapshots"]) m4trace:configure.ac:14: -1- AC_SUBST_TRACE([SNAP]) m4trace:configure.ac:14: -1- m4_pattern_allow([^SNAP$]) m4trace:configure.ac:16: -1- AC_SUBST([TEMP], ["$CWD/t/support/files/template"]) m4trace:configure.ac:16: -1- AC_SUBST_TRACE([TEMP]) m4trace:configure.ac:16: -1- m4_pattern_allow([^TEMP$]) m4trace:configure.ac:39: -1- AC_SUBST([PERL]) m4trace:configure.ac:39: -1- AC_SUBST_TRACE([PERL]) m4trace:configure.ac:39: -1- m4_pattern_allow([^PERL$]) m4trace:configure.ac:51: -1- AC_SUBST([CMD_RSYNC], ["cmd_rsync $RSYNC"]) m4trace:configure.ac:51: -1- AC_SUBST_TRACE([CMD_RSYNC]) m4trace:configure.ac:51: -1- m4_pattern_allow([^CMD_RSYNC$]) m4trace:configure.ac:68: -1- AC_SUBST([RSYNC]) m4trace:configure.ac:68: -1- AC_SUBST_TRACE([RSYNC]) m4trace:configure.ac:68: -1- m4_pattern_allow([^RSYNC$]) m4trace:configure.ac:69: -1- AC_SUBST([RSYNC], ["$RSYNC"]) m4trace:configure.ac:69: -1- AC_SUBST_TRACE([RSYNC]) m4trace:configure.ac:69: -1- m4_pattern_allow([^RSYNC$]) m4trace:configure.ac:70: -1- AC_SUBST([CMD_RSYNC], ["cmd_rsync $RSYNC"]) m4trace:configure.ac:70: -1- AC_SUBST_TRACE([CMD_RSYNC]) m4trace:configure.ac:70: -1- m4_pattern_allow([^CMD_RSYNC$]) m4trace:configure.ac:98: -1- AC_SUBST([TEST_CP], ["$CP"]) m4trace:configure.ac:98: -1- AC_SUBST_TRACE([TEST_CP]) m4trace:configure.ac:98: -1- m4_pattern_allow([^TEST_CP$]) m4trace:configure.ac:101: -1- AC_SUBST([CP]) m4trace:configure.ac:101: -1- AC_SUBST_TRACE([CP]) m4trace:configure.ac:101: -1- m4_pattern_allow([^CP$]) m4trace:configure.ac:108: -1- AC_SUBST([CMD_CP], ["cmd_cp $CP"]) m4trace:configure.ac:108: -1- AC_SUBST_TRACE([CMD_CP]) m4trace:configure.ac:108: -1- m4_pattern_allow([^CMD_CP$]) m4trace:configure.ac:132: -1- AC_SUBST([RM]) m4trace:configure.ac:132: -1- AC_SUBST_TRACE([RM]) m4trace:configure.ac:132: -1- m4_pattern_allow([^RM$]) m4trace:configure.ac:135: -1- AC_SUBST([TEST_RM], ["$RM"]) m4trace:configure.ac:135: -1- AC_SUBST_TRACE([TEST_RM]) m4trace:configure.ac:135: -1- m4_pattern_allow([^TEST_RM$]) m4trace:configure.ac:141: -1- AC_SUBST([CMD_RM], ["cmd_rm $RM"]) m4trace:configure.ac:141: -1- AC_SUBST_TRACE([CMD_RM]) m4trace:configure.ac:141: -1- m4_pattern_allow([^CMD_RM$]) m4trace:configure.ac:165: -1- AC_SUBST([SSH]) m4trace:configure.ac:165: -1- AC_SUBST_TRACE([SSH]) m4trace:configure.ac:165: -1- m4_pattern_allow([^SSH$]) m4trace:configure.ac:168: -1- AC_SUBST([TEST_SSH], ["$SSH"]) m4trace:configure.ac:168: -1- AC_SUBST_TRACE([TEST_SSH]) m4trace:configure.ac:168: -1- m4_pattern_allow([^TEST_SSH$]) m4trace:configure.ac:174: -1- AC_SUBST([CMD_SSH], ["cmd_ssh $SSH"]) m4trace:configure.ac:174: -1- AC_SUBST_TRACE([CMD_SSH]) m4trace:configure.ac:174: -1- m4_pattern_allow([^CMD_SSH$]) m4trace:configure.ac:181: -1- AC_SUBST([LVCREATE]) m4trace:configure.ac:181: -1- AC_SUBST_TRACE([LVCREATE]) m4trace:configure.ac:181: -1- m4_pattern_allow([^LVCREATE$]) m4trace:configure.ac:185: -1- AC_SUBST([CMD_LVCREATE], ["$LVCREATE"]) m4trace:configure.ac:185: -1- AC_SUBST_TRACE([CMD_LVCREATE]) m4trace:configure.ac:185: -1- m4_pattern_allow([^CMD_LVCREATE$]) m4trace:configure.ac:188: -1- AC_SUBST([LVREMOVE]) m4trace:configure.ac:188: -1- AC_SUBST_TRACE([LVREMOVE]) m4trace:configure.ac:188: -1- m4_pattern_allow([^LVREMOVE$]) m4trace:configure.ac:192: -1- AC_SUBST([CMD_LVREMOVE], ["$LVREMOVE"]) m4trace:configure.ac:192: -1- AC_SUBST_TRACE([CMD_LVREMOVE]) m4trace:configure.ac:192: -1- m4_pattern_allow([^CMD_LVREMOVE$]) m4trace:configure.ac:195: -1- AC_SUBST([MOUNT]) m4trace:configure.ac:195: -1- AC_SUBST_TRACE([MOUNT]) m4trace:configure.ac:195: -1- m4_pattern_allow([^MOUNT$]) m4trace:configure.ac:199: -1- AC_SUBST([CMD_MOUNT], ["$MOUNT"]) m4trace:configure.ac:199: -1- AC_SUBST_TRACE([CMD_MOUNT]) m4trace:configure.ac:199: -1- m4_pattern_allow([^CMD_MOUNT$]) m4trace:configure.ac:202: -1- AC_SUBST([UMOUNT]) m4trace:configure.ac:202: -1- AC_SUBST_TRACE([UMOUNT]) m4trace:configure.ac:202: -1- m4_pattern_allow([^UMOUNT$]) m4trace:configure.ac:206: -1- AC_SUBST([CMD_UMOUNT], ["$UMOUNT"]) m4trace:configure.ac:206: -1- AC_SUBST_TRACE([CMD_UMOUNT]) m4trace:configure.ac:206: -1- m4_pattern_allow([^CMD_UMOUNT$]) m4trace:configure.ac:229: -1- AC_SUBST([LOGGER]) m4trace:configure.ac:229: -1- AC_SUBST_TRACE([LOGGER]) m4trace:configure.ac:229: -1- m4_pattern_allow([^LOGGER$]) m4trace:configure.ac:232: -1- AC_SUBST([TEST_LOGGER], ["$LOGGER"]) m4trace:configure.ac:232: -1- AC_SUBST_TRACE([TEST_LOGGER]) m4trace:configure.ac:232: -1- m4_pattern_allow([^TEST_LOGGER$]) m4trace:configure.ac:238: -1- AC_SUBST([CMD_LOGGER], ["cmd_logger $LOGGER"]) m4trace:configure.ac:238: -1- AC_SUBST_TRACE([CMD_LOGGER]) m4trace:configure.ac:238: -1- m4_pattern_allow([^CMD_LOGGER$]) m4trace:configure.ac:262: -1- AC_SUBST([DU]) m4trace:configure.ac:262: -1- AC_SUBST_TRACE([DU]) m4trace:configure.ac:262: -1- m4_pattern_allow([^DU$]) m4trace:configure.ac:265: -1- AC_SUBST([TEST_DU], ["$DU"]) m4trace:configure.ac:265: -1- AC_SUBST_TRACE([TEST_DU]) m4trace:configure.ac:265: -1- m4_pattern_allow([^TEST_DU$]) m4trace:configure.ac:271: -1- AC_SUBST([CMD_DU], ["cmd_du $DU"]) m4trace:configure.ac:271: -1- AC_SUBST_TRACE([CMD_DU]) m4trace:configure.ac:271: -1- m4_pattern_allow([^CMD_DU$]) m4trace:configure.ac:278: -1- AC_SUBST([TEST_SSH_USER], ["$TEST_SSH_USER"]) m4trace:configure.ac:278: -1- AC_SUBST_TRACE([TEST_SSH_USER]) m4trace:configure.ac:278: -1- m4_pattern_allow([^TEST_SSH_USER$]) m4trace:configure.ac:289: -1- AC_SUBST([TEST_SSH_USER], ["$USER"]) m4trace:configure.ac:289: -1- AC_SUBST_TRACE([TEST_SSH_USER]) m4trace:configure.ac:289: -1- m4_pattern_allow([^TEST_SSH_USER$]) m4trace:configure.ac:294: -1- AC_CONFIG_FILES([rsnapshot:rsnapshot-program.pl]) m4trace:configure.ac:295: -1- AC_CONFIG_FILES([rsnapshot-diff:rsnapshot-diff.pl]) m4trace:configure.ac:298: -1- AC_CONFIG_FILES([rsnapshot.conf.default:rsnapshot.conf.default.in]) m4trace:configure.ac:301: -1- m4_include([t/include.ac]) m4trace:t/include.ac:4: -1- AC_CONFIG_FILES([t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t]) m4trace:t/include.ac:5: -1- AC_CONFIG_FILES([t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf]) m4trace:t/include.ac:6: -1- AC_CONFIG_FILES([t/relative_delete_bugfix/relative_delete_bugfix.t]) m4trace:t/include.ac:7: -1- AC_CONFIG_FILES([t/relative_delete_bugfix/conf/relative_delete_bugfix.conf]) m4trace:t/include.ac:8: -1- AC_CONFIG_FILES([t/snapshot_root_with_space/snapshot_root_with_space.t]) m4trace:t/include.ac:9: -1- AC_CONFIG_FILES([t/snapshot_root_with_space/conf/snapshot_root_with_space.conf]) m4trace:t/include.ac:10: -1- AC_CONFIG_FILES([t/cmd-post_pre-exec/cmd-post_pre-exec.t]) m4trace:t/include.ac:11: -1- AC_CONFIG_FILES([t/cmd-post_pre-exec/conf/pre-false-post-true.conf]) m4trace:t/include.ac:12: -1- AC_CONFIG_FILES([t/cmd-post_pre-exec/conf/pre-true-post-true.conf]) m4trace:t/include.ac:13: -1- AC_CONFIG_FILES([t/cmd-post_pre-exec/conf/pre-true-post-false.conf]) m4trace:t/include.ac:14: -1- AC_CONFIG_FILES([t/cmd-post_pre-exec/conf/pre-false-post-false.conf]) m4trace:t/include.ac:15: -1- AC_CONFIG_FILES([t/SysWrap.pm]) m4trace:t/include.ac:16: -1- AC_CONFIG_FILES([t/backup_exec/conf/backup_exec_fail.conf]) m4trace:t/include.ac:17: -1- AC_CONFIG_FILES([t/backup_exec/conf/backup_exec.conf]) m4trace:t/include.ac:18: -1- AC_CONFIG_FILES([t/backup_exec/backup_exec.t]) m4trace:t/include.ac:19: -1- AC_CONFIG_FILES([t/rsync-exitcode/rsync-exitcode.t]) m4trace:t/include.ac:20: -1- AC_CONFIG_FILES([t/rsync-exitcode/conf/rsync-exitcode-good.conf]) m4trace:t/include.ac:21: -1- AC_CONFIG_FILES([t/rsync-exitcode/conf/rsync-exitcode-bad.conf]) m4trace:t/include.ac:22: -1- AC_CONFIG_FILES([t/configtest/configtest.t]) m4trace:t/include.ac:23: -1- AC_CONFIG_FILES([t/configtest/conf/configtest.conf]) m4trace:t/include.ac:24: -1- AC_CONFIG_FILES([t/rsync/rsync.t]) m4trace:t/include.ac:25: -1- AC_CONFIG_FILES([t/rsync/conf/rsync.conf]) m4trace:t/include.ac:26: -1- AC_CONFIG_FILES([t/gnu_cp/gnu_cp.t]) m4trace:t/include.ac:27: -1- AC_CONFIG_FILES([t/gnu_cp/conf/gnu_cp.conf]) m4trace:t/include.ac:28: -1- AC_CONFIG_FILES([t/ssh_args/conf/ssh_args.conf]) m4trace:t/include.ac:29: -1- AC_CONFIG_FILES([t/ssh_args/ssh_args.t]) m4trace:configure.ac:304: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) m4trace:configure.ac:304: -1- m4_pattern_allow([^LIB@&t@OBJS$]) m4trace:configure.ac:304: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([LTLIBOBJS]) m4trace:configure.ac:304: -1- m4_pattern_allow([^LTLIBOBJS$]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([top_builddir]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([top_build_prefix]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([srcdir]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([abs_srcdir]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([top_srcdir]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([abs_top_srcdir]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([builddir]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([abs_builddir]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([abs_top_builddir]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([INSTALL]) m4trace:configure.ac:304: -1- AC_SUBST_TRACE([MKDIR_P]) rsnapshot-1.4.2/autom4te.cache/requests0000664000175000017500000001467712632661203017565 0ustar travistravis# This file was generated by Autom4te Sun Nov 6 20:57:04 UTC 2011. # It contains the lists of macros which have been traced. # It can be safely removed. @request = ( bless( [ '0', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', '/usr/share/aclocal-1.11/amversion.m4', '/usr/share/aclocal-1.11/auxdir.m4', '/usr/share/aclocal-1.11/cond.m4', '/usr/share/aclocal-1.11/depend.m4', '/usr/share/aclocal-1.11/depout.m4', '/usr/share/aclocal-1.11/init.m4', '/usr/share/aclocal-1.11/install-sh.m4', '/usr/share/aclocal-1.11/lead-dot.m4', '/usr/share/aclocal-1.11/make.m4', '/usr/share/aclocal-1.11/missing.m4', '/usr/share/aclocal-1.11/mkdirp.m4', '/usr/share/aclocal-1.11/options.m4', '/usr/share/aclocal-1.11/runlog.m4', '/usr/share/aclocal-1.11/sanity.m4', '/usr/share/aclocal-1.11/silent.m4', '/usr/share/aclocal-1.11/strip.m4', '/usr/share/aclocal-1.11/substnot.m4', '/usr/share/aclocal-1.11/tar.m4', 'configure.ac' ], { 'm4_pattern_forbid' => 1, 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, '_AM_SET_OPTION' => 1, 'AC_DEFUN' => 1, 'AM_PROG_MKDIR_P' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'AM_MISSING_HAS_RUN' => 1, 'AM_SUBST_NOTMAKE' => 1, 'AM_MISSING_PROG' => 1, 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AC_DEFUN_ONCE' => 1, 'AM_PROG_INSTALL_STRIP' => 1, '_m4_warn' => 1, 'AM_SANITY_CHECK' => 1, 'AM_SILENT_RULES' => 1, 'include' => 1, '_AM_PROG_TAR' => 1, 'AM_AUX_DIR_EXPAND' => 1, 'AM_DEP_TRACK' => 1, '_AM_SET_OPTIONS' => 1, '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, 'AM_RUN_LOG' => 1, '_AM_IF_OPTION' => 1, '_AM_SUBST_NOTMAKE' => 1, 'm4_pattern_allow' => 1, '_AM_AUTOCONF_VERSION' => 1, '_AM_MANGLE_OPTION' => 1, 'AM_CONDITIONAL' => 1, 'AM_SET_LEADING_DOT' => 1, 'AM_SET_DEPDIR' => 1, '_AM_DEPENDENCIES' => 1, 'AM_PROG_INSTALL_SH' => 1, 'm4_include' => 1, '_AC_AM_CONFIG_HEADER_HOOK' => 1, 'AU_DEFUN' => 1, 'AM_MAKE_INCLUDE' => 1 } ], 'Autom4te::Request' ), bless( [ '1', 1, [ '/usr/share/autoconf' ], [ '/usr/share/autoconf/autoconf/autoconf.m4f', 'aclocal.m4', 'configure.ac' ], { '_LT_AC_TAGCONFIG' => 1, 'AM_PROG_F77_C_O' => 1, 'm4_pattern_forbid' => 1, 'AC_INIT' => 1, '_AM_COND_IF' => 1, 'AC_CANONICAL_TARGET' => 1, 'AC_SUBST' => 1, 'AC_CONFIG_LIBOBJ_DIR' => 1, 'AC_FC_SRCEXT' => 1, 'AC_CANONICAL_HOST' => 1, 'AC_PROG_LIBTOOL' => 1, 'AM_INIT_AUTOMAKE' => 1, 'AM_PATH_GUILE' => 1, 'AC_CONFIG_SUBDIRS' => 1, 'AM_AUTOMAKE_VERSION' => 1, 'LT_CONFIG_LTDL_DIR' => 1, 'AC_REQUIRE_AUX_FILE' => 1, 'AC_CONFIG_LINKS' => 1, 'm4_sinclude' => 1, 'LT_SUPPORTED_TAG' => 1, 'AM_MAINTAINER_MODE' => 1, 'AM_NLS' => 1, 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, 'AM_MAKEFILE_INCLUDE' => 1, '_m4_warn' => 1, 'AM_PROG_CXX_C_O' => 1, '_AM_COND_ENDIF' => 1, '_AM_MAKEFILE_INCLUDE' => 1, 'AM_ENABLE_MULTILIB' => 1, 'AM_SILENT_RULES' => 1, 'AM_PROG_MOC' => 1, 'AC_CONFIG_FILES' => 1, 'LT_INIT' => 1, 'include' => 1, 'AM_PROG_AR' => 1, 'AM_GNU_GETTEXT' => 1, 'AC_LIBSOURCE' => 1, 'AM_PROG_FC_C_O' => 1, 'AC_CANONICAL_BUILD' => 1, 'AC_FC_FREEFORM' => 1, 'AH_OUTPUT' => 1, '_AM_SUBST_NOTMAKE' => 1, 'AC_CONFIG_AUX_DIR' => 1, 'sinclude' => 1, 'AM_PROG_CC_C_O' => 1, 'm4_pattern_allow' => 1, 'AM_XGETTEXT_OPTION' => 1, 'AC_CANONICAL_SYSTEM' => 1, 'AM_CONDITIONAL' => 1, 'AC_CONFIG_HEADERS' => 1, 'AC_DEFINE_TRACE_LITERAL' => 1, 'AM_POT_TOOLS' => 1, 'm4_include' => 1, '_AM_COND_ELSE' => 1, 'AC_SUBST_TRACE' => 1 } ], 'Autom4te::Request' ) ); rsnapshot-1.4.2/autom4te.cache/output.00000664000175000017500000036226412632661202017405 0ustar travistravis@%:@! /bin/sh @%:@ Guess values for system-dependent variables and create Makefiles. @%:@ Generated by GNU Autoconf 2.68 for rsnapshot 1.4.2. @%:@ @%:@ Report bugs to . @%:@ @%:@ @%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software @%:@ Foundation, Inc. @%:@ @%:@ @%:@ This configure script is free software; the Free Software Foundation @%:@ gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in @%:@( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in @%:@ (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: rsnapshot-discuss@lists.sourceforge.net about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in @%:@( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIB@&t@OBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='rsnapshot' PACKAGE_TARNAME='rsnapshot' PACKAGE_VERSION='1.4.2' PACKAGE_STRING='rsnapshot 1.4.2' PACKAGE_BUGREPORT='rsnapshot-discuss@lists.sourceforge.net' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIB@&t@OBJS TEST_SSH_USER CMD_DU TEST_DU DU CMD_LOGGER TEST_LOGGER LOGGER CMD_UMOUNT UMOUNT CMD_MOUNT MOUNT CMD_LVREMOVE LVREMOVE CMD_LVCREATE LVCREATE CMD_SSH TEST_SSH SSH CMD_RM TEST_RM RM CMD_CP CP TEST_CP RSYNC CMD_RSYNC PERL TEMP SNAP TEST CWD am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_perl with_rsync with_cp with_rm with_ssh with_logger with_du with_test_ssh_user ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures rsnapshot 1.4.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX @<:@@S|@ac_default_prefix@:>@ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX @<:@PREFIX@:>@ By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root @<:@DATAROOTDIR/doc/rsnapshot@:>@ --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of rsnapshot 1.4.2:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-perl=PATH Specify the path to perl --with-rsync=PATH Specify the path to rsync --with-cp=PATH Specify the path to cp --with-rm=PATH Specify the path to rm --with-ssh=PATH Specify the path to ssh --with-logger=PATH Specify the path to logger --with-du=PATH Specify the path to du --with-test-ssh-user=USER Specify the path to rsync Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF rsnapshot configure 1.4.2 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by rsnapshot $as_me 1.4.2, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in @%:@(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in @%:@(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='rsnapshot' VERSION='1.4.2' cat >>confdefs.h <<_ACEOF @%:@define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF @%:@define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_config_files="$ac_config_files Makefile" CWD=`eval echo \`pwd\`` CWD="$CWD/" TEST="$CWD/t/" SNAP="$CWD/t/support/snapshots" TEMP="$CWD/t/support/files/template" @%:@ Check whether --with-perl was given. if test "${with_perl+set}" = set; then : withval=$with_perl; if test "x$withval" != "xno"; then if test -x "$withval"; then PERL=$withval else as_fn_error $? "perl not found" "$LINENO" 5 fi else as_fn_error $? "perl is required" "$LINENO" 5 fi fi if test "$PERL" = ""; then # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no" ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$PERL" = "no"; then as_fn_error $? "perl is required" "$LINENO" 5 fi @%:@ Check whether --with-rsync was given. if test "${with_rsync+set}" = set; then : withval=$with_rsync; if test "x$withval" != "xno"; then if test -x "$withval"; then RSYNC=$withval CMD_RSYNC="cmd_rsync $RSYNC" else as_fn_error $? "rsync not found" "$LINENO" 5 fi else as_fn_error $? "rsync is required" "$LINENO" 5 fi fi if test "$RSYNC" = ""; then # Extract the first word of "rsync", so it can be a program name with args. set dummy rsync; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RSYNC+:} false; then : $as_echo_n "(cached) " >&6 else case $RSYNC in [\\/]* | ?:[\\/]*) ac_cv_path_RSYNC="$RSYNC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RSYNC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_RSYNC" && ac_cv_path_RSYNC="no" ;; esac fi RSYNC=$ac_cv_path_RSYNC if test -n "$RSYNC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RSYNC" >&5 $as_echo "$RSYNC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi RSYNC="$RSYNC" CMD_RSYNC="cmd_rsync $RSYNC" fi if test "$RSYNC" = "no"; then as_fn_error $? "rsync is required" "$LINENO" 5 fi @%:@ Check whether --with-cp was given. if test "${with_cp+set}" = set; then : withval=$with_cp; if test "x$withval" != "xno"; then if test -x "$withval"; then CP=$withval else as_fn_error $? "cp not found" "$LINENO" 5 fi else CP=no fi fi TEST_CP="$CP" if test "$CP" != "no"; then # Extract the first word of "cp", so it can be a program name with args. set dummy cp; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CP+:} false; then : $as_echo_n "(cached) " >&6 else case $CP in [\\/]* | ?:[\\/]*) ac_cv_path_CP="$CP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_CP" && ac_cv_path_CP="no" ;; esac fi CP=$ac_cv_path_CP if test -n "$CP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CP" >&5 $as_echo "$CP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$CP" = "no"; then CP=/bin/cp fi CMD_CP="cmd_cp $CP" @%:@ Check whether --with-rm was given. if test "${with_rm+set}" = set; then : withval=$with_rm; if test "x$withval" != "xno"; then if test -x "$withval"; then RM=$withval else as_fn_error $? "rm not found" "$LINENO" 5 fi else RM=no fi fi if test "$RM" != "no"; then # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RM+:} false; then : $as_echo_n "(cached) " >&6 else case $RM in [\\/]* | ?:[\\/]*) ac_cv_path_RM="$RM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_RM" && ac_cv_path_RM="no" ;; esac fi RM=$ac_cv_path_RM if test -n "$RM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 $as_echo "$RM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_RM="$RM" if test "$RM" = "no"; then RM=/bin/rm fi CMD_RM="cmd_rm $RM" @%:@ Check whether --with-ssh was given. if test "${with_ssh+set}" = set; then : withval=$with_ssh; if test "x$withval" != "xno"; then if test -x "$withval"; then SSH=$withval else as_fn_error $? "ssh not found" "$LINENO" 5 fi else SSH=no fi fi if test "$SSH" != "no"; then # Extract the first word of "ssh", so it can be a program name with args. set dummy ssh; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SSH+:} false; then : $as_echo_n "(cached) " >&6 else case $SSH in [\\/]* | ?:[\\/]*) ac_cv_path_SSH="$SSH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SSH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SSH" && ac_cv_path_SSH="no" ;; esac fi SSH=$ac_cv_path_SSH if test -n "$SSH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SSH" >&5 $as_echo "$SSH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_SSH="$SSH" if test "$SSH" = "no"; then SSH=/path/to/ssh fi CMD_SSH="cmd_ssh $SSH" # Extract the first word of "lvcreate", so it can be a program name with args. set dummy lvcreate; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LVCREATE+:} false; then : $as_echo_n "(cached) " >&6 else case $LVCREATE in [\\/]* | ?:[\\/]*) ac_cv_path_LVCREATE="$LVCREATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LVCREATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LVCREATE" && ac_cv_path_LVCREATE="no" ;; esac fi LVCREATE=$ac_cv_path_LVCREATE if test -n "$LVCREATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LVCREATE" >&5 $as_echo "$LVCREATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$LVCREATE" = "no"; then LVCREATE=/path/to/lvcreate fi CMD_LVCREATE="$LVCREATE" # Extract the first word of "lvremove", so it can be a program name with args. set dummy lvremove; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LVREMOVE+:} false; then : $as_echo_n "(cached) " >&6 else case $LVREMOVE in [\\/]* | ?:[\\/]*) ac_cv_path_LVREMOVE="$LVREMOVE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LVREMOVE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LVREMOVE" && ac_cv_path_LVREMOVE="no" ;; esac fi LVREMOVE=$ac_cv_path_LVREMOVE if test -n "$LVREMOVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LVREMOVE" >&5 $as_echo "$LVREMOVE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$LVREMOVE" = "no"; then LVREMOVE=/path/to/lvremove fi CMD_LVREMOVE="$LVREMOVE" # Extract the first word of "mount", so it can be a program name with args. set dummy mount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MOUNT+:} false; then : $as_echo_n "(cached) " >&6 else case $MOUNT in [\\/]* | ?:[\\/]*) ac_cv_path_MOUNT="$MOUNT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MOUNT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MOUNT" && ac_cv_path_MOUNT="no" ;; esac fi MOUNT=$ac_cv_path_MOUNT if test -n "$MOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOUNT" >&5 $as_echo "$MOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MOUNT" = "no"; then MOUNT=/path/to/mount fi CMD_MOUNT="$MOUNT" # Extract the first word of "umount", so it can be a program name with args. set dummy umount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_UMOUNT+:} false; then : $as_echo_n "(cached) " >&6 else case $UMOUNT in [\\/]* | ?:[\\/]*) ac_cv_path_UMOUNT="$UMOUNT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_UMOUNT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_UMOUNT" && ac_cv_path_UMOUNT="no" ;; esac fi UMOUNT=$ac_cv_path_UMOUNT if test -n "$UMOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UMOUNT" >&5 $as_echo "$UMOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$UMOUNT" = "no"; then UMOUNT=/path/to/umount fi CMD_UMOUNT="$UMOUNT" @%:@ Check whether --with-logger was given. if test "${with_logger+set}" = set; then : withval=$with_logger; if test "x$withval" != "xno"; then if test -x "$withval"; then LOGGER=$withval else as_fn_error $? "logger not found" "$LINENO" 5 fi else LOGGER=no fi fi if test "$LOGGER" != "no"; then # Extract the first word of "logger", so it can be a program name with args. set dummy logger; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LOGGER+:} false; then : $as_echo_n "(cached) " >&6 else case $LOGGER in [\\/]* | ?:[\\/]*) ac_cv_path_LOGGER="$LOGGER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LOGGER="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LOGGER" && ac_cv_path_LOGGER="no" ;; esac fi LOGGER=$ac_cv_path_LOGGER if test -n "$LOGGER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LOGGER" >&5 $as_echo "$LOGGER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_LOGGER="$LOGGER" if test "$LOGGER" = "no"; then LOGGER=/path/to/logger fi CMD_LOGGER="cmd_logger $LOGGER" @%:@ Check whether --with-du was given. if test "${with_du+set}" = set; then : withval=$with_du; if test "x$withval" != "xno"; then if test -x "$withval"; then DU=$withval else as_fn_error $? "du not found" "$LINENO" 5 fi else DU=no fi fi if test "$DU" != "no"; then # Extract the first word of "du", so it can be a program name with args. set dummy du; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DU+:} false; then : $as_echo_n "(cached) " >&6 else case $DU in [\\/]* | ?:[\\/]*) ac_cv_path_DU="$DU" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DU="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_DU" && ac_cv_path_DU="no" ;; esac fi DU=$ac_cv_path_DU if test -n "$DU"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DU" >&5 $as_echo "$DU" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_DU="$DU" if test "$DU" = "no"; then DU=/path/to/du fi CMD_DU="cmd_du $DU" @%:@ Check whether --with-test-ssh-user was given. if test "${with_test_ssh_user+set}" = set; then : withval=$with_test_ssh_user; if test "x$withval" != "xno"; then TEST_SSH_USER="$withval" TEST_SSH_USER="$TEST_SSH_USER" fi fi if test "$TEST_SSH_USER" = ""; then TEST_SSH_USER="$USER" fi # replace perl paths ac_config_files="$ac_config_files rsnapshot:rsnapshot-program.pl" ac_config_files="$ac_config_files rsnapshot-diff:rsnapshot-diff.pl" ac_config_files="$ac_config_files rsnapshot.conf.default:rsnapshot.conf.default.in" # this part is autogenerated by autogen.sh ac_config_files="$ac_config_files t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t" ac_config_files="$ac_config_files t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf" ac_config_files="$ac_config_files t/relative_delete_bugfix/relative_delete_bugfix.t" ac_config_files="$ac_config_files t/relative_delete_bugfix/conf/relative_delete_bugfix.conf" ac_config_files="$ac_config_files t/snapshot_root_with_space/snapshot_root_with_space.t" ac_config_files="$ac_config_files t/snapshot_root_with_space/conf/snapshot_root_with_space.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/cmd-post_pre-exec.t" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-false-post-true.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-true-post-true.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-true-post-false.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-false-post-false.conf" ac_config_files="$ac_config_files t/SysWrap.pm" ac_config_files="$ac_config_files t/backup_exec/conf/backup_exec_fail.conf" ac_config_files="$ac_config_files t/backup_exec/conf/backup_exec.conf" ac_config_files="$ac_config_files t/backup_exec/backup_exec.t" ac_config_files="$ac_config_files t/rsync-exitcode/rsync-exitcode.t" ac_config_files="$ac_config_files t/rsync-exitcode/conf/rsync-exitcode-good.conf" ac_config_files="$ac_config_files t/rsync-exitcode/conf/rsync-exitcode-bad.conf" ac_config_files="$ac_config_files t/configtest/configtest.t" ac_config_files="$ac_config_files t/configtest/conf/configtest.conf" ac_config_files="$ac_config_files t/rsync/rsync.t" ac_config_files="$ac_config_files t/rsync/conf/rsync.conf" ac_config_files="$ac_config_files t/gnu_cp/gnu_cp.t" ac_config_files="$ac_config_files t/gnu_cp/conf/gnu_cp.conf" ac_config_files="$ac_config_files t/ssh_args/conf/ssh_args.conf" ac_config_files="$ac_config_files t/ssh_args/ssh_args.t" # this part had been autogenerated by autogen.sh cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIB@&t@OBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in @%:@( *posix*) : set -o posix ;; @%:@( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in @%:@( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in @%:@(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH @%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] @%:@ ---------------------------------------- @%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are @%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the @%:@ script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } @%:@ as_fn_error @%:@ as_fn_set_status STATUS @%:@ ----------------------- @%:@ Set @S|@? to STATUS, without forking. as_fn_set_status () { return $1 } @%:@ as_fn_set_status @%:@ as_fn_exit STATUS @%:@ ----------------- @%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } @%:@ as_fn_exit @%:@ as_fn_unset VAR @%:@ --------------- @%:@ Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset @%:@ as_fn_append VAR VALUE @%:@ ---------------------- @%:@ Append the text in VALUE to the end of the definition contained in VAR. Take @%:@ advantage of any shell optimizations that allow amortized linear growth over @%:@ repeated appends, instead of the typical quadratic growth present in naive @%:@ implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append @%:@ as_fn_arith ARG... @%:@ ------------------ @%:@ Perform arithmetic evaluation on the ARGs, and store the result in the @%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments @%:@ must be portable across @S|@(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in @%:@((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @%:@ as_fn_mkdir_p @%:@ ------------- @%:@ Create "@S|@as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } @%:@ as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in @%:@( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by rsnapshot $as_me 1.4.2, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ rsnapshot config.status 1.4.2 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX @%:@@%:@ Running $as_me. @%:@@%:@ _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "rsnapshot") CONFIG_FILES="$CONFIG_FILES rsnapshot:rsnapshot-program.pl" ;; "rsnapshot-diff") CONFIG_FILES="$CONFIG_FILES rsnapshot-diff:rsnapshot-diff.pl" ;; "rsnapshot.conf.default") CONFIG_FILES="$CONFIG_FILES rsnapshot.conf.default:rsnapshot.conf.default.in" ;; "t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t") CONFIG_FILES="$CONFIG_FILES t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t" ;; "t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf") CONFIG_FILES="$CONFIG_FILES t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf" ;; "t/relative_delete_bugfix/relative_delete_bugfix.t") CONFIG_FILES="$CONFIG_FILES t/relative_delete_bugfix/relative_delete_bugfix.t" ;; "t/relative_delete_bugfix/conf/relative_delete_bugfix.conf") CONFIG_FILES="$CONFIG_FILES t/relative_delete_bugfix/conf/relative_delete_bugfix.conf" ;; "t/snapshot_root_with_space/snapshot_root_with_space.t") CONFIG_FILES="$CONFIG_FILES t/snapshot_root_with_space/snapshot_root_with_space.t" ;; "t/snapshot_root_with_space/conf/snapshot_root_with_space.conf") CONFIG_FILES="$CONFIG_FILES t/snapshot_root_with_space/conf/snapshot_root_with_space.conf" ;; "t/cmd-post_pre-exec/cmd-post_pre-exec.t") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/cmd-post_pre-exec.t" ;; "t/cmd-post_pre-exec/conf/pre-false-post-true.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-false-post-true.conf" ;; "t/cmd-post_pre-exec/conf/pre-true-post-true.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-true-post-true.conf" ;; "t/cmd-post_pre-exec/conf/pre-true-post-false.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-true-post-false.conf" ;; "t/cmd-post_pre-exec/conf/pre-false-post-false.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-false-post-false.conf" ;; "t/SysWrap.pm") CONFIG_FILES="$CONFIG_FILES t/SysWrap.pm" ;; "t/backup_exec/conf/backup_exec_fail.conf") CONFIG_FILES="$CONFIG_FILES t/backup_exec/conf/backup_exec_fail.conf" ;; "t/backup_exec/conf/backup_exec.conf") CONFIG_FILES="$CONFIG_FILES t/backup_exec/conf/backup_exec.conf" ;; "t/backup_exec/backup_exec.t") CONFIG_FILES="$CONFIG_FILES t/backup_exec/backup_exec.t" ;; "t/rsync-exitcode/rsync-exitcode.t") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/rsync-exitcode.t" ;; "t/rsync-exitcode/conf/rsync-exitcode-good.conf") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/conf/rsync-exitcode-good.conf" ;; "t/rsync-exitcode/conf/rsync-exitcode-bad.conf") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/conf/rsync-exitcode-bad.conf" ;; "t/configtest/configtest.t") CONFIG_FILES="$CONFIG_FILES t/configtest/configtest.t" ;; "t/configtest/conf/configtest.conf") CONFIG_FILES="$CONFIG_FILES t/configtest/conf/configtest.conf" ;; "t/rsync/rsync.t") CONFIG_FILES="$CONFIG_FILES t/rsync/rsync.t" ;; "t/rsync/conf/rsync.conf") CONFIG_FILES="$CONFIG_FILES t/rsync/conf/rsync.conf" ;; "t/gnu_cp/gnu_cp.t") CONFIG_FILES="$CONFIG_FILES t/gnu_cp/gnu_cp.t" ;; "t/gnu_cp/conf/gnu_cp.conf") CONFIG_FILES="$CONFIG_FILES t/gnu_cp/conf/gnu_cp.conf" ;; "t/ssh_args/conf/ssh_args.conf") CONFIG_FILES="$CONFIG_FILES t/ssh_args/conf/ssh_args.conf" ;; "t/ssh_args/ssh_args.t") CONFIG_FILES="$CONFIG_FILES t/ssh_args/ssh_args.t" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo "Now type \"make test\" to run the regression test suite." echo "Then type \"make install\" to install the program." echo "" if test ! -e "$RSNAPSHOT_SYSCONFDIR/rsnapshot.conf"; then echo "After rsnapshot is installed, don't forget to copy" echo "$RSNAPSHOT_SYSCONFDIR/rsnapshot.conf.default to $RSNAPSHOT_SYSCONFDIR/rsnapshot.conf" echo "" fi rsnapshot-1.4.2/configure0000775000175000017500000036133312632661202015063 0ustar travistravis#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for rsnapshot 1.4.2. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: rsnapshot-discuss@lists.sourceforge.net about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='rsnapshot' PACKAGE_TARNAME='rsnapshot' PACKAGE_VERSION='1.4.2' PACKAGE_STRING='rsnapshot 1.4.2' PACKAGE_BUGREPORT='rsnapshot-discuss@lists.sourceforge.net' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS TEST_SSH_USER CMD_DU TEST_DU DU CMD_LOGGER TEST_LOGGER LOGGER CMD_UMOUNT UMOUNT CMD_MOUNT MOUNT CMD_LVREMOVE LVREMOVE CMD_LVCREATE LVCREATE CMD_SSH TEST_SSH SSH CMD_RM TEST_RM RM CMD_CP CP TEST_CP RSYNC CMD_RSYNC PERL TEMP SNAP TEST CWD am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_perl with_rsync with_cp with_rm with_ssh with_logger with_du with_test_ssh_user ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures rsnapshot 1.4.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/rsnapshot] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of rsnapshot 1.4.2:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-perl=PATH Specify the path to perl --with-rsync=PATH Specify the path to rsync --with-cp=PATH Specify the path to cp --with-rm=PATH Specify the path to rm --with-ssh=PATH Specify the path to ssh --with-logger=PATH Specify the path to logger --with-du=PATH Specify the path to du --with-test-ssh-user=USER Specify the path to rsync Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF rsnapshot configure 1.4.2 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by rsnapshot $as_me 1.4.2, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='rsnapshot' VERSION='1.4.2' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_config_files="$ac_config_files Makefile" CWD=`eval echo \`pwd\`` CWD="$CWD/" TEST="$CWD/t/" SNAP="$CWD/t/support/snapshots" TEMP="$CWD/t/support/files/template" # Check whether --with-perl was given. if test "${with_perl+set}" = set; then : withval=$with_perl; if test "x$withval" != "xno"; then if test -x "$withval"; then PERL=$withval else as_fn_error $? "perl not found" "$LINENO" 5 fi else as_fn_error $? "perl is required" "$LINENO" 5 fi fi if test "$PERL" = ""; then # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no" ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$PERL" = "no"; then as_fn_error $? "perl is required" "$LINENO" 5 fi # Check whether --with-rsync was given. if test "${with_rsync+set}" = set; then : withval=$with_rsync; if test "x$withval" != "xno"; then if test -x "$withval"; then RSYNC=$withval CMD_RSYNC="cmd_rsync $RSYNC" else as_fn_error $? "rsync not found" "$LINENO" 5 fi else as_fn_error $? "rsync is required" "$LINENO" 5 fi fi if test "$RSYNC" = ""; then # Extract the first word of "rsync", so it can be a program name with args. set dummy rsync; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RSYNC+:} false; then : $as_echo_n "(cached) " >&6 else case $RSYNC in [\\/]* | ?:[\\/]*) ac_cv_path_RSYNC="$RSYNC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RSYNC="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_RSYNC" && ac_cv_path_RSYNC="no" ;; esac fi RSYNC=$ac_cv_path_RSYNC if test -n "$RSYNC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RSYNC" >&5 $as_echo "$RSYNC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi RSYNC="$RSYNC" CMD_RSYNC="cmd_rsync $RSYNC" fi if test "$RSYNC" = "no"; then as_fn_error $? "rsync is required" "$LINENO" 5 fi # Check whether --with-cp was given. if test "${with_cp+set}" = set; then : withval=$with_cp; if test "x$withval" != "xno"; then if test -x "$withval"; then CP=$withval else as_fn_error $? "cp not found" "$LINENO" 5 fi else CP=no fi fi TEST_CP="$CP" if test "$CP" != "no"; then # Extract the first word of "cp", so it can be a program name with args. set dummy cp; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_CP+:} false; then : $as_echo_n "(cached) " >&6 else case $CP in [\\/]* | ?:[\\/]*) ac_cv_path_CP="$CP" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_CP="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_CP" && ac_cv_path_CP="no" ;; esac fi CP=$ac_cv_path_CP if test -n "$CP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CP" >&5 $as_echo "$CP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$CP" = "no"; then CP=/bin/cp fi CMD_CP="cmd_cp $CP" # Check whether --with-rm was given. if test "${with_rm+set}" = set; then : withval=$with_rm; if test "x$withval" != "xno"; then if test -x "$withval"; then RM=$withval else as_fn_error $? "rm not found" "$LINENO" 5 fi else RM=no fi fi if test "$RM" != "no"; then # Extract the first word of "rm", so it can be a program name with args. set dummy rm; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_RM+:} false; then : $as_echo_n "(cached) " >&6 else case $RM in [\\/]* | ?:[\\/]*) ac_cv_path_RM="$RM" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_RM" && ac_cv_path_RM="no" ;; esac fi RM=$ac_cv_path_RM if test -n "$RM"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 $as_echo "$RM" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_RM="$RM" if test "$RM" = "no"; then RM=/bin/rm fi CMD_RM="cmd_rm $RM" # Check whether --with-ssh was given. if test "${with_ssh+set}" = set; then : withval=$with_ssh; if test "x$withval" != "xno"; then if test -x "$withval"; then SSH=$withval else as_fn_error $? "ssh not found" "$LINENO" 5 fi else SSH=no fi fi if test "$SSH" != "no"; then # Extract the first word of "ssh", so it can be a program name with args. set dummy ssh; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_SSH+:} false; then : $as_echo_n "(cached) " >&6 else case $SSH in [\\/]* | ?:[\\/]*) ac_cv_path_SSH="$SSH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_SSH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_SSH" && ac_cv_path_SSH="no" ;; esac fi SSH=$ac_cv_path_SSH if test -n "$SSH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SSH" >&5 $as_echo "$SSH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_SSH="$SSH" if test "$SSH" = "no"; then SSH=/path/to/ssh fi CMD_SSH="cmd_ssh $SSH" # Extract the first word of "lvcreate", so it can be a program name with args. set dummy lvcreate; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LVCREATE+:} false; then : $as_echo_n "(cached) " >&6 else case $LVCREATE in [\\/]* | ?:[\\/]*) ac_cv_path_LVCREATE="$LVCREATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LVCREATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LVCREATE" && ac_cv_path_LVCREATE="no" ;; esac fi LVCREATE=$ac_cv_path_LVCREATE if test -n "$LVCREATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LVCREATE" >&5 $as_echo "$LVCREATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$LVCREATE" = "no"; then LVCREATE=/path/to/lvcreate fi CMD_LVCREATE="$LVCREATE" # Extract the first word of "lvremove", so it can be a program name with args. set dummy lvremove; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LVREMOVE+:} false; then : $as_echo_n "(cached) " >&6 else case $LVREMOVE in [\\/]* | ?:[\\/]*) ac_cv_path_LVREMOVE="$LVREMOVE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LVREMOVE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LVREMOVE" && ac_cv_path_LVREMOVE="no" ;; esac fi LVREMOVE=$ac_cv_path_LVREMOVE if test -n "$LVREMOVE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LVREMOVE" >&5 $as_echo "$LVREMOVE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$LVREMOVE" = "no"; then LVREMOVE=/path/to/lvremove fi CMD_LVREMOVE="$LVREMOVE" # Extract the first word of "mount", so it can be a program name with args. set dummy mount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MOUNT+:} false; then : $as_echo_n "(cached) " >&6 else case $MOUNT in [\\/]* | ?:[\\/]*) ac_cv_path_MOUNT="$MOUNT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MOUNT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_MOUNT" && ac_cv_path_MOUNT="no" ;; esac fi MOUNT=$ac_cv_path_MOUNT if test -n "$MOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOUNT" >&5 $as_echo "$MOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MOUNT" = "no"; then MOUNT=/path/to/mount fi CMD_MOUNT="$MOUNT" # Extract the first word of "umount", so it can be a program name with args. set dummy umount; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_UMOUNT+:} false; then : $as_echo_n "(cached) " >&6 else case $UMOUNT in [\\/]* | ?:[\\/]*) ac_cv_path_UMOUNT="$UMOUNT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_UMOUNT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_UMOUNT" && ac_cv_path_UMOUNT="no" ;; esac fi UMOUNT=$ac_cv_path_UMOUNT if test -n "$UMOUNT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UMOUNT" >&5 $as_echo "$UMOUNT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$UMOUNT" = "no"; then UMOUNT=/path/to/umount fi CMD_UMOUNT="$UMOUNT" # Check whether --with-logger was given. if test "${with_logger+set}" = set; then : withval=$with_logger; if test "x$withval" != "xno"; then if test -x "$withval"; then LOGGER=$withval else as_fn_error $? "logger not found" "$LINENO" 5 fi else LOGGER=no fi fi if test "$LOGGER" != "no"; then # Extract the first word of "logger", so it can be a program name with args. set dummy logger; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_LOGGER+:} false; then : $as_echo_n "(cached) " >&6 else case $LOGGER in [\\/]* | ?:[\\/]*) ac_cv_path_LOGGER="$LOGGER" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_LOGGER="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_LOGGER" && ac_cv_path_LOGGER="no" ;; esac fi LOGGER=$ac_cv_path_LOGGER if test -n "$LOGGER"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LOGGER" >&5 $as_echo "$LOGGER" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_LOGGER="$LOGGER" if test "$LOGGER" = "no"; then LOGGER=/path/to/logger fi CMD_LOGGER="cmd_logger $LOGGER" # Check whether --with-du was given. if test "${with_du+set}" = set; then : withval=$with_du; if test "x$withval" != "xno"; then if test -x "$withval"; then DU=$withval else as_fn_error $? "du not found" "$LINENO" 5 fi else DU=no fi fi if test "$DU" != "no"; then # Extract the first word of "du", so it can be a program name with args. set dummy du; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_DU+:} false; then : $as_echo_n "(cached) " >&6 else case $DU in [\\/]* | ?:[\\/]*) ac_cv_path_DU="$DU" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_DU="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_DU" && ac_cv_path_DU="no" ;; esac fi DU=$ac_cv_path_DU if test -n "$DU"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DU" >&5 $as_echo "$DU" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi TEST_DU="$DU" if test "$DU" = "no"; then DU=/path/to/du fi CMD_DU="cmd_du $DU" # Check whether --with-test-ssh-user was given. if test "${with_test_ssh_user+set}" = set; then : withval=$with_test_ssh_user; if test "x$withval" != "xno"; then TEST_SSH_USER="$withval" TEST_SSH_USER="$TEST_SSH_USER" fi fi if test "$TEST_SSH_USER" = ""; then TEST_SSH_USER="$USER" fi # replace perl paths ac_config_files="$ac_config_files rsnapshot:rsnapshot-program.pl" ac_config_files="$ac_config_files rsnapshot-diff:rsnapshot-diff.pl" ac_config_files="$ac_config_files rsnapshot.conf.default:rsnapshot.conf.default.in" # this part is autogenerated by autogen.sh ac_config_files="$ac_config_files t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t" ac_config_files="$ac_config_files t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf" ac_config_files="$ac_config_files t/relative_delete_bugfix/relative_delete_bugfix.t" ac_config_files="$ac_config_files t/relative_delete_bugfix/conf/relative_delete_bugfix.conf" ac_config_files="$ac_config_files t/snapshot_root_with_space/snapshot_root_with_space.t" ac_config_files="$ac_config_files t/snapshot_root_with_space/conf/snapshot_root_with_space.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/cmd-post_pre-exec.t" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-false-post-true.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-true-post-true.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-true-post-false.conf" ac_config_files="$ac_config_files t/cmd-post_pre-exec/conf/pre-false-post-false.conf" ac_config_files="$ac_config_files t/SysWrap.pm" ac_config_files="$ac_config_files t/backup_exec/conf/backup_exec_fail.conf" ac_config_files="$ac_config_files t/backup_exec/conf/backup_exec.conf" ac_config_files="$ac_config_files t/backup_exec/backup_exec.t" ac_config_files="$ac_config_files t/rsync-exitcode/rsync-exitcode.t" ac_config_files="$ac_config_files t/rsync-exitcode/conf/rsync-exitcode-good.conf" ac_config_files="$ac_config_files t/rsync-exitcode/conf/rsync-exitcode-bad.conf" ac_config_files="$ac_config_files t/configtest/configtest.t" ac_config_files="$ac_config_files t/configtest/conf/configtest.conf" ac_config_files="$ac_config_files t/rsync/rsync.t" ac_config_files="$ac_config_files t/rsync/conf/rsync.conf" ac_config_files="$ac_config_files t/gnu_cp/gnu_cp.t" ac_config_files="$ac_config_files t/gnu_cp/conf/gnu_cp.conf" ac_config_files="$ac_config_files t/ssh_args/conf/ssh_args.conf" ac_config_files="$ac_config_files t/ssh_args/ssh_args.t" # this part had been autogenerated by autogen.sh cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by rsnapshot $as_me 1.4.2, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ rsnapshot config.status 1.4.2 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "rsnapshot") CONFIG_FILES="$CONFIG_FILES rsnapshot:rsnapshot-program.pl" ;; "rsnapshot-diff") CONFIG_FILES="$CONFIG_FILES rsnapshot-diff:rsnapshot-diff.pl" ;; "rsnapshot.conf.default") CONFIG_FILES="$CONFIG_FILES rsnapshot.conf.default:rsnapshot.conf.default.in" ;; "t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t") CONFIG_FILES="$CONFIG_FILES t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t" ;; "t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf") CONFIG_FILES="$CONFIG_FILES t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf" ;; "t/relative_delete_bugfix/relative_delete_bugfix.t") CONFIG_FILES="$CONFIG_FILES t/relative_delete_bugfix/relative_delete_bugfix.t" ;; "t/relative_delete_bugfix/conf/relative_delete_bugfix.conf") CONFIG_FILES="$CONFIG_FILES t/relative_delete_bugfix/conf/relative_delete_bugfix.conf" ;; "t/snapshot_root_with_space/snapshot_root_with_space.t") CONFIG_FILES="$CONFIG_FILES t/snapshot_root_with_space/snapshot_root_with_space.t" ;; "t/snapshot_root_with_space/conf/snapshot_root_with_space.conf") CONFIG_FILES="$CONFIG_FILES t/snapshot_root_with_space/conf/snapshot_root_with_space.conf" ;; "t/cmd-post_pre-exec/cmd-post_pre-exec.t") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/cmd-post_pre-exec.t" ;; "t/cmd-post_pre-exec/conf/pre-false-post-true.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-false-post-true.conf" ;; "t/cmd-post_pre-exec/conf/pre-true-post-true.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-true-post-true.conf" ;; "t/cmd-post_pre-exec/conf/pre-true-post-false.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-true-post-false.conf" ;; "t/cmd-post_pre-exec/conf/pre-false-post-false.conf") CONFIG_FILES="$CONFIG_FILES t/cmd-post_pre-exec/conf/pre-false-post-false.conf" ;; "t/SysWrap.pm") CONFIG_FILES="$CONFIG_FILES t/SysWrap.pm" ;; "t/backup_exec/conf/backup_exec_fail.conf") CONFIG_FILES="$CONFIG_FILES t/backup_exec/conf/backup_exec_fail.conf" ;; "t/backup_exec/conf/backup_exec.conf") CONFIG_FILES="$CONFIG_FILES t/backup_exec/conf/backup_exec.conf" ;; "t/backup_exec/backup_exec.t") CONFIG_FILES="$CONFIG_FILES t/backup_exec/backup_exec.t" ;; "t/rsync-exitcode/rsync-exitcode.t") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/rsync-exitcode.t" ;; "t/rsync-exitcode/conf/rsync-exitcode-good.conf") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/conf/rsync-exitcode-good.conf" ;; "t/rsync-exitcode/conf/rsync-exitcode-bad.conf") CONFIG_FILES="$CONFIG_FILES t/rsync-exitcode/conf/rsync-exitcode-bad.conf" ;; "t/configtest/configtest.t") CONFIG_FILES="$CONFIG_FILES t/configtest/configtest.t" ;; "t/configtest/conf/configtest.conf") CONFIG_FILES="$CONFIG_FILES t/configtest/conf/configtest.conf" ;; "t/rsync/rsync.t") CONFIG_FILES="$CONFIG_FILES t/rsync/rsync.t" ;; "t/rsync/conf/rsync.conf") CONFIG_FILES="$CONFIG_FILES t/rsync/conf/rsync.conf" ;; "t/gnu_cp/gnu_cp.t") CONFIG_FILES="$CONFIG_FILES t/gnu_cp/gnu_cp.t" ;; "t/gnu_cp/conf/gnu_cp.conf") CONFIG_FILES="$CONFIG_FILES t/gnu_cp/conf/gnu_cp.conf" ;; "t/ssh_args/conf/ssh_args.conf") CONFIG_FILES="$CONFIG_FILES t/ssh_args/conf/ssh_args.conf" ;; "t/ssh_args/ssh_args.t") CONFIG_FILES="$CONFIG_FILES t/ssh_args/ssh_args.t" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "" echo "Now type \"make test\" to run the regression test suite." echo "Then type \"make install\" to install the program." echo "" if test ! -e "$RSNAPSHOT_SYSCONFDIR/rsnapshot.conf"; then echo "After rsnapshot is installed, don't forget to copy" echo "$RSNAPSHOT_SYSCONFDIR/rsnapshot.conf.default to $RSNAPSHOT_SYSCONFDIR/rsnapshot.conf" echo "" fi rsnapshot-1.4.2/rsnapshot-diff.pl0000775000175000017500000002110512632661200016427 0ustar travistravis#!@PERL@ -w ############################################################################## # rsnapshot-diff # by David Cantrell # # This program calculates the differences between two directories. It is # designed to work with two different subdirectories under the rsnapshot # snapshot_root. For example: # # rsnapshot-diff /.snapshots/daily.0/ /.snapshots/daily.1/ # # http://www.rsnapshot.org/ ############################################################################## # $Id: rsnapshot-diff.pl,v 1.6 2010/08/10 13:00:15 drhyde Exp $ =head1 NAME rsnapshot-diff - a utility for comparing the disk usage of two snapshots taken by rsnapshot =cut use strict; use constant DEBUG => 0; use Getopt::Std; my $program_name = 'rsnapshot-diff'; my %opts; my $verbose = 0; my $ignore = 0; my $show_size = 0; my $result = getopts('vVhHis', \%opts); # help if ($opts{'h'}) { print qq{ $program_name [-vVHhi] dir1 dir2 $program_name shows the differences between two 'rsnapshot' backups. -h show this help -H also show "human" sizes - MB and GB as well as just bytes -i ignore symlinks, directories, and special files in verbose output -s show the size of each changed file -v be verbose -V be more verbose (mutter about unchanged files and about symlinks) dir1 the first directory to look at dir2 the second directory to look at if you want to look at directories called '-h' or '-v' pass a first parameter of '--'. $program_name always show the changes made starting from the older of the two directories. }; exit; } =head1 SYNOPSIS rsnapshot-diff [-h|vVi] dir1 dir2 =head1 DESCRIPTION rsnapshot-diff is a companion utility for rsnapshot, which traverses two parallel directory structures and calculates the difference between them. By default it is silent apart from displaying summary information at the end, but it can be made more verbose. In the summary, "added" files may very well include files which at first glance also appear at the same place in the older directory structure. However, because the files differ in some respect, they are different files. They have a different inode number. Consequently if you use -v most of its output may appear to be pairs of files with the same name being removed and added. =head1 OPTIONS =over 4 =item -h (help) Displays help information =item -H (human) Display more human-friendly numbers - as well as showing the number of bytes changed, also show MB and GB. =item -i (ignore) If verbosity is turned on, -i suppresses information about symlinks, directories, and special files. =item -s (show size) Show the size of each changed file after the + or - sign. To sort the files by decreasing size, use this option and run the output through "sort -k 2 -rn". =item -v (verbose) Be verbose. This will spit out a list of all changes as they are encountered, apart from symlink, as well as the summary at the end. =item -V (more verbose) Be more verbose - as well as listing changed files, unchanged files and symlinks will be listed too. =item dir1 and dir2 These are the only compulsory parameters, and should be the names of two directories to compare. Their order doesn't matter, rsnapshot-diff will always compare the younger to the older, so files that appear only in the older will be reported as having been removed, and files that appear only in the younger will be reported as having been added. =back =cut # verbose if ($opts{'v'}) { $verbose = 1; } # extra verbose if ($opts{'V'}) { $verbose = 2; } # ignore if ($opts{'i'}) { $ignore = 1; } # size if ($opts{'s'}) { $show_size = 1; } if(!exists($ARGV[1]) || !-d $ARGV[0] || !-d $ARGV[1]) { die("$program_name\nUsage: $program_name [-vVhi] dir1 dir2\nType $program_name -h for details\n"); } my($dirold, $dirnew) = @ARGV; my($addedfiles, $addedspace, $deletedfiles, $deletedspace) = (0, 0, 0, 0); my($addedspace_mb, $addedspace_gb, $deletedspace_mb, $deletedspace_gb) = (0, 0, 0, 0); ($dirold, $dirnew) = ($dirnew, $dirold) if(-M $dirold < -M $dirnew); # remove trailing slahes, if any $dirold =~ s/\/+$//; $dirnew =~ s/\/+$//; print "Comparing $dirold to $dirnew\n"; compare_dirs($dirold, $dirnew); $addedspace_mb = sprintf("%.2f", $addedspace / (1024 * 1024)); $addedspace_gb = sprintf("%.2f", $addedspace_mb / 1024); $deletedspace_mb = sprintf("%.2f", $deletedspace / (1024 * 1024)); $deletedspace_gb = sprintf("%.2f", $deletedspace_mb / 1024); print "Between $dirold and $dirnew:\n"; print " $addedfiles were added, taking $addedspace bytes". ($opts{H} ? " ($addedspace_mb MB, $addedspace_gb GB)" : ''). "\n"; print " $deletedfiles were removed, saving $deletedspace bytes". ($opts{H} ? " ($deletedspace_mb MB, $deletedspace_gb GB)" : ''). "\n"; sub compare_dirs { my($old, $new) = @_; opendir(OLD, $old) || die("Can't open dir $old\n"); opendir(NEW, $new) || die("Can't open dir $new\n"); my %old = map { my $fn = $old.'/'.$_; ($_, (mystat($fn))[1]) } grep { $_ ne '.' && $_ ne '..' } readdir(OLD); my %new = map { my $fn = $new.'/'.$_; ($_, (mystat($fn))[1]) } grep { $_ ne '.' && $_ ne '..' } readdir(NEW); closedir(OLD); closedir(NEW); my @added = grep { !exists($old{$_}) } keys %new; my @deleted = grep { !exists($new{$_}) } keys %old; my @changed = grep { !-d $new.'/'.$_ && exists($old{$_}) && $old{$_} != $new{$_} } keys %new; add(map { $new.'/'.$_ } @added, @changed); remove(map { $old.'/'.$_ } @deleted, @changed); if($verbose == 2) { my %changed = map { ($_, 1) } @changed, @added, @deleted; print "0 $new/$_\n" foreach(grep { !-d "$new/$_" && !exists($changed{$_}) } keys %new); } foreach (grep { !-l $new.'/'.$_ && !-l $old.'/'.$_ && -d $new.'/'.$_ && -d $old.'/'.$_ } keys %new) { print "Comparing subdirs $new/$_ and $old/$_ ...\n" if(DEBUG); compare_dirs($old.'/'.$_, $new.'/'.$_); } } sub add { my @added = @_; print "Adding ".join(', ', @added)."\n" if(DEBUG && @added); foreach(grep { !-d } @added) { $addedfiles++; my $size = (mystat($_))[7]; $addedspace += $size; # if ignore is on, only print files unless ($ignore && (-l || !-f)) { print ''.($show_size ? "+ $size $_" : "+ $_"). (-l $_ ? ' (symlink)' : ''). "\n" if($verbose == 2 || ($verbose == 1 && !-l $_)); } } foreach my $dir (grep { !-l && -d } @added) { opendir(DIR, $dir) || die("Can't open dir $dir\n"); add(map { $dir.'/'.$_ } grep { $_ ne '.' && $_ ne '..' } readdir(DIR)) } } sub remove { my @removed = @_; print "Removing ".join(', ', @removed)."\n" if(DEBUG && @removed); foreach(grep { !-d } @removed) { $deletedfiles++; my $size = (mystat($_))[7]; $deletedspace += $size; # if ignore is on, only print files unless ($ignore && (-l || !-f)) { print ''.($show_size ? "- $size $_" : "- $_"). (-l $_ ? ' (symlink)' : ''). "\n" if($verbose == 2 || ($verbose == 1 && !-l $_)); } } foreach my $dir (grep { !-l && -d } @removed) { opendir(DIR, $dir) || die("Can't open dir $dir\n"); remove(map { $dir.'/'.$_ } grep { $_ ne '.' && $_ ne '..' } readdir(DIR)) } } { my $device; sub mystat { local $_ = shift; my @stat = (-l) ? lstat() : stat(); # on first stat, memorise device $device = $stat[0] unless(defined($device)); die("Can't compare across devices.\n(looking at $_)\n") unless($device == $stat[0] || -p $_); return @stat; } } =head1 SEE ALSO rsnapshot =head1 BUGS Please report bugs (and other comments) to the rsnapshot-discuss mailing list: L =head1 AUTHOR David Cantrell Edavid@cantrell.org.ukE =head1 COPYRIGHT Copyright 2005-2010 David Cantrell =head1 LICENCE This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA =cut rsnapshot-1.4.2/ChangeLog0000664000175000017500000006543612632661200014731 0ustar travistravis------------------------------------------------------------------------------ rsnapshot changelog http://www.rsnapshot.org/ ------------------------------------------------------------------------------ current master ------------------------------------------------------------------------------ - Display warning, when the verbosity is set multiple times (e.g. on command-line and logfile at the same time) - Changed maintainership in all files. - Capture rsync's output right (Github issue 102) VERSION 1.4.0 ------------------------------------------------------------------------------ - Tidy the code with perltidy - Fix --rsh command line option The --rsh option of rsync got errornously quoted (Debian Bug #743310) - Define traps to unmount LVM parts after fail If you use LVM snapshots and rsnapshot fails, rsnapshot will unmount and remove the snapshot, too. - cd to home before executing a command - if($use_lazy_deletes): remove lockfile in any case - Bail on failing cmd_(pre|post)exec If one of those commands fails, rsnapshot will exit with exit code != 0 - Capture output from rsync and print/log if level is >=4 - Print rsnpashot's PID when logging to syslog, instead of the logger's PID. - make script uses pod2man instead of /usr/bin/pod2man - rsnapshot-diff: Fixed removed files reported as addition (+ mark) - Introduction of backup_exec resource for running unix commands interspersed with backup and backup_script jobs. - check for SIGPIPE, mainly in case cron fails when trying to mail (this is probably why rsnapshot dies mysteriously if it outputs when called by cron on a system which does not have mail working). - add test case for -t showing --link-dest when there is only one snapshot - if gnu_cp_al fails, test out a simple cp -al command before suggesting that the cp does not support -al. - When snapshot_root does not exist, check existence of parent directories. - include_conf `command` now strips backticks before execution (bug fix based on suggestion from David Osborn). - Ignore extraneous output from lvremove command. (patch by Tim Connors) - Update current maintainer status in Authors section of man page. (David Cantrell stepped down between 1.3.0 and 1.3.1.) - Remove some old (1.1.x -> 1.2.0) upgrade notices from man page. - Allow linux_lvm_cmd_* in config file to have options also. - Allow `backticks with options` in include_conf. - Fix inaccurate omission of --link-dest in test-mode output - rsnapshot-diff: Add -s option to show size of each file. VERSION 1.3.1 (Aug 31 2008) ------------------------------------------------------------------------------ - Fix help message mixup in lines between -c and -t. - Add more specific error messages for not currently implemented potential per backup point options, like cmd_preexec. - Allow named pipe as logfile - suggested by Patrice Levesque. - Include rsnapshot-copy script written by Matt McCutchen. - Allow `backticks` in include_conf. - Apply fix-sync_first-rollback.diff patch from Matt McCutchen (02 Apr 2008). - Fix bug with link_dest not being used on second and later backups when you have link_dest 1 and sync_first 1. (Ignore $sync_dir_was_present) - Patch from Adam Greenbaum to allow passing of ssh arguments correctly. - David Grant added rsync_numtries to rsnapshot.conf. - Applied Ben Low's Linux LVM patch. - Added stop_on_stale_lockfile, thanks to Henning Moll. - Michael Ashley's fix for filter/space problems on the rsync command line. - Remove trailing whitespace from command names in rsnapshot.conf. - Warn about extra spaces between tab and argument. - Added multi-line config options, thanks to Dieter Bloms. - The 'interval' config option is now called 'retain'. - chdir to avoid an obscure bug in some versions of GNU rm. - Changed use_lazy_deletes option to use _delete.$$ directories. - Added note about -H and hard links to docs for rsync_short_args. - Include rsnapshot-diff.1 in rpm. - Fix bug with rsnapshot sync the first time (when .sync does not exist) trying to copy hourly.0 to .sync, even if hourly.0 doesn't exist. http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=413439 VERSION 1.3.0 (Oct 21 2006) ------------------------------------------------------------------------------ - Add files rsnapreport.pl Upgrading_from_1.1 rsnapshot-HOWTO.en.html to rpm. - fix a bug with removing interval.delete (with use_lazy_deletes). - rsnapshot detects the global ssh_args option being set multiple times, and gives a config error suggesting the per-backup ssh_args instead. - Move Upgrading section of INSTALL to docs/Upgrading_from_1.1. - Incorporate patch from Alan Batie to fix bugs with include_conf. - check for quoting on $rsync_long_args rather than just splitting on space. - Change rsnapshot.conf default to have lockfile enabled. - Check for stale lock files (PID not currently running). - explicitly add mode 0644 to sysopen() to create lockfile - give warning if write() or close() return 0 when writing/closing lockfile - Make prev_max_interval "not present (yet), nothing to copy" message when rotating interval.0 more visible (level 3 instead of level 4). - Add man page for rsnapshot-diff (generated from perldoc). - Updates to rsnapshot man pages (via perldoc). - Use =item in AUTHORS section - move mis-placed =back - document stale lock file detection - strongly recommend using a lock file - add a chmod to example backup script - change crontab example for weekly from 4 "weekly"s per month to 1 per week - expand on why higher intervals are done first via cron. - Change space to tab after #cmd_rsnapshot_diff in rsnapshot.conf.default.in. - In rpm patch, set cmd_rsnapshot_diff to /usr/bin/rsnapshot-diff. - Set the test scripts t/*.t.in to run from the source directory and create directory t/support/files/a if necessary. - Trim comments in README about gnu cp versions > 5.3 since rsnapshot strips trailing slashes for gnu cp with rsnapshot 1.2.9 and later. - Add pointers to HOWTO and utils/rsnapreport.pl in README. - More examples (eg: timestamp backup_script) in rsnapshot.conf.default.in. - Change "Perhaps this is not GNU cp?" error message. VERSION 1.2.9 (May 18 2006) ------------------------------------------------------------------------------ - David Keegel now responsible for release management - Added utils/rsnapreport.pl, written by William Bear. - Detect exit status 23 and 24 from rsync in rsync_cleanup_after_native_cp_al - Add $! (system error message) to various warning messages in native_cp_al - Add more examples and comments to rsnapshot.conf.default.in - In Makefile*, for "make tar", include "t" (testing) in the tar file. - Do not strip the trailing slash if it's a remote root filesystem. (This was a bug in rsnapshot 1.2.3 if you use "backup host:/ ...") - Give a more descriptive error message "cannot have a remote snapshot_root" if user tries to configure an ssh path or rsync path as snapshot_root. - Add some more description to the error "rsnapshot refuses to create snapshot_root when no_create_root is enabled", after checking whether the snapshot_root is a non-directory file, or just plain non-existent. - Changed default syslog level to 'info' instead of 'notice' - Added include_conf directive - Allowed remote ssh directory paths starting with "~/" as well as "/". - Changed rsnapshot maintainer from Nathan Rosenquist to David Cantrell - David Cantrell wrote the rsnapshot-diff utility - Chris Petersen added cwrsync permanent-share support - Robert Jackson added use_lazy_deletes - Added rollback for backup_scripts - Added rsnapshot-diff to Autoconf/Automake install/build process - Added sha1sum to utils/sign_packages.sh - Added a CVS Id to key files - Fixed exit value for some test invocations - Added 'rsnapshot diff' front-end to rsnapshot-diff - Added cmd_rsnapshot_diff - Added cmd_preexec - Added cmd_postexec - Added db prefs examples to utils/backup_mysql.sh and utils/backup_pgsql.sh - Fixed formatting with email addresses under AUTHORS section of man page - Added an extra safety check in copy_symlink() - Fixed swapped config comments about rsync_long_args in write_upgrade_config_file() - Added optional use of the CPAN Lchown module - Added safe_chown() wrapper to handle chown() calls safely - Added warning message if we can't properly lchown a symlink - Added fixes in sync_cp_src_dest() and sync_rm_dest() to properly delete a file that is being replaced with a directory - Fixed error message for dest not being specified in sync_rm_dest() - Changed skip message level to 2 in rsync_backup_point() - Added better file type checking in sync_cp_src_dest() - Removed redundant stat() calls in sync_cp_src_dest() and sync_rm_dest() - Removed trailing slashes from file paths when calling cp -al subroutines - Changed show_usage() to use here printing - Changed strip trailing slash operation in rsync_backup_point() to use strip_trailing_slash() - Fixed incorrect call to cmd_rm_rf() in handle_interval() - Fixed trailing slash on call to bail() in handle_interval() - Added sync_first feature (touches a lot of code) - When link_dest is enabled, rsnapshot will now hunt for the newest available directory to use as a link_dest target (up to the oldest directory) - When use_lazy_deletes is enabled, remove the lockfile before the final delete - Expanded on default (no args) and help messages - Added show_latest_snapshot() subroutine for shell scripts - Fixed sync_if_different() to allow alternating directories and files to be created with the same names between runs - Removed redundant line width and indent values in wrap_cmd() calls - Anthony Ettinger wrote utils/mysqlbackup.pl - Sherman Boyd wrote utils/random_file_verify.sh VERSION 1.2.3 (Aug ?? ??:?? 2005) ------------------------------------------------------------------------------ - Fixed a bug introduced in 1.2.2 when rsync is not using --relative - Fixed a bug where the snapshot_root could be included in backups if the root filesystem was being backed up and --relative was not set VERSION 1.2.2 (Aug 20 18:07 2005) ------------------------------------------------------------------------------ - David Keegel fixed a race condition in add_lockfile() - David Keegel improved error reporting when config file isn't present - Provided a workaround for a bug in some versions of rsync which caused files to not be deleted properly when the --relative flag was set. VERSION 1.2.1 (Apr 09 15:10 2005) ------------------------------------------------------------------------------ - Fixed security bug when neither cmd_cp or link_dest are enabled - Disabled chown() call in copy_symlink() - Check for symlink before all chown() calls VERSION 1.2.0 (Jan 31 21:43 2005) ------------------------------------------------------------------------------ - Turned off buffering ($|=1) - Changed default lockfile to /var/run/rsnapshot.pid, for FHS compliance - Clarified man page licensing (GPL) - Fixed is_real_local_abs_path() to handle dangling symlinks - Changed utils/backup_smb_share.sh to re-order the smbtar arguments - Added "-uroot" to utils/backup_mysql.sh example file - Changed regex in is_blank() subroutine - Changed rsync include/exclude mode to relative - Peter Palfrader enhanced error reporting to include command line options - Bharat Mediratta improved the exclusion rules to avoid backing up the snapshot root. The old way was also kept for users who can't or don't want to upgrade their destination paths in their backup points. - Bharat Mediratta added a "+" feature to the per-backup point args to allow additive include/exclude rules. - Added safe_rename() subroutine to work around a semi-obscure timestamp bug in certain Linux kernels - Clarified error message about local/relative paths in config file parsing - Added check for leading/trailing spaces in remote (ssh) paths - Added du(1) and crontab(1) to man page references - Added config.guess and config.sub for automake - Changed default destination paths for backup points in example config file for compatibility with --relative rsync flag - Added formatting fix to show one slash only when invoking backup_script with link_dest option enabled - Broke backwards compatibility for the benefit of fixing several outstanding issues. The default value for rsync_long_args is now different. - Changed add_lockfile() verbose message to "echo $$ > /path/to/lockfile.pid" which is actually what the code is doing - Added check to make sure backup_scripts can't share destination path with backup points - Added check to make sure different backup_script destinations don't overlap and don't clobber backup point destinations - Added "cmd_du" parameter to allow specifying the path to "du" - Nicolas Kaiser provided various typo fixes in the program and man page - Fixed "missing rsync/configtest ok" bug - Added config_version parameter, which is now required - All autoconf files were updated with the ones from Debian sarge - Added upgrade-config-file feature for "make upgrade" target and manual use - Added upgrade feature to RPM spec file - Added check-config-version feature for use with shell scripts, etc. - Changed version_only argument to version-only, for consistency with new options - Conditionalized configure script to only advise the user to copy the rsnapshot.conf.default file to rsnapshot.conf if it's a new installation - Added rollback feature to restore interval.0 snapshots when using link_dest - Added second option for du, to compare subdirectories or files - Added "du_args" to pass arguments to du - Relaxed cmd line option validation, but only when du is the command - Now only show command invocation for logger on verbose level 4 - Added rsync cleanup after native_cp_al() to preserve special files - Removed warning messages from native_cp_al() about special files - Modified error printing so full run string is displayed once at the top of a list of error messages - Fixed bug in old method of preventing the snapshot root from being backed up, which occurred when snapshot root was more than one level down from a backup point - Added commented out du_args to rsnapshot.conf.default.in - Added descriptive error if "du" fails VERSION 1.1.6 (Jul 05 16:35 2004) ------------------------------------------------------------------------------ - Moved the bulk of the program into smaller subroutines (finally) - show_disk_usage() now exits the program directly instead of returning a value - "0" can now be used as a valid interval name - Config error messages now wrap before 80 columns. - Moved $file_line_num global var into parse_config_file() - Split on \s+ instead of \s where appropriate - Moved $rsync_include_args and $rsync_include_file_args into parse_config_file() - Removed the $have_{cmd} global variables entirely - Took %opts out of the global namespace and into get_cmd_line_opts() - Changed a failed syslog call from an error to a warning - Removed $cwd from global namespace - Fixed bug where cp_al() commands would not be displayed in test mode - Removed redundant $done flag from file_diff() while loop - Downgraded close() file errors to warnings - Added utils/backup_dpkg.sh to backup Debian package information - Simplified the utils/ section of the Makefile under "make tar" - Now exits with an error if unknown command line flags are found - Added a check in parse_cmd_line_opts() for the config file if specified - Changed link_dest rsync error message to description instead of number - Changed description of test mode in the help cmd - Changed description of -V mode - Removed perl defaults from man page - Clarified crontab entry timing in man page - Removed trailing slashes on calls to mkpath() to fix bug with NetBSD - Removed trailing slashes on calls to rename() to fix bug with NetBSD - Removed trailing slashes on calls to rmtree() just in case - Fixed man page generation in "make tar" target - Changed -V message when there's no directory to rotate VERSION 1.1.5 (Jun 20 20:56 2004) ------------------------------------------------------------------------------ - /bin/rm is the default for deleting directories (in the default config file) - Removed redundant validation (re: intervals) in execution section - Print PID in lockfile - Added a few more comments, clarified some existing comments - Made some minor updates to the man page - Fix display formatting double-slash bug when '/' is a backup point - Changed return value when called with no cmd line args to 1 - Added a new exit code, for warnings (2) - rsync exit codes 23 and 24 make rsnapshot return a warning exit code instead of an error - Changed link_dest comment in config file to mention "cross-platform" - Added utils/debug_moving_files.sh abuse script for testing - Added 'du' option to show disk usage in snapshot_root - Moved setlocale() after begin message - Added manual link() call when we're using --link-dest and a single file - Don't call syslog in bail() if it's a test run VERSION 1.1.4 (May 16 23:44 2004) ------------------------------------------------------------------------------ - (re)added the cmd_rm parameter. rmtree() can't delete some obscure files on some systems - Added rm_rf() stub function to recursively remove things using either rmtree() or /bin/rm -rf, depending on the configuration. - Added cp and rm detection to ./configure script - Set LC_ALL locale variable to C in an attempt to fix rmtree() locale issue - Added no_create_root option to rsnapshot - Added utils/make_cvs_snapshot.sh utility script - Added utils/sign_packages.sh utility script - Added utils/rsnapshot_if_mounted.sh utility script - Standardized comment headers in utils/ scripts - Added DEBIAN/copyright file - Fixed man page to say RSNAPSHOT instead of RSNAPSHOT-PROGRAM for the title VERSION 1.1.3 (Apr 06 14:24 2004) ------------------------------------------------------------------------------ - Validating rsync_short_args, must be in format '-an', not '-a -n' - Assembling @cmd_stack list one at a time, rather than using join() - Added "don't panic" message in rotate_interval() at verbose >= 4 when no filesystem actions get performed - Fixed latent display bug in print_msg() (now that it's getting used) - Fixed "cd //" display bug when running from root directory (removed extra /) VERSION 1.1.2 (Mar 17 02:12 2004) ------------------------------------------------------------------------------ - Fixed slash formatting issue with non-ssh rsync protocol calls - Fixed a slightly inconvenient permissions issue in rsnaptar - Added support for arbitrary arguments to backup_script files VERSION 1.1.1 (Feb 11 23:24 2004) ------------------------------------------------------------------------------ - Changed some fatal errors to warnings in some recursive subroutines - Added optional GPG support to the rsnaptar utility shell script VERSION 1.1.0 (Jan 24 16:41 2004) ------------------------------------------------------------------------------ - The first interval must now have a value of at least 2 if more than one interval is being used - Now allows "/" as a backup point on the local drive - Cleaned up command formatting to consolidate slashes - Added subroutines for centralized print/logging - Added logfile and loglevel parameters to the config file - Added logging feature - Moved loglevel/verbose number validation into a seperate subroutine - Added much more error checking on the config file - Changed @snapshot_points to @backup_points for more consistent terminology - Made all "-x" executable checks also check for "-f" file - Made rsync error messages report the full path to rsync and the correct return value - Fixed minor screen formatting issue with print_cmd() subroutine where it could line wrap the first element of a command - Changed exit error code from -1 (255) to 1, to be more standard - Added include, exclude, include_file, and exclude_file params - Fixed bug where not all locally specified backup options would be parsed - Replaced calls to bail() from config parsing code with config_err() calls - Added directory traversal checks for commands - Changed indentation in print_cmd() to 4 spaces instead of 2 - Fixed bug where a file named "tmp" in the snapshot root would not be deleted properly at runtime (if sync_if_different() was used) VERSION 1.0.10 (Jan 20 00:43 2004) ------------------------------------------------------------------------------ - Added link_dest option, to use the --link-dest flag with rsync - Now checking the return values from rsync, with conditional syntax warning for --link-dest on older versions - Added additional calls to syslog, to report rsync failures - Now checking the return value of scripts called from backup_script - Conditionalized the backup_interval() and rotate_interval() subroutines to only delete the oldest interval if we're keeping more than one of that interval - Reformatted source code so it doesn't wrap (at 126 columns, or 1024x768) - Shortened output when invoked with no args or from help to fix in 80 columns - Changed rotate_interval() subroutine to simply move directories from lower intervals up instead of recursively copying hard links - Added formatting subroutine to wrap all verbose command output at 80 columns VERSION 1.0.9 (Jan 6 19:17 2004) ------------------------------------------------------------------------------ - Added backup_mysql.sh example script in utils/ to backup a MySQL database - Added backup_smb_share.sh example script in utils/ to backup an SMB share - Changed verbose settings internally to use numbers, instead of several arbitrary variables. - Added optional "verbose" field to the config file, with values 1-5 - Fixed lockfile code to not run in test mode VERSION 1.0.8 (Dec 26 12:56 2003) ------------------------------------------------------------------------------ - Added backup_script option to have rsnapshot invoke backup scripts directly - Added two example backup scripts in the utils/ directory, one for Postgres, and one for downloading the CVS root for rsnapshot - Added optional syslog support using the "logger" command - Fixed ssh_args local override for individual backup points - Added additional comments to various sections of the code - Removed redundant rsync arguments from the default - Moved add_lockfile() call so it runs later in the program VERSION 1.0.7 (Dec 19 19:22 2003) ------------------------------------------------------------------------------ - Added ssh_args parameter to pass arbitrary args to ssh - Fully integrated Autoconf build support for the program and config file - Provided more helpful error messages when the config file is not found - Fixed false "Can not remove lockfile" error when cmd_ssh is not defined but is referenced later in backup points VERSION 1.0.6 (Nov 26 21:03 2003) ------------------------------------------------------------------------------ - added \n to utime() debug message - moved all rsync calls into dynamically populated arrays - added rsync_short_args and rsync_long_args to config file - improved parse_backup_opts() validation code - Fixed "make install" vs. INSTALL bug for Mac OS X - Ted Zlatanov added Autoconf support! VERSION 1.0.5 (Nov 14 00:22 2003) ------------------------------------------------------------------------------ - Changed domain to rsnapshot.org - Added lockfile feature, with patch to enable it by default in the RPM - Updated man page to include the one_fs feature, did general clean up - Fixed '..' pattern matching bug that would exclude valid files - Updated Makefile to use "install", now allows "make tar" as a non-root user - Moved most remaining regexes into dedicated subroutines VERSION 1.0.4 (Nov 6 23:18 2003) ------------------------------------------------------------------------------ - Added one_fs feature to the config file (same as -x on the command line) - Fixed anonymous rsync feature, which had been broken in 1.0.3 - Added verification data to the RPM package VERSION 1.0.3 (Nov 2 14:43 2003) ------------------------------------------------------------------------------ - Carl Wilhelm Soderstrom added RPM format to release. - Added "one filesystem" option to prevent rsnapshot from crossing filesystems within a backup point. Patch provided by Ted Zlatanov - Minor typographical errors fixed. VERSION 1.0.2 (Oct 24 23:22 2003) ------------------------------------------------------------------------------ - added -V "extra verbose" option, to show rsync verbose output VERSION 1.0.1 (Oct 18 03:22 2003) ------------------------------------------------------------------------------ - Make sure the snapshot directory either needs to be created or already is a directory. Previously we were checking only if the snapshot root existed, which would cause problems if it were a file. - Cleaned up and streamlined the config file parsing portion of the code. - Changed numeric comparisons so that a typo would prevent compilation, instead of acting weird. i.e. (0 == $foo) instead of ($foo == 0) VERSION 1.0.0 (Sep 14 02:58 2003) ------------------------------------------------------------------------------ - Removed backward compatibility cruft for mkdir, touch, rm, and mv. - rsnapshot has now been tested successfully on Debian and Redhat Linux, as well as IRIX and Solaris. - Man pages are no longer gzipped, for compatibility with Solaris and others. VERSION 0.9.5 (Sep 9 20:11 2003) ------------------------------------------------------------------------------ - Removed most dependencies on external shell programs. - Added compatibility for non-Linux platforms. - Did significant testing/debugging to ensure compatibility with perl 5.004, 5.6, and 5.8 - Tested and working successfully on IRIX, more tests to follow. VERSION 0.9.4 (Sep 1 23:55 2003) ------------------------------------------------------------------------------ - Heavily commented variables, and added much stricter syntax checking of the config file. - Additional error checking on mkdir - updated the man page. VERSION 0.9.3 (Sep 1 01:46 2003) ------------------------------------------------------------------------------ - Anonymous rsync connections now supported. - Reverted back from recycling the oldest snapshots to the tried and true method of deleting the old ones. - Now rsnapshot will not only create the snapshot root directory as it did before, but it will also chmod 0700 the directory when it creates it. VERSION 0.9.2 (Aug 31 04:08 2003) ------------------------------------------------------------------------------ - Optimized rotating snapshot intervals by recycling the last directory to the first, instead of deleting the last and copying .0 to .1 - Added support for spaces in path names. - The config file now requires tabs to seperate all entries, where spaces were before acceptable. This was the easiest way to support spaces in path names. - Directory entries now require a trailing slash. This is so that files can be treated correctly without having to be examined directly (which is impractical over rsync/ssh). rsnapshot-1.4.2/missing0000755000175000017500000002415212632661203014545 0ustar travistravis#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: rsnapshot-1.4.2/docs/0000775000175000017500000000000012632661200014071 5ustar travistravisrsnapshot-1.4.2/docs/Upgrading_from_1.10000664000175000017500000003161312632661200017342 0ustar travistravis Starting with rsnapshot 1.2.0, the default value for "rsync_long_args" has changed. This is a global change, that affects which directories your backups are stored in under the snapshot root. IT IS ABSOLUTELY VITAL THAT YOU UNDERSTAND THIS SECTION, AND MAKE SURE THAT YOU UPGRADE YOUR CONFIG FILE. Here is a quick summary of what is needed to upgrade: Run the configure script with the same arguments you used for the previous installation For example: ./configure --sysconfdir=/etc configure will look at your old rsnapshot.conf file, and prompt you to upgrade. Read the message it displays, and then type: make upgrade An upgrade script will read your existing config file and make changes if necessary. If it does, the original will be saved as "rsnapshot.conf.backup" in the same directory. After the upgrade is complete, it is recommended you look at rsnapshot.conf and make sure everything is OK. Specifically, the "rsync_long_args" parameter should now be uncommented, along with a note explaining the change. Finally, to install rsnapshot, type: make install For the last step, to make sure the upgrade went OK, run: rsnapshot configtest Now rsnapshot will continue to work just as before. However, you may want to read the section below, as it gives information on how to fully update your config file to take advantage of the new features. What follows is a detailed description of the change: In previous versions of rsnapshot (before 1.2.0), the default value for "rsync_long_args" was: --delete --numeric-ids Starting with rsnapshot 1.2.0, the new default value for "rsync_long_args" is: --delete --numeric-ids --relative --delete-excluded In both the old and new versions, explicitly setting this parameter overrides the defaults. This is what the "make upgrade" script does, it manually sets this to the old default value for backwards compatibility. This change was made for a number of good reasons: rsnapshot has a feature to prevent you from accidentally backing up your snapshot root inside itself (recursively). Without this feature, it would be very easy to do something like specifying "/" as the backup point and forgetting to exclude the snapshot root. In the past, rsnapshot would avoid this by detecting the presence of the snapshot root in a backup point. If there was a conflict, the backup point would be rewritten internally, so that rsync would get called several times, once for each top level directory in the backup point, except for the one containing the snapshot root. This was not terrible, but it prevented taking full advantage of some other features that were added over time, such as "one_fs", and the include/exclude rules. For instance, if you wanted to backup your root filesystem (but only that disk partition), you couldn't really do so without figuring out which top level directories were housed on that partition, and then specifying them all as different backup points. Attempting to use the one_fs option would not have worked, since one_fs would be passed to rsync, but once for every single top level directory. Thus, if (for example) /var was housed on a different partition, it wouldn't matter since rsync was using /var as it's starting point, not "/". Additionally, in the past it was impossible to exclude a full path with rsync's include/exclude rules, regardless of what you were backing up. The best that could be done was to exclude a pattern (like "CVS"), or once again resort to listing all the top-level directories as seperate backup points surrounding anything you wanted to exclude. Now, because of the "--relative" option, it is possible to do all these things. "--delete-excluded" is nice too, since it will automatically remove things from your backups when you decide not to back them up anymore. Of course, there is a downside as well: With "--relative" enabled in "rsync_long_args", rsync treats the destination paths differently. Before, rsync would take the files from the source path and stick them directly into the destination path. Now, it takes the full source path and recreates all the parent directories in the destination path. This limits flexibility somewhat in the destination paths, since they are now tied to the namespace of the source paths. For example, something like this can no longer be done under the new system: backup /var/qmail/ localhost/email/ Before, the finished snapshot would look like this: /.snapshots/hourly.0/localhost/email/ Now, the finished snapshot will look like this: /.snapshots/hourly.0/localhost/email/var/qmail/ By explicitly setting the "rsync_long_args" parameter, you can operate rsnapshot in either of these two ways. Please be aware that if you are using an anonymous rsync server, the rules are just a little bit different. Unlike with a local filesystem or rsync over ssh, you can not rsync directly from the top level of the remote host. Instead, an rsync server has "modules" that are exported. These are essentially just top level directories. So instead of just specifying the hostname for the destination path, you should specify the module as well. Here is an example, where example.com is the rsync server, and the exported module is called "pub": Before backup rsync://example.com/pub/cvs/ example.com/pub/cvs/ After backup rsync://example.com/pub/cvs/ example.com/pub/ If you want to keep things the way they were, make sure you run "make upgrade" or otherwise set the rsync_long_args parameter to the old value. If you want to transition your destination paths over to the new way, read on. Here are some "before and after" examples from rsnapshot.conf. Each one yields identical results on the filesystem. THE OLD WAY (rsnapshot 1.1.6 and before): backup /etc/ localhost/etc/ backup /home/ localhost/home/ backup /usr/local/ localhost/usr/local/ backup root@example.com:/etc/ example.com/etc/ backup root@example.com:/var/ example.com/var/ backup rsync://example.com:/pub/cvs/ example.com/pub/cvs/ THE NEW WAY (from rsnapshot 1.2.0 on): backup /etc/ localhost/ backup /home/ localhost/ backup /usr/local/ localhost/ backup root@example.com:/etc/ example.com/ backup root@example.com:/var/ example.com/ backup rsync://example.com:/pub/cvs/ example.com/pub/ But what happens when you had an entry like this? backup /var/qmail/ localhost/email/ As you can see, there is no direct mapping from the source path to the destination. You now have essentially four choices: 1. Manually change the backup directories for individual backup points inside the snapshot root. This is probably the best method for most people to follow. For example, take this entry: backup /var/qmail/ localhost/email/ For the conversion, we are going to change it to: backup /var/qmail/ localhost/ Assume the snapshot root is "/.snapshots/", and the smallest interval is "hourly". Under the old system, these files would be backed up in this location: /.snapshots/hourly.0/localhost/email/ After we change the config file over to use --relative in rsync_long_args, the same files will now get backed up here: /.snapshots/hourly.0/localhost/var/qmail/ To make the transition seamless, we need to move this directory inside the snapshot root, and create all the parent directories, if necessary. So in this example, we do: cd /.snapshots/hourly.0/localhost/ mkdir var/ mv email/ var/qmail/ If we map all the directories over in this way, we maintain all the hard links. The only real drawback is that users will have to learn the new locations of the files to restore them. 2. Keep rsync_long_args set to the old values. Backward compatibility is maintained, but you can't take advantage of the new features. 3. Specify rsync_long_args for a particular backup point where you want to use the old method. I.E.: backup /etc/ localhost/ backup /home/ localhost/ backup /var/qmail/ localhost/email/ rsync_long_args=--delete --numeric-ids This way you get the new features except where you need to override them for certain backup points. Be very careful here because it's easy to forget what's going on. 4. Delete the latest snapshot and do a full re-sync under the new system. This is the brute force "I don't care about my old backups anyway" method. If this interests you, then perform the following steps: A. Figure out where your snapshot root is located. B. Figure out what the smallest interval is (I.E. hourly). C. Modify the config file to change your paths over to the new system. D. Manually delete the most recent snapshot directory. Assuming your snapshot root is set to "/.snapshots/", and your smallest interval is "hourly", you would delete the following directory: rm -rf /.snapshots/hourly.0/ E. Manually run rsnapshot on the lowest interval to perform a full re-sync. rsnapshot -v hourly Aside from the extra time spent on the full re-sync, the other big drawback to this method is that your snapshots will now take up the space of TWO full backups, plus incrementals. If you liked this method and were more concerned with disk space than history, you could also conceivably just delete the entire snapshot root and start over as well. Obviously this is a tactic to be used as a last resort! Finally, be aware that the backup_script parameter does NOT follow these new rules. Backup scripts still drop their files right into the destination directory specified. This makes sense when you realize that since the files came from a script, they didn't really have a source path on the filesystem to begin with. Any backup_script parameters should remain unchanged from before. Additionally, new checks have been added to rsnapshot to prevent you from accidentally wiping out your backup points later with an incorrect backup_script destination. For instance, this would nuke your backups, except that rsnapshot won't let you do it: backup /etc/ localhost/etc/ backup_script /usr/local/bin/backup_pgsql.sh localhost/etc/ This won't work either, because the backup script destination is above the backup point: backup /etc/ localhost/etc/ backup_script /usr/local/bin/backup_pgsql.sh localhost/ The correct usage would be something like this: backup /etc/ localhost/etc/ backup_script /usr/local/bin/backup_pgsql.sh localhost/pgsql/ rsnapshot-1.4.2/docs/docbook/0000775000175000017500000000000012632661200015511 5ustar travistravisrsnapshot-1.4.2/docs/docbook/rsnapshot-HOWTO.en.xml0000664000175000017500000012357012632661200021563 0ustar travistravis
rsnapshot HOWTO Nathan Rosenquist
nathan@rsnapshot.org
2004-01-20 1.0.0 2005-01-31 NR Updated for rsnapshot 1.2.0 0.9.7 2005-01-17 NR Spelling corrections submitted by Nicolas Kaiser 0.9.6 2004-12-13 NR Misc. updates 0.9.5 2004-07-10 NR Relicensed document under GPL, instead of FDL 0.9.4 2004-07-02 NR Added description of proper crontab time settings 0.9.3 2004-06-11 NR Misc. updates 0.9.2 2004-05-16 NR Updated --link-dest info 0.9.1 2004-01-20 NR Added --link-dest info 0.9 2004-01-10 NR First draft rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. This document is a tutorial in the installation and configuration of rsnapshot.
Introduction rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. rsnapshot is written in Perl, and depends on rsync. OpenSSH, GNU cp, GNU du, and the BSD logger program are also recommended, but not required. All of these should be present on most Linux systems. rsnapshot is written with the lowest common denominator in mind. It only requires at minimum Perl 5.004 and rsync. As a result of this, it works on pretty much any UNIX-like system you care to throw at it. It has been successfully tested with Perl 5.004 through 5.8.2, on Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, NetBSD, and IRIX. The latest version of the program and this document can always be found at http://www.rsnapshot.org/. What you will need At a minimum: perl, rsync Optionally: ssh, logger, GNU cp, GNU du Additionally, it will help if you have reasonably good sysadmin skills. Copyright and License This document, rsnapshot HOWTO, is copyrighted (c) 2005 by Nathan Rosenquist. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of the license is available at http://www.gnu.org/copyleft/gpl.html. Disclaimer No liability for the contents of this document can be accepted. Use the concepts, examples and information at your own risk. There may be errors and inaccuracies, that could be damaging to your system. Proceed with caution, and although this is highly unlikely, the author(s) do not take any responsibility. All copyrights are held by their by their respective owners, unless specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. Naming of particular products or brands should not be seen as endorsements. Feedback Feedback is most certainly welcome for this document. Send your additions, comments and criticisms to the following email address : nathan@rsnapshot.org. Motivation I originally used Mike Rubel's shell scripts to do rsync snapshots a while back. These worked very well, but there were a number of things that I wanted to improve upon. I had to write two shell scripts that were customized for my server. If I wanted to change the number of intervals stored, or the parts of the filesystem that were archived, that meant manually editing these shell scripts. If I wanted to install them on a different server with a different configuration, this meant manually editing the scripts for the new server, and hoping the logic and the sequence of operations was correct. Also, I was doing all the backups locally, on a single machine, on a single hard drive (just to protect from dumb user mistakes like deleting files). Never the less, I continued on with this system for a while, and it did work very well. Several months later, the IDE controller on my web server failed horribly (when I typed /sbin/shutdown, it said the command was not found). I was then faced with what was in the back of my mind all along: I had not been making regular remote backups of my server, and the local backups were of no use to me since the entire drive was corrupted. The reason I had only been making sporadic, partial remote backups is that they weren't automatic and effortless. Of course, this was no one's fault but my own, but I got frustrated enough to write a tool that would make automated remote snapshots so easy that I wouldn't ever have to worry about them again. This goal has long been reached, but work on rsnapshot still continues as people submit patches, request features, and ways are found to improve the program. Installation This section will walk you through the installation of rsnapshot, step by step. This is not the only way to do it, but it is a way that works and that is well documented. Feel free to improvise if you know what you're doing. This guide assumes you are installing rsnapshot 1.2.0 for the first time. If you are upgrading from an earlier version, please read the INSTALL file that comes with the source distribution instead. 30 second version (for the impatient) ./configure --sysconfdir=/etc su make install cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf The rest of this section is the long version. Untar the source code package tar xzvf rsnapshot-1.2.0.tar.gz If you don't have GNU tar, you may have to do this in two steps instead: gunzip rsnapshot-1.2.0.tar.gz tar xvf rsnapshot-1.2.0.tar Change to the source directory cd rsnapshot-1.2.0/ Decide where you want to install By default, the installation procedure will install all files under /usr/local. For this tutorial, this will be OK except we will install the config file under /etc. We are assuming that rsync, ssh, logger, and du are all in your search path. If this is not the case, you can specify the path to any of these programs using the typical Autoconf --with-program=/path/to/program syntax. For example, if Perl was in /opt/bin/perl and rsync was in /home/me/bin/rsync, you could run configure like: ./configure --with-perl=/opt/bin/perl --with-rsync=/home/me/bin/rsync Run the configure script This will poke and prod your system to figure out where the various external programs that rsnapshot depends on live. It also generates the Makefile that we will use to install the program. The configure script accepts arguments that can be used to tell it where to install the program, and also where to find the supporting programs. For this installation, the only non-default option we want is to put the config file in the /etc directory. To do this, run this command at the shell: ./configure --sysconfdir=/etc If all goes well, you're ready to install the program. If there was a problem, it should be descriptive. Most likely a problem would be the result of something that was required and not found (like rsync or perl). If this happens, you must figure out where the missing program is located on your system, or install it if necessary. If you know where it is but configure couldn't find it, you can specify the path using the --with-program=/path/to/program options described above. Install the program If you've followed these instructions so far, you will have configured rsnapshot to be installed under /usr/local, with the config file in /etc. Under these circumstances, it will be necessary to become root to install the program. Now is the time to do so. You will, of course, need the root password to do this: su This will prompt you for the root password. Now, to install rsnapshot, run the following command: make install This will install rsnapshot with all the settings you specified in the ./configure stage. If all goes well, you will have the following files on your system: /usr/local/bin/rsnapshot The rsnapshot program /usr/local/man/man1/rsnapshot.1 Man page /etc/rsnapshot.conf.default The example config file If you decide later that you don't want rsnapshot on your system anymore, simply remove the files listed above, or run make uninstall in the same source directory you installed from. Of course, if you installed with different options, the location of these files may be different. Configuration Create the config file In the install process, the config file is not created or installed. However, a working example is provided that you can copy. To copy the example config file into the location rsnapshot will be looking for the real config file: cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf As a general rule, you should avoid modifying /etc/rsnapshot.conf.default, simply because it is a working example that you may wish to refer to later. Also, if you perform an upgrade, the rsnapshot.conf.default file will always be upgraded to the latest version, while your real config file will be safe out of harm's way. Please note that if you run make upgrade during an upgrade, your rsnapshot.conf may be modified slightly, and the original will then be saved in rsnapshot.conf.backup in the same directory. Where to go for more info The rsnapshot.conf config file is well commented, and much of it should be fairly self-explanatory. For a full reference of all the various options, please consult the rsnapshot man page. Type: man rsnapshot This will give you the complete documentation. However, it assumes that you already know what you're doing to a certain extent. If you just want to get something up and running, this tutorial is a better place to start. If your system can't find the man page, /usr/local/man probably isn't in your $MANPATH environmental variable. This is beyond the scope of this document, but if it isn't working for you, you can always read the newest man page on the rsnapshot web site at http://www.rsnapshot.org/ Modifying the config file In this example, we will be using the /.snapshots/ directory to hold the filesystem snapshots. This is referred to as the snapshot root. Feel free to put this anywhere you have lots of free disk space. However, the examples in this document assume you have not changed this parameter, so you will have to substitute this in your commands if you put it somewhere else. Also please note that fields are separated by tabs, not spaces. The reason for this is so it's easier to specify file paths with spaces in them. cmd_cp If enabled, the cmd_cp parameter should contain the path to the GNU cp program on your filesystem. If you are using Linux, be sure to uncomment this by removing the hash mark (#) in front of it. If you are using BSD, Solaris, IRIX, or most other UNIX variants, you should leave this commented out. What makes GNU cp so special is that unlike the traditional UNIX cp, it has the ability to make recursive copies of directories as hard links. If you don't have GNU cp, there is a subroutine in rsnapshot that somewhat approximates this functionality (although it won't support more esoteric files such as device nodes, FIFOs, sockets, etc). This gets followed up by another call to rsync, which transfers the remaining special files, if any. In this way, rsnapshot can support all file types on every platform. The rule of thumb is that if you're on a Linux system, leave cmd_cp enabled. If you aren't on a Linux system, leave cmd_cp disabled. There are reports of GNU cp working on BSD and other non-Linux platforms, but there have also been some cases where problems have been encountered. If you enable cmd_cp on a non-Linux platform, please let the mailing list know how it worked out for you. cmd_rsync The cmd_rsync parameter must not be commented out, and it must point to a working version of rsync. If it doesn't, the program just will not work at all. Please note that if you are using IRIX, there is another program named rsync that is different than the real rsync most people know of. If you're on an IRIX machine, you should double check this. cmd_ssh If you have ssh installed on your system, you will want to uncomment the cmd_ssh parameter. By enabling ssh, you can take snapshots of any number of remote systems. If you don't have ssh, or plan to only take snapshots of the local filesystem, you may safely leave this commented out. cmd_logger The cmd_logger parameter specifies the path to the logger program. logger is a command line interface to syslog. See the logger man page for more details. logger should be a standard part of most UNIX-like systems. It appears to have remained unchanged since about 1993, which is good for cross-platform stability. If you comment out this parameter, it will disable syslog support in rsnapshot. It is recommended that you leave this enabled. cmd_du The cmd_du parameter specifies the path to the du program. du is a command line tool that reports on disk usage. rsnapshot uses du to generate reports about the actual amount of disk space taken up, which is otherwise difficult to estimate because of all the hard links. If you comment this out, rsnapshot will try to use the version of du it finds in your path, if possible. The GNU version of du is recommended, since it has the best selection of features, and supports the most options. The BSD version also seems to work, although some versions don't support the -h flag. Solaris du does not work at all, because it doesn't support the -c parameter. link_dest If you have rsync version 2.5.7 or later, you may want to enable this. With link_dest enabled, rsnapshot relies on rsync to create recursive hard links, overriding GNU cp in most, but not all, cases. With link_dest enabled, every single file on your system can be backed up in one pass, on any operating system. To get the most out of rsnapshot on non-Linux platforms, link_dest should be enabled. Be advised, however, that if a remote host is unavailable during a backup, rsnapshot will take an extra step and roll back the files from the previous backup. Using GNU cp, this would not be necessary. interval rsnapshot has no idea how often you want to take snapshots. Everyone's backup scheme may be different. In order to specify how much data to save, you need to tell rsnapshot which intervals to keep, and how many of each. An interval, in the context of the rsnapshot config file, is a unit of time measurement. These can actually be named anything (as long as it's alphanumeric, and not a reserved word), but by convention we will call ours hourly and daily. In this example, we want to take a snapshot every four hours, or six times a day (these are the hourly intervals). We also want to keep a second set, which are taken once a day, and stored for a week (or seven days). This happens to be the default, so as you can see the config file reads: interval hourly 6 interval daily 7 It also has some other entries, but you can either ignore them or comment them out for now. Please note that the hourly interval is specified first. This is very important. The first interval line is assumed to be the smallest unit of time, with each additional line getting successively larger. Thus, if you add a yearly interval, it should go at the bottom, and if you add a minutes interval, it should go before hourly. It's also worth noting that the snapshots get pulled up from the smallest interval to the largest. In this example, the daily snapshots get pulled from the oldest hourly snapshot, not directly from the main filesystem. backup Please note that the destination paths specified here are based on the assumption that the --relative flag is being passed to rsync via the rsync_long_args parameter. If you are installing for the first time, this is the default setting. If you upgraded from a previous version, please read the INSTALL file that came with the source distribution for more information. This is the section where you tell rsnapshot what files you actually want to back up. You put a backup parameter first, followed by the full path to the directory or network path you're backing up. The third column is the relative path you want to back up to inside the snapshot root. Let's look at an example: backup /etc/ localhost/ In this example, backup tells us it's a backup point. /etc/ is the full path to the directory we want to take snapshots of, and localhost/ is a directory inside the snapshot_root we're going to put them in. Using the word localhost as the destination directory is just a convention. You might also choose to use the server's fully qualified domain name instead of localhost. If you are taking snapshots of several machines on one dedicated backup server, it's a good idea to use their various hostnames as directories to keep track of which files came from which server. In addition to full paths on the local filesystem, you can also backup remote systems using rsync over ssh. If you have ssh installed and enabled (via the cmd_ssh parameter), you can specify a path like: backup root@example.com:/etc/ example.com/ This behaves fundamentally the same way, but you must take a few extra things into account. The ssh daemon must be running on example.com You must have access to the account you specify the remote machine, in this case the root user on example.com. You must have key-based logins enabled for the root user at example.com, without passphrases. If you wanted to perform backups as another user, you could specify the other user instead of root for the source (i.e. user@domain.com). Please note that allowing remote logins with no passphrase is a security risk that may or may not be acceptable in your situation. Make sure you guard access to the backup server very carefully! For more information on how to set this up, please consult the ssh man page, or a tutorial on using ssh public and private keys. You will find that the key based logins are better in many ways, not just for rsnapshot but for convenience and security in general. Troy Johnson's excellent tutorial on using nifty ssh features for secure snapshots which, in case his site ever suffers a mishap, is mirrored here on this site. This backup occurs over the network, so it may be slower. Since this uses rsync, this is most noticeable during the first backup. Depending on how much your data changes, subsequent backups should go much, much faster since rsync only sends the differences between files. backup_script With this parameter, the second column is the full path to an executable backup script, and the third column is the local path you want to store it in (just like with the "backup" parameter). For example: backup_script /usr/local/bin/backup_pgsql.sh localhost/postgres/ In this example, rsnapshot will run the script /usr/local/bin/backup_pgsql.sh in a temp directory, then sync the results into the localhost/postgres/ directory under the snapshot root. You can find the backup_pgsql.sh example script in the utils/ directory of the source distribution. Feel free to modify it for your system. Your backup script simply needs to dump out the contents of whatever it does into it's current working directory. It can create as many files and/or directories as necessary, but it should not put its files in any pre-determined path. The reason for this is that rsnapshot creates a temp directory, changes to that directory, runs the backup script, and then syncs the contents of the temp directory to the local path you specified in the third column. A typical backup script would be one that archives the contents of a database. It might look like this: #!/bin/sh /usr/bin/mysqldump -uroot mydatabase > mydatabase.sql /bin/chmod 644 mydatabase.sql There are several example scripts in the utils/ directory of the rsnapshot source distribution to give you more ideas. Make sure the destination path you specify is unique. The backup script will completely overwrite anything in the destination path, so if you tried to specify the same destination twice, you would be left with only the files from the last script. Fortunately, rsnapshot will try to prevent you from doing this when it reads the config file. Please remember that these backup scripts will be invoked as the user running rsnapshot. In our example, this is root. Make sure your backup scripts are owned by root, and not writable by anyone else. If you fail to do this, anyone with write access to these backup scripts will be able to put commands in them that will be run as the root user. If they are malicious, they could take over your server. Testing your config file When you have made all your changes, you should verify that the config file is syntactically valid, and that all the supporting programs are where you think they are. To do this, run rsnapshot with the configtest argument: rsnapshot configtest If all is well, it should say Syntax OK. If there's a problem, it should tell you exactly what it is. Make sure your config file is using tabs and not spaces, etc. The final step to test your configuration is to run rsnapshot in test mode. This will print out a verbose list of the things it will do, without actually doing them. To do a test run, run this command: rsnapshot -t hourly This tells rsnapshot to simulate an "hourly" backup. It should print out the commands it will perform when it runs for real. Please note that the test output might be slightly different than the real execution, but only because the test doesn't actually do things that may be checked for later in the program. For example, if the program will create a directory and then later test to see if that directory exists, the test run might claim that it would create the directory twice, since it didn't actually get created during the test. This should be the only type of difference you will see while running a test. Automation Now that you have your config file set up, it's time to set up rsnapshot to be run from cron. As the root user, edit root's crontab by typing: crontab -e You could alternately keep a crontab file that you load in, but the concepts are the same. You want to enter the following information into root's crontab: 0 */4 * * * /usr/local/bin/rsnapshot hourly 30 23 * * * /usr/local/bin/rsnapshot daily It is usually a good idea to schedule the larger intervals to run a bit before the lower ones. For example, in the crontab above, notice that daily runs 30 minutes before hourly. This helps prevent race conditions where the daily would try to run before the hourly job had finished. This same strategy should be extended so that a weekly entry would run before the daily and so on. How it works We have a snapshot root under which all backups are stored. By default, this is the directory /.snapshots/. Within this directory, other directories are created for the various intervals that have been defined. In the beginning it will be empty, but once rsnapshot has been running for a week, it should look something like this: [root@localhost]# ls -l /.snapshots/ drwxr-xr-x 7 root root 4096 Dec 28 00:00 daily.0 drwxr-xr-x 7 root root 4096 Dec 27 00:00 daily.1 drwxr-xr-x 7 root root 4096 Dec 26 00:00 daily.2 drwxr-xr-x 7 root root 4096 Dec 25 00:00 daily.3 drwxr-xr-x 7 root root 4096 Dec 24 00:00 daily.4 drwxr-xr-x 7 root root 4096 Dec 23 00:00 daily.5 drwxr-xr-x 7 root root 4096 Dec 22 00:00 daily.6 drwxr-xr-x 7 root root 4096 Dec 29 00:00 hourly.0 drwxr-xr-x 7 root root 4096 Dec 28 20:00 hourly.1 drwxr-xr-x 7 root root 4096 Dec 28 16:00 hourly.2 drwxr-xr-x 7 root root 4096 Dec 28 12:00 hourly.3 drwxr-xr-x 7 root root 4096 Dec 28 08:00 hourly.4 drwxr-xr-x 7 root root 4096 Dec 28 04:00 hourly.5 Inside each of these directories is a full backup of that point in time. The destination directory paths you specified under the backup and backup_script parameters get stuck directly under these directories. In the example: backup /etc/ localhost/ The /etc/ directory will initially get backed up into /.snapshots/hourly.0/localhost/etc/ Each subsequent time rsnapshot is run with the hourly command, it will rotate the hourly.X directories, and then copy the contents of the hourly.0 directory (using hard links) into hourly.1. When rsnapshot daily is run, it will rotate all the daily.X directories, then copy the contents of hourly.5 into daily.0. hourly.0 will always contain the most recent snapshot, and daily.6 will always contain a snapshot from a week ago. Unless the files change between snapshots, the full backups are really just multiple hard links to the same files. Thus, if your /etc/passwd file doesn't change in a week, hourly.0/localhost/etc/passwd and daily.6/localhost/etc/passwd will literally be the same exact file. This is how rsnapshot can be so efficient on space. If the file changes at any point, the next backup will unlink the hard link in hourly.0, and replace it with a brand new file. This will now take double the disk space it did before, but it is still considerably less than it would be to have full unique copies of this file 13 times over. Remember that if you are using different intervals than the ones in this example, the first interval listed is the one that gets updates directly from the main filesystem. All subsequently listed intervals pull from the previous intervals. For example, if you had weekly, monthly, and yearly intervals defined (in that order), the weekly ones would get updated directly from the filesystem, the monthly ones would get updated from weekly, and the yearly ones would get updated from monthly. Restoring backups When rsnapshot is first run, it will create the snapshot_root directory (/.snapshots/ by default). It assigns this directory the permissions 700, and for good reason. The snapshot root will probably contain files owned by all sorts of users on your system. If any of these files are writeable (and of course some of them will be), the users will still have write access to their files. Thus, if they can see the snapshots directly, they can modify them, and the integrity of the snapshots can not be guaranteed. For example, if a user had write permission to the backups and accidentally ran rm -rf /, they would delete all their files in their home directory and all the files they owned in the backups! root only The simplest, but least flexible solution, is to simply deny non-root users access to the snapshot root altogether. The root user will still have access of course, and as with all other aspects of system administration, must be trusted not to go messing with things too much. However, by simply denying access to everyone, the root user will be the only one who can pull backups. This may or may not be desirable, depending on your situation. For a small setup or a single-user machine, this may be all you need. All users If users need to be able to pull their own backups, you will need to do a little extra work up front (but probably less work in the long run). The best way to do this seems to be creating a container directory for the snapshot root with 700 permissions, giving the snapshot root directory 755 permissions, and mounting the snapshot root for the users read-only. This can be done over NFS and Samba, to name two possibilities. Let's explore how to do this using NFS on a single machine: Set the snapshot_root variable in /etc/rsnapshot.conf equal to /.private/.snapshots/ snapshot_root /.private/.snapshots/ Create the container directory: mkdir /.private/ Create the real snapshot root: mkdir /.private/.snapshots/ Create the read-only snapshot root mount point: mkdir /.snapshots/ Set the proper permissions on these new directories: chmod 0700 /.private/ chmod 0755 /.private/.snapshots/ chmod 0755 /.snapshots/ In /etc/exports, add /.private/.snapshots/ as a read only NFS export: /.private/.snapshots/ 127.0.0.1(ro,no_root_squash) In /etc/fstab, mount /.private/.snapshots/ read-only under /.snapshots/ localhost:/.private/.snapshots/ /.snapshots/ nfs ro 0 0 You should now restart your NFS daemon. Now mount the read-only snapshot root: mount /.snapshots/ To test this, go into the /.snapshots/ directory as root. It is set to read-only, so even root shouldn't be able to write to it. As root, try: touch /.snapshots/testfile This should fail, citing insufficient permissions. This is what you want. It means that your users won't be able to mess with the snapshots either. Now, all your users have to do to recover old files is go into the /.snapshots directory, select the interval they want, and browse through the filesystem until they find the files they are looking for. They can't modify anything in here because NFS will prevent them, but they can copy anything that they had read permission for in the first place. All the regular filesystem permissions are still at work, but the read-only NFS mount prevents any writes from happening. Please note that some NFS configurations may prevent you from accessing files that are owned by root and set to only be readable by root. In this situation, you may wish to pull backups for root from the "real" snapshot root, and let non-privileged users pull from the read-only NFS mount. Conclusion If you followed the instructions in this document, you should now have rsnapshot installed and set up to perform automatic backups of your system. If it's not working, go back and trace your steps back to see if you can isolate the problem. The amount of disk space taken up will be equal to one full backup, plus an additional copy of every file that is changed. There is also a slight disk space overhead with creating multiple hard links, but it's not very much. On my system, adding a second, completely identical 3 Gigabyte interval alongside the original one only added about 15 Megabytes. You can use the du option to rsnapshot to generate disk usage reports. To see the sum total of all space used, try: rsnapshot du If you were storing backups under localhost/home/ and wanted to see how much this subdirectory takes up throughout all your backups, try this instead: rsnapshot du localhost/home/ The latest version of this document and the rsnapshot program can always be found at http://www.rsnapshot.org/ More resources Web sites Mike Rubel's original shell scripts, upon which this project is based http://www.mikerubel.org/computers/rsync_snapshots/ Perl http://www.perl.org/ GNU cp and du (coreutils package) http://www.gnu.org/software/coreutils/ rsync http://rsync.samba.org/ OpenSSH http://www.openssh.org/ rsnapshot http://www.rsnapshot.org/
rsnapshot-1.4.2/docs/docbook/rsnapshot-HOWTO.en.info0000664000175000017500000011345512632661200021717 0ustar travistravisThis is rsnapshot-HOWTO.en.info, produced by makeinfo version 4.8 from rsnapshot-HOWTO.en.texi. START-INFO-DIR-ENTRY * rsnapshot HOWTO: . ??? END-INFO-DIR-ENTRY  File: rsnapshot-HOWTO.en.info, Node: Top, Next: Introduction, Up: (dir) rsnapshot HOWTO *************** * Menu: * Introduction:: * Motivation:: * Installation:: * Configuration:: * Automation:: * How it works:: * Restoring backups:: * Conclusion:: * More resources:: --- The Detailed Node Listing --- Introduction * What you will need:: * Copyright and License:: * Disclaimer:: * Feedback:: Installation * 30 second version [for the impatient]:: * Untar the source code package:: * Change to the source directory:: * Decide where you want to install:: * Run the configure script:: * Install the program:: Configuration * Create the config file:: * Where to go for more info:: * Modifying the config file:: * Testing your config file:: Restoring backups * root only:: * All users::  File: rsnapshot-HOWTO.en.info, Node: Introduction, Next: Motivation, Prev: Top, Up: Top 1 Introduction ************** rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. rsnapshot is written in Perl, and depends on rsync. OpenSSH, GNU cp, GNU du, and the BSD logger program are also recommended, but not required. All of these should be present on most Linux systems. rsnapshot is written with the lowest common denominator in mind. It only requires at minimum Perl 5.004 and rsync. As a result of this, it works on pretty much any UNIX-like system you care to throw at it. It has been successfully tested with Perl 5.004 through 5.8.2, on Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, NetBSD, and IRIX. The latest version of the program and this document can always be found at http://www.rsnapshot.org/ (http://www.rsnapshot.org/). * Menu: * What you will need:: * Copyright and License:: * Disclaimer:: * Feedback::  File: rsnapshot-HOWTO.en.info, Node: What you will need, Next: Copyright and License, Up: Introduction 1.1 What you will need ====================== At a minimum: perl, rsync Optionally: ssh, logger, GNU cp, GNU du Additionally, it will help if you have reasonably good sysadmin skills.  File: rsnapshot-HOWTO.en.info, Node: Copyright and License, Next: Disclaimer, Prev: What you will need, Up: Introduction 1.2 Copyright and License ========================= This document, rsnapshot HOWTO, is copyrighted (c) 2005 by Nathan Rosenquist. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of the license is available at http://www.gnu.org/copyleft/gpl.html (http://www.gnu.org/copyleft/gpl.html).  File: rsnapshot-HOWTO.en.info, Node: Disclaimer, Next: Feedback, Prev: Copyright and License, Up: Introduction 1.3 Disclaimer ============== No liability for the contents of this document can be accepted. Use the concepts, examples and information at your own risk. There may be errors and inaccuracies, that could be damaging to your system. Proceed with caution, and although this is highly unlikely, the author(s) do not take any responsibility. All copyrights are held by their by their respective owners, unless specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. Naming of particular products or brands should not be seen as endorsements.  File: rsnapshot-HOWTO.en.info, Node: Feedback, Prev: Disclaimer, Up: Introduction 1.4 Feedback ============ Feedback is most certainly welcome for this document. Send your additions, comments and criticisms to the following email address : .  File: rsnapshot-HOWTO.en.info, Node: Motivation, Next: Installation, Prev: Introduction, Up: Top 2 Motivation ************ I originally used Mike Rubel's shell scripts to do rsync snapshots a while back. These worked very well, but there were a number of things that I wanted to improve upon. I had to write two shell scripts that were customized for my server. If I wanted to change the number of intervals stored, or the parts of the filesystem that were archived, that meant manually editing these shell scripts. If I wanted to install them on a different server with a different configuration, this meant manually editing the scripts for the new server, and hoping the logic and the sequence of operations was correct. Also, I was doing all the backups locally, on a single machine, on a single hard drive (just to protect from dumb user mistakes like deleting files). Never the less, I continued on with this system for a while, and it did work very well. Several months later, the IDE controller on my web server failed horribly (when I typed `/sbin/shutdown', it said the command was not found). I was then faced with what was in the back of my mind all along: I had not been making regular remote backups of my server, and the local backups were of no use to me since the entire drive was corrupted. The reason I had only been making sporadic, partial remote backups is that they weren't automatic and effortless. Of course, this was no one's fault but my own, but I got frustrated enough to write a tool that would make automated remote snapshots so easy that I wouldn't ever have to worry about them again. This goal has long been reached, but work on rsnapshot still continues as people submit patches, request features, and ways are found to improve the program.  File: rsnapshot-HOWTO.en.info, Node: Installation, Next: Configuration, Prev: Motivation, Up: Top 3 Installation ************** This section will walk you through the installation of rsnapshot, step by step. This is not the only way to do it, but it is a way that works and that is well documented. Feel free to improvise if you know what you're doing. This guide assumes you are installing rsnapshot 1.2.0 for the first time. If you are upgrading from an earlier version, please read the `INSTALL' file that comes with the source distribution instead. * Menu: * 30 second version [for the impatient]:: * Untar the source code package:: * Change to the source directory:: * Decide where you want to install:: * Run the configure script:: * Install the program::  File: rsnapshot-HOWTO.en.info, Node: 30 second version [for the impatient], Next: Untar the source code package, Up: Installation 3.1 30 second version (for the impatient) ========================================= ./configure --sysconfdir=/etc su make install cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf The rest of this section is the long version.  File: rsnapshot-HOWTO.en.info, Node: Untar the source code package, Next: Change to the source directory, Prev: 30 second version [for the impatient], Up: Installation 3.2 Untar the source code package ================================= tar xzvf rsnapshot-1.2.0.tar.gz If you don't have GNU `tar', you may have to do this in two steps instead: gunzip rsnapshot-1.2.0.tar.gz tar xvf rsnapshot-1.2.0.tar  File: rsnapshot-HOWTO.en.info, Node: Change to the source directory, Next: Decide where you want to install, Prev: Untar the source code package, Up: Installation 3.3 Change to the source directory ================================== cd rsnapshot-1.2.0/  File: rsnapshot-HOWTO.en.info, Node: Decide where you want to install, Next: Run the configure script, Prev: Change to the source directory, Up: Installation 3.4 Decide where you want to install ==================================== By default, the installation procedure will install all files under `/usr/local'. For this tutorial, this will be OK except we will install the config file under `/etc'. We are assuming that `rsync', `ssh', `logger', and `du' are all in your search path. If this is not the case, you can specify the path to any of these programs using the typical Autoconf `--with-program=/path/to/program' syntax. For example, if Perl was in `/opt/bin/perl' and rsync was in `/home/me/bin/rsync', you could run configure like: ./configure --with-perl=/opt/bin/perl --with-rsync=/home/me/bin/rsync  File: rsnapshot-HOWTO.en.info, Node: Run the configure script, Next: Install the program, Prev: Decide where you want to install, Up: Installation 3.5 Run the configure script ============================ This will poke and prod your system to figure out where the various external programs that rsnapshot depends on live. It also generates the Makefile that we will use to install the program. The configure script accepts arguments that can be used to tell it where to install the program, and also where to find the supporting programs. For this installation, the only non-default option we want is to put the config file in the `/etc' directory. To do this, run this command at the shell: ./configure --sysconfdir=/etc If all goes well, you're ready to install the program. If there was a problem, it should be descriptive. Most likely a problem would be the result of something that was required and not found (like rsync or perl). If this happens, you must figure out where the missing program is located on your system, or install it if necessary. If you know where it is but configure couldn't find it, you can specify the path using the `--with-program=/path/to/program' options described above.  File: rsnapshot-HOWTO.en.info, Node: Install the program, Prev: Run the configure script, Up: Installation 3.6 Install the program ======================= If you've followed these instructions so far, you will have configured rsnapshot to be installed under `/usr/local', with the config file in `/etc'. Under these circumstances, it will be necessary to become root to install the program. Now is the time to do so. You will, of course, need the root password to do this: su This will prompt you for the root password. Now, to install rsnapshot, run the following command: make install This will install rsnapshot with all the settings you specified in the ./configure stage. If all goes well, you will have the following files on your system: `/usr/local/bin/rsnapshot' The rsnapshot program `/usr/local/man/man1/rsnapshot.1' Man page `/etc/rsnapshot.conf.default' The example config file If you decide later that you don't want rsnapshot on your system anymore, simply remove the files listed above, or run `make uninstall' in the same source directory you installed from. Of course, if you installed with different options, the location of these files may be different.  File: rsnapshot-HOWTO.en.info, Node: Configuration, Next: Automation, Prev: Installation, Up: Top 4 Configuration *************** * Menu: * Create the config file:: * Where to go for more info:: * Modifying the config file:: * Testing your config file::  File: rsnapshot-HOWTO.en.info, Node: Create the config file, Next: Where to go for more info, Up: Configuration 4.1 Create the config file ========================== In the install process, the config file is not created or installed. However, a working example is provided that you can copy. To copy the example config file into the location rsnapshot will be looking for the real config file: cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf As a general rule, you should avoid modifying `/etc/rsnapshot.conf.default', simply because it is a working example that you may wish to refer to later. Also, if you perform an upgrade, the `rsnapshot.conf.default' file will always be upgraded to the latest version, while your real config file will be safe out of harm's way. Please note that if you run `make upgrade' during an upgrade, your rsnapshot.conf may be modified slightly, and the original will then be saved in `rsnapshot.conf.backup' in the same directory.  File: rsnapshot-HOWTO.en.info, Node: Where to go for more info, Next: Modifying the config file, Prev: Create the config file, Up: Configuration 4.2 Where to go for more info ============================= The `rsnapshot.conf' config file is well commented, and much of it should be fairly self-explanatory. For a full reference of all the various options, please consult the rsnapshot man page. Type: man rsnapshot This will give you the complete documentation. However, it assumes that you already know what you're doing to a certain extent. If you just want to get something up and running, this tutorial is a better place to start. If your system can't find the man page, `/usr/local/man' probably isn't in your $MANPATH environmental variable. This is beyond the scope of this document, but if it isn't working for you, you can always read the newest man page on the rsnapshot web site at http://www.rsnapshot.org/ (http://www.rsnapshot.org/)  File: rsnapshot-HOWTO.en.info, Node: Modifying the config file, Next: Testing your config file, Prev: Where to go for more info, Up: Configuration 4.3 Modifying the config file ============================= In this example, we will be using the `/.snapshots/' directory to hold the filesystem snapshots. This is referred to as the snapshot root. Feel free to put this anywhere you have lots of free disk space. However, the examples in this document assume you have not changed this parameter, so you will have to substitute this in your commands if you put it somewhere else. Also please note that fields are separated by tabs, not spaces. The reason for this is so it's easier to specify file paths with spaces in them. * Menu: * cmd_cp:: * cmd_rsync:: * cmd_ssh:: * cmd_logger:: * cmd_du:: * link_dest:: * interval:: * backup:: * backup_script::  File: rsnapshot-HOWTO.en.info, Node: cmd_cp, Next: cmd_rsync, Up: Modifying the config file 4.3.1 cmd_cp ------------ If enabled, the cmd_cp parameter should contain the path to the GNU `cp' program on your filesystem. If you are using Linux, be sure to uncomment this by removing the hash mark (#) in front of it. If you are using BSD, Solaris, IRIX, or most other UNIX variants, you should leave this commented out. What makes GNU `cp' so special is that unlike the traditional UNIX `cp', it has the ability to make recursive copies of directories as hard links. If you don't have GNU `cp', there is a subroutine in rsnapshot that somewhat approximates this functionality (although it won't support more esoteric files such as device nodes, FIFOs, sockets, etc). This gets followed up by another call to rsync, which transfers the remaining special files, if any. In this way, rsnapshot can support all file types on every platform. The rule of thumb is that if you're on a Linux system, leave cmd_cp enabled. If you aren't on a Linux system, leave cmd_cp disabled. There are reports of GNU `cp' working on BSD and other non-Linux platforms, but there have also been some cases where problems have been encountered. If you enable cmd_cp on a non-Linux platform, please let the mailing list know how it worked out for you.  File: rsnapshot-HOWTO.en.info, Node: cmd_rsync, Next: cmd_ssh, Prev: cmd_cp, Up: Modifying the config file 4.3.2 cmd_rsync --------------- The cmd_rsync parameter must not be commented out, and it must point to a working version of `rsync'. If it doesn't, the program just will not work at all. Please note that if you are using IRIX, there is another program named `rsync' that is different than the real `rsync' most people know of. If you're on an IRIX machine, you should double check this.  File: rsnapshot-HOWTO.en.info, Node: cmd_ssh, Next: cmd_logger, Prev: cmd_rsync, Up: Modifying the config file 4.3.3 cmd_ssh ------------- If you have `ssh' installed on your system, you will want to uncomment the cmd_ssh parameter. By enabling `ssh', you can take snapshots of any number of remote systems. If you don't have `ssh', or plan to only take snapshots of the local filesystem, you may safely leave this commented out.  File: rsnapshot-HOWTO.en.info, Node: cmd_logger, Next: cmd_du, Prev: cmd_ssh, Up: Modifying the config file 4.3.4 cmd_logger ---------------- The cmd_logger parameter specifies the path to the `logger' program. `logger' is a command line interface to syslog. See the `logger' man page for more details. `logger' should be a standard part of most UNIX-like systems. It appears to have remained unchanged since about 1993, which is good for cross-platform stability. If you comment out this parameter, it will disable syslog support in rsnapshot. It is recommended that you leave this enabled.  File: rsnapshot-HOWTO.en.info, Node: cmd_du, Next: link_dest, Prev: cmd_logger, Up: Modifying the config file 4.3.5 cmd_du ------------ The cmd_du parameter specifies the path to the `du' program. `du' is a command line tool that reports on disk usage. rsnapshot uses `du' to generate reports about the actual amount of disk space taken up, which is otherwise difficult to estimate because of all the hard links. If you comment this out, rsnapshot will try to use the version of `du' it finds in your path, if possible. The GNU version of `du' is recommended, since it has the best selection of features, and supports the most options. The BSD version also seems to work, although some versions don't support the `-h' flag. Solaris `du' does not work at all, because it doesn't support the `-c' parameter.  File: rsnapshot-HOWTO.en.info, Node: link_dest, Next: interval, Prev: cmd_du, Up: Modifying the config file 4.3.6 link_dest --------------- If you have `rsync' version 2.5.7 or later, you may want to enable this. With link_dest enabled, rsnapshot relies on rsync to create recursive hard links, overriding GNU cp in most, but not all, cases. With link_dest enabled, every single file on your system can be backed up in one pass, on any operating system. To get the most out of rsnapshot on non-Linux platforms, link_dest should be enabled. Be advised, however, that if a remote host is unavailable during a backup, rsnapshot will take an extra step and roll back the files from the previous backup. Using GNU cp, this would not be necessary.  File: rsnapshot-HOWTO.en.info, Node: interval, Next: backup, Prev: link_dest, Up: Modifying the config file 4.3.7 interval -------------- rsnapshot has no idea how often you want to take snapshots. Everyone's backup scheme may be different. In order to specify how much data to save, you need to tell rsnapshot which intervals to keep, and how many of each. An interval, in the context of the rsnapshot config file, is a unit of time measurement. These can actually be named anything (as long as it's alphanumeric, and not a reserved word), but by convention we will call ours hourly and daily. In this example, we want to take a snapshot every four hours, or six times a day (these are the hourly intervals). We also want to keep a second set, which are taken once a day, and stored for a week (or seven days). This happens to be the default, so as you can see the config file reads: interval hourly 6 interval daily 7 It also has some other entries, but you can either ignore them or comment them out for now. Please note that the hourly interval is specified first. This is very important. The first interval line is assumed to be the smallest unit of time, with each additional line getting successively larger. Thus, if you add a yearly interval, it should go at the bottom, and if you add a minutes interval, it should go before hourly. It's also worth noting that the snapshots get pulled up from the smallest interval to the largest. In this example, the daily snapshots get pulled from the oldest hourly snapshot, not directly from the main filesystem.  File: rsnapshot-HOWTO.en.info, Node: backup, Next: backup_script, Prev: interval, Up: Modifying the config file 4.3.8 backup ------------ Please note that the destination paths specified here are based on the assumption that the -relative flag is being passed to `rsync' via the rsync_long_args parameter. If you are installing for the first time, this is the default setting. If you upgraded from a previous version, please read the `INSTALL' file that came with the source distribution for more information. This is the section where you tell rsnapshot what files you actually want to back up. You put a backup parameter first, followed by the full path to the directory or network path you're backing up. The third column is the relative path you want to back up to inside the snapshot root. Let's look at an example: backup /etc/ localhost/ In this example, backup tells us it's a backup point. `/etc/' is the full path to the directory we want to take snapshots of, and `localhost/' is a directory inside the snapshot_root we're going to put them in. Using the word localhost as the destination directory is just a convention. You might also choose to use the server's fully qualified domain name instead of localhost. If you are taking snapshots of several machines on one dedicated backup server, it's a good idea to use their various hostnames as directories to keep track of which files came from which server. In addition to full paths on the local filesystem, you can also backup remote systems using `rsync' over `ssh'. If you have `ssh' installed and enabled (via the cmd_ssh parameter), you can specify a path like: backup root@example.com:/etc/ example.com/ This behaves fundamentally the same way, but you must take a few extra things into account. * The ssh daemon must be running on example.com * You must have access to the account you specify the remote machine, in this case the root user on example.com. * You must have key-based logins enabled for the root user at example.com, without passphrases. If you wanted to perform backups as another user, you could specify the other user instead of root for the source (i.e. user@domain.com). Please note that allowing remote logins with no passphrase is a security risk that may or may not be acceptable in your situation. Make sure you guard access to the backup server very carefully! For more information on how to set this up, please consult the ssh man page, or a tutorial on using ssh public and private keys. You will find that the key based logins are better in many ways, not just for rsnapshot but for convenience and security in general. Troy Johnson (http://www.jdmz.net/rsnapshot)'s excellent tutorial on using nifty ssh features for secure snapshots which, in case his site ever suffers a mishap, is mirrored here (http://www.rsnapshot.org/howto/using-rsnapshot-and-ssh.html) on this site. * This backup occurs over the network, so it may be slower. Since this uses `rsync', this is most noticeable during the first backup. Depending on how much your data changes, subsequent backups should go much, much faster since rsync only sends the differences between files.  File: rsnapshot-HOWTO.en.info, Node: backup_script, Prev: backup, Up: Modifying the config file 4.3.9 backup_script ------------------- With this parameter, the second column is the full path to an executable backup script, and the third column is the local path you want to store it in (just like with the "backup" parameter). For example: backup_script /usr/local/bin/backup_pgsql.sh localhost/postgres/ In this example, rsnapshot will run the script `/usr/local/bin/backup_pgsql.sh' in a temp directory, then sync the results into the `localhost/postgres/' directory under the snapshot root. You can find the backup_pgsql.sh example script in the `utils/' directory of the source distribution. Feel free to modify it for your system. Your backup script simply needs to dump out the contents of whatever it does into it's current working directory. It can create as many files and/or directories as necessary, but it should not put its files in any pre-determined path. The reason for this is that rsnapshot creates a temp directory, changes to that directory, runs the backup script, and then syncs the contents of the temp directory to the local path you specified in the third column. A typical backup script would be one that archives the contents of a database. It might look like this: #!/bin/sh /usr/bin/mysqldump -uroot mydatabase > mydatabase.sql /bin/chmod 644 mydatabase.sql There are several example scripts in the `utils/' directory of the rsnapshot source distribution to give you more ideas. Make sure the destination path you specify is unique. The backup script will completely overwrite anything in the destination path, so if you tried to specify the same destination twice, you would be left with only the files from the last script. Fortunately, rsnapshot will try to prevent you from doing this when it reads the config file. Please remember that these backup scripts will be invoked as the user running rsnapshot. In our example, this is root. Make sure your backup scripts are owned by root, and not writable by anyone else. If you fail to do this, anyone with write access to these backup scripts will be able to put commands in them that will be run as the root user. If they are malicious, they could take over your server.  File: rsnapshot-HOWTO.en.info, Node: Testing your config file, Prev: Modifying the config file, Up: Configuration 4.4 Testing your config file ============================ When you have made all your changes, you should verify that the config file is syntactically valid, and that all the supporting programs are where you think they are. To do this, run rsnapshot with the configtest argument: rsnapshot configtest If all is well, it should say `Syntax OK'. If there's a problem, it should tell you exactly what it is. Make sure your config file is using tabs and not spaces, etc. The final step to test your configuration is to run rsnapshot in test mode. This will print out a verbose list of the things it will do, without actually doing them. To do a test run, run this command: rsnapshot -t hourly This tells rsnapshot to simulate an "hourly" backup. It should print out the commands it will perform when it runs for real. Please note that the test output might be slightly different than the real execution, but only because the test doesn't actually do things that may be checked for later in the program. For example, if the program will create a directory and then later test to see if that directory exists, the test run might claim that it would create the directory twice, since it didn't actually get created during the test. This should be the only type of difference you will see while running a test.  File: rsnapshot-HOWTO.en.info, Node: Automation, Next: How it works, Prev: Configuration, Up: Top 5 Automation ************ Now that you have your config file set up, it's time to set up rsnapshot to be run from cron. As the root user, edit root's crontab by typing: crontab -e You could alternately keep a crontab file that you load in, but the concepts are the same. You want to enter the following information into root's crontab: 0 */4 * * * /usr/local/bin/rsnapshot hourly 30 23 * * * /usr/local/bin/rsnapshot daily It is usually a good idea to schedule the larger intervals to run a bit before the lower ones. For example, in the crontab above, notice that daily runs 30 minutes before hourly. This helps prevent race conditions where the daily would try to run before the hourly job had finished. This same strategy should be extended so that a weekly entry would run before the daily and so on.  File: rsnapshot-HOWTO.en.info, Node: How it works, Next: Restoring backups, Prev: Automation, Up: Top 6 How it works ************** We have a snapshot root under which all backups are stored. By default, this is the directory `/.snapshots/'. Within this directory, other directories are created for the various intervals that have been defined. In the beginning it will be empty, but once rsnapshot has been running for a week, it should look something like this: [root@localhost]# ls -l /.snapshots/ drwxr-xr-x 7 root root 4096 Dec 28 00:00 daily.0 drwxr-xr-x 7 root root 4096 Dec 27 00:00 daily.1 drwxr-xr-x 7 root root 4096 Dec 26 00:00 daily.2 drwxr-xr-x 7 root root 4096 Dec 25 00:00 daily.3 drwxr-xr-x 7 root root 4096 Dec 24 00:00 daily.4 drwxr-xr-x 7 root root 4096 Dec 23 00:00 daily.5 drwxr-xr-x 7 root root 4096 Dec 22 00:00 daily.6 drwxr-xr-x 7 root root 4096 Dec 29 00:00 hourly.0 drwxr-xr-x 7 root root 4096 Dec 28 20:00 hourly.1 drwxr-xr-x 7 root root 4096 Dec 28 16:00 hourly.2 drwxr-xr-x 7 root root 4096 Dec 28 12:00 hourly.3 drwxr-xr-x 7 root root 4096 Dec 28 08:00 hourly.4 drwxr-xr-x 7 root root 4096 Dec 28 04:00 hourly.5 Inside each of these directories is a full backup of that point in time. The destination directory paths you specified under the backup and backup_script parameters get stuck directly under these directories. In the example: backup /etc/ localhost/ The `/etc/' directory will initially get backed up into `/.snapshots/hourly.0/localhost/etc/' Each subsequent time rsnapshot is run with the hourly command, it will rotate the `hourly.X' directories, and then copy the contents of the `hourly.0' directory (using hard links) into `hourly.1'. When `rsnapshot daily' is run, it will rotate all the `daily.X' directories, then copy the contents of `hourly.5' into `daily.0'. `hourly.0' will always contain the most recent snapshot, and `daily.6' will always contain a snapshot from a week ago. Unless the files change between snapshots, the full backups are really just multiple hard links to the same files. Thus, if your `/etc/passwd' file doesn't change in a week, `hourly.0/localhost/etc/passwd' and `daily.6/localhost/etc/passwd' will literally be the same exact file. This is how rsnapshot can be so efficient on space. If the file changes at any point, the next backup will unlink the hard link in `hourly.0', and replace it with a brand new file. This will now take double the disk space it did before, but it is still considerably less than it would be to have full unique copies of this file 13 times over. Remember that if you are using different intervals than the ones in this example, the first interval listed is the one that gets updates directly from the main filesystem. All subsequently listed intervals pull from the previous intervals. For example, if you had weekly, monthly, and yearly intervals defined (in that order), the weekly ones would get updated directly from the filesystem, the monthly ones would get updated from weekly, and the yearly ones would get updated from monthly.  File: rsnapshot-HOWTO.en.info, Node: Restoring backups, Next: Conclusion, Prev: How it works, Up: Top 7 Restoring backups ******************* When rsnapshot is first run, it will create the snapshot_root directory (`/.snapshots/' by default). It assigns this directory the permissions 700, and for good reason. The snapshot root will probably contain files owned by all sorts of users on your system. If any of these files are writeable (and of course some of them will be), the users will still have write access to their files. Thus, if they can see the snapshots directly, they can modify them, and the integrity of the snapshots can not be guaranteed. For example, if a user had write permission to the backups and accidentally ran `rm -rf /', they would delete all their files in their home directory and all the files they owned in the backups! * Menu: * root only:: * All users::  File: rsnapshot-HOWTO.en.info, Node: root only, Next: All users, Up: Restoring backups 7.1 root only ============= The simplest, but least flexible solution, is to simply deny non-root users access to the snapshot root altogether. The root user will still have access of course, and as with all other aspects of system administration, must be trusted not to go messing with things too much. However, by simply denying access to everyone, the root user will be the only one who can pull backups. This may or may not be desirable, depending on your situation. For a small setup or a single-user machine, this may be all you need.  File: rsnapshot-HOWTO.en.info, Node: All users, Prev: root only, Up: Restoring backups 7.2 All users ============= If users need to be able to pull their own backups, you will need to do a little extra work up front (but probably less work in the long run). The best way to do this seems to be creating a container directory for the snapshot root with 700 permissions, giving the snapshot root directory 755 permissions, and mounting the snapshot root for the users read-only. This can be done over NFS and Samba, to name two possibilities. Let's explore how to do this using NFS on a single machine: Set the snapshot_root variable in `/etc/rsnapshot.conf' equal to `/.private/.snapshots/' snapshot_root /.private/.snapshots/ Create the container directory: mkdir /.private/ Create the real snapshot root: mkdir /.private/.snapshots/ Create the read-only snapshot root mount point: mkdir /.snapshots/ Set the proper permissions on these new directories: chmod 0700 /.private/ chmod 0755 /.private/.snapshots/ chmod 0755 /.snapshots/ In `/etc/exports', add `/.private/.snapshots/' as a read only NFS export: /.private/.snapshots/ 127.0.0.1(ro,no_root_squash) In `/etc/fstab', mount `/.private/.snapshots/' read-only under `/.snapshots/' localhost:/.private/.snapshots/ /.snapshots/ nfs ro 0 0 You should now restart your NFS daemon. Now mount the read-only snapshot root: mount /.snapshots/ To test this, go into the /.snapshots/ directory as root. It is set to read-only, so even root shouldn't be able to write to it. As root, try: touch /.snapshots/testfile This should fail, citing insufficient permissions. This is what you want. It means that your users won't be able to mess with the snapshots either. Now, all your users have to do to recover old files is go into the /.snapshots directory, select the interval they want, and browse through the filesystem until they find the files they are looking for. They can't modify anything in here because NFS will prevent them, but they can copy anything that they had read permission for in the first place. All the regular filesystem permissions are still at work, but the read-only NFS mount prevents any writes from happening. Please note that some NFS configurations may prevent you from accessing files that are owned by root and set to only be readable by root. In this situation, you may wish to pull backups for root from the "real" snapshot root, and let non-privileged users pull from the read-only NFS mount.  File: rsnapshot-HOWTO.en.info, Node: Conclusion, Next: More resources, Prev: Restoring backups, Up: Top 8 Conclusion ************ If you followed the instructions in this document, you should now have rsnapshot installed and set up to perform automatic backups of your system. If it's not working, go back and trace your steps back to see if you can isolate the problem. The amount of disk space taken up will be equal to one full backup, plus an additional copy of every file that is changed. There is also a slight disk space overhead with creating multiple hard links, but it's not very much. On my system, adding a second, completely identical 3 Gigabyte interval alongside the original one only added about 15 Megabytes. You can use the du option to rsnapshot to generate disk usage reports. To see the sum total of all space used, try: rsnapshot du If you were storing backups under `localhost/home/' and wanted to see how much this subdirectory takes up throughout all your backups, try this instead: rsnapshot du localhost/home/ The latest version of this document and the rsnapshot program can always be found at http://www.rsnapshot.org/ (http://www.rsnapshot.org/)  File: rsnapshot-HOWTO.en.info, Node: More resources, Prev: Conclusion, Up: Top 9 More resources **************** *Web sites* Mike Rubel's original shell scripts, upon which this project is based http://www.mikerubel.org/computers/rsync_snapshots/ (http://www.mikerubel.org/computers/rsync_snapshots/) Perl http://www.perl.org/ (http://www.perl.org/) GNU cp and du (coreutils package) http://www.gnu.org/software/coreutils/ (http://www.gnu.org/software/coreutils/) rsync http://rsync.samba.org/ (http://rsync.samba.org/) OpenSSH http://www.openssh.org/ (http://www.openssh.org/) rsnapshot http://www.rsnapshot.org/ (http://www.rsnapshot.org/)  Tag Table: Node: Top174 Node: Introduction973 Node: What you will need2260 Node: Copyright and License2563 Node: Disclaimer3147 Node: Feedback3897 Node: Motivation4169 Node: Installation5957 Node: 30 second version [for the impatient]6734 Node: Untar the source code package7123 Node: Change to the source directory7553 Node: Decide where you want to install7820 Node: Run the configure script8653 Node: Install the program9877 Node: Configuration11099 Node: Create the config file11363 Node: Where to go for more info12348 Node: Modifying the config file13314 Node: cmd_cp14178 Node: cmd_rsync15522 Node: cmd_ssh16030 Node: cmd_logger16469 Node: cmd_du17070 Node: link_dest17889 Node: interval18640 Node: backup20239 Node: backup_script23559 Node: Testing your config file25874 Node: Automation27324 Node: How it works28274 Node: Restoring backups31646 Node: root only32548 Node: All users33184 Node: Conclusion35794 Node: More resources37007  End Tag Table rsnapshot-1.4.2/docs/docbook/rsnapshot-HOWTO.en.fo0000664000175000017500000043155212632661200021371 0ustar travistravis rsnapshot HOWTOrsnapshot HOWTOrsnapshot HOWTONathan Rosenquist <nathan@rsnapshot.org>2004-01-20Revision HistoryRevision 1.0.02005-01-31NRUpdated for rsnapshot 1.2.0Revision 0.9.72005-01-17NRSpelling corrections submitted by Nicolas KaiserRevision 0.9.62004-12-13NRMisc. updatesRevision 0.9.52004-07-10NRRelicensed document under GPL, instead of FDLRevision 0.9.42004-07-02NRAdded description of proper crontab time settingsRevision 0.9.32004-06-11NRMisc. updatesRevision 0.9.22004-05-16NRUpdated --link-dest infoRevision 0.9.12004-01-20NRAdded --link-dest infoRevision 0.92004-01-10NRFirst draftAbstract rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. This document is a tutorial in the installation and configuration of rsnapshot. Table of ContentsIntroduction What you will need Copyright and License Disclaimer Feedback Motivation Installation 30 second version (for the impatient) Untar the source code package Change to the source directory Decide where you want to install Run the configure script Install the program Configuration Create the config file Where to go for more info Modifying the config file Testing your config file Automation How it works Restoring backups root only All users Conclusion More resources IntroductionIntroductionrsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well.rsnapshot is written in Perl, and depends on rsync. OpenSSH, GNU cp, GNU du, and the BSD logger program are also recommended, but not required. All of these should be present on most Linux systems. rsnapshot is written with the lowest common denominator in mind. It only requires at minimum Perl 5.004 and rsync. As a result of this, it works on pretty much any UNIX-like system you care to throw at it. It has been successfully tested with Perl 5.004 through 5.8.2, on Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, NetBSD, and IRIX.The latest version of the program and this document can always be found at http://www.rsnapshot.org/.What you will needWhat you will needAt a minimum: perl, rsyncOptionally: ssh, logger, GNU cp, GNU duAdditionally, it will help if you have reasonably good sysadmin skills.Copyright and LicenseCopyright and LicenseThis document, rsnapshot HOWTO, is copyrighted (c) 2005 by Nathan Rosenquist. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of the license is available at http://www.gnu.org/copyleft/gpl.html.DisclaimerDisclaimerNo liability for the contents of this document can be accepted. Use the concepts, examples and information at your own risk. There may be errors and inaccuracies, that could be damaging to your system. Proceed with caution, and although this is highly unlikely, the author(s) do not take any responsibility.All copyrights are held by their by their respective owners, unless specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. Naming of particular products or brands should not be seen as endorsements.FeedbackFeedbackFeedback is most certainly welcome for this document. Send your additions, comments and criticisms to the following email address : <nathan@rsnapshot.org>.MotivationMotivationI originally used Mike Rubel's shell scripts to do rsync snapshots a while back. These worked very well, but there were a number of things that I wanted to improve upon. I had to write two shell scripts that were customized for my server. If I wanted to change the number of intervals stored, or the parts of the filesystem that were archived, that meant manually editing these shell scripts. If I wanted to install them on a different server with a different configuration, this meant manually editing the scripts for the new server, and hoping the logic and the sequence of operations was correct. Also, I was doing all the backups locally, on a single machine, on a single hard drive (just to protect from dumb user mistakes like deleting files). Never the less, I continued on with this system for a while, and it did work very well.Several months later, the IDE controller on my web server failed horribly (when I typed /sbin/shutdown, it said the command was not found). I was then faced with what was in the back of my mind all along: I had not been making regular remote backups of my server, and the local backups were of no use to me since the entire drive was corrupted. The reason I had only been making sporadic, partial remote backups is that they weren't automatic and effortless. Of course, this was no one's fault but my own, but I got frustrated enough to write a tool that would make automated remote snapshots so easy that I wouldn't ever have to worry about them again. This goal has long been reached, but work on rsnapshot still continues as people submit patches, request features, and ways are found to improve the program.InstallationInstallationThis section will walk you through the installation of rsnapshot, step by step. This is not the only way to do it, but it is a way that works and that is well documented. Feel free to improvise if you know what you're doing.This guide assumes you are installing rsnapshot 1.2.0 for the first time. If you are upgrading from an earlier version, please read the INSTALL file that comes with the source distribution instead.30 second version (for the impatient)30 second version (for the impatient)./configure --sysconfdir=/etc su make install cp /etc/rsnapshot.conf.default /etc/rsnapshot.confThe rest of this section is the long version.Untar the source code packageUntar the source code packagetar xzvf rsnapshot-1.2.0.tar.gzIf you don't have GNU tar, you may have to do this in two steps instead:gunzip rsnapshot-1.2.0.tar.gz tar xvf rsnapshot-1.2.0.tarChange to the source directoryChange to the source directorycd rsnapshot-1.2.0/Decide where you want to installDecide where you want to installBy default, the installation procedure will install all files under /usr/local. For this tutorial, this will be OK except we will install the config file under /etc.We are assuming that rsync, ssh, logger, and du are all in your search path. If this is not the case, you can specify the path to any of these programs using the typical Autoconf --with-program=/path/to/program syntax. For example, if Perl was in /opt/bin/perl and rsync was in /home/me/bin/rsync, you could run configure like:./configure --with-perl=/opt/bin/perl --with-rsync=/home/me/bin/rsyncRun the configure scriptRun the configure scriptThis will poke and prod your system to figure out where the various external programs that rsnapshot depends on live. It also generates the Makefile that we will use to install the program. The configure script accepts arguments that can be used to tell it where to install the program, and also where to find the supporting programs. For this installation, the only non-default option we want is to put the config file in the /etc directory. To do this, run this command at the shell:./configure --sysconfdir=/etcIf all goes well, you're ready to install the program. If there was a problem, it should be descriptive. Most likely a problem would be the result of something that was required and not found (like rsync or perl). If this happens, you must figure out where the missing program is located on your system, or install it if necessary. If you know where it is but configure couldn't find it, you can specify the path using the --with-program=/path/to/program options described above.Install the programInstall the programIf you've followed these instructions so far, you will have configured rsnapshot to be installed under /usr/local, with the config file in /etc. Under these circumstances, it will be necessary to become root to install the program. Now is the time to do so. You will, of course, need the root password to do this:suThis will prompt you for the root password.Now, to install rsnapshot, run the following command:make installThis will install rsnapshot with all the settings you specified in the ./configure stage. If all goes well, you will have the following files on your system:/usr/local/bin/rsnapshot The rsnapshot program/usr/local/man/man1/rsnapshot.1 Man page/etc/rsnapshot.conf.default The example config fileIf you decide later that you don't want rsnapshot on your system anymore, simply remove the files listed above, or run make uninstall in the same source directory you installed from. Of course, if you installed with different options, the location of these files may be different.ConfigurationConfigurationCreate the config fileCreate the config fileIn the install process, the config file is not created or installed. However, a working example is provided that you can copy. To copy the example config file into the location rsnapshot will be looking for the real config file:cp /etc/rsnapshot.conf.default /etc/rsnapshot.confAs a general rule, you should avoid modifying /etc/rsnapshot.conf.default, simply because it is a working example that you may wish to refer to later. Also, if you perform an upgrade, the rsnapshot.conf.default file will always be upgraded to the latest version, while your real config file will be safe out of harm's way. Please note that if you run make upgrade during an upgrade, your rsnapshot.conf may be modified slightly, and the original will then be saved in rsnapshot.conf.backup in the same directory.Where to go for more infoWhere to go for more infoThe rsnapshot.conf config file is well commented, and much of it should be fairly self-explanatory. For a full reference of all the various options, please consult the rsnapshot man page. Type:man rsnapshotThis will give you the complete documentation. However, it assumes that you already know what you're doing to a certain extent. If you just want to get something up and running, this tutorial is a better place to start. If your system can't find the man page, /usr/local/man probably isn't in your $MANPATH environmental variable. This is beyond the scope of this document, but if it isn't working for you, you can always read the newest man page on the rsnapshot web site at http://www.rsnapshot.org/Modifying the config fileModifying the config fileIn this example, we will be using the /.snapshots/ directory to hold the filesystem snapshots. This is referred to as the “snapshot rootâ€. Feel free to put this anywhere you have lots of free disk space. However, the examples in this document assume you have not changed this parameter, so you will have to substitute this in your commands if you put it somewhere else.Also please note that fields are separated by tabs, not spaces. The reason for this is so it's easier to specify file paths with spaces in them.cmd_cpIf enabled, the cmd_cp parameter should contain the path to the GNU cp program on your filesystem. If you are using Linux, be sure to uncomment this by removing the hash mark (#) in front of it. If you are using BSD, Solaris, IRIX, or most other UNIX variants, you should leave this commented out.What makes GNU cp so special is that unlike the traditional UNIX cp, it has the ability to make recursive “copies†of directories as hard links.If you don't have GNU cp, there is a subroutine in rsnapshot that somewhat approximates this functionality (although it won't support more esoteric files such as device nodes, FIFOs, sockets, etc). This gets followed up by another call to rsync, which transfers the remaining special files, if any. In this way, rsnapshot can support all file types on every platform.The rule of thumb is that if you're on a Linux system, leave cmd_cp enabled. If you aren't on a Linux system, leave cmd_cp disabled. There are reports of GNU cp working on BSD and other non-Linux platforms, but there have also been some cases where problems have been encountered. If you enable cmd_cp on a non-Linux platform, please let the mailing list know how it worked out for you.cmd_rsyncThe cmd_rsync parameter must not be commented out, and it must point to a working version of rsync. If it doesn't, the program just will not work at all.Please note that if you are using IRIX, there is another program named rsync that is different than the “real†rsync most people know of. If you're on an IRIX machine, you should double check this.cmd_sshIf you have ssh installed on your system, you will want to uncomment the cmd_ssh parameter. By enabling ssh, you can take snapshots of any number of remote systems. If you don't have ssh, or plan to only take snapshots of the local filesystem, you may safely leave this commented out.cmd_loggerThe cmd_logger parameter specifies the path to the logger program. logger is a command line interface to syslog. See the logger man page for more details. logger should be a standard part of most UNIX-like systems. It appears to have remained unchanged since about 1993, which is good for cross-platform stability. If you comment out this parameter, it will disable syslog support in rsnapshot. It is recommended that you leave this enabled.cmd_duThe cmd_du parameter specifies the path to the du program. du is a command line tool that reports on disk usage. rsnapshot uses du to generate reports about the actual amount of disk space taken up, which is otherwise difficult to estimate because of all the hard links.If you comment this out, rsnapshot will try to use the version of du it finds in your path, if possible. The GNU version of du is recommended, since it has the best selection of features, and supports the most options. The BSD version also seems to work, although some versions don't support the -h flag. Solaris du does not work at all, because it doesn't support the -c parameter.link_destIf you have rsync version 2.5.7 or later, you may want to enable this. With link_dest enabled, rsnapshot relies on rsync to create recursive hard links, overriding GNU cp in most, but not all, cases. With link_dest enabled, every single file on your system can be backed up in one pass, on any operating system. To get the most out of rsnapshot on non-Linux platforms, link_dest should be enabled. Be advised, however, that if a remote host is unavailable during a backup, rsnapshot will take an extra step and roll back the files from the previous backup. Using GNU cp, this would not be necessary.intervalrsnapshot has no idea how often you want to take snapshots. Everyone's backup scheme may be different. In order to specify how much data to save, you need to tell rsnapshot which “intervals†to keep, and how many of each. An interval, in the context of the rsnapshot config file, is a unit of time measurement. These can actually be named anything (as long as it's alphanumeric, and not a reserved word), but by convention we will call ours hourly and daily. In this example, we want to take a snapshot every four hours, or six times a day (these are the hourly intervals). We also want to keep a second set, which are taken once a day, and stored for a week (or seven days). This happens to be the default, so as you can see the config file reads:interval hourly 6 interval daily 7It also has some other entries, but you can either ignore them or comment them out for now.Please note that the hourly interval is specified first. This is very important. The first interval line is assumed to be the smallest unit of time, with each additional line getting successively larger. Thus, if you add a yearly interval, it should go at the bottom, and if you add a minutes interval, it should go before hourly. It's also worth noting that the snapshots get “pulled up†from the smallest interval to the largest. In this example, the daily snapshots get pulled from the oldest hourly snapshot, not directly from the main filesystem.backupPlease note that the destination paths specified here are based on the assumption that the --relative flag is being passed to rsync via the rsync_long_args parameter. If you are installing for the first time, this is the default setting. If you upgraded from a previous version, please read the INSTALL file that came with the source distribution for more information.This is the section where you tell rsnapshot what files you actually want to back up. You put a “backup†parameter first, followed by the full path to the directory or network path you're backing up. The third column is the relative path you want to back up to inside the snapshot root. Let's look at an example:backup /etc/ localhost/In this example, backup tells us it's a backup point. /etc/ is the full path to the directory we want to take snapshots of, and localhost/ is a directory inside the snapshot_root we're going to put them in. Using the word localhost as the destination directory is just a convention. You might also choose to use the server's fully qualified domain name instead of localhost. If you are taking snapshots of several machines on one dedicated backup server, it's a good idea to use their various hostnames as directories to keep track of which files came from which server.In addition to full paths on the local filesystem, you can also backup remote systems using rsync over ssh. If you have ssh installed and enabled (via the cmd_ssh parameter), you can specify a path like:backup root@example.com:/etc/ example.com/This behaves fundamentally the same way, but you must take a few extra things into account.•The ssh daemon must be running on example.com•You must have access to the account you specify the remote machine, in this case the root user on example.com.•You must have key-based logins enabled for the root user at example.com, without passphrases. If you wanted to perform backups as another user, you could specify the other user instead of root for the source (i.e. user@domain.com). Please note that allowing remote logins with no passphrase is a security risk that may or may not be acceptable in your situation. Make sure you guard access to the backup server very carefully! For more information on how to set this up, please consult the ssh man page, or a tutorial on using ssh public and private keys. You will find that the key based logins are better in many ways, not just for rsnapshot but for convenience and security in general. Troy Johnson [http://www.jdmz.net/rsnapshot]'s excellent tutorial on using nifty ssh features for secure snapshots which, in case his site ever suffers a mishap, is mirrored here [http://www.rsnapshot.org/howto/using-rsnapshot-and-ssh.html] on this site.•This backup occurs over the network, so it may be slower. Since this uses rsync, this is most noticeable during the first backup. Depending on how much your data changes, subsequent backups should go much, much faster since rsync only sends the differences between files.backup_scriptWith this parameter, the second column is the full path to an executable backup script, and the third column is the local path you want to store it in (just like with the "backup" parameter). For example:backup_script /usr/local/bin/backup_pgsql.sh localhost/postgres/In this example, rsnapshot will run the script /usr/local/bin/backup_pgsql.sh in a temp directory, then sync the results into the localhost/postgres/ directory under the snapshot root. You can find the backup_pgsql.sh example script in the utils/ directory of the source distribution. Feel free to modify it for your system.Your backup script simply needs to dump out the contents of whatever it does into it's current working directory. It can create as many files and/or directories as necessary, but it should not put its files in any pre-determined path. The reason for this is that rsnapshot creates a temp directory, changes to that directory, runs the backup script, and then syncs the contents of the temp directory to the local path you specified in the third column. A typical backup script would be one that archives the contents of a database. It might look like this:#!/bin/sh /usr/bin/mysqldump -uroot mydatabase > mydatabase.sql /bin/chmod 644 mydatabase.sqlThere are several example scripts in the utils/ directory of the rsnapshot source distribution to give you more ideas.Make sure the destination path you specify is unique. The backup script will completely overwrite anything in the destination path, so if you tried to specify the same destination twice, you would be left with only the files from the last script. Fortunately, rsnapshot will try to prevent you from doing this when it reads the config file.Please remember that these backup scripts will be invoked as the user running rsnapshot. In our example, this is root. Make sure your backup scripts are owned by root, and not writable by anyone else. If you fail to do this, anyone with write access to these backup scripts will be able to put commands in them that will be run as the root user. If they are malicious, they could take over your server.Testing your config fileTesting your config fileWhen you have made all your changes, you should verify that the config file is syntactically valid, and that all the supporting programs are where you think they are. To do this, run rsnapshot with the configtest argument:rsnapshot configtestIf all is well, it should say Syntax OK. If there's a problem, it should tell you exactly what it is. Make sure your config file is using tabs and not spaces, etc.The final step to test your configuration is to run rsnapshot in test mode. This will print out a verbose list of the things it will do, without actually doing them. To do a test run, run this command:rsnapshot -t hourlyThis tells rsnapshot to simulate an "hourly" backup. It should print out the commands it will perform when it runs for real. Please note that the test output might be slightly different than the real execution, but only because the test doesn't actually do things that may be checked for later in the program. For example, if the program will create a directory and then later test to see if that directory exists, the test run might claim that it would create the directory twice, since it didn't actually get created during the test. This should be the only type of difference you will see while running a test.AutomationAutomationNow that you have your config file set up, it's time to set up rsnapshot to be run from cron. As the root user, edit root's crontab by typing:crontab -eYou could alternately keep a crontab file that you load in, but the concepts are the same. You want to enter the following information into root's crontab: 0 */4 * * * /usr/local/bin/rsnapshot hourly 30 23 * * * /usr/local/bin/rsnapshot daily It is usually a good idea to schedule the larger intervals to run a bit before the lower ones. For example, in the crontab above, notice that daily runs 30 minutes before hourly. This helps prevent race conditions where the daily would try to run before the hourly job had finished. This same strategy should be extended so that a weekly entry would run before the daily and so on. How it worksHow it worksWe have a snapshot root under which all backups are stored. By default, this is the directory /.snapshots/. Within this directory, other directories are created for the various intervals that have been defined. In the beginning it will be empty, but once rsnapshot has been running for a week, it should look something like this: [root@localhost]# ls -l /.snapshots/ drwxr-xr-x 7 root root 4096 Dec 28 00:00 daily.0 drwxr-xr-x 7 root root 4096 Dec 27 00:00 daily.1 drwxr-xr-x 7 root root 4096 Dec 26 00:00 daily.2 drwxr-xr-x 7 root root 4096 Dec 25 00:00 daily.3 drwxr-xr-x 7 root root 4096 Dec 24 00:00 daily.4 drwxr-xr-x 7 root root 4096 Dec 23 00:00 daily.5 drwxr-xr-x 7 root root 4096 Dec 22 00:00 daily.6 drwxr-xr-x 7 root root 4096 Dec 29 00:00 hourly.0 drwxr-xr-x 7 root root 4096 Dec 28 20:00 hourly.1 drwxr-xr-x 7 root root 4096 Dec 28 16:00 hourly.2 drwxr-xr-x 7 root root 4096 Dec 28 12:00 hourly.3 drwxr-xr-x 7 root root 4096 Dec 28 08:00 hourly.4 drwxr-xr-x 7 root root 4096 Dec 28 04:00 hourly.5 Inside each of these directories is a “full†backup of that point in time. The destination directory paths you specified under the backup and backup_script parameters get stuck directly under these directories. In the example:backup /etc/ localhost/The /etc/ directory will initially get backed up into /.snapshots/hourly.0/localhost/etc/Each subsequent time rsnapshot is run with the hourly command, it will rotate the hourly.X directories, and then “copy†the contents of the hourly.0 directory (using hard links) into hourly.1.When rsnapshot daily is run, it will rotate all the daily.X directories, then copy the contents of hourly.5 into daily.0.hourly.0 will always contain the most recent snapshot, and daily.6 will always contain a snapshot from a week ago. Unless the files change between snapshots, the “full†backups are really just multiple hard links to the same files. Thus, if your /etc/passwd file doesn't change in a week, hourly.0/localhost/etc/passwd and daily.6/localhost/etc/passwd will literally be the same exact file. This is how rsnapshot can be so efficient on space. If the file changes at any point, the next backup will unlink the hard link in hourly.0, and replace it with a brand new file. This will now take double the disk space it did before, but it is still considerably less than it would be to have full unique copies of this file 13 times over.Remember that if you are using different intervals than the ones in this example, the first interval listed is the one that gets updates directly from the main filesystem. All subsequently listed intervals pull from the previous intervals. For example, if you had weekly, monthly, and yearly intervals defined (in that order), the weekly ones would get updated directly from the filesystem, the monthly ones would get updated from weekly, and the yearly ones would get updated from monthly.Restoring backupsRestoring backupsWhen rsnapshot is first run, it will create the snapshot_root directory (/.snapshots/ by default). It assigns this directory the permissions 700, and for good reason. The snapshot root will probably contain files owned by all sorts of users on your system. If any of these files are writeable (and of course some of them will be), the users will still have write access to their files. Thus, if they can see the snapshots directly, they can modify them, and the integrity of the snapshots can not be guaranteed.For example, if a user had write permission to the backups and accidentally ran rm -rf /, they would delete all their files in their home directory and all the files they owned in the backups!root onlyroot onlyThe simplest, but least flexible solution, is to simply deny non-root users access to the snapshot root altogether. The root user will still have access of course, and as with all other aspects of system administration, must be trusted not to go messing with things too much. However, by simply denying access to everyone, the root user will be the only one who can pull backups. This may or may not be desirable, depending on your situation. For a small setup or a single-user machine, this may be all you need.All usersAll usersIf users need to be able to pull their own backups, you will need to do a little extra work up front (but probably less work in the long run). The best way to do this seems to be creating a container directory for the snapshot root with 700 permissions, giving the snapshot root directory 755 permissions, and mounting the snapshot root for the users read-only. This can be done over NFS and Samba, to name two possibilities. Let's explore how to do this using NFS on a single machine:Set the snapshot_root variable in /etc/rsnapshot.conf equal to /.private/.snapshots/snapshot_root /.private/.snapshots/Create the container directory:mkdir /.private/Create the real snapshot root:mkdir /.private/.snapshots/Create the read-only snapshot root mount point:mkdir /.snapshots/Set the proper permissions on these new directories:chmod 0700 /.private/ chmod 0755 /.private/.snapshots/ chmod 0755 /.snapshots/In /etc/exports, add /.private/.snapshots/ as a read only NFS export:/.private/.snapshots/ 127.0.0.1(ro,no_root_squash)In /etc/fstab, mount /.private/.snapshots/ read-only under /.snapshots/localhost:/.private/.snapshots/ /.snapshots/ nfs ro 0 0You should now restart your NFS daemon.Now mount the read-only snapshot root:mount /.snapshots/To test this, go into the /.snapshots/ directory as root. It is set to read-only, so even root shouldn't be able to write to it. As root, try:touch /.snapshots/testfileThis should fail, citing insufficient permissions. This is what you want. It means that your users won't be able to mess with the snapshots either.Now, all your users have to do to recover old files is go into the /.snapshots directory, select the interval they want, and browse through the filesystem until they find the files they are looking for. They can't modify anything in here because NFS will prevent them, but they can copy anything that they had read permission for in the first place. All the regular filesystem permissions are still at work, but the read-only NFS mount prevents any writes from happening.Please note that some NFS configurations may prevent you from accessing files that are owned by root and set to only be readable by root. In this situation, you may wish to pull backups for root from the "real" snapshot root, and let non-privileged users pull from the read-only NFS mount.ConclusionConclusionIf you followed the instructions in this document, you should now have rsnapshot installed and set up to perform automatic backups of your system. If it's not working, go back and trace your steps back to see if you can isolate the problem.The amount of disk space taken up will be equal to one full backup, plus an additional copy of every file that is changed. There is also a slight disk space overhead with creating multiple hard links, but it's not very much. On my system, adding a second, completely identical 3 Gigabyte interval alongside the original one only added about 15 Megabytes.You can use the du option to rsnapshot to generate disk usage reports. To see the sum total of all space used, try:rsnapshot duIf you were storing backups under localhost/home/ and wanted to see how much this subdirectory takes up throughout all your backups, try this instead:rsnapshot du localhost/home/The latest version of this document and the rsnapshot program can always be found at http://www.rsnapshot.org/More resourcesMore resourcesWeb sitesMike Rubel's original shell scripts, upon which this project is based http://www.mikerubel.org/computers/rsync_snapshots/ Perl http://www.perl.org/ GNU cp and du (coreutils package) http://www.gnu.org/software/coreutils/ rsync http://rsync.samba.org/ OpenSSH http://www.openssh.org/ rsnapshot http://www.rsnapshot.org/ rsnapshot-1.4.2/docs/docbook/rest.mk0000664000175000017500000000127412632661200017023 0ustar travistravisRHFLAGS = --no-toc-backlinks \ # --link-stylesheet \ # --stylesheet=http://twb.ath.cx/share/article.css \ # --trim-footnote-reference-space RLFLAGS = --output-encoding=utf8:strict \ --use-latex-toc \ --table-style=booktabs \ # --hyperlink-color=0 \ # --documentclass=book .txt.html: rst2html $(RHFLAGS) $< $@ .txt.tex: rst2latex $(RLFLAGS) $< $@ .tex.pdf: rubber --inplace --pdf $* rubber --inplace --clean $* .SUFFIXES: .txt .html .tex .pdf none: all: $(patsubst %.txt,%.html,$(wildcard *.txt)) all: $(patsubst %.txt,%.pdf,$(wildcard *.txt)) clean: bash -c 'rm -f *.{aux,log,out}' distclean: clean bash -c 'rm -f *.{html,pdf}' .PHONY: none all clean distclean rsnapshot-1.4.2/docs/docbook/README0000664000175000017500000000020112632661200016362 0ustar travistravisOn Debian, you need the following packages: xsltproc docbook-xsl docbook-xml fop docbook2x texinfo rsnapshot-1.4.2/docs/docbook/rest.txt0000664000175000017500000010124512632661200017232 0ustar travistravis================= rsnapshot HOWTO ================= :Author: Nathan Rosenquist :Date: 2004-01-20 :Copyright: 2005 Nathan Rosenquist :Abstract: rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. This document is a tutorial in the installation and configuration of rsnapshot. .. comment: This document is marked up in reStructured Text format. See http://docutils.sf.net/ for more information. .. Contents:: Introduction ====================================================================== rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. rsnapshot is written in Perl, and depends on rsync. OpenSSH, GNU cp, GNU du, and the BSD logger program are also recommended, but not required. All of these should be present on most Linux systems. rsnapshot is written with the lowest common denominator in mind. It only requires at minimum Perl 5.004 and rsync. As a result of this, it works on pretty much any UNIX-like system you care to throw at it. It has been successfully tested with Perl 5.004 through 5.8.2, on Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, NetBSD, and IRIX. The latest version of the program and this document can always be found at http://www.rsnapshot.org/. What you will need ------------------------------------------------------------ At a minimum: perl, rsync Optionally: ssh, logger, GNU cp, GNU du Additionally, it will help if you have reasonably good sysadmin skills. Copyright and License ------------------------------------------------------------ This document, rsnapshot HOWTO, is copyrighted © 2005 by Nathan Rosenquist. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of the license is available at http://www.gnu.org/ copyleft/gpl.html. Disclaimer ------------------------------------------------------------ No liability for the contents of this document can be accepted. Use the concepts, examples and information at your own risk. There may be errors and inaccuracies, that could be damaging to your system. Proceed with caution, and although this is highly unlikely, the author(s) do not take any responsibility. All copyrights are held by their by their respective owners, unless specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. Naming of particular products or brands should not be seen as endorsements. Feedback ------------------------------------------------------------ Feedback is most certainly welcome for this document. Send your additions, comments and criticisms to the following email address: nathan@rsnapshot.org. Motivation ====================================================================== I originally used Mike Rubel's shell scripts to do rsync snapshots a while back. These worked very well, but there were a number of things that I wanted to improve upon. I had to write two shell scripts that were customized for my server. If I wanted to change the number of intervals stored, or the parts of the filesystem that were archived, that meant manually editing these shell scripts. If I wanted to install them on a different server with a different configuration, this meant manually editing the scripts for the new server, and hoping the logic and the sequence of operations was correct. Also, I was doing all the backups locally, on a single machine, on a single hard drive (just to protect from dumb user mistakes like deleting files). Never the less, I continued on with this system for a while, and it did work very well. Several months later, the IDE controller on my web server failed horribly (when I typed /sbin/shutdown, it said the command was not found). I was then faced with what was in the back of my mind all along: I had not been making regular remote backups of my server, and the local backups were of no use to me since the entire drive was corrupted. The reason I had only been making sporadic, partial remote backups is that they weren't automatic and effortless. Of course, this was no one's fault but my own, but I got frustrated enough to write a tool that would make automated remote snapshots so easy that I wouldn't ever have to worry about them again. This goal has long been reached, but work on rsnapshot still continues as people submit patches, request features, and ways are found to improve the program. Installation ====================================================================== This section will walk you through the installation of rsnapshot, step by step. This is not the only way to do it, but it is a way that works and that is well documented. Feel free to improvise if you know what you're doing. This guide assumes you are installing rsnapshot 1.2.0 for the first time. If you are upgrading from an earlier version, please read the INSTALL file that comes with the source distribution instead. 30 second version (for the impatient) ------------------------------------------------------------ :: ./configure --sysconfdir=/etc su make install cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf The rest of this section is the long version. Untar the source code package ------------------------------------------------------------ :: tar xzvf rsnapshot-1.2.0.tar.gz If you don't have GNU tar, you may have to do this in two steps instead:: gunzip rsnapshot-1.2.0.tar.gz tar xvf rsnapshot-1.2.0.tar Change to the source directory ------------------------------------------------------------ :: cd rsnapshot-1.2.0/ Decide where you want to install ------------------------------------------------------------ By default, the installation procedure will install all files under /usr/local. For this tutorial, this will be OK except we will install the config file under /etc. We are assuming that rsync, ssh, logger, and du are all in your search path. If this is not the case, you can specify the path to any of these programs using the typical Autoconf --with-program=/path/to/program syntax. For example, if Perl was in /opt/bin/perl and rsync was in /home/me/bin/rsync, you could run configure like:: ./configure --with-perl=/opt/bin/perl --with-rsync=/home/me/bin/rsync Run the configure script ------------------------------------------------------------ This will poke and prod your system to figure out where the various external programs that rsnapshot depends on live. It also generates the Makefile that we will use to install the program. The configure script accepts arguments that can be used to tell it where to install the program, and also where to find the supporting programs. For this installation, the only non-default option we want is to put the config file in the /etc directory. To do this, run this command at the shell:: ./configure --sysconfdir=/etc If all goes well, you're ready to install the program. If there was a problem, it should be descriptive. Most likely a problem would be the result of something that was required and not found (like rsync or perl). If this happens, you must figure out where the missing program is located on your system, or install it if necessary. If you know where it is but configure couldn't find it, you can specify the path using the --with-program=/path/to/program options described above. Install the program ------------------------------------------------------------ If you've followed these instructions so far, you will have configured rsnapshot to be installed under /usr/local, with the config file in /etc. Under these circumstances, it will be necessary to become root to install the program. Now is the time to do so. You will, of course, need the root password to do this:: su This will prompt you for the root password. Now, to install rsnapshot, run the following command:: make install This will install rsnapshot with all the settings you specified in the ./configure stage. If all goes well, you will have the following files on your system: /usr/local/bin/rsnapshot The rsnapshot program /usr/local/man/man1/rsnapshot.1 Man page /etc/rsnapshot.conf.default The example config file If you decide later that you don't want rsnapshot on your system anymore, simply remove the files listed above, or run ``make uninstall`` in the same source directory you installed from. Of course, if you installed with different options, the location of these files may be different. Configuration ====================================================================== Create the config file ------------------------------------------------------------ In the install process, the config file is not created or installed. However, a working example is provided that you can copy. To copy the example config file into the location rsnapshot will be looking for the real config file:: cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf As a general rule, you should avoid modifying /etc/rsnapshot.conf.default, simply because it is a working example that you may wish to refer to later. Also, if you perform an upgrade, the rsnapshot.conf.default file will always be upgraded to the latest version, while your real config file will be safe out of harm's way. Please note that if you run ``make upgrade`` during an upgrade, your rsnapshot.conf may be modified slightly, and the original will then be saved in rsnapshot.conf.backup in the same directory. Where to go for more info ------------------------------------------------------------ The rsnapshot.conf config file is well commented, and much of it should be fairly self-explanatory. For a full reference of all the various options, please consult the rsnapshot man page. Type:: man rsnapshot This will give you the complete documentation. However, it assumes that you already know what you're doing to a certain extent. If you just want to get something up and running, this tutorial is a better place to start. If your system can't find the man page, /usr/local/man probably isn't in your $MANPATH environmental variable. This is beyond the scope of this document, but if it isn't working for you, you can always read the newest man page on the rsnapshot web site at http://www.rsnapshot.org/ Modifying the config file ------------------------------------------------------------ In this example, we will be using the /.snapshots/ directory to hold the filesystem snapshots. This is referred to as the "snapshot root". Feel free to put this anywhere you have lots of free disk space. However, the examples in this document assume you have not changed this parameter, so you will have to substitute this in your commands if you put it somewhere else. Also please note that fields are separated by tabs, not spaces. The reason for this is so it's easier to specify file paths with spaces in them. cmd_cp ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If enabled, the cmd_cp parameter should contain the path to the GNU cp program on your filesystem. If you are using Linux, be sure to uncomment this by removing the octothorpe (#) in front of it. If you are using BSD, Solaris, IRIX, or most other UNIX variants, you should leave this commented out. What makes GNU cp so special is that unlike the traditional UNIX cp, it has the ability to make recursive "copies" of directories as hard links. If you don't have GNU cp, there is a subroutine in rsnapshot that somewhat approximates this functionality (although it won't support more esoteric files such as device nodes, FIFOs, sockets, etc). This gets followed up by another call to rsync, which transfers the remaining special files, if any. In this way, rsnapshot can support all file types on every platform. The rule of thumb is that if you're on a Linux system, leave cmd_cp enabled. If you aren't on a Linux system, leave cmd_cp disabled. There are reports of GNU cp working on BSD and other non-Linux platforms, but there have also been some cases where problems have been encountered. If you enable cmd_cp on a non-Linux platform, please let the mailing list know how it worked out for you. cmd_rsync ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The cmd_rsync parameter must not be commented out, and it must point to a working version of rsync. If it doesn't, the program just will not work at all. Please note that if you are using IRIX, there is another program named rsync that is different than the "real" rsync most people know of. If you're on an IRIX machine, you should double check this. cmd_ssh ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you have ssh installed on your system, you will want to uncomment the cmd_ssh parameter. By enabling ssh, you can take snapshots of any number of remote systems. If you don't have ssh, or plan to only take snapshots of the local filesystem, you may safely leave this commented out. cmd_logger ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The cmd_logger parameter specifies the path to the logger program. logger is a command line interface to syslog. See the logger man page for more details. logger should be a standard part of most UNIX-like systems. It appears to have remained unchanged since about 1993, which is good for cross-platform stability. If you comment out this parameter, it will disable syslog support in rsnapshot. It is recommended that you leave this enabled. cmd_du ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The cmd_du parameter specifies the path to the du program. du is a command line tool that reports on disk usage. rsnapshot uses du to generate reports about the actual amount of disk space taken up, which is otherwise difficult to estimate because of all the hard links. If you comment this out, rsnapshot will try to use the version of du it finds in your path, if possible. The GNU version of du is recommended, since it has the best selection of features, and supports the most options. The BSD version also seems to work, although some versions don't support the -h flag. Solaris du does not work at all, because it doesn't support the -c parameter. link_dest ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you have rsync version 2.5.7 or later, you may want to enable this. With link_dest enabled, rsnapshot relies on rsync to create recursive hard links, overriding GNU cp in most, but not all, cases. With link_dest enabled, every single file on your system can be backed up in one pass, on any operating system. To get the most out of rsnapshot on non-Linux platforms, link_dest should be enabled. Be advised, however, that if a remote host is unavailable during a backup, rsnapshot will take an extra step and roll back the files from the previous backup. Using GNU cp, this would not be necessary. interval ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ rsnapshot has no idea how often you want to take snapshots. Everyone's backup scheme may be different. In order to specify how much data to save, you need to tell rsnapshot which "intervals" to keep, and how many of each. An interval, in the context of the rsnapshot config file, is a unit of time measurement. These can actually be named anything (as long as it's alphanumeric, and not a reserved word), but by convention we will call ours hourly and daily. In this example, we want to take a snapshot every four hours, or six times a day (these are the hourly intervals). We also want to keep a second set, which are taken once a day, and stored for a week (or seven days). This happens to be the default, so as you can see the config file reads:: interval hourly 6 interval daily 7 It also has some other entries, but you can either ignore them or comment them out for now. Please note that the hourly interval is specified first. This is very important. The first interval line is assumed to be the smallest unit of time, with each additional line getting successively larger. Thus, if you add a yearly interval, it should go at the bottom, and if you add a minutes interval, it should go before hourly. It's also worth noting that the snapshots get "pulled up" from the smallest interval to the largest. In this example, the daily snapshots get pulled from the oldest hourly snapshot, not directly from the main filesystem. backup ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Please note that the destination paths specified here are based on the assumption that the --relative flag is being passed to rsync via the rsync_long_args parameter. If you are installing for the first time, this is the default setting. If you upgraded from a previous version, please read the INSTALL file that came with the source distribution for more information. This is the section where you tell rsnapshot what files you actually want to back up. You put a "backup" parameter first, followed by the full path to the directory or network path you're backing up. The third column is the relative path you want to back up to inside the snapshot root. Let's look at an example:: backup /etc/ localhost/ In this example, backup tells us it's a backup point. /etc/ is the full path to the directory we want to take snapshots of, and localhost/ is a directory inside the snapshot_root we're going to put them in. Using the word localhost as the destination directory is just a convention. You might also choose to use the server's fully qualified domain name instead of localhost. If you are taking snapshots of several machines on one dedicated backup server, it's a good idea to use their various hostnames as directories to keep track of which files came from which server. In addition to full paths on the local filesystem, you can also backup remote systems using rsync over ssh. If you have ssh installed and enabled (via the cmd_ssh parameter), you can specify a path like:: backup root@example.com:/etc/ example.com/ This behaves fundamentally the same way, but you must take a few extra things into account. - The ssh daemon must be running on example.com - You must have access to the account you specify the remote machine, in this case the root user on example.com. - You must have key-based logins enabled for the root user at example.com, without passphrases. If you wanted to perform backups as another user, you could specify the other user instead of root for the source (i.e. user@domain.com). Please note that allowing remote logins with no passphrase is a security risk that may or may not be acceptable in your situation. Make sure you guard access to the backup server very carefully! For more information on how to set this up, please consult the ssh man page, or a tutorial on using ssh public and private keys. You will find that the key based logins are better in many ways, not just for rsnapshot but for convenience and security in general. `Troy Johnson`__'s excellent tutorial on using nifty ssh features for secure snapshots which, in case his site ever suffers a mishap, is mirrored `here`__ on this site. .. __: http://www.jdmz.net/rsnapshot .. __: http://www.rsnapshot.org/howto/using-rsnapshot-and-ssh.html - This backup occurs over the network, so it may be slower. Since this uses rsync, this is most noticeable during the first backup. Depending on how much your data changes, subsequent backups should go much, much faster since rsync only sends the differences between files. backup_script ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ With this parameter, the second column is the full path to an executable backup script, and the third column is the local path you want to store it in (just like with the "backup" parameter). For example:: backup_script /usr/local/bin/backup_pgsql.sh localhost/postgres/ In this example, rsnapshot will run the script /usr/local/bin/backup_pgsql.sh in a temp directory, then sync the results into the localhost/postgres/ directory under the snapshot root. You can find the backup_pgsql.sh example script in the utils/ directory of the source distribution. Feel free to modify it for your system. Your backup script simply needs to dump out the contents of whatever it does into it's current working directory. It can create as many files and/or directories as necessary, but it should not put its files in any pre-determined path. The reason for this is that rsnapshot creates a temp directory, changes to that directory, runs the backup script, and then syncs the contents of the temp directory to the local path you specified in the third column. A typical backup script would be one that archives the contents of a database. It might look like this:: #!/bin/sh /usr/bin/mysqldump -uroot mydatabase > mydatabase.sql /bin/chmod 644 mydatabase.sql There are several example scripts in the utils/ directory of the rsnapshot source distribution to give you more ideas. Make sure the destination path you specify is unique. The backup script will completely overwrite anything in the destination path, so if you tried to specify the same destination twice, you would be left with only the files from the last script. Fortunately, rsnapshot will try to prevent you from doing this when it reads the config file. Please remember that these backup scripts will be invoked as the user running rsnapshot. In our example, this is root. Make sure your backup scripts are owned by root, and not writable by anyone else. If you fail to do this, anyone with write access to these backup scripts will be able to put commands in them that will be run as the root user. If they are malicious, they could take over your server. Testing your config file ------------------------------------------------------------ When you have made all your changes, you should verify that the config file is syntactically valid, and that all the supporting programs are where you think they are. To do this, run rsnapshot with the configtest argument:: rsnapshot configtest If all is well, it should say Syntax OK. If there's a problem, it should tell you exactly what it is. Make sure your config file is using tabs and not spaces, etc. The final step to test your configuration is to run rsnapshot in test mode. This will print out a verbose list of the things it will do, without actually doing them. To do a test run, run this command:: rsnapshot -t hourly This tells rsnapshot to simulate an "hourly" backup. It should print out the commands it will perform when it runs for real. Please note that the test output might be slightly different than the real execution, but only because the test doesn't actually do things that may be checked for later in the program. For example, if the program will create a directory and then later test to see if that directory exists, the test run might claim that it would create the directory twice, since it didn't actually get created during the test. This should be the only type of difference you will see while running a test. Automation ====================================================================== Now that you have your config file set up, it's time to set up rsnapshot to be run from cron. As the root user, edit root's crontab by typing:: crontab -e You could alternately keep a crontab file that you load in, but the concepts are the same. You want to enter the following information into root's crontab:: 0 */4 * * * /usr/local/bin/rsnapshot hourly 30 23 * * * /usr/local/bin/rsnapshot daily It is usually a good idea to schedule the larger intervals to run a bit before the lower ones. For example, in the crontab above, notice that daily runs 30 minutes before hourly. This helps prevent race conditions where the daily would try to run before the hourly job had finished. This same strategy should be extended so that a weekly entry would run before the daily and so on. How it works ====================================================================== We have a snapshot root under which all backups are stored. By default, this is the directory /.snapshots/. Within this directory, other directories are created for the various intervals that have been defined. In the beginning it will be empty, but once rsnapshot has been running for a week, it should look something like this:: [root@localhost]# ls -l /.snapshots/ drwxr-xr-x 7 root root 4096 Dec 28 00:00 daily.0 drwxr-xr-x 7 root root 4096 Dec 27 00:00 daily.1 drwxr-xr-x 7 root root 4096 Dec 26 00:00 daily.2 drwxr-xr-x 7 root root 4096 Dec 25 00:00 daily.3 drwxr-xr-x 7 root root 4096 Dec 24 00:00 daily.4 drwxr-xr-x 7 root root 4096 Dec 23 00:00 daily.5 drwxr-xr-x 7 root root 4096 Dec 22 00:00 daily.6 drwxr-xr-x 7 root root 4096 Dec 29 00:00 hourly.0 drwxr-xr-x 7 root root 4096 Dec 28 20:00 hourly.1 drwxr-xr-x 7 root root 4096 Dec 28 16:00 hourly.2 drwxr-xr-x 7 root root 4096 Dec 28 12:00 hourly.3 drwxr-xr-x 7 root root 4096 Dec 28 08:00 hourly.4 drwxr-xr-x 7 root root 4096 Dec 28 04:00 hourly.5 Inside each of these directories is a "full" backup of that point in time. The destination directory paths you specified under the backup and backup_script parameters get stuck directly under these directories. In the example:: backup /etc/ localhost/ The /etc/ directory will initially get backed up into /.snapshots/hourly.0/localhost/etc/ Each subsequent time rsnapshot is run with the hourly command, it will rotate the hourly.X directories, and then "copy" the contents of the hourly.0 directory (using hard links) into hourly.1. When rsnapshot daily is run, it will rotate all the daily.X directories, then copy the contents of hourly.5 into daily.0. hourly.0 will always contain the most recent snapshot, and daily.6 will always contain a snapshot from a week ago. Unless the files change between snapshots, the "full" backups are really just multiple hard links to the same files. Thus, if your /etc/passwd file doesn't change in a week, hourly.0/localhost/etc/passwd and daily.6/localhost/etc /passwd will literally be the same exact file. This is how rsnapshot can be so efficient on space. If the file changes at any point, the next backup will unlink the hard link in hourly.0, and replace it with a brand new file. This will now take double the disk space it did before, but it is still considerably less than it would be to have full unique copies of this file 13 times over. Remember that if you are using different intervals than the ones in this example, the first interval listed is the one that gets updates directly from the main filesystem. All subsequently listed intervals pull from the previous intervals. For example, if you had weekly, monthly, and yearly intervals defined (in that order), the weekly ones would get updated directly from the filesystem, the monthly ones would get updated from weekly, and the yearly ones would get updated from monthly. Restoring backups ====================================================================== When rsnapshot is first run, it will create the snapshot_root directory (/.snapshots/ by default). It assigns this directory the permissions 700, and for good reason. The snapshot root will probably contain files owned by all sorts of users on your system. If any of these files are writeable (and of course some of them will be), the users will still have write access to their files. Thus, if they can see the snapshots directly, they can modify them, and the integrity of the snapshots can not be guaranteed. For example, if a user had write permission to the backups and accidentally ran rm -rf /, they would delete all their files in their home directory and all the files they owned in the backups! root only ------------------------------------------------------------ The simplest, but least flexible solution, is to simply deny non-root users access to the snapshot root altogether. The root user will still have access of course, and as with all other aspects of system administration, must be trusted not to go messing with things too much. However, by simply denying access to everyone, the root user will be the only one who can pull backups. This may or may not be desirable, depending on your situation. For a small setup or a single-user machine, this may be all you need. All users ------------------------------------------------------------ If users need to be able to pull their own backups, you will need to do a little extra work up front (but probably less work in the long run). The best way to do this seems to be creating a container directory for the snapshot root with 700 permissions, giving the snapshot root directory 755 permissions, and mounting the snapshot root for the users read-only. This can be done over NFS and Samba, to name two possibilities. Let's explore how to do this using NFS on a single machine: Set the snapshot_root variable in /etc/rsnapshot.conf equal to /.private/.snapshots/ :: snapshot_root /.private/.snapshots/ Create the container directory:: mkdir /.private/ Create the real snapshot root:: mkdir /.private/.snapshots/ Create the read-only snapshot root mount point:: mkdir /.snapshots/ Set the proper permissions on these new directories:: chmod 0700 /.private/ chmod 0755 /.private/.snapshots/ chmod 0755 /.snapshots/ In /etc/exports, add /.private/.snapshots/ as a read only NFS export:: /.private/.snapshots/ 127.0.0.1(ro,no_root_squash) In /etc/fstab, mount /.private/.snapshots/ read-only under /.snapshots/ :: localhost:/.private/.snapshots/ /.snapshots/ nfs ro 0 0 You should now restart your NFS daemon. Now mount the read-only snapshot root:: mount /.snapshots/ To test this, go into the /.snapshots/ directory as root. It is set to read-only, so even root shouldn't be able to write to it. As root, try:: touch /.snapshots/testfile This should fail, citing insufficient permissions. This is what you want. It means that your users won't be able to mess with the snapshots either. Now, all your users have to do to recover old files is go into the /.snapshots directory, select the interval they want, and browse through the filesystem until they find the files they are looking for. They can't modify anything in here because NFS will prevent them, but they can copy anything that they had read permission for in the first place. All the regular filesystem permissions are still at work, but the read-only NFS mount prevents any writes from happening. Please note that some NFS configurations may prevent you from accessing files that are owned by root and set to only be readable by root. In this situation, you may wish to pull backups for root from the "real" snapshot root, and let non-privileged users pull from the read-only NFS mount. Conclusion ====================================================================== If you followed the instructions in this document, you should now have rsnapshot installed and set up to perform automatic backups of your system. If it's not working, go back and trace your steps back to see if you can isolate the problem. The amount of disk space taken up will be equal to one full backup, plus an additional copy of every file that is changed. There is also a slight disk space overhead with creating multiple hard links, but it's not very much. On my system, adding a second, completely identical 3 Gigabyte interval alongside the original one only added about 15 Megabytes. You can use the du option to rsnapshot to generate disk usage reports. To see the sum total of all space used, try:: rsnapshot du If you were storing backups under localhost/home/ and wanted to see how much this subdirectory takes up throughout all your backups, try this instead:: rsnapshot du localhost/home/ The latest version of this document and the rsnapshot program can always be found at http://www.rsnapshot.org/ More resources ====================================================================== Mike Rubel's original shell scripts, upon which this project is based http://www.mikerubel.org/computers/rsync_snapshots/ Perl http://www.perl.org/ GNU cp and du (coreutils package) http://www.gnu.org/software/coreutils/ rsync http://rsync.samba.org/ OpenSSH http://www.openssh.org/ rsnapshot http://www.rsnapshot.org/ rsnapshot-1.4.2/docs/docbook/rsnapshot-HOWTO.en.xhtml0000664000175000017500000014151412632661200022115 0ustar travistravis rsnapshot HOWTO

rsnapshot HOWTO

Nathan Rosenquist

2004-01-20

Revision History
Revision 1.0.02005-01-31NR
Updated for rsnapshot 1.2.0
Revision 0.9.72005-01-17NR
Spelling corrections submitted by Nicolas Kaiser
Revision 0.9.62004-12-13NR
Misc. updates
Revision 0.9.52004-07-10NR
Relicensed document under GPL, instead of FDL
Revision 0.9.42004-07-02NR
Added description of proper crontab time settings
Revision 0.9.32004-06-11NR
Misc. updates
Revision 0.9.22004-05-16NR
Updated --link-dest info
Revision 0.9.12004-01-20NR
Added --link-dest info
Revision 0.92004-01-10NR
First draft

Abstract

rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. This document is a tutorial in the installation and configuration of rsnapshot.


Introduction

rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well.

rsnapshot is written in Perl, and depends on rsync. OpenSSH, GNU cp, GNU du, and the BSD logger program are also recommended, but not required. All of these should be present on most Linux systems. rsnapshot is written with the lowest common denominator in mind. It only requires at minimum Perl 5.004 and rsync. As a result of this, it works on pretty much any UNIX-like system you care to throw at it. It has been successfully tested with Perl 5.004 through 5.8.2, on Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, NetBSD, and IRIX.

The latest version of the program and this document can always be found at http://www.rsnapshot.org/.

What you will need

At a minimum: perl, rsync

Optionally: ssh, logger, GNU cp, GNU du

Additionally, it will help if you have reasonably good sysadmin skills.

Copyright and License

This document, rsnapshot HOWTO, is copyrighted (c) 2005 by Nathan Rosenquist. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of the license is available at http://www.gnu.org/copyleft/gpl.html.

Disclaimer

No liability for the contents of this document can be accepted. Use the concepts, examples and information at your own risk. There may be errors and inaccuracies, that could be damaging to your system. Proceed with caution, and although this is highly unlikely, the author(s) do not take any responsibility.

All copyrights are held by their by their respective owners, unless specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. Naming of particular products or brands should not be seen as endorsements.

Feedback

Feedback is most certainly welcome for this document. Send your additions, comments and criticisms to the following email address : .

Motivation

I originally used Mike Rubel's shell scripts to do rsync snapshots a while back. These worked very well, but there were a number of things that I wanted to improve upon. I had to write two shell scripts that were customized for my server. If I wanted to change the number of intervals stored, or the parts of the filesystem that were archived, that meant manually editing these shell scripts. If I wanted to install them on a different server with a different configuration, this meant manually editing the scripts for the new server, and hoping the logic and the sequence of operations was correct. Also, I was doing all the backups locally, on a single machine, on a single hard drive (just to protect from dumb user mistakes like deleting files). Never the less, I continued on with this system for a while, and it did work very well.

Several months later, the IDE controller on my web server failed horribly (when I typed /sbin/shutdown, it said the command was not found). I was then faced with what was in the back of my mind all along: I had not been making regular remote backups of my server, and the local backups were of no use to me since the entire drive was corrupted. The reason I had only been making sporadic, partial remote backups is that they weren't automatic and effortless. Of course, this was no one's fault but my own, but I got frustrated enough to write a tool that would make automated remote snapshots so easy that I wouldn't ever have to worry about them again. This goal has long been reached, but work on rsnapshot still continues as people submit patches, request features, and ways are found to improve the program.

Installation

This section will walk you through the installation of rsnapshot, step by step. This is not the only way to do it, but it is a way that works and that is well documented. Feel free to improvise if you know what you're doing.

This guide assumes you are installing rsnapshot 1.2.0 for the first time. If you are upgrading from an earlier version, please read the INSTALL file that comes with the source distribution instead.

30 second version (for the impatient)

./configure --sysconfdir=/etc
su
make install
cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

The rest of this section is the long version.

Untar the source code package

tar xzvf rsnapshot-1.2.0.tar.gz

If you don't have GNU tar, you may have to do this in two steps instead:

gunzip rsnapshot-1.2.0.tar.gz
tar xvf rsnapshot-1.2.0.tar

Change to the source directory

cd rsnapshot-1.2.0/

Decide where you want to install

By default, the installation procedure will install all files under /usr/local. For this tutorial, this will be OK except we will install the config file under /etc.

We are assuming that rsync, ssh, logger, and du are all in your search path. If this is not the case, you can specify the path to any of these programs using the typical Autoconf --with-program=/path/to/program syntax. For example, if Perl was in /opt/bin/perl and rsync was in /home/me/bin/rsync, you could run configure like:

./configure --with-perl=/opt/bin/perl --with-rsync=/home/me/bin/rsync

Run the configure script

This will poke and prod your system to figure out where the various external programs that rsnapshot depends on live. It also generates the Makefile that we will use to install the program. The configure script accepts arguments that can be used to tell it where to install the program, and also where to find the supporting programs. For this installation, the only non-default option we want is to put the config file in the /etc directory. To do this, run this command at the shell:

./configure --sysconfdir=/etc

If all goes well, you're ready to install the program. If there was a problem, it should be descriptive. Most likely a problem would be the result of something that was required and not found (like rsync or perl). If this happens, you must figure out where the missing program is located on your system, or install it if necessary. If you know where it is but configure couldn't find it, you can specify the path using the --with-program=/path/to/program options described above.

Install the program

If you've followed these instructions so far, you will have configured rsnapshot to be installed under /usr/local, with the config file in /etc. Under these circumstances, it will be necessary to become root to install the program. Now is the time to do so. You will, of course, need the root password to do this:

su

This will prompt you for the root password.

Now, to install rsnapshot, run the following command:

make install

This will install rsnapshot with all the settings you specified in the ./configure stage. If all goes well, you will have the following files on your system:

/usr/local/bin/rsnapshot The rsnapshot program

/usr/local/man/man1/rsnapshot.1 Man page

/etc/rsnapshot.conf.default The example config file

If you decide later that you don't want rsnapshot on your system anymore, simply remove the files listed above, or run make uninstall in the same source directory you installed from. Of course, if you installed with different options, the location of these files may be different.

Configuration

Create the config file

In the install process, the config file is not created or installed. However, a working example is provided that you can copy. To copy the example config file into the location rsnapshot will be looking for the real config file:

cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

As a general rule, you should avoid modifying /etc/rsnapshot.conf.default, simply because it is a working example that you may wish to refer to later. Also, if you perform an upgrade, the rsnapshot.conf.default file will always be upgraded to the latest version, while your real config file will be safe out of harm's way. Please note that if you run make upgrade during an upgrade, your rsnapshot.conf may be modified slightly, and the original will then be saved in rsnapshot.conf.backup in the same directory.

Where to go for more info

The rsnapshot.conf config file is well commented, and much of it should be fairly self-explanatory. For a full reference of all the various options, please consult the rsnapshot man page. Type:

man rsnapshot

This will give you the complete documentation. However, it assumes that you already know what you're doing to a certain extent. If you just want to get something up and running, this tutorial is a better place to start. If your system can't find the man page, /usr/local/man probably isn't in your $MANPATH environmental variable. This is beyond the scope of this document, but if it isn't working for you, you can always read the newest man page on the rsnapshot web site at http://www.rsnapshot.org/

Modifying the config file

In this example, we will be using the /.snapshots/ directory to hold the filesystem snapshots. This is referred to as the “snapshot rootâ€. Feel free to put this anywhere you have lots of free disk space. However, the examples in this document assume you have not changed this parameter, so you will have to substitute this in your commands if you put it somewhere else.

Also please note that fields are separated by tabs, not spaces. The reason for this is so it's easier to specify file paths with spaces in them.

cmd_cp

If enabled, the cmd_cp parameter should contain the path to the GNU cp program on your filesystem. If you are using Linux, be sure to uncomment this by removing the hash mark (#) in front of it. If you are using BSD, Solaris, IRIX, or most other UNIX variants, you should leave this commented out.

What makes GNU cp so special is that unlike the traditional UNIX cp, it has the ability to make recursive “copies†of directories as hard links.

If you don't have GNU cp, there is a subroutine in rsnapshot that somewhat approximates this functionality (although it won't support more esoteric files such as device nodes, FIFOs, sockets, etc). This gets followed up by another call to rsync, which transfers the remaining special files, if any. In this way, rsnapshot can support all file types on every platform.

The rule of thumb is that if you're on a Linux system, leave cmd_cp enabled. If you aren't on a Linux system, leave cmd_cp disabled. There are reports of GNU cp working on BSD and other non-Linux platforms, but there have also been some cases where problems have been encountered. If you enable cmd_cp on a non-Linux platform, please let the mailing list know how it worked out for you.

cmd_rsync

The cmd_rsync parameter must not be commented out, and it must point to a working version of rsync. If it doesn't, the program just will not work at all.

Please note that if you are using IRIX, there is another program named rsync that is different than the “real†rsync most people know of. If you're on an IRIX machine, you should double check this.

cmd_ssh

If you have ssh installed on your system, you will want to uncomment the cmd_ssh parameter. By enabling ssh, you can take snapshots of any number of remote systems. If you don't have ssh, or plan to only take snapshots of the local filesystem, you may safely leave this commented out.

cmd_logger

The cmd_logger parameter specifies the path to the logger program. logger is a command line interface to syslog. See the logger man page for more details. logger should be a standard part of most UNIX-like systems. It appears to have remained unchanged since about 1993, which is good for cross-platform stability. If you comment out this parameter, it will disable syslog support in rsnapshot. It is recommended that you leave this enabled.

cmd_du

The cmd_du parameter specifies the path to the du program. du is a command line tool that reports on disk usage. rsnapshot uses du to generate reports about the actual amount of disk space taken up, which is otherwise difficult to estimate because of all the hard links.

If you comment this out, rsnapshot will try to use the version of du it finds in your path, if possible. The GNU version of du is recommended, since it has the best selection of features, and supports the most options. The BSD version also seems to work, although some versions don't support the -h flag. Solaris du does not work at all, because it doesn't support the -c parameter.

link_dest

If you have rsync version 2.5.7 or later, you may want to enable this. With link_dest enabled, rsnapshot relies on rsync to create recursive hard links, overriding GNU cp in most, but not all, cases. With link_dest enabled, every single file on your system can be backed up in one pass, on any operating system. To get the most out of rsnapshot on non-Linux platforms, link_dest should be enabled. Be advised, however, that if a remote host is unavailable during a backup, rsnapshot will take an extra step and roll back the files from the previous backup. Using GNU cp, this would not be necessary.

interval

rsnapshot has no idea how often you want to take snapshots. Everyone's backup scheme may be different. In order to specify how much data to save, you need to tell rsnapshot which “intervals†to keep, and how many of each. An interval, in the context of the rsnapshot config file, is a unit of time measurement. These can actually be named anything (as long as it's alphanumeric, and not a reserved word), but by convention we will call ours hourly and daily. In this example, we want to take a snapshot every four hours, or six times a day (these are the hourly intervals). We also want to keep a second set, which are taken once a day, and stored for a week (or seven days). This happens to be the default, so as you can see the config file reads:

interval    hourly  6
interval    daily   7

It also has some other entries, but you can either ignore them or comment them out for now.

Please note that the hourly interval is specified first. This is very important. The first interval line is assumed to be the smallest unit of time, with each additional line getting successively larger. Thus, if you add a yearly interval, it should go at the bottom, and if you add a minutes interval, it should go before hourly. It's also worth noting that the snapshots get “pulled up†from the smallest interval to the largest. In this example, the daily snapshots get pulled from the oldest hourly snapshot, not directly from the main filesystem.

backup

Please note that the destination paths specified here are based on the assumption that the --relative flag is being passed to rsync via the rsync_long_args parameter. If you are installing for the first time, this is the default setting. If you upgraded from a previous version, please read the INSTALL file that came with the source distribution for more information.

This is the section where you tell rsnapshot what files you actually want to back up. You put a “backup†parameter first, followed by the full path to the directory or network path you're backing up. The third column is the relative path you want to back up to inside the snapshot root. Let's look at an example:

backup      /etc/      localhost/

In this example, backup tells us it's a backup point. /etc/ is the full path to the directory we want to take snapshots of, and localhost/ is a directory inside the snapshot_root we're going to put them in. Using the word localhost as the destination directory is just a convention. You might also choose to use the server's fully qualified domain name instead of localhost. If you are taking snapshots of several machines on one dedicated backup server, it's a good idea to use their various hostnames as directories to keep track of which files came from which server.

In addition to full paths on the local filesystem, you can also backup remote systems using rsync over ssh. If you have ssh installed and enabled (via the cmd_ssh parameter), you can specify a path like:

backup      root@example.com:/etc/     example.com/

This behaves fundamentally the same way, but you must take a few extra things into account.

  • The ssh daemon must be running on example.com

  • You must have access to the account you specify the remote machine, in this case the root user on example.com.

  • You must have key-based logins enabled for the root user at example.com, without passphrases. If you wanted to perform backups as another user, you could specify the other user instead of root for the source (i.e. user@domain.com). Please note that allowing remote logins with no passphrase is a security risk that may or may not be acceptable in your situation. Make sure you guard access to the backup server very carefully! For more information on how to set this up, please consult the ssh man page, or a tutorial on using ssh public and private keys. You will find that the key based logins are better in many ways, not just for rsnapshot but for convenience and security in general. Troy Johnson's excellent tutorial on using nifty ssh features for secure snapshots which, in case his site ever suffers a mishap, is mirrored here on this site.

  • This backup occurs over the network, so it may be slower. Since this uses rsync, this is most noticeable during the first backup. Depending on how much your data changes, subsequent backups should go much, much faster since rsync only sends the differences between files.

backup_script

With this parameter, the second column is the full path to an executable backup script, and the third column is the local path you want to store it in (just like with the "backup" parameter). For example:

backup_script      /usr/local/bin/backup_pgsql.sh       localhost/postgres/

In this example, rsnapshot will run the script /usr/local/bin/backup_pgsql.sh in a temp directory, then sync the results into the localhost/postgres/ directory under the snapshot root. You can find the backup_pgsql.sh example script in the utils/ directory of the source distribution. Feel free to modify it for your system.

Your backup script simply needs to dump out the contents of whatever it does into it's current working directory. It can create as many files and/or directories as necessary, but it should not put its files in any pre-determined path. The reason for this is that rsnapshot creates a temp directory, changes to that directory, runs the backup script, and then syncs the contents of the temp directory to the local path you specified in the third column. A typical backup script would be one that archives the contents of a database. It might look like this:

#!/bin/sh

/usr/bin/mysqldump -uroot mydatabase > mydatabase.sql
/bin/chmod 644 mydatabase.sql

There are several example scripts in the utils/ directory of the rsnapshot source distribution to give you more ideas.

Make sure the destination path you specify is unique. The backup script will completely overwrite anything in the destination path, so if you tried to specify the same destination twice, you would be left with only the files from the last script. Fortunately, rsnapshot will try to prevent you from doing this when it reads the config file.

Please remember that these backup scripts will be invoked as the user running rsnapshot. In our example, this is root. Make sure your backup scripts are owned by root, and not writable by anyone else. If you fail to do this, anyone with write access to these backup scripts will be able to put commands in them that will be run as the root user. If they are malicious, they could take over your server.

Testing your config file

When you have made all your changes, you should verify that the config file is syntactically valid, and that all the supporting programs are where you think they are. To do this, run rsnapshot with the configtest argument:

rsnapshot configtest

If all is well, it should say Syntax OK. If there's a problem, it should tell you exactly what it is. Make sure your config file is using tabs and not spaces, etc.

The final step to test your configuration is to run rsnapshot in test mode. This will print out a verbose list of the things it will do, without actually doing them. To do a test run, run this command:

rsnapshot -t hourly

This tells rsnapshot to simulate an "hourly" backup. It should print out the commands it will perform when it runs for real. Please note that the test output might be slightly different than the real execution, but only because the test doesn't actually do things that may be checked for later in the program. For example, if the program will create a directory and then later test to see if that directory exists, the test run might claim that it would create the directory twice, since it didn't actually get created during the test. This should be the only type of difference you will see while running a test.

Automation

Now that you have your config file set up, it's time to set up rsnapshot to be run from cron. As the root user, edit root's crontab by typing:

crontab -e

You could alternately keep a crontab file that you load in, but the concepts are the same. You want to enter the following information into root's crontab:

0 */4 * * *       /usr/local/bin/rsnapshot hourly
30 23 * * *       /usr/local/bin/rsnapshot daily

It is usually a good idea to schedule the larger intervals to run a bit before the lower ones. For example, in the crontab above, notice that daily runs 30 minutes before hourly. This helps prevent race conditions where the daily would try to run before the hourly job had finished. This same strategy should be extended so that a weekly entry would run before the daily and so on.

How it works

We have a snapshot root under which all backups are stored. By default, this is the directory /.snapshots/. Within this directory, other directories are created for the various intervals that have been defined. In the beginning it will be empty, but once rsnapshot has been running for a week, it should look something like this:

[root@localhost]# ls -l /.snapshots/
drwxr-xr-x    7 root     root         4096 Dec 28 00:00 daily.0
drwxr-xr-x    7 root     root         4096 Dec 27 00:00 daily.1
drwxr-xr-x    7 root     root         4096 Dec 26 00:00 daily.2
drwxr-xr-x    7 root     root         4096 Dec 25 00:00 daily.3
drwxr-xr-x    7 root     root         4096 Dec 24 00:00 daily.4
drwxr-xr-x    7 root     root         4096 Dec 23 00:00 daily.5
drwxr-xr-x    7 root     root         4096 Dec 22 00:00 daily.6
drwxr-xr-x    7 root     root         4096 Dec 29 00:00 hourly.0
drwxr-xr-x    7 root     root         4096 Dec 28 20:00 hourly.1
drwxr-xr-x    7 root     root         4096 Dec 28 16:00 hourly.2
drwxr-xr-x    7 root     root         4096 Dec 28 12:00 hourly.3
drwxr-xr-x    7 root     root         4096 Dec 28 08:00 hourly.4
drwxr-xr-x    7 root     root         4096 Dec 28 04:00 hourly.5

Inside each of these directories is a “full†backup of that point in time. The destination directory paths you specified under the backup and backup_script parameters get stuck directly under these directories. In the example:

backup          /etc/           localhost/

The /etc/ directory will initially get backed up into /.snapshots/hourly.0/localhost/etc/

Each subsequent time rsnapshot is run with the hourly command, it will rotate the hourly.X directories, and then “copy†the contents of the hourly.0 directory (using hard links) into hourly.1.

When rsnapshot daily is run, it will rotate all the daily.X directories, then copy the contents of hourly.5 into daily.0.

hourly.0 will always contain the most recent snapshot, and daily.6 will always contain a snapshot from a week ago. Unless the files change between snapshots, the “full†backups are really just multiple hard links to the same files. Thus, if your /etc/passwd file doesn't change in a week, hourly.0/localhost/etc/passwd and daily.6/localhost/etc/passwd will literally be the same exact file. This is how rsnapshot can be so efficient on space. If the file changes at any point, the next backup will unlink the hard link in hourly.0, and replace it with a brand new file. This will now take double the disk space it did before, but it is still considerably less than it would be to have full unique copies of this file 13 times over.

Remember that if you are using different intervals than the ones in this example, the first interval listed is the one that gets updates directly from the main filesystem. All subsequently listed intervals pull from the previous intervals. For example, if you had weekly, monthly, and yearly intervals defined (in that order), the weekly ones would get updated directly from the filesystem, the monthly ones would get updated from weekly, and the yearly ones would get updated from monthly.

Restoring backups

When rsnapshot is first run, it will create the snapshot_root directory (/.snapshots/ by default). It assigns this directory the permissions 700, and for good reason. The snapshot root will probably contain files owned by all sorts of users on your system. If any of these files are writeable (and of course some of them will be), the users will still have write access to their files. Thus, if they can see the snapshots directly, they can modify them, and the integrity of the snapshots can not be guaranteed.

For example, if a user had write permission to the backups and accidentally ran rm -rf /, they would delete all their files in their home directory and all the files they owned in the backups!

root only

The simplest, but least flexible solution, is to simply deny non-root users access to the snapshot root altogether. The root user will still have access of course, and as with all other aspects of system administration, must be trusted not to go messing with things too much. However, by simply denying access to everyone, the root user will be the only one who can pull backups. This may or may not be desirable, depending on your situation. For a small setup or a single-user machine, this may be all you need.

All users

If users need to be able to pull their own backups, you will need to do a little extra work up front (but probably less work in the long run). The best way to do this seems to be creating a container directory for the snapshot root with 700 permissions, giving the snapshot root directory 755 permissions, and mounting the snapshot root for the users read-only. This can be done over NFS and Samba, to name two possibilities. Let's explore how to do this using NFS on a single machine:

Set the snapshot_root variable in /etc/rsnapshot.conf equal to /.private/.snapshots/

snapshot_root       /.private/.snapshots/

Create the container directory:

mkdir /.private/

Create the real snapshot root:

mkdir /.private/.snapshots/

Create the read-only snapshot root mount point:

mkdir /.snapshots/

Set the proper permissions on these new directories:

chmod 0700 /.private/
chmod 0755 /.private/.snapshots/
chmod 0755 /.snapshots/

In /etc/exports, add /.private/.snapshots/ as a read only NFS export:

/.private/.snapshots/  127.0.0.1(ro,no_root_squash)

In /etc/fstab, mount /.private/.snapshots/ read-only under /.snapshots/

localhost:/.private/.snapshots/   /.snapshots/   nfs    ro   0 0

You should now restart your NFS daemon.

Now mount the read-only snapshot root:

mount /.snapshots/

To test this, go into the /.snapshots/ directory as root. It is set to read-only, so even root shouldn't be able to write to it. As root, try:

touch /.snapshots/testfile

This should fail, citing insufficient permissions. This is what you want. It means that your users won't be able to mess with the snapshots either.

Now, all your users have to do to recover old files is go into the /.snapshots directory, select the interval they want, and browse through the filesystem until they find the files they are looking for. They can't modify anything in here because NFS will prevent them, but they can copy anything that they had read permission for in the first place. All the regular filesystem permissions are still at work, but the read-only NFS mount prevents any writes from happening.

Please note that some NFS configurations may prevent you from accessing files that are owned by root and set to only be readable by root. In this situation, you may wish to pull backups for root from the "real" snapshot root, and let non-privileged users pull from the read-only NFS mount.

Conclusion

If you followed the instructions in this document, you should now have rsnapshot installed and set up to perform automatic backups of your system. If it's not working, go back and trace your steps back to see if you can isolate the problem.

The amount of disk space taken up will be equal to one full backup, plus an additional copy of every file that is changed. There is also a slight disk space overhead with creating multiple hard links, but it's not very much. On my system, adding a second, completely identical 3 Gigabyte interval alongside the original one only added about 15 Megabytes.

You can use the du option to rsnapshot to generate disk usage reports. To see the sum total of all space used, try:

rsnapshot du

If you were storing backups under localhost/home/ and wanted to see how much this subdirectory takes up throughout all your backups, try this instead:

rsnapshot du localhost/home/

The latest version of this document and the rsnapshot program can always be found at http://www.rsnapshot.org/

More resources

Web sites

Mike Rubel's original shell scripts, upon which this project is based

http://www.mikerubel.org/computers/rsync_snapshots/

Perl

http://www.perl.org/

GNU cp and du (coreutils package)

http://www.gnu.org/software/coreutils/

rsync

http://rsync.samba.org/

OpenSSH

http://www.openssh.org/

rsnapshot

http://www.rsnapshot.org/

rsnapshot-1.4.2/docs/docbook/Makefile0000664000175000017500000000130112632661200017144 0ustar travistravisx := rsnapshot-HOWTO.en xsldir := /usr/share/xml/docbook/stylesheet/nwalsh ## dependencies all: $x.xhtml all: $x.pdf all: $x.info ## xsltproc / fop rules %.xhtml: %.xml xsltproc $(xsldir)/xhtml/docbook.xsl '$<' >'$@' %.fo: %.xml xsltproc $(xsldir)/fo/docbook.xsl '$<' >'$@' %.pdf: %.fo fop -fo '$<' -pdf '$@' %.txml: %.xml db2x_xsltproc -s texi '$<' -o '$@' %.texi: %.txml db2x_texixml '$<' %.info: %.texi makeinfo '$<' ### phony rules clean: rm -f *~ bash -c 'set -ex && rm -f *.{aux,cp,fn,ky,log,pg,toc,tp,vr,refs,txml,fo}' distclean: clean bash -c 'set -ex && rm -f *.{texi,info,pdf,xhtml,html}' test: xmllint --xinclude --valid --postvalid --noout $x.xml .PHONY: all clean distclean test rsnapshot-1.4.2/docs/docbook/rest.html0000664000175000017500000013376712632661200017375 0ustar travistravis rsnapshot HOWTO

rsnapshot HOWTO

Author: Nathan Rosenquist <nathan@rsnapshot.org>
Date: 2004-01-20
Copyright: 2005 Nathan Rosenquist

Abstract

rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. This document is a tutorial in the installation and configuration of rsnapshot.

Introduction

rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well.

rsnapshot is written in Perl, and depends on rsync. OpenSSH, GNU cp, GNU du, and the BSD logger program are also recommended, but not required. All of these should be present on most Linux systems. rsnapshot is written with the lowest common denominator in mind. It only requires at minimum Perl 5.004 and rsync. As a result of this, it works on pretty much any UNIX-like system you care to throw at it. It has been successfully tested with Perl 5.004 through 5.8.2, on Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, NetBSD, and IRIX.

The latest version of the program and this document can always be found at http://www.rsnapshot.org/.

What you will need

At a minimum: perl, rsync

Optionally: ssh, logger, GNU cp, GNU du

Additionally, it will help if you have reasonably good sysadmin skills.

Copyright and License

This document, rsnapshot HOWTO, is copyrighted © 2005 by Nathan Rosenquist. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of the license is available at http://www.gnu.org/ copyleft/gpl.html.

Disclaimer

No liability for the contents of this document can be accepted. Use the concepts, examples and information at your own risk. There may be errors and inaccuracies, that could be damaging to your system. Proceed with caution, and although this is highly unlikely, the author(s) do not take any responsibility.

All copyrights are held by their by their respective owners, unless specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. Naming of particular products or brands should not be seen as endorsements.

Feedback

Feedback is most certainly welcome for this document. Send your additions, comments and criticisms to the following email address: nathan@rsnapshot.org.

Motivation

I originally used Mike Rubel's shell scripts to do rsync snapshots a while back. These worked very well, but there were a number of things that I wanted to improve upon. I had to write two shell scripts that were customized for my server. If I wanted to change the number of intervals stored, or the parts of the filesystem that were archived, that meant manually editing these shell scripts. If I wanted to install them on a different server with a different configuration, this meant manually editing the scripts for the new server, and hoping the logic and the sequence of operations was correct. Also, I was doing all the backups locally, on a single machine, on a single hard drive (just to protect from dumb user mistakes like deleting files). Never the less, I continued on with this system for a while, and it did work very well.

Several months later, the IDE controller on my web server failed horribly (when I typed /sbin/shutdown, it said the command was not found). I was then faced with what was in the back of my mind all along: I had not been making regular remote backups of my server, and the local backups were of no use to me since the entire drive was corrupted. The reason I had only been making sporadic, partial remote backups is that they weren't automatic and effortless. Of course, this was no one's fault but my own, but I got frustrated enough to write a tool that would make automated remote snapshots so easy that I wouldn't ever have to worry about them again. This goal has long been reached, but work on rsnapshot still continues as people submit patches, request features, and ways are found to improve the program.

Installation

This section will walk you through the installation of rsnapshot, step by step. This is not the only way to do it, but it is a way that works and that is well documented. Feel free to improvise if you know what you're doing.

This guide assumes you are installing rsnapshot 1.2.0 for the first time. If you are upgrading from an earlier version, please read the INSTALL file that comes with the source distribution instead.

30 second version (for the impatient)

./configure --sysconfdir=/etc
su
make install
cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

The rest of this section is the long version.

Untar the source code package

tar xzvf rsnapshot-1.2.0.tar.gz

If you don't have GNU tar, you may have to do this in two steps instead:

gunzip rsnapshot-1.2.0.tar.gz
tar xvf rsnapshot-1.2.0.tar

Change to the source directory

cd rsnapshot-1.2.0/

Decide where you want to install

By default, the installation procedure will install all files under /usr/local. For this tutorial, this will be OK except we will install the config file under /etc.

We are assuming that rsync, ssh, logger, and du are all in your search path. If this is not the case, you can specify the path to any of these programs using the typical Autoconf --with-program=/path/to/program syntax. For example, if Perl was in /opt/bin/perl and rsync was in /home/me/bin/rsync, you could run configure like:

./configure --with-perl=/opt/bin/perl --with-rsync=/home/me/bin/rsync

Run the configure script

This will poke and prod your system to figure out where the various external programs that rsnapshot depends on live. It also generates the Makefile that we will use to install the program. The configure script accepts arguments that can be used to tell it where to install the program, and also where to find the supporting programs. For this installation, the only non-default option we want is to put the config file in the /etc directory. To do this, run this command at the shell:

./configure --sysconfdir=/etc

If all goes well, you're ready to install the program. If there was a problem, it should be descriptive. Most likely a problem would be the result of something that was required and not found (like rsync or perl). If this happens, you must figure out where the missing program is located on your system, or install it if necessary. If you know where it is but configure couldn't find it, you can specify the path using the --with-program=/path/to/program options described above.

Install the program

If you've followed these instructions so far, you will have configured rsnapshot to be installed under /usr/local, with the config file in /etc. Under these circumstances, it will be necessary to become root to install the program. Now is the time to do so. You will, of course, need the root password to do this:

su

This will prompt you for the root password.

Now, to install rsnapshot, run the following command:

make install

This will install rsnapshot with all the settings you specified in the ./configure stage. If all goes well, you will have the following files on your system:

/usr/local/bin/rsnapshot
The rsnapshot program
/usr/local/man/man1/rsnapshot.1
Man page
/etc/rsnapshot.conf.default
The example config file

If you decide later that you don't want rsnapshot on your system anymore, simply remove the files listed above, or run make uninstall in the same source directory you installed from. Of course, if you installed with different options, the location of these files may be different.

Configuration

Create the config file

In the install process, the config file is not created or installed. However, a working example is provided that you can copy. To copy the example config file into the location rsnapshot will be looking for the real config file:

cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

As a general rule, you should avoid modifying /etc/rsnapshot.conf.default, simply because it is a working example that you may wish to refer to later. Also, if you perform an upgrade, the rsnapshot.conf.default file will always be upgraded to the latest version, while your real config file will be safe out of harm's way. Please note that if you run make upgrade during an upgrade, your rsnapshot.conf may be modified slightly, and the original will then be saved in rsnapshot.conf.backup in the same directory.

Where to go for more info

The rsnapshot.conf config file is well commented, and much of it should be fairly self-explanatory. For a full reference of all the various options, please consult the rsnapshot man page. Type:

man rsnapshot

This will give you the complete documentation. However, it assumes that you already know what you're doing to a certain extent. If you just want to get something up and running, this tutorial is a better place to start. If your system can't find the man page, /usr/local/man probably isn't in your $MANPATH environmental variable. This is beyond the scope of this document, but if it isn't working for you, you can always read the newest man page on the rsnapshot web site at http://www.rsnapshot.org/

Modifying the config file

In this example, we will be using the /.snapshots/ directory to hold the filesystem snapshots. This is referred to as the "snapshot root". Feel free to put this anywhere you have lots of free disk space. However, the examples in this document assume you have not changed this parameter, so you will have to substitute this in your commands if you put it somewhere else.

Also please note that fields are separated by tabs, not spaces. The reason for this is so it's easier to specify file paths with spaces in them.

cmd_cp

If enabled, the cmd_cp parameter should contain the path to the GNU cp program on your filesystem. If you are using Linux, be sure to uncomment this by removing the octothorpe (#) in front of it. If you are using BSD, Solaris, IRIX, or most other UNIX variants, you should leave this commented out.

What makes GNU cp so special is that unlike the traditional UNIX cp, it has the ability to make recursive "copies" of directories as hard links.

If you don't have GNU cp, there is a subroutine in rsnapshot that somewhat approximates this functionality (although it won't support more esoteric files such as device nodes, FIFOs, sockets, etc). This gets followed up by another call to rsync, which transfers the remaining special files, if any. In this way, rsnapshot can support all file types on every platform.

The rule of thumb is that if you're on a Linux system, leave cmd_cp enabled. If you aren't on a Linux system, leave cmd_cp disabled. There are reports of GNU cp working on BSD and other non-Linux platforms, but there have also been some cases where problems have been encountered. If you enable cmd_cp on a non-Linux platform, please let the mailing list know how it worked out for you.

cmd_rsync

The cmd_rsync parameter must not be commented out, and it must point to a working version of rsync. If it doesn't, the program just will not work at all.

Please note that if you are using IRIX, there is another program named rsync that is different than the "real" rsync most people know of. If you're on an IRIX machine, you should double check this.

cmd_ssh

If you have ssh installed on your system, you will want to uncomment the cmd_ssh parameter. By enabling ssh, you can take snapshots of any number of remote systems. If you don't have ssh, or plan to only take snapshots of the local filesystem, you may safely leave this commented out.

cmd_logger

The cmd_logger parameter specifies the path to the logger program. logger is a command line interface to syslog. See the logger man page for more details. logger should be a standard part of most UNIX-like systems. It appears to have remained unchanged since about 1993, which is good for cross-platform stability. If you comment out this parameter, it will disable syslog support in rsnapshot. It is recommended that you leave this enabled.

cmd_du

The cmd_du parameter specifies the path to the du program. du is a command line tool that reports on disk usage. rsnapshot uses du to generate reports about the actual amount of disk space taken up, which is otherwise difficult to estimate because of all the hard links.

If you comment this out, rsnapshot will try to use the version of du it finds in your path, if possible. The GNU version of du is recommended, since it has the best selection of features, and supports the most options. The BSD version also seems to work, although some versions don't support the -h flag. Solaris du does not work at all, because it doesn't support the -c parameter.

link_dest

If you have rsync version 2.5.7 or later, you may want to enable this. With link_dest enabled, rsnapshot relies on rsync to create recursive hard links, overriding GNU cp in most, but not all, cases. With link_dest enabled, every single file on your system can be backed up in one pass, on any operating system. To get the most out of rsnapshot on non-Linux platforms, link_dest should be enabled. Be advised, however, that if a remote host is unavailable during a backup, rsnapshot will take an extra step and roll back the files from the previous backup. Using GNU cp, this would not be necessary.

interval

rsnapshot has no idea how often you want to take snapshots. Everyone's backup scheme may be different. In order to specify how much data to save, you need to tell rsnapshot which "intervals" to keep, and how many of each. An interval, in the context of the rsnapshot config file, is a unit of time measurement. These can actually be named anything (as long as it's alphanumeric, and not a reserved word), but by convention we will call ours hourly and daily. In this example, we want to take a snapshot every four hours, or six times a day (these are the hourly intervals). We also want to keep a second set, which are taken once a day, and stored for a week (or seven days). This happens to be the default, so as you can see the config file reads:

interval    hourly  6
interval    daily   7

It also has some other entries, but you can either ignore them or comment them out for now.

Please note that the hourly interval is specified first. This is very important. The first interval line is assumed to be the smallest unit of time, with each additional line getting successively larger. Thus, if you add a yearly interval, it should go at the bottom, and if you add a minutes interval, it should go before hourly. It's also worth noting that the snapshots get "pulled up" from the smallest interval to the largest. In this example, the daily snapshots get pulled from the oldest hourly snapshot, not directly from the main filesystem.

backup

Please note that the destination paths specified here are based on the assumption that the --relative flag is being passed to rsync via the rsync_long_args parameter. If you are installing for the first time, this is the default setting. If you upgraded from a previous version, please read the INSTALL file that came with the source distribution for more information.

This is the section where you tell rsnapshot what files you actually want to back up. You put a "backup" parameter first, followed by the full path to the directory or network path you're backing up. The third column is the relative path you want to back up to inside the snapshot root. Let's look at an example:

backup      /etc/      localhost/

In this example, backup tells us it's a backup point. /etc/ is the full path to the directory we want to take snapshots of, and localhost/ is a directory inside the snapshot_root we're going to put them in. Using the word localhost as the destination directory is just a convention. You might also choose to use the server's fully qualified domain name instead of localhost. If you are taking snapshots of several machines on one dedicated backup server, it's a good idea to use their various hostnames as directories to keep track of which files came from which server.

In addition to full paths on the local filesystem, you can also backup remote systems using rsync over ssh. If you have ssh installed and enabled (via the cmd_ssh parameter), you can specify a path like:

backup      root@example.com:/etc/     example.com/

This behaves fundamentally the same way, but you must take a few extra things into account.

  • The ssh daemon must be running on example.com
  • You must have access to the account you specify the remote machine, in this case the root user on example.com.
  • You must have key-based logins enabled for the root user at example.com, without passphrases. If you wanted to perform backups as another user, you could specify the other user instead of root for the source (i.e. user@domain.com). Please note that allowing remote logins with no passphrase is a security risk that may or may not be acceptable in your situation. Make sure you guard access to the backup server very carefully! For more information on how to set this up, please consult the ssh man page, or a tutorial on using ssh public and private keys. You will find that the key based logins are better in many ways, not just for rsnapshot but for convenience and security in general. Troy Johnson's excellent tutorial on using nifty ssh features for secure snapshots which, in case his site ever suffers a mishap, is mirrored here on this site.
  • This backup occurs over the network, so it may be slower. Since this uses rsync, this is most noticeable during the first backup. Depending on how much your data changes, subsequent backups should go much, much faster since rsync only sends the differences between files.

backup_script

With this parameter, the second column is the full path to an executable backup script, and the third column is the local path you want to store it in (just like with the "backup" parameter). For example:

backup_script      /usr/local/bin/backup_pgsql.sh       localhost/postgres/

In this example, rsnapshot will run the script /usr/local/bin/backup_pgsql.sh in a temp directory, then sync the results into the localhost/postgres/ directory under the snapshot root. You can find the backup_pgsql.sh example script in the utils/ directory of the source distribution. Feel free to modify it for your system.

Your backup script simply needs to dump out the contents of whatever it does into it's current working directory. It can create as many files and/or directories as necessary, but it should not put its files in any pre-determined path. The reason for this is that rsnapshot creates a temp directory, changes to that directory, runs the backup script, and then syncs the contents of the temp directory to the local path you specified in the third column. A typical backup script would be one that archives the contents of a database. It might look like this:

#!/bin/sh

/usr/bin/mysqldump -uroot mydatabase > mydatabase.sql
/bin/chmod 644 mydatabase.sql

There are several example scripts in the utils/ directory of the rsnapshot source distribution to give you more ideas.

Make sure the destination path you specify is unique. The backup script will completely overwrite anything in the destination path, so if you tried to specify the same destination twice, you would be left with only the files from the last script. Fortunately, rsnapshot will try to prevent you from doing this when it reads the config file.

Please remember that these backup scripts will be invoked as the user running rsnapshot. In our example, this is root. Make sure your backup scripts are owned by root, and not writable by anyone else. If you fail to do this, anyone with write access to these backup scripts will be able to put commands in them that will be run as the root user. If they are malicious, they could take over your server.

Testing your config file

When you have made all your changes, you should verify that the config file is syntactically valid, and that all the supporting programs are where you think they are. To do this, run rsnapshot with the configtest argument:

rsnapshot configtest

If all is well, it should say Syntax OK. If there's a problem, it should tell you exactly what it is. Make sure your config file is using tabs and not spaces, etc.

The final step to test your configuration is to run rsnapshot in test mode. This will print out a verbose list of the things it will do, without actually doing them. To do a test run, run this command:

rsnapshot -t hourly

This tells rsnapshot to simulate an "hourly" backup. It should print out the commands it will perform when it runs for real. Please note that the test output might be slightly different than the real execution, but only because the test doesn't actually do things that may be checked for later in the program. For example, if the program will create a directory and then later test to see if that directory exists, the test run might claim that it would create the directory twice, since it didn't actually get created during the test. This should be the only type of difference you will see while running a test.

Automation

Now that you have your config file set up, it's time to set up rsnapshot to be run from cron. As the root user, edit root's crontab by typing:

crontab -e

You could alternately keep a crontab file that you load in, but the concepts are the same. You want to enter the following information into root's crontab:

0 */4 * * *       /usr/local/bin/rsnapshot hourly
30 23 * * *       /usr/local/bin/rsnapshot daily

It is usually a good idea to schedule the larger intervals to run a bit before the lower ones. For example, in the crontab above, notice that daily runs 30 minutes before hourly. This helps prevent race conditions where the daily would try to run before the hourly job had finished. This same strategy should be extended so that a weekly entry would run before the daily and so on.

How it works

We have a snapshot root under which all backups are stored. By default, this is the directory /.snapshots/. Within this directory, other directories are created for the various intervals that have been defined. In the beginning it will be empty, but once rsnapshot has been running for a week, it should look something like this:

[root@localhost]# ls -l /.snapshots/
drwxr-xr-x    7 root     root         4096 Dec 28 00:00 daily.0
drwxr-xr-x    7 root     root         4096 Dec 27 00:00 daily.1
drwxr-xr-x    7 root     root         4096 Dec 26 00:00 daily.2
drwxr-xr-x    7 root     root         4096 Dec 25 00:00 daily.3
drwxr-xr-x    7 root     root         4096 Dec 24 00:00 daily.4
drwxr-xr-x    7 root     root         4096 Dec 23 00:00 daily.5
drwxr-xr-x    7 root     root         4096 Dec 22 00:00 daily.6
drwxr-xr-x    7 root     root         4096 Dec 29 00:00 hourly.0
drwxr-xr-x    7 root     root         4096 Dec 28 20:00 hourly.1
drwxr-xr-x    7 root     root         4096 Dec 28 16:00 hourly.2
drwxr-xr-x    7 root     root         4096 Dec 28 12:00 hourly.3
drwxr-xr-x    7 root     root         4096 Dec 28 08:00 hourly.4
drwxr-xr-x    7 root     root         4096 Dec 28 04:00 hourly.5

Inside each of these directories is a "full" backup of that point in time. The destination directory paths you specified under the backup and backup_script parameters get stuck directly under these directories. In the example:

backup          /etc/           localhost/

The /etc/ directory will initially get backed up into /.snapshots/hourly.0/localhost/etc/

Each subsequent time rsnapshot is run with the hourly command, it will rotate the hourly.X directories, and then "copy" the contents of the hourly.0 directory (using hard links) into hourly.1.

When rsnapshot daily is run, it will rotate all the daily.X directories, then copy the contents of hourly.5 into daily.0.

hourly.0 will always contain the most recent snapshot, and daily.6 will always contain a snapshot from a week ago. Unless the files change between snapshots, the "full" backups are really just multiple hard links to the same files. Thus, if your /etc/passwd file doesn't change in a week, hourly.0/localhost/etc/passwd and daily.6/localhost/etc /passwd will literally be the same exact file. This is how rsnapshot can be so efficient on space. If the file changes at any point, the next backup will unlink the hard link in hourly.0, and replace it with a brand new file. This will now take double the disk space it did before, but it is still considerably less than it would be to have full unique copies of this file 13 times over.

Remember that if you are using different intervals than the ones in this example, the first interval listed is the one that gets updates directly from the main filesystem. All subsequently listed intervals pull from the previous intervals. For example, if you had weekly, monthly, and yearly intervals defined (in that order), the weekly ones would get updated directly from the filesystem, the monthly ones would get updated from weekly, and the yearly ones would get updated from monthly.

Restoring backups

When rsnapshot is first run, it will create the snapshot_root directory (/.snapshots/ by default). It assigns this directory the permissions 700, and for good reason. The snapshot root will probably contain files owned by all sorts of users on your system. If any of these files are writeable (and of course some of them will be), the users will still have write access to their files. Thus, if they can see the snapshots directly, they can modify them, and the integrity of the snapshots can not be guaranteed.

For example, if a user had write permission to the backups and accidentally ran rm -rf /, they would delete all their files in their home directory and all the files they owned in the backups!

root only

The simplest, but least flexible solution, is to simply deny non-root users access to the snapshot root altogether. The root user will still have access of course, and as with all other aspects of system administration, must be trusted not to go messing with things too much. However, by simply denying access to everyone, the root user will be the only one who can pull backups. This may or may not be desirable, depending on your situation. For a small setup or a single-user machine, this may be all you need.

All users

If users need to be able to pull their own backups, you will need to do a little extra work up front (but probably less work in the long run). The best way to do this seems to be creating a container directory for the snapshot root with 700 permissions, giving the snapshot root directory 755 permissions, and mounting the snapshot root for the users read-only. This can be done over NFS and Samba, to name two possibilities. Let's explore how to do this using NFS on a single machine:

Set the snapshot_root variable in /etc/rsnapshot.conf equal to /.private/.snapshots/

snapshot_root       /.private/.snapshots/

Create the container directory:

mkdir /.private/

Create the real snapshot root:

mkdir /.private/.snapshots/

Create the read-only snapshot root mount point:

mkdir /.snapshots/

Set the proper permissions on these new directories:

chmod 0700 /.private/
chmod 0755 /.private/.snapshots/
chmod 0755 /.snapshots/

In /etc/exports, add /.private/.snapshots/ as a read only NFS export:

/.private/.snapshots/  127.0.0.1(ro,no_root_squash)

In /etc/fstab, mount /.private/.snapshots/ read-only under /.snapshots/

localhost:/.private/.snapshots/   /.snapshots/   nfs    ro   0 0

You should now restart your NFS daemon.

Now mount the read-only snapshot root:

mount /.snapshots/

To test this, go into the /.snapshots/ directory as root. It is set to read-only, so even root shouldn't be able to write to it. As root, try:

touch /.snapshots/testfile

This should fail, citing insufficient permissions. This is what you want. It means that your users won't be able to mess with the snapshots either.

Now, all your users have to do to recover old files is go into the /.snapshots directory, select the interval they want, and browse through the filesystem until they find the files they are looking for. They can't modify anything in here because NFS will prevent them, but they can copy anything that they had read permission for in the first place. All the regular filesystem permissions are still at work, but the read-only NFS mount prevents any writes from happening.

Please note that some NFS configurations may prevent you from accessing files that are owned by root and set to only be readable by root. In this situation, you may wish to pull backups for root from the "real" snapshot root, and let non-privileged users pull from the read-only NFS mount.

Conclusion

If you followed the instructions in this document, you should now have rsnapshot installed and set up to perform automatic backups of your system. If it's not working, go back and trace your steps back to see if you can isolate the problem.

The amount of disk space taken up will be equal to one full backup, plus an additional copy of every file that is changed. There is also a slight disk space overhead with creating multiple hard links, but it's not very much. On my system, adding a second, completely identical 3 Gigabyte interval alongside the original one only added about 15 Megabytes.

You can use the du option to rsnapshot to generate disk usage reports. To see the sum total of all space used, try:

rsnapshot du

If you were storing backups under localhost/home/ and wanted to see how much this subdirectory takes up throughout all your backups, try this instead:

rsnapshot du localhost/home/

The latest version of this document and the rsnapshot program can always be found at http://www.rsnapshot.org/

More resources

Mike Rubel's original shell scripts, upon which this project is based
http://www.mikerubel.org/computers/rsync_snapshots/
Perl
http://www.perl.org/
GNU cp and du (coreutils package)
http://www.gnu.org/software/coreutils/
rsync
http://rsync.samba.org/
OpenSSH
http://www.openssh.org/
rsnapshot
http://www.rsnapshot.org/
rsnapshot-1.4.2/docs/docbook/rsnapshot-HOWTO.en.pdf0000664000175000017500000014215112632661200021530 0ustar travistravis%PDF-1.3 %ª«¬­ 4 0 obj << /Type /Info /Producer (FOP 0.20.5) >> endobj 5 0 obj << /Length 2016 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gb"/+>B?Pt'RnB3i%^X&;r+t.F?8gW2VkfgBiFKe6amR/bI/`7]E48d^TRbW*GiOGl#rS5Ps",k!f-4a*ISPen9f]Tbr'VLF2O)#oAp-rOY]ccOL)O6%T:'o_%C_jloBM3\NUCkq8W7%;ANEJ/_52mjig7,\5A&+hmn.-m_etYQ1L=us$[f+k;&BfTu[a2cKe9j[>U;^I=,ZP=M6,#RR`0^.3d2QMgchpHLd\bZdKWZ=hhsh^%K0,V^3lbZkAkcc/nW%u`::*QOcGui?,]PRUG21Z=Y]G''8fd9-BqnDqtB06Q`n\8[ZU%T/Znd%79oD;0tkf-.J+R_]ej^>rG=QAObq=;BB2O"0YeP2e!p_eWT/]6MrYsaSu*]9):M/0,u7-U\\_;]ea5hj4l:.$#/:mET#T^`?XlrP3T=1,-<`c`k4_#Kb+fiOe"/uX4$:jZI,$U")c7l`Z!>h];iHh/d"u^gLSRa#_rsLu3oTi9Q`57iWdQI6]m8"rp%lZQ-o\&,`Y6oR,[f,/q"W>n%G'b'XSF9k9i\nZAc=`J0"5jCP==FfZ>*WD5gASFgIh6q;/oMaaMtr0,W>iMh2P8#3d8p8:K]Z`+ia=FeHRB/W[oqei:bTS2R9bX[KcVtpBW,2*=r'N*t?i&cmc5&cT-T?kr0=l_8_,*=`'6m;\(T'3*eL%Q;#Le6ZC+X*P5N0e-]$lht;6Q/Gj0H(+t)BiSEj>IHY+=9ZdW@3:oGnB'Ucn3gU.!Ib2dlAoR-8/dI#.#$%#;mG&BfBBd@X=V"OsoTrU'o)?QfKCF;-%GC/7QsU^$P3!Vj_PBBc<>OoS^$ZN-huIX%FEQdgJTgDpZTL#gCtdqIB+r&ekd6JnYbR!#`jIIW#[0CZOpO/jhZ'grKs5)L8b5A-h:(KJlrAtH1tlHhJ3/[EGAMuFa6N+kfm6p&h+6YL/okee=a.>fC1`MQrTB([Y.,B:ODM_)0t$O@gEN8S!B4$(&!Wm9#,DcM3,`:kMDYni24NZP#rB6MGh*W:YH]sq.J&B<=X)sA7ji=DP]r3$C3s6=%oQ?nMcE4R]mlU:@XGk3rCQV[2DSo-<"Xn6Jj=Xd'$;,,1[`G0jL*ecE*G-ABYN'FV[V^.Z0G[!inPd1dV*r2'^0"pn'17s-6,CS(QTPk!HLS0$&et4I%qE,5*6Ljb-X>s@ZHoU'ZKT]0TmiK;^6#po:d=TWphQ!\(-O^T_84MdPS(=Vb'YLFr@Y/,7r4;V(B'Tbe3;n]5((bOrt[*oUN;X.aUu4Uj4o73R;eUA#FViMu>Ri840i9eLc7$sD-d#51WO72Gi_d"04735>5fJ(1k)XA?X9lT)%q`sF1?\[/sDrSmYNi&I@>FRV!U[5P&M4mMH"Mi,dPrWYYSUFQ~> endstream endobj 6 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 5 0 R /Annots 7 0 R >> endobj 7 0 obj [ 8 0 R 10 0 R 12 0 R 14 0 R 16 0 R 18 0 R 20 0 R 22 0 R 24 0 R 26 0 R 28 0 R 30 0 R 32 0 R 34 0 R 36 0 R 38 0 R ] endobj 8 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 256.439 169.44 246.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 9 0 R /H /I >> endobj 10 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 245.439 174.6 235.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 11 0 R /H /I >> endobj 12 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 234.439 187.1 224.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 13 0 R /H /I >> endobj 14 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 223.439 139.88 213.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 15 0 R /H /I >> endobj 16 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 212.439 134.32 202.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 17 0 R /H /I >> endobj 18 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 201.439 164.45 191.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 19 0 R /H /I >> endobj 20 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 190.439 165.0 180.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 21 0 R /H /I >> endobj 22 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 179.439 244.03 169.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 23 0 R /H /I >> endobj 24 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 168.439 218.73 158.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 25 0 R /H /I >> endobj 26 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 157.439 218.75 147.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 27 0 R /H /I >> endobj 28 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 146.439 227.92 136.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 29 0 R /H /I >> endobj 30 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 135.439 192.93 125.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 31 0 R /H /I >> endobj 32 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 124.439 172.1 114.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 33 0 R /H /I >> endobj 34 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 113.439 176.11 103.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 35 0 R /H /I >> endobj 36 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 102.439 180.7 92.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 37 0 R /H /I >> endobj 38 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 91.439 201.25 81.439 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 39 0 R /H /I >> endobj 40 0 obj << /Length 3140 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gb"/+h/D)Y&V'O^Z&]4LaSK)Bp0&/)R_"j'?'<2;P+q1C=5p@g9;7HB]XRoh8IZu+'Wmo-GP.XEnhN"spbM6#$T>'?CA#nc5Ok92:TQ`B?bH`sk)3lPTT7-=]k=9`cUuY)-)'9[9nIbd(2BQB5H#]b%Cpr%qUb$+LC(Ea_14,H<2pP9S9QP*KpF^R54o*rC7uF.pHi#m8LJHjKVh8Fo`r-Tfd^;?`H\N"MS^Z+=f@$XW8AAV[e$`1fab7Y4[2+PJfLX-IH9B_G&6a!Rou\D>,_H)l=!dedK,Xtkj47d;1>qufj3>L8;bjjWAh+Z$aih24XpTm#lM6=:9r^b^`b[-5n's?PMq\_WAh%X$aie=oij^iS@D0i=ZQ\%,o'_0'Ps@e!t2M5$aigG4p9U;0j5))p_R7LALjJ.^5eP-EM4._TmfE=$Kj,lN7$r;J_hj_.X"U;X^1m(m:DSe%ns)*HUSfY"2Ki-Cg.!sAG"HY,9-WV(T'V/^<%B!NbC/>-gf%D9sN)3^(-N\k[Ij@Lh)3>kfX*T&>I13LGS,g@@a"_1;R0U&7*A1:7l7bD/cDno(;\UBl?'r<*IpXdK&29*SC<166D>HjZi-I&=sHn^=fkME<]aKiML(:';upf$7..RJeT^T4nY6a#;'m\g'[>1CRtZ^B+Z?bA][<`2'l/a\kL:/^S9jn2/N"g1f(],^p`n&F=F)OVoc+V;Q!#K^LXbdH92nsHa4V'0-cHehh"%s^>;l\;Phh^Lj<0W`0-$AXCS2Rb"d7>7*38f\Uhs%j62rCC8rq?&\A$Y6%9AZ80*t6OPYARZ.VW-psP\`3h;GZEu;e,7WcGHGmZbn][HF3=^24X[O(6"&X3J^uoFBOZBjD4..j:g9])=:8ecSD)@*Q`0"9s'e;PK2M)jM>b*=q4+5ag.r1[^%66L0h8/E;rE]r!k\l:Ila1bXZR#d7sf"doX7GY*Rr!%7`%AFmC_TKhZ6h2QIXT._45/L].GLa31La-*o2NoE7aN-N4H^BC^;I+<[s2/0`[I'd^:Us;*fo0.HQEuYX66NI+W-Am@,lt*=#iP4LYfVg!Bq5Pph&Q'f0Sck=3hs+G_&.W;e*h.A.-dSA%9:^Ip>=`-]YPNpY@N*o(?B/k*'aH>%:ic+,(P6H[J!Be;`t#0c:ML=7j>>PLT2fnWsf6%;+,#D'XWsTKhf*>YEp;^0Vg848n8$lW9%b*50!qp^_TQ/K<1M)7)J3gPt!LMG6M(3Hc1J3n](*A;2"[8R=,^_t$RK.j$^\8FJ=tX6e)&YX:.R]&$BYr/WD([A8lK.84khS0\%RL[19pSZB3Nn'[%^8IpWkJ+r4$*U85HaSM_7DM.H%Zg>kVa+h=CG22NHkdNqpE8Q6H^i^cqID,hC"2]Q'H._q3G9)S*Y(GnoD*G!-2f#mF#/RV6XZKfp6$NHYebp]?n[PcW)2c$!+Y#0F<78#l-I2;M_d?eb9a)u:i-i3f=m#MoTa0IUho'Ej\O5Qi?m\#_pOnfBPb4OeIYYN%gn%YZ8b_N8d$.k1Wq)YX@&W\Y,dFTGR`VWVX;]Nk#;F2Z]QIlqp2;,:e4H+^4P:1//.h4-=Fma2![cs8:.cY<#)S>HD-)HqE$Sl,#,hN6LP@*9rbRfnj$<66ddq6.]kpI#Mh?PCP8OX+cS\dbaa-6Q1c[88&Uk."aHbhL1OaeG##od]hjp]PSc(n=XO@@A]YF$rL'?"FQUL'TA!FA3G"M`Kt3MTW&HW*F7\1QfFg(7B\m%OU\K?K55U!-].;6@S7KMH!C<.X]ZeDf5VG/m2`dIH94fJ;j1?.bnRc[j(^[,pkisS*H+,MH^585-A#34Kqe6Zj+!(_dW9UM!sY1F9tWnR;Z$(RK?/uI68Hmig2u*UD*!M(n,RBf&""A[[%IXJEf.F@1bdVONM`@VgWthm^*b5Mfha/S;"5^GK`^k:+??Q[\3kZJ=tg]c/42doY%Ps+8eIMUC@qB(S-Lr?.$h8%"\(9Bq["m:U=PkX:iG]qj["k^[fE=UZEGd+T2lE^(6;eHDo_D>XjDkXFEChM2nseGX\1=qEnY:ZNI?h43rb$-m0:EIJa0eYt5O41V87Aii1:t":pS#rC+_:KfU&5T!8WnL^Z<]6/.ut,sREK7,&kPad6>$Ya6@50$2mtV=@Ad?S\);O*-dJr-=O^s65)%M`1QFLu'ibH@,1'pRe:(`it<-mo[OUX'M-T=jY^uipR\eDV\b7*QP"fU\dd1ps2@aG.NWHFp@?OU'E'%9]WS/TjV\l&)B5F#0k3r!!~> endstream endobj 41 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 40 0 R /Annots 42 0 R >> endobj 42 0 obj [ 43 0 R 45 0 R 47 0 R 49 0 R 51 0 R 53 0 R 55 0 R 57 0 R 59 0 R 61 0 R 62 0 R ] endobj 43 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 719.0 197.38 709.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 44 0 R /H /I >> endobj 45 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 708.0 190.71 698.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 46 0 R /H /I >> endobj 47 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 697.0 167.78 687.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 48 0 R /H /I >> endobj 49 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 686.0 174.44 676.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 50 0 R /H /I >> endobj 51 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 675.0 194.16 665.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 52 0 R /H /I >> endobj 53 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 664.0 132.39 654.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 54 0 R /H /I >> endobj 55 0 obj << /Type /Annot /Subtype /Link /Rect [ 96.0 653.0 131.83 643.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 56 0 R /H /I >> endobj 57 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 642.0 165.56 632.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 58 0 R /H /I >> endobj 59 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 631.0 181.92 621.0 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A 60 0 R /H /I >> endobj 61 0 obj << /Type /Annot /Subtype /Link /Rect [ 425.5 436.674 530.5 426.674 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.rsnapshot.org/) /S /URI >> /H /I >> endobj 62 0 obj << /Type /Annot /Subtype /Link /Rect [ 202.2 260.796 353.04 250.796 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.gnu.org/copyleft/gpl.html) /S /URI >> /H /I >> endobj 63 0 obj << /Length 2886 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat%%99\DG%DMS?n82d;]%,BTO0-Q52q^cmg7>3R]sWWd*,(bKR?g8p.CJ43omm6BJDB^;Du%9='+'75#QjW/lat2ukp2Zdo5llnn*[':rEVOR_CqM)PA!"F:Xa!G/gouFjS/C5gY+cjg=Y].j?Jk$5@JLpM5S]0L5',VdLrn^,$JLpNa$q!4=#!8AFeSL@Wn;AEYGV,%"tj[dA8o>-YXM2a!V,)5E9p>YDk\gP%=BC3XscCjSgRHr!`ZT4Lge'p&uc)+>JCH-"*)4h((EO0D?)snKsSWmQ_]pDiX)-0)8Wp3@Xd*Zmg*)FjDMohHPXeJZI#B`DRfpQ#7W6aI-fZX?mboA,pB"NH1[NkYpb9U7dhA;0TmEp=#/O=8e*JpT%,/RC%2^$R4X3qB(C?tNc?M&G#"J:pZrOCXchjDfsS;jrZ&,-lIlXT+Y=Z#GmKMX?Q,3=]7Gp_@e\fWf^83g04rA!aX]eq\BU`:K%;$Zo-,=H1#R)-J0[a;A<)\QqsD(8mC.2Cu-NZ0@jfJm_uHV!0c'[q?Fk18mB@$GPs7%j];5+DE`G[F45Xdj-B3"rH'0S#*H)[TkF$Yg-uF,S'O$.L?UJ&k$I.VKbPVMa:\LdHIU?@QX=NpnZ<=I`S/3'iA)rFAYOqpA<:mX!OoT&[\r!(6"8t]pLMVa,.;4i3I&l(^+L=%8toSh=,c'conY9\EQ;3;DUKd33nhKo)fNGD&I2]GnqL:]`0WQ=N2'@]/JF[2-?'!S[1g0$%a?f#^DWC'cRVMf7t5"*VBdWe4f;B/+*IJl=H'fY)rK&?i#$W>cp"#_LRF*X-aFT,!]1iAO%f:orYAg6JOeX'Jm.!XDMZebG!gOKuG.+BYjMAp=D@ESn*atQg[%)Y/PRu[%,>q3X6g$?C0u=n4g[2/(3E[u_rhI9ce/RYJg)7=HL%90uIRYq-'#`]3[]>Q\d?'^L;H4`Pr=XM'<"dbi:>G[+oOQbsG6b%nFIR,uD[##6>ra0i$YG,nM>76I=Sfbm?/2Lq0o-k-X[n8E2nY`[:(1!aB+,La['p.Gets.=\WuD,##r<1>#"f!o3j91A['q`pSq;(=MT#UA&sN!`*_(q#i4]b@#<"-j.f+bcRMQQVrFE&#l0%2:PmH,od/$WBhJ1""'d-=>.<*cUeqli#&6)hF14fhbBh=?$/EJ./3@N+XQpD*O8Zo\l"f4,c\WVn/cCiWm)6DS\>E^QlZaX3k)JF6CV%)$DL]]cZMWc$Ub%ioEgB6B?#4#'r`ZSTPu`O:#,ToV.4Kkr3<"W4Ril593YMgWbg]]]#K^@bAAb]rG"Pg:(d\<%1f9e9a;GVi-KCUm3HiXLI/_oCTmg$q+LbL$djA&G7U[^;l;X(GRA\Z7$[;\GGj@qYQn6qF2T#((81i#D73l`#n,@U>1K,9oF&k]$qPV4Ci,ZoHFBOO+D@cjBFp^f<@X\V;lic/7&JD1^?&El*T:@A3Q'?ODf5\el"dG.'i2iq\!3SH6uT3!Q3$2i!JT;bD0Dt35-"&dhM65R/R)C*lFIY.rdK7(AI=V0>?PW`r5!rf>Y7X,ZutM8WI`/qm:(fP58!18!EQU\RWOS3WDTLS9Rl2b[Z."U/o@eZ60Am?D^T'V.Q;*d,66H#3;\VS#Z@?bdAcdM-NPX&X_H\X*M>1Mom5/D^';ha$;M%^RmC9M"=RAA[)O<&NYPHFlZom+TV2u5lXjM`BV-^00tGdVF_sqkj4):2ep].l"@]RO2NkrlUPAlH(cV5&$O^keHh@[]q@;5O6u6W8RGRGBng`VVoTg9X//UF!ZkmlGrSR+5O]qq!WLZB(FVk!U]Rk9rBAN]78Z8YTEN`a9!LgS7da.T"ch#BP7A8q7$%[dFhn4da?1R"=[;Jq'8b2N5VVFkPl#-[k@~> endstream endobj 64 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 63 0 R >> endobj 65 0 obj << /Length 2966 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=.D3*_c&cTMZ_V_X(G\-2H$?.)5BS0WLbI*%V+DCV&CX]_rZKR+mq>B\SBni(M/Bccl(P'i!*'P@*o0ViBc-tsUE8d^$O=`BfVtK'=j=f*H5C\e"hKkCKGOVXkQ3BN?`,$",fc1U+AM[rj18Tc*3$@rn:%^aB0X8cj>jdnC#Yg-D.H3Nl:\i`Ucjm79_ZCOu,[#!;28I:_cRJ[G&c/>I0?VU15nr7KNh]Mc+;AD7,T#Y_)db"^rj-=Gh1Bn;`k[oW0D$RsekjiN8.Z;!YS:d74XkQcO*D"Tu75MhA0S1F.>kPM=/DO/@_M;A/7+6TLl_OD.D1F0N??75/k;B66`a!T#K]ZJEs,r92AS)*P_E6R+b]68A0"0Zc$c3SUriG8QD.V]n]G:/!qA=rI0aH=!kFi]6@k%QVCg?T28chhMTOZ/o;UcHs)l*,PGg/+ql;3D&-:t8sfMBcD>gGk-fW=",`Z92GIFp$!IC!!p(j^J!\LW,s2G0(9/si:m^*(7QX)>&?7]fK@HPk#d86ofh+u\G-^U%q6q&o=7!9A?D3gXkYP%%5SJ&o2HF:jsaX(IB7A:.:H]0'-ZgoOh?C3As0hH`Jg`*StDA*FVcXCe4)f]"#+P#5X3&_?]V`7A`-k'L\%="et7$M5>3*Dk1BFmjcXXeDB8(C;iL,_`F.Q_pAeZRL11QUpD(YWfEA=cLDO(aOYDa96q*b-8.iDPT[[YQRU\U_lf]SC7:,Qpj$kd3uBcEjXJ6`6b*Ls,"S+\E!5AF[S,/Dt<&[/:%]G$c'jR)R:l.\MY,VeY@s[MV:/2#o/oJ9.)(?gs\a6dg;$N$:H[RQNd5!Y/*1DB4O>1Sd)N`dtE?KDO0qbOX38*Q_RcUI3K]/+Vic<%LQGhTSoMU,\Z2b%ral9f2Ct<"Q?:ERpB%ln]1oTV[!i0W3Q(.8I3=,3(dLMH"-]eV*Nc<,fj[2^G:d1#sJt'c.&-jIBqB>V86/Ch:O@SJZAuW:_O.ti*n,87'E"5Er`/8`g[=F0+b@i9u^\')gDlTm]S4UD9h,VkTV4bG',S2Q,05]Q^=aC[\6.afX&rT]ZF1BD+EQ!s%1-FWiS(4\j4oWVtPV+.PaQMTfY1IUJ]hR$-=f*BK:2+J9&]"niP6#?ZO%_V0:PKOLI7$$ka&.%'u$EA2?e]_qf[YR-]58/js/(/_k5]h0>E?57adqrLS?qHf8ZkiM&+n8?A>Qn_bq12anG;\hP*K,fK[2bA7tb#2O79(Wbn`dt?%%<]:j91C?WA"Z0<94n;-2@g%7'R]'%d':,aEAGmL1VJfn)/JciO'Y<7/L>FsZ^O'tVE,^.]]W#C:S[G60M2`gAUi&==bd3B>kYE=Yq:1tiU-%3CL_RCo#.*l6$.+1!K54j2Ep'Qa@U)j%jRdg]f%,^-rXBhkJBf91Jpk4\D<#2C/_Q2M">;Mr_d2t=BRNbNmQRm)1E&UkB'^`=4-J>@O1ZaW0m`7j)>beD(YJ^+-hDMrJXGganZO7a'A"9I(iPUYCBdaiAsc=%K.%utB!YWkd'26_k%i3!L@/+WP&p"q.":T'C5hnS2[I(?7uA\a`eoNFIKK05^l/,q`D%%'GmX@u7hWPm6-*?81E&S:8T%"$@giDjS$%8_nZ_m`h>5p"^p(r54](TJ=Bo8Z%aoE0O>Y:e`tF7_)9\s5pPB"7B0Ma?4l.%BhK`L`0;edb4)=PR$eD,%.f/11nI<]9#sL&EJ,)^Lf[[9IY+]oAm"KV'PIo>]I$0r/1#;jnnal\3%i&6fO=U2PR,-'M0KeK,asH%V678884([:+*B]U,0*UVH%\87WR&0iV^kP7-"d1^QVk?MKAH%K#CoHGi7%n7qOAP)Cjt8/q\KQhSG`U'rh4jB`$QAY\e0kcH;ZW=2=+0W)dJeWGuENFVo\r;)$-h;d!a.s@A,4q$hYr-gtSX&>>r.XhRJ4&7.(h;BbWS]ckYU9[X.;!K?3h>fMR7'/7C%3TZ)a4A'?OB_n-_AXRkcZ:OQ*I2o3ugpiTALQ=JkBrF

.fZf"qP4)F(\jI9ZbCYr-(/JN9rjS endstream endobj 66 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 65 0 R >> endobj 67 0 obj << /Length 3471 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gau0FD3*G]&cSA/@A!de!01+KQLA%\D0fFY?J=.$%VU`OQ>)go=`d)H*WQ"s30\#'bMMQ?,!`s,&NLg@LVk!U^O:G"n0qR0@1Y&_G&P7:r_9a*iErsJigsCDE=f5f:WLF=hORYnGea"bBDmU0>IE5-7b0.gqU@!#RjBfV5n^,<.JaNj^s;7\=Qc6TU`jss(BPO9UIOa%n^#2'?XQ%=!`WMQH,$(^26.QTk6:dUXDp+Id.L0$]>gg,Nf@(*>[.faU*(D12H$n_LXdkVB2L]BFMt#@mSWq?`d,Yf^:j-J#gtEEGoj)eniU$6'-L,ZBgl#6EGBSE%9e4X5A>`e<>hVNC=g%._sBFn7-Nc*#It;"qbEdFMenb!Jsp?.4KFob+hropl'Ntc#a39S0@?IlEueKN=^Q!=qi[r;>Em]%k&o:ctP7h%cG@VtKh>@2*16r=N4WV1GGCOqt59NT?D.&ORQi.)W\)d/'Db\q]kVBeP%G#-R48A['>h=4rVplNcK,K]m%ktW4.d(G=QGg3'8F-oMG5&MVKo(u]B#Y.VIEuup-Q]m-k?IA0d)`U"$M)f;mGGfj6[W4B6]=d/>DASIhG2[rELH%rcJ/,e_+_%Y(TGS)p(B?1a3fApd\]nZL>L_5:XdqI99SW4p2m(ClTJmG-Q4pY9=.4a:)kRuL&M[[_&+^h_a4q"[r^"1h.I\N"![j]OqdRL(+l0O7m&5=Dc1.oE!X7ErLjlA"0MDo1P7.n%&0f)h]'BVfdnujE\dg1T4=FZg_+4%>VK&)L0:([=Y_icpaL5m>`IVLf;Y3@0kA:_qDNs.(0lu;r'#Fkpc[@]>.e]PHWldAo@n``mLUOcFM%V]CN_\egDU`"CenZ8c2Olh[o+N)5_IlmAS`?2n8[)OArke&#D`B+LC1BIhiu:iZGGfdX4=Ys,+0AXKlt+F2*5-I'O_(S_9CQ]=g>=E#MUF^2+@l,=#$pn05O"#h$)`ILeW5`0-6XO!`500r!/s[i">1BMa[;``BGf1ub.Kk@"F'ZbJ4aX`^\n%t^M_DpDHLCMO)PoMrM-UpCV]drr@VIO\RhNl,hQaS#c@6IRad2[C3W58F1kcU.Vtgl]CW\WiI':%q;Eu_&Np\r/,N3s^0'L.uB!5O:caYfq#V*_3!WE8rC+&@KQX0''[Qk,rDj-p_OjE%HLPJtj>HJ?YVTa?C/d?%T"MS:;/dQ3,:%nkT_!okGdnnX.P4sqFr4s%$-Ona-U=UQrs;7H;-fulqlUQ;]D>cj`]nD5Y[X\Z`T?c/i(A3/mUN9T7k.p'BBm'PB_8/p6j2I0o7KST-kUGC-.-kKfZI@=!"eabFna[Uo*%?+W3^K,U;,D"VG/)jV9RiAZ094/!p1.TQ4\Til(Q1SQ!_<.pm1!3:(t'Q&!W>>A(KTH(&JNDo'"*g@k0`_o):t%Oe+"c2Q\P'J>5_-j:i#r:fh7nUGe.N7SAP`JQlB6?U<-'dEAnYU&?^=ds/(?@2C^dQ#2NU%a_dfOh:sYL>imfZlV7$NXrR6q-'q*OB@TJYr-,=5/RL"0g+uA)p!pe0?(G:\0PF`^NRIi&P%2ru%r\f=RScE>N%X=JjY3/EnmQO8]91Dn$tl*j[Tfk8M8Y.n@n(Mkb6$Tt+dJ[`uLZG=#\+U0TUTrVX0L-S?>k$`pK8qOj\g`cFCNhALjHB7MMEtb*4"*J#;Bl3L%Bng-=-_3%c*g0B*;LkIBgR)#->/C?pTFN/PXc?J[9E't`?+7K8cKiXTDo[I*@dQA<)B?jrZ8/nt((-jW(&_X84d6L:H!uQj>&Pn7F'MPEEnS39=SNRm_cZsE)j=O[^5rDK"06S++XN;oNj)s+MGARiXeG"<]DssgOGL_hG@&AW/-$fFCR"Mc#)_mlTXLc/rAP2:4=dtIi_eT^;*g8Lg_G=o_(b6B9hVV?Q9Wp/No=X3DZ#`QQr82h'[WGgRiujjj#0@L2i;cl"!*S(6eIF7PQUuAC#U)%aD#Af#,n]'E>3DLj\"&\m2TLBo\m'K+`VqGR24l>'bhkih<+7rO2!HkhiWqfVoouP^cqbg_rIqRCjAsg>d,%+an=Is!D%D@cJ:#2lPl>+CZbeLPSCLscRtSt7K9CD5FWUDpCBk!d4p\l?f!<24pp:'pIAUb`X*g:QEHlN68<=\:XuVNe?e4C3G??3ohRnZ(7P8H!=am(#.;Bf?VVMOf-?STH)C!qQlEVoNN,s)@:-FW+bUsUmi"!3(I_.5N_1_f.=IKi`NGB$cY/`!Yl%s$oG,,s"D])I_gPD4cfTt+L&(@MJZ9ul9Zr$iFtX.-a8@Q8h^gZMuI&=W$/dL@FU+"e*r!uYLA8n,e)1E+9"Ca-^0CupR)RAa;-V+^Y9rq-!M7uiQ]T4Q1`fp6"%#D@jKAjh"!c52R29#fQKWe046lbtuBn0QXL6o&S^1PS=]"E6hrpuKa<=7D3Z0pfIVqV:n>XF^/N7aqXb=>QXVO\4Wo&MbF%1dj0S8k.N?R7rTY;1)C=q^aJqe\Y6N9p@\sbOG6#Vl)KRZ%)4S;pSG^ofjS\rDnTuC?/juk&51PIA52WpW4"h/B5G[Rs>VBm`3XL5L.Q9Va5?IJcrC:CluPRET/d;o3_3bF)q~> endstream endobj 68 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 67 0 R /Annots 69 0 R >> endobj 69 0 obj [ 70 0 R ] endobj 70 0 obj << /Type /Annot /Subtype /Link /Rect [ 385.77 351.076 490.77 341.076 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.rsnapshot.org/) /S /URI >> /H /I >> endobj 71 0 obj << /Length 4200 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=/D/\LD&cR6o@_\HE=>Q+2]m]7@8aE*Ad`+QSoSS/LEP8B[U8f%,r9l_q:uYkC=QLd8MfX#2/a8]VLZb3ntu;Fc*F+e`R9Hi0<5#P95G>G1iZG)J^7I=3BVT7>!696Yc;Y_&PQ"P["))4<*\!V2G8@r50X#W.RU=kano/-+*&,W/C`9l#0[!d9n;P5+i9198,G9UD>Z7'^@9N@":e:"LlX$nBC$;t_CAL]'n\gJRc2@Dd6Ct8^Gq18pQLH$,-a#OM/hlfKr*nuTEB_ha,T"Duf%+#QV&Z=q.n^nA_@oV--2a[=9Du8kJOlURbF@if2gAI93PrV]9X=[\DoX+KCLKL`0a+2/0a,=+L'RhY$mG8Fg!#cSnBZmIpWK/XP&UnDBZnre!XOp%O:29CI_IQ8!XO6'>`INB!((Yeq16_rU7d4iH#Ys`d&QM#Zdja6eu(*WD1>oEJ2^)dn5jG.D\4]F]('nn2qSS7iJD11(TqL`ggZ]?tuj0qJS%92W);m!nYSfJ@8h(9+R[L8o#%:U\:dM$k0JBV\A5YDe5ZT/Rc2N0D4i+o#nk$Wrb0#[Omlbq[uMk;QUGec#?9nl"3JKMJ:rg=T+S`7r/j\hQ8X-"!m8WeT_;bc4-?%\j:jq5c-9:9L]FNM3p4bNd?($BBdQ*\T$%l>2EkBm6*EQO=d"5$Tps'$)bUi>';:a8M@)L5ISEp54sWas%TKgT\(Yp8<"btgC,d/Ieo%p$(1"F09fZP77^W&QA@OA,6:ITd8Fu'mKkj`bY<`HO#"VSJ3U2'D9K/l6"":2^F39,;qFB.]a3"F,MSi2dmg.9@O[+PX$oi$9/Y)9.b@e&-P6\qm7V9jI\%!j[&VK8`1-:];4%WOe#`TYn6S"lU>aPP$$2-T+GM_kdJ0sne7dLNEJ6dd%MkGmYtA<$"CsGAD0O=+s&"'ab:>N`dC1\NS@Z@6#+_Y]FgPo*g(6nLBNfG27?NA\$Vk4QLkkQcjAOT#[RZb&Y0D!R_a?X$X\aW[Q9Ca$<%\&0dl"`U@"DLFW1ffl$-V&D?akHgkQ`_M>RoctdrUlmcAf41UKB]gP.m*b%VJ\d\!CMO=hBQ"GH1+lBIN?)kW*Y]$/P0BC9F/_p%0-r@k0[QL<+#tC^q$gf78Or+k>O!1@+Y5ZY5"WV.4:$OkC.Z*>Pq))P7Q-Nm8p5WX>10B)^P3aRLhhEIR(8sT!06=85]o3qJGB:DS8[P&!dKW9!*PFT0NVun[0gik%.)'5+j%EqHl[mp:FF#;(N=7^Up2q(@B/)?a`KulE4h@W(m]ho7t/4Db4&OFKeCENPYX\E^Z\QR7D$sNd9+aRf82a>m?bsgC>oiE(I3fk+i5Orf:=/lhl'f)1[s#*"naerR?S;#2Di=6?M>dDHjT5nUWWP%1Wb#B@q(:65Ed]#@]7%nHKLDCZ8f4aoIXX29=iW;B*63DjWk`i,;&.g'G4m\GA%$8+7S5$ZJYQK$Tr2aEU1p\XqddK#hsNhoZ%Na9FT'1f6;C<2TJG'/DjQ"I?A`@A#>6PP$UE08*kf#_U,>@SciOWG@CH]Qlc2nPlB@g6N*je6n2+46FolJr5T4Ctu##i?89/pr68N]tnFCRqBfu/`hi1AL(1hUr3'1q^Ms3E#FJp>K#"V.R`F)@P#il(!&<\2(UXGEs)`r`'J"thB-`EgN$0=Xp@rXgNL=aL.SY>&+pL5S,:E4YU^(nie(Ae+?R.7J&khYC0Q/(G7Y$R,_od=Hp_EGIfk_>li`I5F(NP?lO5&d#;I/NZpL&ci==mR4*X:^_QhX"[+BFK_L[Z04Q/&[cfD.N?f51NmoOYu_]6mKSFl-OfPhm1(/ipIVq$snCH4IAF/;0kY?\0CG0QaSfM(t$.:3@RLS!(]Sci*YKBrug/^+M2^8VnN57eKdsWbAfb[fJ$m^3Q=;j\rmnl))qJ_Jn&QIJMMd/hOD7jgH5T`(815=0NGQa478(CnN#7"hdoDE#XctcdA8VYGkam?rNd[r!*:VuOdA/A$'Gp[&?(r(7KrEjNSO0iV2a5Y4;%>JFC<9n#X_S.L;a]"]G!hGTmi>d9cKt0)FSo:M,Nk[/PF[X+j&&T%_0I&M_ru0%2<&K`%k/u3nQnSp`On.TDN<>nQdr4kOd=!92QM!gMrE2!H[\qB6^.\rL^=Zls@qf8J<,cHn^O.6m9FkeK]WEY3orNUM*a_0r;q<.]rL$hsoP]DGaX%)l_fd8F$&4e2@H_eDiC?h\D&p,1E-sceR-`[6m3[[Xi2OVV6O9pH$hl9!Qohg5Kn>7J,8BfNSnm*^>Db6YJ@)*gfQ[HjOY3GIMKEb;@gnM2?a1>!/nF/ED6_"J_C+gqg;m';joHh)\0\AMhDq'TeOrf%7rSrY+bh/YV@?^]&hfj>b@X'k8S'R)s%o0k**_)Qu6+$][Ir3r%JBShERc<*I@PW^EPC3TUFNt7j)anh&89P#c endstream endobj 72 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 71 0 R >> endobj 73 0 obj << /Length 3997 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gatm>D3*_c&cR6o_Yo]\^o,_pm!MD-2!>*Wd\8@O+<)<111`6lM2j!dj8SnI&jj.lrQfiI+nE$]8iCWG+*I?!S8^=uGQk"h92_Ou]m.adt&HXX8&LrK+o2PlJ8IB4Xq5pH.4AH,oa.;WE%J/aP4EB>\tMCBcq5#=0,`QY"SqOcUaR0I3cKHBum@rh4CLke#mkjo2g$A/$HdpQM%5^9)3hYR2Y2>LHuQ-@;H/A1J3./rLC_Pjl`h3+7"QGlY^ekHN[An/5F&)O"tVb4ToZnnY-Vs0"_m`(iMAW=/&WAi7%1]hI6,p]A'DWF-0bSg=O"4_M!-_P3.%o9@m4SWgG=o[pnM0X$t5#YCig8bI\ka-8'%H5\W=)))kUmGdLKCp[a?:)HPHpofdM3`Jc"A)'dPuX\ZOn9B&l0.q]Q>4GmId(=%T.>D5&ZM>+\s:GZ^?ZK+W7(Hu"8b(+U^h??+5E$!M&824>hGion8SF)5+cWY!lXlF*%4a0XlP\*5@%D?b)s4Tk0&nKi1H_e)fc>bYEXn5>hM**.WA0_'"1BD``I4lPV&cF5cY?W#0'DD:NKdZaW#U=7*NG+*=X#isMj#fkqs4>tsGVtrNV7k[G1HPg(,RO&?I_XWNht!''.FuBrb#KCCZVT#8et16FAo0,rE1`e,G0qi)B2e'tmh6c&34TIoFrl).E7)Fr5-=*\o@C;@VGC0+U<-g=#.*j2NTPLXhaQ\_p)%o5WT+,$QD=G.B.Cl"bBP/.%`!@`q9BM/uO^MV\h-3IUY^h2(ou"&TT!lkX\nA/$gOMVJH@=8M4XRY9(DWgR[.Qp)!\la+#00r50'>@K_,PMB_YIfbE&`bD:=6egt$$_eJ+<6e-m<>%n@O&ptBc-]L/_"S8m_W\n*8-sHRZ1YTBNpR(*"PJh&ig:$He('&39$@pQr!sJ\A(%!23gia[Zle8&XqBn=k&N"fp'iqF&#CSUMA1VN<=9oV6D7k]m_^09[B?Kg$&-g?99tUQL$0%F#eRe9&#oJ<1,`(qZD@)VO/[+(XJF[f'D&XZdf3qVs,3,"\8%CA\>e98-;b=oAH*>-*k;B\OdpI6NRoqk@+XDRJ&KL#Qg8K,6AJM&(;c,"0TcqHWO@k@RlCB`;'GP\h1h)LGnfahHHNX>:csiu@[^b>,&2Z7i=rc-6Gc_JTKqACsb^%.`g=OKRYW4QM1=_IZAt4]*PQL&aMP8[BrY8@$r10P97D3fBa]..Yl[i/:@"M**PCS00R@f;&a=P.R-4n&KQB&^@5ZX8Zofm6/4U6p[h_3cFMQJ(9\':X[6n+H(>YF@IMg`6bqm%>:;kMsS1NtLF%LLV:*se_/"Y'@caV*iu!D*h,^C?RdO,1>Y.GGZq@RO[^k`Z$(icM&-D>=9gT;>LT[\!CTW9%tKaU3&EE+P-knP4k*=E#-,k5*pSr*;f4;`tsg7qiWC^b'=-7h`_n:_Y\$lJAMj)3'["4TW<.s2GI1o>_#P:(5!\i[o@"AOW8/KKXT@oleIohW[Y5$B$\bTjc,Ui?Z[=<978igtKmVM](n%F.],S"AuHGhq9?^BC1fc41Os?`*XX@q=#ZkN41]&ZTaSX7QdW;PklY^c6p<0%MKXF1j`pHa]tVZ[MMQ[40I96,]d^Lk*uW8SJV1=/n2J8(+"g6VKgiZ1sm*iS"M?n"N@Rs[j[fd(\TIkaaO!aU?b3Xb:s:96.@rTpOt;hl;(VS]M\QXYA$Y\ANF7U45Sm'(1:NDU`.$nYG[g9'AVu&NP&9SaC:]C7(GNQ^6n!@NJK:q'B9&Aq-G>6m,eC@@/Gd#))'i11K%dfWp<&=R/SaZR-5``NPI:T=Buk2'>RiGjSepgb/?T5RMhoE&@bNATq^7<2C7QZ+LPk@1gfWOG]Hb+ooif1$S/]Xj0o+rYXjq-sE[04=!4l9WU+-a),HHI)AO\OPl"(@'u/1E9A;f`Ktai\=Ih1.I#sVi*86[uKK,!^%NaXie)R/."s1Fr.C,:1VQED$[Y?/uq$q8"/f?88la5(+f!97@;qH^").1g$P<\"'Lu:U(`5X`1LU#PEPDj)nU\GXKC&[-Z^*f4ru9XJR$"RGU2'%gS,"bEIGeIN6V#4@6uINuS2ni&\IB+oZF:8#5OY]K1S.GSHo#5M-d,&5()L#MaqA$7K,4DbYC+q%Xo$MYd1E78QdE3;$P/#s:mL9&n91Y1X=4"(O4QfX`t1q\Fbp#VO"n/P[\r+UR_2G`N@R&TPr*]'T.QOH/2Iej95f!!!dd&D>B@j8!I%Os'="l3qe[_cPVqQ-UFAVit*$HK`?)\qodS%&(g,)q!H`3-YRf*0J2SA&">:/J5QN/i.$trk;=)8N?ii0J3p0$:)q&M<3SQ:GQ7bDSFtUiOP*H[f[jel'P0&F7`qml%^Zg;CD4rs1.*8^WXIMb7tFAep3:n6Ypqpc)1FF7$#qo?+@Z!Xj7?WK'e]^~> endstream endobj 74 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 73 0 R /Annots 75 0 R >> endobj 75 0 obj [ 76 0 R 77 0 R 78 0 R ] endobj 76 0 obj << /Type /Annot /Subtype /Link /Rect [ 504.64 109.361 548.8 99.361 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.jdmz.net/rsnapshot) /S /URI >> /H /I >> endobj 77 0 obj << /Type /Annot /Subtype /Link /Rect [ 135.0 98.361 148.89 88.361 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.jdmz.net/rsnapshot) /S /URI >> /H /I >> endobj 78 0 obj << /Type /Annot /Subtype /Link /Rect [ 660.6 87.361 677.81 77.361 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.rsnapshot.org/howto/using-rsnapshot-and-ssh.html) /S /URI >> /H /I >> endobj 79 0 obj << /Length 3370 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat%&D3*_c&cTMZ_G*8U%e.Ve\!.C,)RP9+MrGAf5S3".JsL)>>tO[Fde`n195,g":mSdr/?n%g&r4B`E98>*+*UMM&'6ic?a'm36jpJQkQT_kY$V)+me9Z3SU]:./shLJWeR(p8Tp\AO.2?GFE5h\d2\eGP@rI2cUsb@;cd%M]O*gWaY:q#fjMER$&(p,NdL4rJ#mhn6o2^=;47[>N6bq"kWV94ST^YM$6h-0^"]mQV*?2j7FAU*\US/1Y^00gb-H#o/I4B5=qEV\*DZ][SLquB7&BGI;aMeY,*\\%YksM1W'^29mi!L6X1at=/7Z$F)MLXl9F(:/4SoU"K.I3r#WtOIc.'Yqf[!!Ue"&n"mG;dggYV=7fhCN0H9tb6+N;_>M8&"FWm'^Pkc9T$j4GKZc%n.SPo"j-m0/S[*\mqZ*`u>EjW,$,<82FJ$RWEFrioBWX!@$aDC#Zk+Z+6q88fOP(H1]=8I:5ke]F,U']_,;D#!qr^V(i;.e,iO>m)2$Z10pFf6>_GT2I4&Nc024Q?8NVmgA.\]<1Y#pN^FoeH.)M/F4UAO/Q\E#,VZY`qRjN-"9Y!=XA?ZjL+M?\Z\f'fd)_K>,*8a+n's2@Ek`EjHoXpXP)R&Ojphipr#*mBP^$(7pF%*]Oc2XL2bIg6i0;F#\(1+sX<53+1Y-/)ll6-X)HN!U)l*BspI;JBOX73O+S`:(@n&'U=iFIV+r#pV&$$1s9eHV_a2fPon]?P(U3b6;3@8A=F#Spg](rfEr:*\[E;/;qS6UF%%pK-1YMDDI>=&:SS9[-.6\@-=_q$U^+2R:[A^iNPs=gQK7#XmA97)-lQjhFkLnON357Or4*e^F=eCpVMNSs$kM;,_?#11TE8REOr-,c@X0+P)Z,216j^tY7Kb5/H8*bb.ZQf<_:PJAS.eF0H#N&]"Y3?BV1KH$TpLg_=s5X_"9<=3^k=4i^i2`s[3>#(MK_iLh0C,oS[\+Rj<6c`RPZ\=4$=s7C#Hps!F>0DRTMe_Y#8n=Lk?NH.+C'to6l*<&-SJ[7g1,5VBXs:Sh'a)XPll4V\WOrcdlo!^B4f9J`_JG@_V3up?=E._QloNrWrFbOk/-*THRD"P!1gi:MA'=pO]7lT*)Dg:9DLo9_rumSMY(-=?=psW(8m!,q9OO/WMO0im]4`S`/,l]*F>nPRU;G6A*Ec15B%R[olZYt0J/OfAa-It<@n`PBgOkOY/Xn.PHN30,E:_B'])%S7+u)6Ug,:c(2ehHD``US!G\QfYbOHKR$;l+N(\j+TMj-cK=>T-&-f[\c.c2I9Y<>Uh-Nj:J?^90&3D5sUh_ambH:hDG"&c/C`i>1=^JQc8$e`WD!`9I93lk0),m>&U/g`%"sKSY2A>`M9Od]F$;.H^d4f&oGq^8J;.<3ElGj$PFbOcc7,0`\9+P5BKtFl5R)b#/S&\>`SKUj.aR,#*Ed.s6:X0D*-2pEH'W&PiWL/!tSp*t4`G]-8P6aq$*_XsTpOVTob#9F"^[#?E2:N6uDCI"Fn"6]00!_WZQW0R#p]da514XbkXo3C5Zflk&PN"2ttqo$d:bn*4h]e5e:&Rd9!"@6o]%j#BMAk#uEZW0lt=QgbYTkFN\RRA_=S"o?k2EXh(e[`"DOts5hH=C;+Obr`!m9Dc%!g5J6.O*Y(tk5cO%%3.2fmAkjt7'FKfZVq4LAdCdUbN>L"ssB%kfbG[mU07Z-L:Lplh/A;!mQ#;kOe5gs-\&8"r6Y'$6H0\TT7)Ok5kc<&U!@Ogkn"3d/B^lWQ\L%9g6SU:mi"O&A`joBim/:1*TmTH*>P%=@CF't_/"@X-\-#!mM>pH^G(i4)6-Y,ihoPu[VAs^QB;$ml0'JPBlBqU>c];MEk/,7jRi!aFP/p7#l?4rMj;-NOXB$@':nX=?.7QBt'Z)/$ZfJ_?f!8+u4@&U.m_\T!%r8@2kG=@J=S!m?O&@,C'H`n7Rf;jp/.W7M0/mgO,p2r1u^\ho]0Y@/Q'DesMV5YWK@m(fqgig1Z%:W:P"dfRtBZPmGdcj#62M!Rn/]<.Cp!LsHZ&tn!Nl+\$X@Ij,cY$P^9a*fX\Wt4$eS:tbSTV\@k9L`Z?dg_uo5\?\ogZ:N8p8Y%V7]Y5bD[Xtb#CWe28j6n#Trh1YNg.>$^)JmXr"h4oQ(pdO+"-Ec8Q`RK.-?"gMm"4N/!e]/&W1$Iqu7`R28St+;nbiG]&52#65)_ZnK(lf&T\`D7li)QsCf)=2W5iPMA%SQQ`lR%TA3R'qbKu?j^\up0j(DG&^7ZU?p5,'ea]f'2TPs30%3M"khc2m@E>6c`$dmG9AQCBUF73^0]@2.P9.-h%gko^@$,3n\!HXqe3.%W:cE2cUn:0=YI2RP(24!ZI*-fRT*e+^\lW221LSpc:Ib^'(SuJW/f/CpqDc3MM`\me:VdFY?(.Z^VRHWT0OWP%)UE_EMl8-r]5Ck%Z@f~> endstream endobj 80 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 79 0 R >> endobj 81 0 obj << /Length 2800 /Filter [ /ASCII85Decode /FlateDecode ] >> stream GauHNh2gX*%=d9M@ZWcY;XA,rrK4#?cj%$C1^u.S+\75P@r'*LHE=)Wn*L&JPqC.Q4SJUm3^jO785&$)'Le.QrNq'!qD$k&*q=FNj+Fg&4nq*7rTEYI?soj<5l>`55OX($Uj9^q0i/^6@=^@JkD<%/mYVlgXqRS/RAVfhrmk:=Z7ehaSl?Jq5B%U-[o;UG-^UI.%"+:ANr51?D,rk$u.]D^'u8%q2Ja`UFCq'>X@K3HsTMlaji1%@_!+441.gCD5SaEUEgm#qu+mPV!u::2g!NC^.rbReqKq73\Ca"3!(G5R=ho8ViOB^skbLh1s'JsDe=/hMKcH%SkI?un.>U;I7Jm8:6'nBfB0OZ.RI>-W)1nsgsPg@SKaWO.m&L-@=q'2/>"AlLNY2kiZ==4%LVp_-&[VNg&+*mnVLWXsG@$Y;JKe'Y9X,sNGRb8NkcD,q>]#$?brZD-ft(]o$*>sUZbl_"8*.Im!lcP5S4UTg6j.ql-B@@!EGDJu2jX@$>Vpg+\@_om2XLK-?YVK2ShqdVkBVX,IroDOD],5*AX[^U3JE?KDRPe@ABA%VFJ=2Qc"bB?#`[#qr.ZOa&0R!PC!#"nWO2OPK^=uI:-NPTl5%d7fpDEN9;ap--T);71;m$aq:Uo2&L`[Z=-EnuST4\:&/!PGoDQgi0bf/(]IDL=VNR;BC]TO@'lZpLRj15Gb.cE8k7Y/sY7[bB]Q%\?=V3orHT0_/1Xe%o2fBTCL*qhXF`M?p%t,hNF@`X*(Npeo,gR[JmdK-r-L"Vo"g3t)=f.%5^+e_KCT0WW7t.c9&M2IsA4U<^H*d_C5"MK>T@#-:8/ET)0s2o?efBi7.%UEH/'\EL.iMm=+#'Q!M\(N8V$IJmlVM^U[A[bK-*Aj*&KbuJVGqd3J3qbF6PUbO;:ELA*=&7pMDQV"gPgq:o8%;fr&/G>(o/F0N,:>+A^O]CfgZuhICeg$B>uR1WA@rr4N)o'5oc*7/E^j[Wtof3MN?:C@d$G$&^0=FWPa,Jj:$*V")#W8oZW-7](+O?2KSP#0n,iB\*d>ZQ+k*No$gOd[CA83K/Z.($4#HD40]ZF2R)b[YR!%=*,p0]UAk')+_#R2"a^*rbP%nN"g+C,]Qm]E3h/rTL*=W/*W_!,JI'-m/V]GZY@r*r4S^;?QGHm%4h;1H@@#UVd5>q_TjC,#.*lW44bsoQE$K%oGerlag.fDFg]TtU#:.A'=8Q#$%0`@?#4<\a!G]#PJA_0+RpK(rQ=50RMCM:_&k+TURpCE?lDHV5XWgfJWMq^SZ20'n9?UY7+k2I:@Q1=ZWpW*:S)j/&V283O\mugIBh2^c^K"52,Z#r='sMt8Z\W.34O\%;7*l8e]dACQ_hl`nNV9Ql)CPgqd7j$&[KJ'`Ed,pG`PF%+.)LDn%@8Op&BgO9D5;mo$W1310(0IZe^hm_6p#"a*G^tQ`\<7s"u'"m96:9(\oOfmfCr9F[V>#a]e]HYOp!SY2^0m`UG5sB)X(dOSM_1X>IAqtWoh\>[A]^>%A0LC:VA#2:J@(gMY:1jhegNA^sBC307uW$cUYB-:t-!&/IEJ',9*Y$at_iWWEPsh6A!3`#mgKu-dgN]l'/1se\M]R:N(D]Z6Sc&ma6(5E>0f`f!g66B\V@n8gk0:P38udSsGFhW["Ai`4/9#]pk.IRtX5K(o9Ujr5+4J-VK(l5Y^/Y/Pdedg=n'HTlj2dC'+(dR\=)_-A?-u$Z3HGatAHJG^2!$i&CKh`ABEE[,J+A]U"b31'0$?Q@n&&<-b?-Q%6?[kVl+KPC:hBK>r>6BK#HdCgC$BH8,#U"K(P9T2]tUosLOXqbOVX9eacLo"H,=)#'-f/+m+f@]!qd1o*IHZ;*bmLNe5![<%8o[ml.s1P)rUX*E8u<5h8(BVi.>NZ?:L[ambm(6E8`!#J*?Fn]7Z#"^dZH)Z:ku9G6\q%J;]c1WJm+us$-]+i0%Yj8PZqq+,G:ZS1aV=Eetn$`4u>/5`%*q7(8[[r(,YrpHK8rSY%I,>L"RER$6b6H:dnJ'"X?M''(=Ps.R50=LNm#-(jrm8ah-Y0Y1p(?+ej^A@]D"4u\XkqFNRf_[g[-Cb1)TJ$OX1.N'P$3%KhCPG9k?_g_kVGjOa"rBISmh5ID(K3.B$\d8)#"45JhM;138O6"$l&=Mm0@pX7i\DNBmg/Z>B.Oht)c&Xh-M,]mf@0Jl9h54tRC!hIdGffGTI2=/h!oo@7mTek6,]_Ip^$iOu,ZT[^>0ugn=g\+T^"6s'#t_eR=aQho endstream endobj 82 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 81 0 R >> endobj 83 0 obj << /Length 3972 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gatm>>EA*Y&UlsZ_L9QJ^rs.R;Vi<75u(96B[7GCcn,=PVUt*q6q$T:;LM-1CI+PT":Rt'=DC-QV(_aK^WL9i-J^R!-@QJ[/Hr+GWr(Z8CTN]sqZ#XfFFDYs"oA\8#,FLRaL4NQLNTQ+^cXU\oj]WdE4,&4_FF2g;H*>r,TjePMNRc+?*]JK_]1o#M*cIaIjUXfNe),#K&Z^ColtgDr7"gI(UMH0NXikTA)bm-6O7H_?A4Yn>&0/0):jbJRJ@S0oM9@gk;?rOD=XYG5n=T0?56oI6=G`@"acXP;D(K\'t+brN!Q:Z"_a"d+UbYp["`qoVgq]LA'=hOoL9R^,(oBCZORnVe6f'r[fGjE6UBT5C+:E)4=SOi>(9KMH]I82>+Je^OD,bm8@AZ]b9QXu*6/]BnnL5D/*l0B6=(d_Hg=Dc[@2"e3,6=fpt:(_e1;,*0uj)f\!q`%@[?ECQM.rN*^X0)XhZm.>EYn*77c"2Bsn\32s?"-"aM_`e/MgSBC0/]E%tsW`9ihcamZcfH6m8FGf-U#9Ok=XMB^Yen63R!5#(Ke=g^F*9aMCMn4c(M%Mq8:dB(3'B@CTgG$X(4&56]pM/G4/?!2+dA0MH^W:cJ"lWCS&i#1mGVbT*qBMhI4N1-qJIUNbYPp#_F[[)>;(cU3";[![<*mS?obT?67!3BBK\6rcmKq\2TVm3D,Ya%$.$WDjC@o'rjgq&_us*@qVDQrQAn-3X4B]c(QIJ_8S"F"Z_ba-s/278`dDju>,HtNdu&`_+^KLHC&-1lH<\<]E1niZV8i3iKrPK,]IbqAZk=aq/QEap_->n+(qHFK\O+iW)\]sHF/A6*gaT^!YOSEMXO8Actj@Lg*T-60/]9I9X%s>#::$lHtF>L]joj?=.`k8PECfE/t?KX'^u!+WWV?`]b21)09X[ZNVf/QHR@l`eUJ`!kp8W#06TGjfZTKDjH^Ct@&f!8Rnr2RcjPDBZGe393PbFU3/.K7p/P&cSfXWW&S\^[I==#6h54i,m1.#:ti8A7*B(YLAf*H=[poKQk2S%\/8heT]2+>e@.CkMI,@(l@=>f'M!3M'!O_q5Fo5cEMPP]cFhe8iM&WE/_?/FQWE-WlSd?=@oT\pcpLU=<1-aQ)h<-)mLYKlFdodd.9jSG\5s3.mga^da\p-`na#bq9j3Wf3bEQF!jW,`*49*t]c.R8PUZd]X`7mH;STI>R,`#l?lRj="_OQKmL#/^?1qCENJ;P)3IZ0UCHd__4[=62m7%=XN&H=\U]82O%NDif2"B',jN5Lg1:%4i]];Q`q0!q&;m,8!0jNR"2e1AMF;61A[c2tEnsB#=#jVO?S@cXR9ln0$h43U_fJ&M4uT:l'4'56s+\'82ft8PQ<=KVj:L!ile:ag)KfPK(K8*Xc)P'W5abB@&3N@DShj/tCNgY?ZEY'Mknj;h*%t6c8@S[_c$G!er9:@\;-#>6pFM;Wbj+RH/R;aIG\c;G(JGO8DcpGp^F5a\)AL-4kG_W?'a@PP,8afk)IuQm5rL&DaAni@7"9cD(1j^2;;:l\/aJ@edX[obB^10DKMSN<,5A)E./fD;NW3X^O%n/*rKZ2j?eVWbF@o@T6GL(;mqsI_/@&t#h.UR6L4H]OT.4S?ZZZH*AEuf#_6)B!42\t-Zf,E7_c[QK;8(*gfeHniWg_Y;V$:]eod49@js49eT3Xb[UZZuVbfok$5X6U,UGldQYZaI0X'%iqg-q7>]YW/9$(j!=np4>#_7E]:74%j7!^WfI-F6k)4_I7>,*2U#mt:.(IrI#3(h`tfHqWW6qpaB;7a$?2$QQtS.F@IXQImbj\.elAquF^/kRu7+4?p]?Y?[:aYD>$Wqd:M=XTEhbAJXjOLVJr6P48_0+:>hae&J[G5US)+-'X3Q\JQ5g\rfcO1`N8`nOG$-V>b!)8Xl<.lI("0Ze%2YseC`aekua@j5m)?kBIMHT)MBE3Komtf`F6&7hJ61BLh<3K60L*6fJ?8mqbh)oqCN\\^]!YiJBdU2n@"rP=>c4Jb-&$=-q_pjJ!QNk&.J.JVpA.D2-RfW5HRq61]:(!O-dVAAaOF#9#2=F8aK5+/m\-J%W\92qu,Q1?`/t\-[20$OO7n(1l&O=jKOi;dtb\fq!N.tA"?Sc+^n4855b/he2GbSps[QM5:t0H`ZeTVN/HeLd,,Rp(tf-U@e;m9J;g-~> endstream endobj 84 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 83 0 R >> endobj 85 0 obj << /Length 1847 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gat=,bDt=8']%):(tg_H4<.3/9:B-a2!B%D["s:-BSq>+BoY,-PPQ0nD8EQfNQ9?BY;l^3fXB0!L,D`Hlak/bXC5iMdo*@)!ApSr[?n=I4qqhq";sFY9,$;MaJki]d"JDT^]=<(ZdM)Z"u=.J:Tj`IEg=+%glj[?!2K@NPbCo<4=Wj[u?kobs;>J5#He0M\GXD4.2&,NSCBR_echSHtu9dWWcG[8Nu,9c_":XcH6*E)_2I?]-la^*b5n[Ij0urDWTcB%'B0hk\$?%'e;Hbl`NLFA2'hOBg*-\+NP7*M8+r>CnGda9egbuNK^?`lWHDWcV+jaQ.lNIf/'H3nK&M5sDEmYYQa'9T,`DrX&k#:9CXS#B9^uU%A\b#*@7NH^c8kl'%D#R-.oA^*F7aG91DQ%#kT'%We&0E[9dgX92?qN]$*NmLo#2"?f)QIL!pb/?qWS4S,$A0-/mr7%4XR\#-/Q\frCaTL31FI$53.^VW!IeK$i82e$fJK\VZr@gVV%h>sL50pBl+?O1f\A0j>fXpr?2mnK=1>8inh@Wd>*R%X'ptfH!lZTaI)5Cf1oho`p6;BR""MYI-!NV9YHfuWi)kc3tbUY.$5Y3b3+rtE6.\T![E1r&V1K=Yj(ep"#6C5%`eNL,`5LXIcRD?A8AlC_Id;X]>Fk+n9)T2Y[.@M$+"%/Rsff1k5aU<5^H`b&l@U?4G]6L#7UX3PuT]6eacbT8r-lH3K;4dq4!*b"16^Ig>f!J8Z1Kp"D.UTd=dTke]F(In4>1L$`+B6TgF(sk]iEHOF;B5Np]>72o7D$m>!0$W.37\NjSP8^(k\GH8NXh"nmFfBMK-:AW8=$6]_U6m9%<]rT,(XOh_!0Fd%Ic[@GNP'_m\KOVe,;eM=jl:"AO,.Rc*o.!5o]+'4#30jE#8a7LC9c+:E6=bVuC(l2/Su4V3C/.)5+D0d:Ve<#4jb3;#<07*Y!$/f2rLoKITt]Xn,K8EI5Mdq(e'@%Q)JUsI7_$&h>MKj@I9Z-Wte5?2).DLgjS9um(\&LHi86@K"<`C(C^Kg endstream endobj 86 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 85 0 R >> endobj 87 0 obj << /Length 1735 /Filter [ /ASCII85Decode /FlateDecode ] >> stream Gasa1foFfFnD.HF[q(&LXS^(KMDe%WFOS5u:c(U,bI#2k&f$R5_gc#cUc]m(C]sXP)9mSVhsE>V?U?.0gb_]ph/VI8ji2L,rT?7Vi-J/`Kru6ScE;0dIf0puMn576[h$bKcL+cY*':m4aY`>%jp(u48M`;`,/a0Fpu&dk;D$"9IGm+rl:9[;"O"#'M*[d*C;3a)!e7`nn`#,!0d8@=O2kqp)B>=7Zo>>&-&8;`6#%N3B*\/$5[;@$,i`K?'j@*0*@eY7E0)kpF8W')S)I4#'3O7:_\$@q2+.b_C_pkVJ/HA.$Z`^^-$\N$k&Hj!-bk6<%:NUm?NJe[jS22YkLk@,-'+=US,!RensUs6#[:F9kQKep@t<.;Ke[8q)7F'd,7X*G"gCRKGorD9!@0`G%g+;%U+Lnm3m@KFl5HX2n__gr9AKs_W-]<"(bT;b)JNi]sWX<<,aWJV,S$9d:kLSV_tW(:.@K*rM:C-gI.8M)rSi$iGB<_.kf_XuAj_1Gp=:f265baGF;R3\a!\@)N6e(9J"23LfKJbX$3T&_-3q]:*"qTM99T<3gj%j>1VLiXS'cgub)Jtd;KW2Ff)Z=#E3s#$IQk\q$GB-l5<9H,24<`/D"A0j*O9<%$udC*ro_$,1l*_A#88=%JcFc78O!fT).e-0H]>B%p/,[/QUiVeTODrgcMLbg.Fs(*NUT"&*ukLju=!MYp&NYjpeHSp)Z=0p,1nn>2fd,3NpJM+S`NoqCp;rdkK.HY\r[et$,Q*dC)c<.kWEtCE*ap!p#*>_>ZF6mecD%@sSuIDAYc_p?>g;"qs-'&8\AiRST&!Q+bU8?l4ZTB0-&$=2-sR5n!)WANcSj#0%'%=[G0o8tJc]_>CO,blM$+f<[gEA7I^)%4mJ^4i8#6=3qJB:8Agm%do\/o`"C!=P7]VqSDO:):$VqP&=s4!7i+2*;gIZCa]+gY$#F!^B%gWIO.HuB)WX3^<&u5)F0[H3Jjc^jFWW`Og(Upb)dg!KN;i9=%#mm!DqV,mIkok]2u%!/"^64FK=O'`(k"!rR((Jr8Dg5C8g<\^kH2,Rei&>PP\T>e!t2rYI"+uDG>MOisq6i.%$tAdV.lIV665$[#\\cCs:CJV"FM\OBWk]D=R(Z7_)h!+[A5=VIK&N%o]$OZ!sk.oT-9r=2I:]SgIMfmsk3JgaUT$Yqn%fQF61"qQpmB=00D=d\B2`bARoD7DY@,Cf&gYUHOb^eX6]S]o#oN1!!6HE=C+UBb3a)n;)97C%gVrZU'b)Uo06]?bUn)AGM@s1m71.;HA!P75;4X#(c6`;qKlEae*dHn)OEtbl9(8hi40Tan4?:00u/hk4d-4*Em'd:GY_DVdB3tY7:JdVm!_1<=MO\L3F@@2nn-%Tc7/)IK5!!#9=@;j8~> endstream endobj 88 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 612 792 ] /Resources 3 0 R /Contents 87 0 R /Annots 89 0 R >> endobj 89 0 obj [ 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R ] endobj 90 0 obj << /Type /Annot /Subtype /Link /Rect [ 591.43 464.954 602.54 454.954 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.rsnapshot.org/) /S /URI >> /H /I >> endobj 91 0 obj << /Type /Annot /Subtype /Link /Rect [ 120.0 453.954 217.22 443.954 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.rsnapshot.org/) /S /URI >> /H /I >> endobj 92 0 obj << /Type /Annot /Subtype /Link /Rect [ 274.0 357.456 493.99 347.456 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.mikerubel.org/computers/rsync_snapshots/) /S /URI >> /H /I >> endobj 93 0 obj << /Type /Annot /Subtype /Link /Rect [ 274.0 336.456 356.22 326.456 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.perl.org/) /S /URI >> /H /I >> endobj 94 0 obj << /Type /Annot /Subtype /Link /Rect [ 274.0 315.456 430.1 305.456 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.gnu.org/software/coreutils/) /S /URI >> /H /I >> endobj 95 0 obj << /Type /Annot /Subtype /Link /Rect [ 274.0 294.456 366.22 284.456 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://rsync.samba.org/) /S /URI >> /H /I >> endobj 96 0 obj << /Type /Annot /Subtype /Link /Rect [ 274.0 273.456 372.89 263.456 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.openssh.org/) /S /URI >> /H /I >> endobj 97 0 obj << /Type /Annot /Subtype /Link /Rect [ 274.0 252.456 379.0 242.456 ] /C [ 0 0 0 ] /Border [ 0 0 0 ] /A << /URI (http://www.rsnapshot.org/) /S /URI >> /H /I >> endobj 98 0 obj << /Type /Font /Subtype /Type1 /Name /F10 /BaseFont /Courier-Oblique /Encoding /WinAnsiEncoding >> endobj 99 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj 100 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 101 0 obj << /Type /Font /Subtype /Type1 /Name /F9 /BaseFont /Courier /Encoding /WinAnsiEncoding >> endobj 102 0 obj << /Type /Font /Subtype /Type1 /Name /F7 /BaseFont /Times-Bold /Encoding /WinAnsiEncoding >> endobj 103 0 obj << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Times-Italic /Encoding /WinAnsiEncoding >> endobj 104 0 obj << /Type /Font /Subtype /Type1 /Name /F5 /BaseFont /Times-Roman /Encoding /WinAnsiEncoding >> endobj 105 0 obj << /Type /Font /Subtype /Type1 /Name /F11 /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding >> endobj 1 0 obj << /Type /Pages /Count 12 /Kids [6 0 R 41 0 R 64 0 R 66 0 R 68 0 R 72 0 R 74 0 R 80 0 R 82 0 R 84 0 R 86 0 R 88 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R >> endobj 3 0 obj << /Font << /F3 99 0 R /F10 98 0 R /F1 100 0 R /F9 101 0 R /F7 102 0 R /F6 103 0 R /F5 104 0 R /F11 105 0 R >> /ProcSet [ /PDF /ImageC /Text ] >> endobj 9 0 obj << /S /GoTo /D [41 0 R /XYZ 67.0 616.0 null] >> endobj 11 0 obj << /S /GoTo /D [41 0 R /XYZ 67.0 431.674 null] >> endobj 13 0 obj << /S /GoTo /D [41 0 R /XYZ 67.0 339.235 null] >> endobj 15 0 obj << /S /GoTo /D [41 0 R /XYZ 67.0 255.796 null] >> endobj 17 0 obj << /S /GoTo /D [41 0 R /XYZ 67.0 140.357 null] >> endobj 19 0 obj << /S /GoTo /D [64 0 R /XYZ 67.0 725.0 null] >> endobj 21 0 obj << /S /GoTo /D [64 0 R /XYZ 67.0 494.674 null] >> endobj 23 0 obj << /S /GoTo /D [64 0 R /XYZ 67.0 386.348 null] >> endobj 25 0 obj << /S /GoTo /D [64 0 R /XYZ 67.0 276.469 null] >> endobj 27 0 obj << /S /GoTo /D [64 0 R /XYZ 67.0 156.45 null] >> endobj 29 0 obj << /S /GoTo /D [66 0 R /XYZ 67.0 725.0 null] >> endobj 31 0 obj << /S /GoTo /D [66 0 R /XYZ 67.0 589.701 null] >> endobj 33 0 obj << /S /GoTo /D [66 0 R /XYZ 67.0 400.402 null] >> endobj 35 0 obj << /S /GoTo /D [68 0 R /XYZ 67.0 714.0 null] >> endobj 37 0 obj << /S /GoTo /D [68 0 R /XYZ 67.0 680.674 null] >> endobj 39 0 obj << /S /GoTo /D [68 0 R /XYZ 67.0 502.375 null] >> endobj 44 0 obj << /S /GoTo /D [68 0 R /XYZ 67.0 346.076 null] >> endobj 46 0 obj << /S /GoTo /D [80 0 R /XYZ 67.0 233.501 null] >> endobj 48 0 obj << /S /GoTo /D [82 0 R /XYZ 67.0 598.14 null] >> endobj 50 0 obj << /S /GoTo /D [82 0 R /XYZ 67.0 367.374 null] >> endobj 52 0 obj << /S /GoTo /D [84 0 R /XYZ 67.0 425.14 null] >> endobj 54 0 obj << /S /GoTo /D [84 0 R /XYZ 67.0 294.814 null] >> endobj 56 0 obj << /S /GoTo /D [84 0 R /XYZ 67.0 200.375 null] >> endobj 58 0 obj << /S /GoTo /D [88 0 R /XYZ 67.0 725.0 null] >> endobj 60 0 obj << /S /GoTo /D [88 0 R /XYZ 67.0 448.954 null] >> endobj xref 0 106 0000000000 65535 f 0000046094 00000 n 0000046230 00000 n 0000046280 00000 n 0000000015 00000 n 0000000071 00000 n 0000002179 00000 n 0000002299 00000 n 0000002429 00000 n 0000046444 00000 n 0000002563 00000 n 0000046507 00000 n 0000002697 00000 n 0000046573 00000 n 0000002831 00000 n 0000046639 00000 n 0000002966 00000 n 0000046705 00000 n 0000003101 00000 n 0000046771 00000 n 0000003237 00000 n 0000046835 00000 n 0000003372 00000 n 0000046901 00000 n 0000003507 00000 n 0000046967 00000 n 0000003642 00000 n 0000047033 00000 n 0000003777 00000 n 0000047098 00000 n 0000003912 00000 n 0000047162 00000 n 0000004047 00000 n 0000047228 00000 n 0000004181 00000 n 0000047294 00000 n 0000004317 00000 n 0000047358 00000 n 0000004450 00000 n 0000047424 00000 n 0000004583 00000 n 0000007816 00000 n 0000007939 00000 n 0000008036 00000 n 0000047490 00000 n 0000008167 00000 n 0000047556 00000 n 0000008298 00000 n 0000047622 00000 n 0000008430 00000 n 0000047687 00000 n 0000008562 00000 n 0000047753 00000 n 0000008694 00000 n 0000047818 00000 n 0000008825 00000 n 0000047884 00000 n 0000008956 00000 n 0000047950 00000 n 0000009088 00000 n 0000048014 00000 n 0000009220 00000 n 0000009395 00000 n 0000009582 00000 n 0000012561 00000 n 0000012669 00000 n 0000015728 00000 n 0000015836 00000 n 0000019400 00000 n 0000019523 00000 n 0000019550 00000 n 0000019727 00000 n 0000024020 00000 n 0000024128 00000 n 0000028218 00000 n 0000028341 00000 n 0000028382 00000 n 0000028561 00000 n 0000028739 00000 n 0000028947 00000 n 0000032410 00000 n 0000032518 00000 n 0000035411 00000 n 0000035519 00000 n 0000039584 00000 n 0000039692 00000 n 0000041632 00000 n 0000041740 00000 n 0000043568 00000 n 0000043691 00000 n 0000043767 00000 n 0000043944 00000 n 0000044120 00000 n 0000044322 00000 n 0000044493 00000 n 0000044681 00000 n 0000044855 00000 n 0000045029 00000 n 0000045204 00000 n 0000045319 00000 n 0000045432 00000 n 0000045541 00000 n 0000045648 00000 n 0000045758 00000 n 0000045870 00000 n 0000045981 00000 n trailer << /Size 106 /Root 2 0 R /Info 4 0 R >> startxref 48080 %%EOF rsnapshot-1.4.2/docs/docbook/rest.pdf0000664000175000017500000037360612632661200017200 0ustar travistravis%PDF-1.4 5 0 obj << /S /GoTo /D (section.1) >> endobj 8 0 obj (Introduction) endobj 9 0 obj << /S /GoTo /D (subsection.1.1) >> endobj 12 0 obj (What you will need) endobj 13 0 obj << /S /GoTo /D (subsection.1.2) >> endobj 16 0 obj (Copyright and License) endobj 17 0 obj << /S /GoTo /D (subsection.1.3) >> endobj 20 0 obj (Disclaimer) endobj 21 0 obj << /S /GoTo /D (subsection.1.4) >> endobj 24 0 obj (Feedback) endobj 25 0 obj << /S /GoTo /D (section.2) >> endobj 28 0 obj (Motivation) endobj 29 0 obj << /S /GoTo /D (section.3) >> endobj 32 0 obj (Installation) endobj 33 0 obj << /S /GoTo /D (subsection.3.1) >> endobj 36 0 obj (30 second version \(for the impatient\)) endobj 37 0 obj << /S /GoTo /D (subsection.3.2) >> endobj 40 0 obj (Untar the source code package) endobj 41 0 obj << /S /GoTo /D (subsection.3.3) >> endobj 44 0 obj (Change to the source directory) endobj 45 0 obj << /S /GoTo /D (subsection.3.4) >> endobj 48 0 obj (Decide where you want to install) endobj 49 0 obj << /S /GoTo /D (subsection.3.5) >> endobj 52 0 obj (Run the configure script) endobj 53 0 obj << /S /GoTo /D (subsection.3.6) >> endobj 56 0 obj (Install the program) endobj 57 0 obj << /S /GoTo /D (section.4) >> endobj 60 0 obj (Configuration) endobj 61 0 obj << /S /GoTo /D (subsection.4.1) >> endobj 64 0 obj (Create the config file) endobj 65 0 obj << /S /GoTo /D (subsection.4.2) >> endobj 68 0 obj (Where to go for more info) endobj 69 0 obj << /S /GoTo /D (subsection.4.3) >> endobj 72 0 obj (Modifying the config file) endobj 73 0 obj << /S /GoTo /D (subsubsection.4.3.1) >> endobj 76 0 obj (cmd\137cp) endobj 77 0 obj << /S /GoTo /D (subsubsection.4.3.2) >> endobj 80 0 obj (cmd\137rsync) endobj 81 0 obj << /S /GoTo /D (subsubsection.4.3.3) >> endobj 84 0 obj (cmd\137ssh) endobj 85 0 obj << /S /GoTo /D (subsubsection.4.3.4) >> endobj 88 0 obj (cmd\137logger) endobj 89 0 obj << /S /GoTo /D (subsubsection.4.3.5) >> endobj 92 0 obj (cmd\137du) endobj 93 0 obj << /S /GoTo /D (subsubsection.4.3.6) >> endobj 96 0 obj (link\137dest) endobj 97 0 obj << /S /GoTo /D (subsubsection.4.3.7) >> endobj 100 0 obj (interval) endobj 101 0 obj << /S /GoTo /D (subsubsection.4.3.8) >> endobj 104 0 obj (backup) endobj 105 0 obj << /S /GoTo /D (subsubsection.4.3.9) >> endobj 108 0 obj (backup\137script) endobj 109 0 obj << /S /GoTo /D (subsection.4.4) >> endobj 112 0 obj (Testing your config file) endobj 113 0 obj << /S /GoTo /D (section.5) >> endobj 116 0 obj (Automation) endobj 117 0 obj << /S /GoTo /D (section.6) >> endobj 120 0 obj (How it works) endobj 121 0 obj << /S /GoTo /D (section.7) >> endobj 124 0 obj (Restoring backups) endobj 125 0 obj << /S /GoTo /D (subsection.7.1) >> endobj 128 0 obj (root only) endobj 129 0 obj << /S /GoTo /D (subsection.7.2) >> endobj 132 0 obj (All users) endobj 133 0 obj << /S /GoTo /D (section.8) >> endobj 136 0 obj (Conclusion) endobj 137 0 obj << /S /GoTo /D (section.9) >> endobj 140 0 obj (More resources) endobj 141 0 obj << /S /GoTo /D [142 0 R /Fit ] >> endobj 144 0 obj << /Length 3094 /Filter /FlateDecode >> stream xÚí\ÛrãÆ}×Wà‘¬ ǘûŒË•J²Î&vÙqe#Wl?p)ŠRYeQÚ­ýûô\9À ŠÒKvY[Z’ÀA÷™žÓsi€¤M ÿh£­•6–(%i³º=k› œûÇ!Riø0pvÁ¬"¬¥¢Y(K47²DÕh&À‘0ÍBSK,SÊÁÿv~öÕ[nª £R4ç— cÀH(ÖdÜùÅ/³‡ÝݜΖðw»+øo óoéìŸ?Í™žýœÃßOóßο?ûûyvn)Ñ’‰F xC­E‰&ð¢D{ž‚7ÀH1åhÒ–ÁYÊ%Ñšz–}rœ¹Çã«·¦¸ŠCÈ$WàÉÁ¿ž/˜´zö¯å#ÀÝeË;hg³wÛÝÚ5øøs6¯]£ƒ=JKT*u4øM¿åLQb3™¥o¹;ó°‰we'%ø¢Àû¶—¨Œ:×¾{ŠfÐÙ_|€·?µï6"î;¹é3æÒm{„{]”0ËNhú–Ë?‡vzú@‘րΔ+´öÐo}ƒÖu‚[a‹>䆱k[±h邵ƒ.â5o¢NîçÐãŸb´®7>†pä±v-[B d\vMAŸÎµt²áÏRWÏ@QËV¸pjyô{‡w¢vÜ–«NÐbNç®q†p.îøÓ*Ppo5ä³ùF8xëݧÀÞÞ†³ï½g—à¿ÇF܇>Ùb›nâë㜈¥wä/Ü­/§í]xõÌœÇnEæ ÁÄìçÝu<² ¶Ç„û'8mLtÕoŽãŽvÞØûÔ¢pîÑwv~»üÝç†í\¤¡£¡‹‰•2Du{éF  „‹·O^2þÀX1©]bzØEŒÀùÚ5´–âÙH?DÂ-“¡½w•"~»v±£º;ðæõç¬_„Ï©oÄuáÎQÓQ€“•'çÕ¼ŽmHÊ^‡©Óo¢&<‰mä˜âtëTóQ‰ø}î˜N„™ðe4L/¸5ƒú ”Ï>^ \»+¬£> b‡ï£° Ç£–ä*Y0³Ý½wšì]ºWìÆcÑ‘DqÖîË8…ˇ”é°vèW%Z?^…3ÞÊjûTFï"8ýxC{5ÎïUªV¤¤á¶MIãÞŽ% ·4%Mz›“Æ]7œ4âÕz­oý™x’'îÂeäôÑqäåâAÕì<õt_¤Œž­ž|>¤\ê5p¹o@±üÔç Ë›=Ü…ÙØB @§½L—IÚÛ8êûù÷"¼_yÕĆožâ4S]âc¯ã3¶ù%LÀ‚p·>ƒ±ØqX:„Æ8´p^vý¹=-:…i‰)cb5’à‹_¯Ä*«Ž /,“³ïîüLúuÔúNs1X=^o},{©dÖ½´Ç±·É¨ jÒ­ÎÜtßáÆúNa Î%PVfj•–à‹_­Ò*£>,ná±Õ+Ï îfî— aVñ>^ƒ |öC$}?^V ›.õ~¸"' Ë·òîvs WÿÇ/æÕŒõBïÄeŒ°xì3 ~mlP©’Ž•b¸OÁ)‘Ôm#Ò\p¨ a%n)³¸ ( šEA¿ÙÞ‡å_\J»ï* ʽañ‡k?ßùÁt]m›hKZëd]ª·´ …ófT¹õ±ìÿ²…=*e,Þ…”±xׯ&¤Œù<^ÊB†~TÊdöRæQÊߦµÆÊOðaÁýPÏVèšš ÏVµ(a)ªlR ï²: À¯#l¬ƒ acT›6æóxasNÚ–)\Ø ”…-¢°ßÎð ÚÙ¯ ,ÃÓ¼)½ .Ã< 'µvÉê$ì×6ÖA…°±ªMó™«Ö0?øžäÀ.¡5ÂLì2*Pô»ŒS5úúÃ\ XOì- ™Ô´)=Õ¢N¨ Bû½EɈí¹`kI¨Ò‡£€Ç"‚ã´áŠÃåÍÍx `EDû¤ª8DÎ%‡¡Kfd‡Åµ»Ñ@Í¡ƒ]‰ì2È».wX¼ uÙÝ:ìÂãÚóƒ/c<”U+wø×V¶ðñ2ü¡²,vü2à¾Ü¾¯s¥®¦Õ:VsÂ9å½v÷×± …7—iC¨t½V¶÷óFÇF74nûÑ [mlP¢ytC}=ms%aXQø´AYÉikõsÖÙrXš»m*-­â‘U(Ž]ì1÷Å„/Õl¹©7^Bn”mJºµ` o“°þá°<è4ë3ž÷GUŒ³P1ÌÚØ„Š1Ÿ}\ñ‚ÿ o©ÄUœ@YÅiWõ&ßœÜDI¦ s|‹ :ÕÌ}Yy•븟jkXo¶¼)Ùˆ8¢ðFíE\¶êK1ÌBÄX0kc"Æ|? ê*èqe‹¢4°^]Ïi9´úÛPáFN8Ð-æº1wyW” ÝÝSè+ZJ"˜1MI½VtBá-d°SÚt[ø9 zTÉX %cA¬¹(Šq%c>W2ƒw–â7 2(+YF%¿{Š·½êåÄð]«44¯Š{¹uõªÔÒ¦¤7P½(¼Œqb5l9:ÍøB‹£ŠÆ]( tmlBјÏãM5\âw ¨X%«(èïúãè´ï£˜·#ö¶¾¥¦ˆ²Öd7÷Ô"hQ Fo©•„Ou¯ôŒD¾3ùÊÔ„˜‡G´˜•†áEœŒ }'=™VŽÁñÆyxx`ìæ¹R…iJσ·#øçmo†êpÚöÆÊp4Á-k¹ävÒò³µŒuE¡e¬/jcZÆ|¾`Ê€Õp-'TWË&jyèG-*KB-L Ë8¢&xe—¼N:~¶Ž±¾(tŒõEmÌõ…×1æó:–Œ´RM¼2ª«c{ŒŽ ‡/Zí%6A[BÝÖºÓ„©‡,[Nd+ºdY‰(œA~f¥Ãà”tX~aa/ò {ml"¿0ŸG§ƒ Po‹?Cœ09·ÒÃðçsÃý:½º¯ßù¬ú‡p¹³O‰¢îÇ ÷nìGÚŒüe;N¿1¨k$Ø…¬‘`W¦\°Í¸¨‡ûG/%>ˆÊ\Zã¾¹;ò+ Ö?ÍÈš ¿R4ƪ0•üýQâ ½endstream endobj 142 0 obj << /Type /Page /Contents 144 0 R /Resources 143 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 192 0 R /Annots [ 159 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R ] >> endobj 159 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [260.8665 650.1881 359.7943 666.1284] /Subtype/Link/A<> >> endobj 165 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 479.827 153.4423 488.6937] /Subtype /Link /A << /S /GoTo /D (section.1) >> >> endobj 166 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 465.9391 198.6923 476.7784] /Subtype /Link /A << /S /GoTo /D (subsection.1.1) >> >> endobj 167 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 453.984 211.0959 464.8232] /Subtype /Link /A << /S /GoTo /D (subsection.1.2) >> >> endobj 168 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 443.9615 159.0912 452.868] /Subtype /Link /A << /S /GoTo /D (subsection.1.3) >> >> endobj 169 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 432.0063 153.2235 440.9129] /Subtype /Link /A << /S /GoTo /D (subsection.1.4) >> >> endobj 170 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 410.0885 145.2534 418.9552] /Subtype /Link /A << /S /GoTo /D (section.2) >> >> endobj 171 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 388.1707 147.2157 397.0374] /Subtype /Link /A << /S /GoTo /D (section.3) >> >> endobj 172 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 373.7249 274.3275 385.5854] /Subtype /Link /A << /S /GoTo /D (subsection.3.1) >> >> endobj 173 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 362.3277 246.3832 373.1669] /Subtype /Link /A << /S /GoTo /D (subsection.3.2) >> >> endobj 174 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 350.3725 248.0366 361.2117] /Subtype /Link /A << /S /GoTo /D (subsection.3.3) >> >> endobj 175 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 338.4173 256.4251 349.2566] /Subtype /Link /A << /S /GoTo /D (subsection.3.4) >> >> endobj 176 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 326.4622 219.1154 337.3014] /Subtype /Link /A << /S /GoTo /D (subsection.3.5) >> >> endobj 177 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 314.507 197.696 325.3462] /Subtype /Link /A << /S /GoTo /D (subsection.3.6) >> >> endobj 178 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 292.5892 159.111 303.3886] /Subtype /Link /A << /S /GoTo /D (section.4) >> >> endobj 179 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 280.634 203.9724 291.4733] /Subtype /Link /A << /S /GoTo /D (subsection.4.1) >> >> endobj 180 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 268.6789 226.986 279.5181] /Subtype /Link /A << /S /GoTo /D (subsection.4.2) >> >> endobj 181 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 256.7237 219.4142 267.5629] /Subtype /Link /A << /S /GoTo /D (subsection.4.3) >> >> endobj 182 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 244.7685 177.3332 255.6078] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.1) >> >> endobj 183 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 232.8134 190.4039 243.6526] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.2) >> >> endobj 184 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 222.7909 180.7603 231.6974] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.3) >> >> endobj 185 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 208.903 193.4028 219.7423] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.4) >> >> endobj 186 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 198.8805 178.439 207.7871] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.5) >> >> endobj 187 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 186.9254 183.1709 195.8319] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.6) >> >> endobj 188 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 174.9702 177.7913 183.8767] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.7) >> >> endobj 189 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 161.0823 176.1178 171.9216] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.8) >> >> endobj 190 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [111.2713 149.1272 204.5008 159.9664] /Subtype /Link /A << /S /GoTo /D (subsubsection.4.3.9) >> >> endobj 191 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 137.172 212.6101 148.0112] /Subtype /Link /A << /S /GoTo /D (subsection.4.4) >> >> endobj 145 0 obj << /D [142 0 R /XYZ 74.4095 789.6651 null] >> endobj 146 0 obj << /D [142 0 R /XYZ 74.4095 771.7323 null] >> endobj 160 0 obj << /D [142 0 R /XYZ 74.4095 595.2567 null] >> endobj 164 0 obj << /D [142 0 R /XYZ 74.4095 492.8882 null] >> endobj 143 0 obj << /Font << /F38 149 0 R /F43 152 0 R /F8 155 0 R /F11 158 0 R /F50 163 0 R >> /ProcSet [ /PDF /Text ] >> endobj 195 0 obj << /Length 3245 /Filter /FlateDecode >> stream xÚíZ[·~÷¯Ð£Dc^†sq_ê$uâ"±w¸hû0;š•¯4[Ín6þ÷97r8I~( (Z͇äááw®”^(øÓ‹ä¦/x¶eR8]~µ$"ú ’ðT¸vÆ’øöÞ®¬Y>¯Ö¶0Ëý#~[x…6Ì >ŸáÓMä²D—ÆŽ˜ ÈS]á±PÌdyV@:OJ›ê¯PDA@ž ×ÎY@šÎcE±?¿-Ëê«zeY@©‡YA:…ìˆé± <Õ^*“Ô”zȬ†…Õxá±iÓE®\R‚‚^–'_ÇôÄ@­?™”d•ÀúzµÖÊXS»e^¶&Ä í>_¦ 2‰*s7âq"¡ºÌšÎ€,-ì·dµNËòù«øo®7: §UR*›]> @uù€¦“v'ÀuF%E–™Ë‹¦V'N°½Z'¥sækñ•i@Í/â[ˆŠßFðýúžÐLÈF¥ïšÓ¼}T‰ÉÓh¦yh Õ:&›BÛ¥‰U ¶þíÿ$Â/žSð‹ç4ì Â/.EF€pu<å&ÑÊ]‰Ç"äî¾#ãñ^Ö÷oôzgB$à½ÈÓE¼ÜLˆ$TW¸ ŽmÀ–&Çr& È@ytQ|uÓ_‹§â„Äò³ˆ5½á‰;i’¾º™ÚÌ%Ĉ#nÇRòTW˜ì¥s¤ôòƒéÀV¤€- #é¥Ë Á”y*ô`3a[oéX!€y<džïÍS ñð‘§Š­ƒ…’Éâ!F* yv(†GôùÙrO˜Ç|Yñ×?•N%hº/Øýˆî•( Â…>Š¢ŠÑ|2vO呂(‚¢]³á7`𾉳/Á¨ô&]~ìöÒ²å¹çù×Ëo »(d©ñv/X¨£ÉnýޏïÑ=üX}FF¥on!‚ J•}Kµ½ƒ.ƒ Âà–1E ç$ˆŒ9ó#“mDJ@nÉ)5GœIz…}–5óÎï÷ÈT^â‡e§ó‘ì`5ÜC…³oøÝŸÍÑg (Ä\ŸÅ,RsÕ#«Í‚Ï;‘'¼úC¿L­ðèåt@Ô< •gü!Ì@†$|'Óyh¼‰TC´‹ˆš.$ gi9ð^ [n,{’Ÿ¡Xv´¨Ÿï¿sžWÚ&ŒžQœí!–ŸC¨ÉÎ5KÕòWÏÒ‘g©Û§Xz^ôy/¢Ý͉³£Sý†c!QÿˆœX{Vi°O”Æ?¥Á†y¥¡.’¬Bû:P º 'Ø]É÷3 ±ñð¢ˆf™Úr¨ç lÓ`¬[>Ÿ‚uâŠÔÓÈã/´µ“,‰‟£hà‰5,¬†›Ãü­Ì15mZ-ß‹Á”a“Ïßð˜àùÝGž§~è—ŽÛ7‚êJ\ÅZ ¯ßâÔßó3î£ÝnaO(¾õH~Œq‹íÿWhñ³”Θpš®åj¯ÛÃ!H Ù_bïŸÄ0g†„@‡‘‰/þ·ô⦅ÞÐá‚P!fÇd=2Ûï­^ø|½Öm¸ñ–eË/~?0$XVh¦‚™m'-?+‹ÓýÎÝD&sútoÖé RÎÌã:ze¥1±Õn:1„>ã¿“™Qà­Ì°ñ¦¢=xcFVº=õ\ù1ˆ˜ÒË·2åÀB:ãÏÇ Ï‡¶cÉ{ &$÷ãMûgˆõgÆs:LДJL›G0>O•&sË×â—ç¦w$`$Ä*â^¼Ø÷d$˶¯’Q?‰:^£Ø;ÂöÈžïÛ=ÅÇwo?­½k †1ÕËa…ã|¸@ãj¯]Hë l´S‚ÒY¨"  åâ­4“ëÇ=ªÒ+aºH|5Ä¿ÝÐu1»À†ùÞpË®ðŸ15D§ v€ lwYA):žf…Äžïqµ["¡B>qØyxS«Y¾Y)› :ÐJˆÑèµ÷>êÌïgvÐäbÞ“&7õIü#ÍN‡Óˆ ®sdÄÇÝï?ãÖ€rx~ûáí§ ~ìÆÛpÃV ò‡-zù[{eA3ÙI3°"8~Ʀ›ž™x€w‘†í ×kRêÞ|}]ÉŠä H¡*ü÷¥ß[ax¹óˆÖ„ò®T›DÙÒ.ÒÌ‚Hò+Ib _Gô“ü~2)Jwç£éG  ^ÁçåËçççd¥Ï¦‰‡Ùöå¤:`ub •YW$<ÑE†'SqÝ(¤Š¾˜*º,)sUò=L®,§Š‰OÝUbörgƒuÝ'~yÞßßóÓ±õ™KulpNÿW"ÅŠÕåŒíæ'õ1d=ùð¯·ìsàgµ|/§ârNUoð¼h™A4Û‡7¡ÉÇLȰ¥ÆíK͇×q•û ¬€˜ÓÏû(€wÒÅ{ ÿ…T"âÈ0éÑoQX͉WÇ ßFl¥jOÿ۰·©ñƒwþØü9J‹(„›ÇT8†”HÔwíVpÓ̹ øB¨7üü®U7ÇÎguóèŠL·¢..Ø@ ŸeqDÀŒÎ#Û$Ë­ÜNÉö³Žù¨è>$ÈØßÕèá ¼²Ë÷ÚŒ]LÉ›."„ÊæÈÌÐ⇊˂L’ýÐþÂ9£à²U„Ìô]uˆùî@|YÊï©ö¢ªN=Eoa|­¿ŽïS„òÖsÝ?ÐUÌäl_~çþšK‚cK¨æ³¡n¢l>mTãD*Îýͪ„éšÍmEA9ýòîZµ‹zä(ã4rÁgR»'ÙxyVûHÃ$èïŽêö ¾.,ˆ¦>Ÿ‚’çæx¿ n×Âftùg‹ޙ˭IwÄ®Üñ•k<œ Dwèæ<úèbn×G»w¾Ú_&Œ °ß÷ÅŠÀ9[¹îÕ$øÄ017%Øé> endobj 197 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 760.7734 150.3541 769.6402] /Subtype /Link /A << /S /GoTo /D (section.5) >> >> endobj 198 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 738.8556 157.1886 747.7223] /Subtype /Link /A << /S /GoTo /D (section.6) >> >> endobj 199 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 715.0051 182.6226 725.8045] /Subtype /Link /A << /S /GoTo /D (section.7) >> >> endobj 200 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 703.05 153.0938 713.8892] /Subtype /Link /A << /S /GoTo /D (subsection.7.1) >> >> endobj 201 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [88.3572 693.0275 151.2707 701.934] /Subtype /Link /A << /S /GoTo /D (subsection.7.2) >> >> endobj 202 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 671.1097 145.0837 679.9764] /Subtype /Link /A << /S /GoTo /D (section.8) >> >> endobj 203 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[1 0 0] /Rect [73.4132 649.1919 166.8319 658.0586] /Subtype /Link /A << /S /GoTo /D (section.9) >> >> endobj 205 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [411.0431 460.46 532.3767 472.3205] /Subtype/Link/A<> >> endobj 211 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [136.5058 308.1818 231.4489 320.0423] /Subtype/Link/A<> >> endobj 214 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [210.6766 144.5063 309.6044 155.3456] /Subtype/Link/A<> >> endobj 196 0 obj << /D [194 0 R /XYZ 74.4095 789.6651 null] >> endobj 204 0 obj << /D [194 0 R /XYZ 74.4095 638.233 null] >> endobj 6 0 obj << /D [194 0 R /XYZ 74.4095 623.2395 null] >> endobj 206 0 obj << /D [194 0 R /XYZ 74.4095 461.4563 null] >> endobj 10 0 obj << /D [194 0 R /XYZ 74.4095 447.5338 null] >> endobj 207 0 obj << /D [194 0 R /XYZ 74.4095 391.8527 null] >> endobj 14 0 obj << /D [194 0 R /XYZ 74.4095 377.9302 null] >> endobj 212 0 obj << /D [194 0 R /XYZ 74.4095 309.178 null] >> endobj 18 0 obj << /D [194 0 R /XYZ 74.4095 295.2555 null] >> endobj 213 0 obj << /D [194 0 R /XYZ 74.4095 203.709 null] >> endobj 22 0 obj << /D [194 0 R /XYZ 74.4095 189.7864 null] >> endobj 215 0 obj << /D [194 0 R /XYZ 74.4095 145.5026 null] >> endobj 193 0 obj << /Font << /F43 152 0 R /F8 155 0 R /F50 163 0 R /F14 210 0 R >> /ProcSet [ /PDF /Text ] >> endobj 218 0 obj << /Length 2742 /Filter /FlateDecode >> stream xÚµ]oãÆñý~…ßB‘L.É% i›*’+Ð:OMhŠ–Õ3E—”Ïu}çs¹K‘Æ×à “»;;;ß3;¼ä&†ÉM‘í²¸ÊoвÚY›'7M÷!¾9ÂÚOÉ2»Ër[À`au››xWZkn¶>’?Þ}¸ý1€l—f°x÷0e“]a«âæîðÈl¶Ibòè—þrú¼±iTo’èrêÏ›ÞýåöÇò¦ÚUÖXÜßlM²+ã2¡ûÍÖTUÔ°á¿#þ9ï~‚?ø{Cˆ2z×±=ðàþ´1eÔ2Š¿!Ä=¼Û¨Å}ßà^á½e„0QDc£ç=#¡$¾öüz˜^x|ÂÁIDâvÂÞ{Hj~¼>Êx°y›š)€ô$Úm¶YšDwDÞ( ¯¸Jò`î„åÏ4&\«Rú%ÂM’]•ç,\<í…ܦINÌÑQ”&…`q‰ÇÇýˆX^ëB|ª²ãÈ8u¾–s÷¼Žª 1B c8-"ÇWDÔ¡HšðÏ¢`\}!u!!ýY…W*r:ï0ÑÕ {ªçËÄáq²”(0D°hJ«pˆÛ¸CY–eÔÑ9bû/ñ\Úè§PšeÁ~ãù‘vOªm\DûÝócIeáØ†W²0"”ô"ä8ýópUÅ¥¨±jõ &.·ìœ#ƒ0‚†¸ÍbåÎÎÏDyÖƒ'T@g-Óßø~‹“L]i$'ɶFÇ3eÀësrr¢ÓØ^áèZ•2yfW;‘ùÑ ! ‹Ú™ó^sœŒÂË,UKöFÖmXó€cï15Ó¼œÐó«žM²*"ƒ£©C Rô(zÖüPn@ê)Ëp’C:³R˜2Ñ«òþÈc“½‹ÇD ù±höø"~_«iõ[Õ®qjw ³¦¤wM9¸æ™±¶œ2ç±xÔ´gÁnwû TgÙ•;#3™e§DÕe)áéŸgF[}ó‡!rÓSnlxÂÇ1ƒÛKÜo)_É4¹4@÷ÏêésY ÈF&ƒ†<›T×\$ê6úž@O q€Ÿo¤ô9cªÖ½ Ä0M¾ˆ:³ÍYÀ„9OÓeFâ-ˆ€Ë(“øèˆ<Œk]DRm7áöli{ÎAb Xfv¢ Ïÿç1LýK˜/<­þ ˜\¶»ˆˆa6%k£ÙŽ¡‚@#5"á‚hà ”^Øç¹j—¼þiV6¥•%Ô‹Zô1_a°D]`&‘œEËÇÖ€´ í6òŽ“AÂÑ«ÊÉß%r¹¼ò¢a ÖIò€Ë&8ï×#Oaü¯¼”Z±ê`*,À„ç8€å$µ‘©dÅ/ÂhÝ/¿VS¿ZãŽ@ h®²´ ÿޤLÈjÌ;‰æQ‚Ž1„«v™0¡·#ÌþÏðþcñLÖ£ôP”6ìtš”øÎ”ßó`Ùa åZ;!xòQS¾ý½qM¢vO håÐ=ÓKÕ×›+åãíxïùâ-¤H1Ž )EÊÁ׳+u·3ñ²…«F!™µê3Ë(¨š¾ëœ!ÄÖ‹\°2Dw¤²ª¡ê@ÙJ K9ðÅ…¿Ý;ê<¡¨›VOòm;­/ d°,–¨÷£#­Sh‡§+%ãœ#‚Ç¢‹½úN!ÿøÝ’5#[¶œjj[&Šu¥"1îþ4Ë_°—2åô'Ž•J³]¯Å8À½é+æËz%2¼/åÔÂË©¶ÄG„ùB8X=µœUŽ0¡dœ5lëm”ß9š/ˆ±#€dJ!LNE ѯ¤•ij›xúÅ+[¨æ+ÍòÎ;‹°×#…Ú¼bM'ž¦c¶ -mah;^Ò6p(÷²ñðzƒª±6¬ùOôU` +××e-åÖ%ƒ|V¶çÞ=÷ÇžBÏÒÈZ#Lß¹R¨a¤Î ¬ÅúµW$·¡pýuƒ1’Àš^kØ‘Š OÓµ“òrëL*—KmûÍHC=Höoô0tŽïó¹PRÉN¬g÷ü8ö—©¾¦2Å+Ź‘±ìˆÃã#ϸfIvuÏ6Ck~\œûõOÓ>ÕÝœl•S9®«§æÎµ¢”¨0 àÌj_ІžŸ`ÿoaõ_;©¬åv<¶|±"uçT ™RjC¿w“*„Ò/-´™(jö²^5Tæá Æõ±V¯Ãì£~­7"€8öTN( 2;Åz{þŒC®Öë0JÇ7™rV!ÑTN”¬„k±/8ôxñ 2 &[/ G^'O1¹– tWÒJ¦Ç©>:Mý°çYmwb KQ„'vÝýh” $„‹LþŒ^pØçØM@¶àñÊšÓbßäïõ·Lda‚àŽäŠÝŽ{©a7œš]elJN¥»G°MrÁFìÓÓ·c}“¢ÖßúäŠHͱW_®­÷$¥2L¼!O … c6øÁ#hFòAK}‹ð~êµíŠÉq5Tr3xæ“î¹â¤}ºàÚ‡!ÃÖçÝ•Ò_f6û‡0qÓà úÔ{{j®ïXh?ÁäÇ_'s©‡)—;W9­¡ÒjEk…Ð=³Ô&]jfŸ•Ñ ]­9à»UóÈÓ]Uå_eŠwÌC¡PbÏb§)býnv±ôáwf¢¿‹y.Á!¶Vƒƒ‘à ×ª?=âÖóQüýÒ¿§bZ?¼­)9×,Êòkr¬b]ÉJÓÐáë¥y»ÆUUîL^T‹t+ÌÖ"²ýØ€+É ã0ñÕvvœûK çýù©Ôendstream endobj 217 0 obj << /Type /Page /Contents 218 0 R /Resources 216 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 192 0 R >> endobj 219 0 obj << /D [217 0 R /XYZ 74.4095 789.6651 null] >> endobj 26 0 obj << /D [217 0 R /XYZ 74.4095 771.7323 null] >> endobj 220 0 obj << /D [217 0 R /XYZ 74.4095 546.7463 null] >> endobj 30 0 obj << /D [217 0 R /XYZ 74.4095 531.7528 null] >> endobj 221 0 obj << /D [217 0 R /XYZ 74.4095 444.1913 null] >> endobj 34 0 obj << /D [217 0 R /XYZ 74.4095 430.2687 null] >> endobj 225 0 obj << /D [217 0 R /XYZ 74.4095 340.1568 null] >> endobj 38 0 obj << /D [217 0 R /XYZ 74.4095 326.2342 null] >> endobj 226 0 obj << /D [217 0 R /XYZ 74.4095 231.8582 null] >> endobj 42 0 obj << /D [217 0 R /XYZ 74.4095 225.9058 null] >> endobj 227 0 obj << /D [217 0 R /XYZ 74.4095 183.6145 null] >> endobj 216 0 obj << /Font << /F50 163 0 R /F8 155 0 R /F62 224 0 R >> /ProcSet [ /PDF /Text ] >> endobj 230 0 obj << /Length 3011 /Filter /FlateDecode >> stream xÚ­ZÝoã¸ß¿"o'kY$%Ê*p½¶Ûn×EŠ¢èõA++N°¶•Zöîå¿/烟’œ¶Øl"‘Ãáp8¿!%î óOÜÕe^MuWo›\ëJÜuÇwÅÝÞôýñ`š²ÔyYéÚ¼Ìô®+Yä[­åÝ:dòÃý»Í‡Êˆ¼©*ywÿàçÒ"¯uSßÝïþ©¼\­…Uöû¾{Úõ«µª«ìëcæÇ—•’Ùpåö•Y»Ù .ÔxèïÓi4=è>Vÿ¹ÿóæÃö®É-5L_Ü­Å6W[óþðƒT¶3ÔýƒùÕ^a00ÿߛέÄÇG Ú2{‰E6B{{`úÞ k8™ÌžÍóÞWkYg]S\¹9}}âÁ2ÇÅk¢Ÿ Qò°~$>W‡«8ÙG˜lsðR £|µ®t•}XmËl8Ó v Âè›®¬‰áÌ}Èõ2;&X‘Ñ<*wž´ýÉ¡qñJe5T?£Ìú_Ìs×?¯h3MËו‘– #-©%-©xŸÌ¸n*VמÚBåQËDw†Ñ¦V]ŽkeÞ”ª±+‘¸’‚î Yê¬å•e•µã VÆ=‘XÉŒ‘˜÷m`|ašî=¨EfãøHº…ܳý¾?û¦–ÄÄyȘhÊpzÖ<“8ÝËJnÁyÀø°oìqTZ~$šgkÃd!¥(³Džl´å>Òâ@¬áS²<];ö,½•TºžÕiׂ¸Òð}&;é`pÊj™KJìºê2œÌl['0»S:#M ™ý x Ýhúb;R/[´o†g^Íæ«áD+ÀÝs¼å¨Øô©?˜AE3€†c¿1?Ñÿ5X áÝ`ù.ÖÙÚ™cÛ‰>a”6âÀ3FÅüؽûýË|6Ÿi­s±­Ê¹ì(Lþ‘•ZHM™+UnïÖ! Ìœ&úÌÕ4¹Zø‰`!9¨5 &G y`÷qÆ©¤ÊÖ`w+ØS"q¶È¶Ü39¬ù{f=p߅ߣ˜Œ{uÜ;tjk~ªGžîÈ,7És:õ”æûp˜H”7…Öæ¡6ŠV’Gňãï×#ˆGÆÀöW‹>`Žîüô|y O܇ùP6qî2æC¾1)Q“sì17FÑÐò1ûõGš†<α¡ç¯”븳‰§yý²ª8«!ž¹úå`ô¸ØÑ'Ê¿±ä>–*ŽE6ñÁ;nŽƒ˜ð†Ëœƒb:æHbÓ3ðÔ °´p~ù•  Æüýx¡NÌ„ã@/{d2chEܤcÀ`È~‚~Úš'h¯D Pà9ÜeMN7ãšn¸è"•#Õ%.­!Ûb’¥€5—:»“Œ¯$DäÎÂ-JãMIެ޽Ë#اbübÞ)U>ÑZöŽzl4í&[f½E&áYŽÈ‰–‡©yu…Òôôšª ÐiQx¸Ô(o ðrkNÖèi)oDSO¼²ZٯϬÒ=43ÎøÊ¤—™eSO@–÷z¥AX¼¨RÁ°ëÀÐÉ0?Yòõ\¥ƒ$.›Û"øX+wÏ-› Du:lpµWÏ7‘,Aå3:žbô'Ÿ©ŒÏH^v,ÏE¯¨ú@W _Š}| ê$ &&>ZP€ž+›:®lްö+™+6Ì!¾FzÄ—¦YÕÄ!ʼâyŽj&±ú e–.Vé05×o1rmD„\¹jKµHai*m­‹(ݸšÕ´"¼ëúqlÀo¶„4®· ÍËgæ>€*¿Ä/1û‹Ÿt$²O>¹AÏráh8„5(Mø!`B euKŒ€ ˆæÎF€ ‚Mx62c£é G˜9iýÿÎ*] .\M¢›Pé·)ˆiiW¤•æÊî#,1< ŽË¼ç³²Å󕲬Äâôò…D)*Š'6±]A~ÚÑÀèì "·P£K5œ¶ÚZ>,•—Ù…¼c4ñj# ÆÊ"ΗfNz–ÂE÷É">µ ““Õ;¼qF NPÊ,0BóWJ¥˜ñ–Áù¸$*feÆ»“Ýu©ëìÑÁoÈ~´Ø|ÒaaD ÅÐ#N,]Ò†áQXA*,Å$F¹ êgb*y€?HKdáj‘ Ç‚)c£çL‘ýÅBË K•޶Öyì}7 °³`¯Œ‹þ…XûJ‚ªa°&é`¶©8N¢ýõÜ…Ê¢R2£Šõ‚-‡Æ‘àÈÙ–}å‚€Qò]„ãe! æ–Í7ÀñÅ2wTX¬c$xF¾OÊ‘ôžÄmö1¸XñYżˆGF~ïEu£„T\ó„Åš¢Æ†¨/­„? &¡íÐÊ—:Îå7fVIᩤ[’ÙlE§DÞ6åÜñÆûY¬šž˜¹Æ•Cѱ_„G/4 ú¬jQPëtxbc©íቒƌ ½ö3¼ß¹+p°•ËÓpZ:yQù¶((@”&[ððsãú…›uzƒÇCÿêáËÉß(×~ 5ïôû÷¢)ƒ4÷‡x¾u:™I:ºP°® Ýt‘'— ‹¾«’Mö§à€è‹û܆¥lù–ÒÕYŸÓ Ź؞ˆêu€q…ìHŒךt¹V‰p×Lgð•Ì3O>^55¾»OÓÊwG÷å=uÎd#-§ÙHO>Ñs÷ærëïÒc\­å²_i¹˜8&÷¡'E<‡d @W;Gk9¦!C9Ì}h4uïEßl †­ç!ƒ¥YDSÀÐT¹(ké8‘·'Ó¹¯xgæûäH{endstream endobj 229 0 obj << /Type /Page /Contents 230 0 R /Resources 228 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 192 0 R >> endobj 231 0 obj << /D [229 0 R /XYZ 74.4095 789.6651 null] >> endobj 46 0 obj << /D [229 0 R /XYZ 74.4095 771.7323 null] >> endobj 232 0 obj << /D [229 0 R /XYZ 74.4095 658.5014 null] >> endobj 50 0 obj << /D [229 0 R /XYZ 74.4095 650.5882 null] >> endobj 233 0 obj << /D [229 0 R /XYZ 74.4095 487.4842 null] >> endobj 54 0 obj << /D [229 0 R /XYZ 74.4095 474.0987 null] >> endobj 234 0 obj << /D [229 0 R /XYZ 74.4095 236.6494 null] >> endobj 58 0 obj << /D [229 0 R /XYZ 74.4095 222.1929 null] >> endobj 235 0 obj << /D [229 0 R /XYZ 74.4095 193.557 null] >> endobj 62 0 obj << /D [229 0 R /XYZ 74.4095 193.557 null] >> endobj 228 0 obj << /Font << /F50 163 0 R /F8 155 0 R /F62 224 0 R /F43 152 0 R >> /ProcSet [ /PDF /Text ] >> endobj 238 0 obj << /Length 3783 /Filter /FlateDecode >> stream xÚ­Ûnã6ö=_at+©û6Åî´Sl»Ý6E ´}P'ñ&¶ÜÈiš¿ßs¥H‰ž™ÅƒŒ)ò<7žY,røW,š2+sW-šÖeu]‹õî,_ÜÂØ—g…À”e•UÝÀGbtå‡W¦ÉZW•)¨ÂeÎTöĮ̬-ÛŪ©‹¬©]ƒP_\ž]¼­ÍfÖ¦^\Þ,œËlQÒ uyýËr}^,ç«ÊØå47ðw„?ìÆïGøàoò÷üõ› |/p7Òw-ëÝÈÜ'ø{ 9ñv¿]~}ñ¶ (]QXª|CJß ç«2o`]øi—·œ¼Á»ìªiwEróúLµ|97í²â©á¡ ×<«;7ÍòÛŽ½»þJ<Ø ^¤ûÞ2¢þ‚è&¢‰bÚÆÓÚϘJÙY,Ù—ßdà…1¹DêåfM† S²e9hÓ³X \+3WZ"sUeˆ}ÏHfˆÞOè(óåæOÄÈ”Œ’ÒáNÖ¼„ñí…ç?o™l9’p©ÿQ©9QG0öÀ+‹ ³sÐþjù{‡ùQ×Ây‚Žö>0K…¯DÕŽáº=ÿ>‰öÝ’‚\«FÀ¢JÕfDqÝŠ8˜+ë bÝÿ+Ï•iÛå¯yQŽì4N˜ô@Ña›Ä"¬$9"¤ˆÁ\Š’kfjónÜjäí è‚ÇHɈ†×Ü,ŸïD!\•Ýx¤i>I²Ì™Bá-ϘР8Åôº˜ª¡#µˆÙÍšJÛÚ¶Ê—ý ÿ’’˜_1›ló®-Q…J×.¿S,:<,·WñÉw¨×¸¸¨y5Ã~µ'{¶P‘16y“Õ6G“Ž8ïÄàÝó.h½ÜÄ.vÞ¤Îì]]gEikYëZ¶}ŒÏ)¢‡Ú˜¥µÛVU,8%âC¦‰¬†ilÖ4S³óv”`Yº©…ù£n"èð ý·wˆÑÑÛ4ĦAbØÜ–m|(Ÿhš­ €¡RE÷ ‡Ñ¶+^¼5?Þh_!Ð׺Ùf«M(ºÝ&eK”]tžÖGµ^¢À¤*œE“³,3s ‚³øénóˆ ÝTËcÏ¿·ò+F‘Ú»^¡¶{꟫¢Øf¶Ímq)dX°´Ã#œšì‹M‚-sõU8H‡w#’´ÊnReÙ\³²lÓIQpÚ§=Q;žÚ â±kæê±Ó+®JF[E!þ–fR8º"·¨N‘°è¦—b–o± ½ cÖᢖ–{5×ZùFÒ_ iÃÐLa!à~!ÈçUÍq«„2ù A…·óÃk^â[F€e© ëJl•Ö‚Ü‘A’¥»Û ò£´ËKõgâ¨?GΜýóÒ‡¼w׹͜­Ý'ÄÌá§cfë=ê­ ^ªEAÔMdª,Ä6dËØ1Àèl`4d:ŒÁiðâR×Á˵¸|@¡¦‹D‚¨ÊrùU’à£6F¨MéO lÞ /'¨G¶0%­äxàZŽ €Ü eGê{–5RQ)›ÃÑ]½ÒE:c˜ÐÀû”Æ;0ÜñÏšè9êIÞs/Û#*áNƱô»„Ü<~üWÎ&…J0à ™JÁÆ·úÝFÙáiÔAàL5]Ø=†üçgaVÚe¸ÚÀSŽ2Å[­¸B à„bߎJ~Ò"y{FÖ¦ª•:[5ȉ³„iUa‰i‰ÐÒ•æì´ã¥ÖDï+ßjujÀ«XÏ€-4Ä‚ nÖL’@‘‹‡QåIó.dJES¤'ÿ|˜qÜªÕ °Ió÷o ýæÛUŠeß¡}sÞ‚eû  !fÍú#pætìÂ󈧾m&†Úc‰¦²†”-2m6EšŒ©r°ÖýÁûµVœaÛLÕ ‡N[ Éòœ¾ÛÆÆ­O8µqp:™]â¶Ž$¢¡Q ”‹„³-H›¨q"Sj7C&A0Fõ¶}œ¬mØmcÀ~ŸœÂï!$¯ŠjsN¨Žã<6x¡»+ó"« Ð\Yˆô”™päñV@¾KJ ¾ àÉ·…>h¶(2ÔÛGqdŸã‰¹x~~δl>оÃÝÔÓQ¢?œ>ð@ÒÄòEØã*c†óŸ4¡ÖbŠi¢L>/²\.x“)Gºç•h¦V®æ…ávlšq4‰V]`À%¬ŸWLbÖGÉ÷pD4»aìÒã1ů…-Sa¤ã•í¡õÙ9jÈ¢åØz³y`ÈÝõÁ™pÛC`»\>3Ì>9CÉF Úü ¨e̹óÁ3¿É̺b‚Qá¥9Ü3Ã}m–bíéø,Äkób¦ªw«OËç$çÅI‹Oð>êcØ‘yй/¤ÐdÉ¿$Ĺ%=HãpИ¢ãˆ)¤qèg{Ç…2üžâ’p$ª®MWªþj›ŸF@S4¡K ÙL@æ¦ÊEð71¼O…žÆdj;61dŒ5–¡lsõHVn¥&ж±™æpp@¢êV1‰Ý o6úÐÝ=ŽS†Í(££jè¿âóm¶C½P6iòQ`P• J 9´/!À"ì¢t²øékÅÌ #5ÛC%YEøj„‚õ¶RUÖuú÷Ô¾ Öc)Ÿ2)P€4Ê‚»QÐÏŠÀˆQ‰é?±;)å”6öJ¦ÊÚ¦¿‡Ž×âú¿²]®w×S÷[Ø<³•³àíËÌ´àbÁ³þ~öËoùâüð×g0ìÚrñŒñx^g»3HuÛJ?Î~8ûÏèªý‚«pEòÕ²`¬3[–å¸1Ý6¹pm[:ñ¹|)g°9—5Æ W‹:¶ˆ‹ E’öª–Õ¶UæòêÓi×WኳÀª¨ äêq_!(JX3" QpÊ©¾¢ù€×“<¦Ý„Jç‡û$—¾„æ·?ŠM "ÊÅàCÒq³ÅÔ”å'£6@«¶Í*0ȱu¥´ÙµAtîFbœ›…AØ÷/þ– éOµùepPÃS÷»Ö§Ú²(Uł ‡a³aøÆÄyK…ôڮg‡'ç®oJœ:Ç£Ñ; ¿!–¿æU}ƒß‚©×rƒk}Ð86ààvÌ¥Ksr,ý¤*†s˜òû¾øÚÿЃd–?hTè“L­÷½ûþÝÏÒìÅ‘íúAœ‘§v#C?~ûîçTm±ó*¬ëFî.¡÷F¤î¬è˸=y®ôŠ?E%ªR»{ÚjàORjÇ'úÈ¡àoè(O¯GÇS»Iõ õ—“I½Ò¸÷5<—íøÓßÉl§…XÝKX ­õAëqcŠ]K\5$w cº °9ª“®ýé ùñžâ'z‡°”Û«/\%ÅØBîk¦R“ò…\á§^V°§}˜Ü˜Éœ­\Iã¼ÙåºÕáwPh ‹¼} Ò*jû2\TîL•­VÆdçTõÊ|DõÊuVÕUõ×U¯ÂßS½ò`šï rµDZÿ‘Å,ï²[›¤²4u»(\›mùéTê‚«pʉÚê¢öõDŽÒ©šÞTúÇT|?j|MÛÁsÍTžN§OãûeÃ,üÚ¡õê˜ÜFÌÿv´9Ôíß³Zr²ðsÒêãàüI+#u\ßzFHy Ž¿É—·&¥úñÞd\uûšËä§Jp6zWB§r?Û¡kH(Û¢8^}o)ä»Ü ¸Ù€Þ]AM/¾˜×ôX+JE;wpañÞ%Ò½½˜0 `÷¬™×ã}A¨À§ð—‚÷§V_ÒÉWx²Oª&AR÷ÐçÎxI3¬Ð|ûbš¤ ý!N'Rf»¿‘à³´^ñ’Ñz˜xhbƒüW×á/à|=â£Ës×Úwãë—ÜHf)ûÖWjROùÀ™ªI¾ä[)Ì*š™3㪬(ãWBÑT'ß#$öû{Ǩendstream endobj 237 0 obj << /Type /Page /Contents 238 0 R /Resources 236 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 192 0 R /Annots [ 241 0 R ] >> endobj 241 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [400.5288 532.7041 521.8625 544.5645] /Subtype/Link/A<> >> endobj 239 0 obj << /D [237 0 R /XYZ 74.4095 789.6651 null] >> endobj 240 0 obj << /D [237 0 R /XYZ 74.4095 680.1359 null] >> endobj 66 0 obj << /D [237 0 R /XYZ 74.4095 666.2133 null] >> endobj 242 0 obj << /D [237 0 R /XYZ 74.4095 533.7003 null] >> endobj 70 0 obj << /D [237 0 R /XYZ 74.4095 519.7778 null] >> endobj 243 0 obj << /D [237 0 R /XYZ 74.4095 428.2312 null] >> endobj 74 0 obj << /D [237 0 R /XYZ 74.4095 414.3087 null] >> endobj 244 0 obj << /D [237 0 R /XYZ 74.4095 240.5105 null] >> endobj 78 0 obj << /D [237 0 R /XYZ 74.4095 226.588 null] >> endobj 245 0 obj << /D [237 0 R /XYZ 74.4095 160.3863 null] >> endobj 236 0 obj << /Font << /F62 224 0 R /F8 155 0 R /F50 163 0 R /F43 152 0 R >> /ProcSet [ /PDF /Text ] >> endobj 248 0 obj << /Length 3755 /Filter /FlateDecode >> stream xÚ­ÙŽ7ò}¾BÈK$Àê4¾ömM‹Å.â $y¥ž±àÑhV­ññ÷['5±á ð¨I‹Åb±NÆ,jøÏ,:_ùzh]?TmÛ˜ÅöpS/î`ìÇ#0Þ·•oÚ…Ñucëªo[»X§H^¾¾ùîïC5´¶]¼¾Kµ¦êÚ¡[¼Þý¶ô+³¬ÿYãûåö°[ýñú§›ï_‡%Œ«+× .N…þwóÛõbôütÃCï QWfìâp㪡o´yóóÍ"Éá:ÅxI²q¾rÞûœæ ÈÅo‘Îï~è“ ë¾`‰¾r½!øW·«µwfùieûåñ‰oÁfe»å{ì±Ó.§é-îaô—9#Ø=üÁãŽG9B³1&úÆ9à‘½Y­m‹ä'ºå‰ÎPÑ*C*8u‚½ú¡&Ä ­ýr·"Á2ËoWxÄp!¤„4nfœòQXD#keŸ%ö‰T9çx „Äô䜀kœÁ¹·qŽ vß3v‹ü¾gˆßkãõÒÌ.ÇCã@;r¦Í-&Žœ °¦’°Ô¥÷„ï*N§ëy&9#m‘é`“mª¾ëæÊІ2lWµuý*Ãã3Ê0€!Í÷Gºü$òóTâk=>S÷hlÕÖ.Ú®©¬ù ¾"\§/ô‡1-ž†‹ëÒQ¾îîèºÕCI‹@?\éG¾•[” Àqâ=¦ MBÁ}„Rï‡|&…µOÔÅà…vÍJ…>7ÂcÍ ^¬w§ZLVâ¦J/¢Ç›°Ùެ=(à¶ë‹÷Úv¨&©²nù3"y8Ù–í|J06‘6ú ÆÜ ®TˆãIg7¤ªˆõ›½\òI–œáe ò$@;ìtª<ÕF¨?³î2„›NW ÃiŸ%ê &h:3Ä/ÿzõßµ2T4Y¦YäS5Ääúå+BѲºñ¡Å&ìï" ª;YãoÂIî]°ÜÿVwv§Ã“Âo͆Y"ªŠ`à9P–¶ï–TÏ :ßG"ïX÷ò_Y"]»Ü’ÀNÓ:؈³é±ð ¬KÖ㬯<>³]ì=Úno:²g6õulÓän v„í5Í\}ãä¢s€,ètUšùA)¹çöN±ï`d|é…ž§û |ÒÇSÄÊ'BPtü¨{MfLqÆ(Ûew׬ð[æÿ¥ül3—»BãîKM[ó9¦­6Ucû M[‚ñ9Ó¦`H3níéO Z=ä­mÊÍg ARÓ»ÊøÚ½E„ëcÁ¢u¸¾.®w´ú²5ƒ=\µfm¦Ì±™Y3>!úMÉ’5à†'”©Ìµ¤¥]ÛæV¬õV,®úè>'¤&ÑmÉn .Ã6ÎUµ53w$>¹èï°íIÉN`«ð^ööʵÄ;߆ úÈ'ø¼£[E*gü÷ö ­44ÓÙ¸NÊl„Øži- i•Íáø­<ÍáØa¾;:~6þ„*qÒâžIAÍ…Å@“¨c 7Eu…£t€Äµ[5ÜçèöK1’¹@ÀCà— ¦}»yJPjÔ at)‚x›}U†*XïØ½Àm_ Þ ¹]'ã3ô‰ñFn|†þÂà CŒ 0(©›k„³3£#ØN¢hóÈHuãøú\Ðd½N«ì9Ö£ÉG¡_?ÕÜÁ§Ü|5,Bºš«dÛ”ƒÀŽD„­íÉàË0‰íD4+Âü]ÏlsÍÚ×Ëáó_¿ðwa?®ø¸áW/Z×уIE[Ét&÷Œ\8øHF&þNÅ Dì&œ(|·*¢sÊ(ÂÜèå$Š&! h7 ºì.„D 7½S ÐeÚ^ã{Î ‘¯]¾D_ý<£Ä×F²PÓ‘á§œXþÔ[ Ÿ”N":ßi† áyJ, ÊÝ[Æ8²üå’¼MºHKàIJ#…Cà.“}­e)ã†B‹ªäšãæ÷ªE¥2ä„2,£ >¨ŠwùÎYÙœ3¥ÃÜ€vQCí£ŽK—Iw©‰+»¾Tgë-ÿ^Éw}³Öгv¿gU8÷jl_‡Ñ.|ßT3íW{5Špb,9l¶2µMV·fœˆ-¯­«ÚÁ™Ük#åݧÊ—¡V?°vþ+ê+iT˜o+h4ø§c8Š„` ?!¶º|é‹¢ÀkDz³Ø£ŠpÎÜpî̬ ŘÃò×5‘ƒ¦tDó6ÏÝšަu ÷+Ó|}~) \§/s·f¨Lo’u㑞™îBè!L,ÛNNèz_uÝÜ«;i–o/~-f²5¯>?k/‘$Æ) ÕïÀ¶*ªÍIÒ´~ê^ þ ÷BrõÇ(t'Áµ+•¤œ‘µƒDÎcZ3 ORÿÄDûF,¤ïUoù™zBÐíUɈç‚S02ÏŠÑPW]Ý/<øÔÖ×_É ºuŠïB„W<®™ ÷æŠù®Sdû'† ¾À\0@›å•±GdÆÛY-Æçµ¡j~„ 7ÐÑÆ“g{ÇÝ¬ì “¬K(´vŸ&ÙÀQ BÕ€ÀµP Š'ŠÝ [W¶wÍõDˆB ¾ÆëUïHú…P™™ç4±Ÿ]oLˆIèû–¯8·òÀ¿jé×ÿ ¹HÄô‘—»’=¢ý_Ü©™0: Ó `.œƒü~¥8„ëã…@Rº}²n.’Æ\¦(±3 0¶˜pY·àH¾”ܬ³®êÀÍɯçfGjH¬AvëÙC‰#·%}OCfÝw_·‰ãO^jÂÂI›ªCv?5)tLHÚ¦ÖË×x[Q奄Óe»ì®˜$¥Üï5ƒéiü„ÊŠNˆ˜n& ŒEáÑ))=¾âÝ=Ęñ¤Nä½zz‘Ö’“–•¨¸ëVs"‡<û6Fwޝ‡Jb3iè[bMŪâ—)-Y&öƒêVÑ=-äûصMáRß7«:Åãvœ¦ «RJÒ~Ãىà þ&’CRù~Õz´T>];s× oCðæûŽiçÏýŠ=îqÃíäbPûx+â€iÄ«éИUÏû68 âªEƒ±b]Îg±û~•†]¼qò[¹H}YöqHóY+¸‘ØÐó)s’mq´t¬_¢ŠqõòFƒge»Óüà“WÃ,Ux+•Ó!S3Ðn¹tý”¦…h§*}Ã@)ÞÄ ÁF ¦¬a*qˆê¬9=gõíîîZj@/k`J7Î_VÃXwQü hµ,Y`+û¨÷ªuQQ4mΖ¦£â—ú›Ž“ Ö±bjÔ´Ë¿?0Äs¤ÑrV=„Nu4·Ç8õ£†ÍqÕô5Î ¢¾ã¾T¥ÉÆU‘Àè†Ô ìË«SN¯X@;Œ›)$L™¤z7€"¤STmky|a†<˜>Q]ÿÀòN&É¡˜L'ª €ßë¦Ö”•B­C›ú̓ÊF„î/–36ç„«¥|-¶³mS¯æÔ’þÈßñLœ>ÝðÏNÝ(ZÀ©ž3ÁGp)•»:/À@³Äz\òYu'2Sqèù+†®r‚ÐÈy«‘Á i`#›Y‹ì´y¾¬(˜+ðjÂ>}sQ¡‡F\Àà}ÆAØÄ ©“( 0‰¼;~j°ã™Zɦ¹‹j”:œ‚ÂLãû”ŠdÅœ“]Ç XUž'}  YP9 ŸQgùüx=Ó‘žmÄÒ‰Ñ}NE[µ7/+³êt”ç-º¢ÚßÍccìá< Õ þ6Éô5¨m†ª©}WzZjÀÕ³»òîB0ç|ždDA!XkÓ¤ÀP9Óš¸îZu¹>;I¨´­”‰Ž!‰\8–m‰•Ÿƒt'í}‚°é0Sx™±¤O|ˆHlà5^¥yå阔¯ä%©>«²Ñœ¨ÆO!ñõ"+O1Ÿ\†qŸj›S,ëÝ=„[3“ dŽœ•Ų˜H"ÂÍÓxƒ|¦ªÄù«Üm8¥Þ¨¹ŠfU`—×Jݽèšgô"a aÒ•zùŽÁ¤yÒ¼ EeC~ÿ]“~æÆDƳBÐ&s|RÑ ùšÚg6“WÓ¯×ãµ™&ö\víëj xuˆOš‰8è›»…¡6ÚÃüTõC’ÏF€à+³®ß%9Ó¬ò¥uðù»*ÀŸèð¸·áªË#Ú˜ÕUñÌ4²Cwú˜Øc¾ì­:uSÑœIBÅÙôªY§¤Óëyœ…é²Öþi `›ÀH€¾È1áZøl‹Ö ôŒ¬š™£råHOg¡?XKë¾d‡,¥wÖ¤‡ yv+>nÅ•¶bq+Ågc$·‰n²½/]uõ.éuºê–\ÊÞG5‹èI‡ZŠ‹Š&‘NÂ¥Åx¾òʇ(ÁjšžâÐGQÌéÿ€è4Áó ‚Yæ(]]W›]8t‹ŸÑJïqŽìJ@.€ê¶¦c7Ýuí\×–Üt×ç¡g×ÎBvíi8€Ó¦Ä0ìÏrkÝÅrÇ{ÍoL‚¨h®![1ZÔœÂSÆQÐ’öÓ÷Ï>l¯®ùWC_Ù¦Š”¬ ‹¶šÊøÎLHr;_.üO@…õþ”j>endstream endobj 247 0 obj << /Type /Page /Contents 248 0 R /Resources 246 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 192 0 R >> endobj 249 0 obj << /D [247 0 R /XYZ 74.4095 789.6651 null] >> endobj 82 0 obj << /D [247 0 R /XYZ 74.4095 771.7323 null] >> endobj 250 0 obj << /D [247 0 R /XYZ 74.4095 717.5457 null] >> endobj 86 0 obj << /D [247 0 R /XYZ 74.4095 703.6232 null] >> endobj 251 0 obj << /D [247 0 R /XYZ 74.4095 625.4664 null] >> endobj 90 0 obj << /D [247 0 R /XYZ 74.4095 611.5438 null] >> endobj 252 0 obj << /D [247 0 R /XYZ 74.4095 509.4767 null] >> endobj 94 0 obj << /D [247 0 R /XYZ 74.4095 495.5541 null] >> endobj 253 0 obj << /D [247 0 R /XYZ 74.4095 405.4421 null] >> endobj 98 0 obj << /D [247 0 R /XYZ 74.4095 391.5196 null] >> endobj 254 0 obj << /D [247 0 R /XYZ 74.4095 153.9606 null] >> endobj 246 0 obj << /Font << /F43 152 0 R /F8 155 0 R /F62 224 0 R >> /ProcSet [ /PDF /Text ] >> endobj 257 0 obj << /Length 4004 /Filter /FlateDecode >> stream xÚ­koãÆñ»…Ú/''šûà.7ŸÚ¢M‘àZ´‹¢H‚‚'ól÷,Ëí\üï;}“’.¸"¸˜\ÎÎîÎÎ{FbÕÂbeu£[×­lïc:±Úî.ÚÕ-|ûó…ð0Z›FwÆÂËÂ×M'Û¦7F®69’?\_\}­ÕÊ5ÎH³ºþ–2¢±ÆÙÕõÍ÷k})ÖÂÿõ—!t¿~/ÃöR‰õGxzO—?^{õuŸájWÑ7ª„äoôÿÆa/7Ê™õ#¼íŸqß»5>Þ!âçòݾÁÇ ïáß#òËþ‘AžÂ N›x•éér#ÍzÜ"à­ÀÃŒ7øM3öCX¬‡ì™Ž8ȰBµ§ašðð;\¸ÞÌ™ãl6´ØC~ŽŸ/eß’D<Ѹ®cêÁÆ;„¼…ÉZðÄïùx&€(1ñöµ¤µ÷üW^=ô–?ÿì×$ßé|ìîâOבµdg-a›V‰F+e±~ºøþÇvu|øíEÛ(×ëÕ'xiáœ\í.Tãú.¼>\|wñ÷Īá&ÇH¬šs—Õ¢•i]¤Ó_Ò¡Þ§E¾æÿ·Ï€ðÌ>{ÕmL¹Oâ´Û)»,vãs`Éær£­Zó¯èYcÿÂ/‘Oá9\#îw¼âÀžüð˜|ÿ’6ÉGg¿œó6ÍËô–áfñxßüõ;x¹¾ìÕú÷ïÞñ˜§ìC€Ò¹J(dœé¹…ëç£|º÷$¹Ã÷òÊàóDGÀílýÈM¸†gÿ_Þ{Õ\(&À™žwûCÂ.ÀäYw-tã´r¥~ºÎA·}ztùæñË4nó áЧ\ã@¼qÝZš?2_ÓGº-RÿxEÓ[ýô-ÂåäŸð´—\j^ý~.%|~Dàç´‡=Ç›>€øÈßG×ãÖÿFà5zç+à%Yœ„iDïTyû?¥sÜ""þ-]ç–´ÄFÉZ€™eÇ—øp)Y%"N8 x»á‰ïñ€¯üœs˜Ô49ÈéCd¶5ÎØ3t590#](™˜É¯´÷ÛÆ„sHOnù¸´TÒ}bý& å•Jzå:Oêì^ˆk©»Šä×aÓVÊìàidåz»ð¤Ø¡ôؤílI4ËvrÑžÓ×âP6WèðRr.ÈkUÉqÍ'£Ç ,‚{Úþìd#ÏX>0"¼‰gfæÎ¨õ;â´7áÈ™Ìo¦Öe¬¯kÆ_ˆa£2ýª6ËÁá4Ê5ÖZµä½ °¦.oÙµuºÝÚ¯69 2Ãàî&;ì\£„i!Ü&‘–¼šÜ“Ý(†ñŠhÆ7߯ü8“€Ç®;?6yø«¹7¼¡G dò§Áõ¿!2µsS*f”{ËÃK*"¢ƒ"ó8^Òc°(oÒÐp#;Î{æ+âLöJÀC¸"¾Ø^ñ%g».,•˜éšÉß÷~qò =óHd¬bK#•–=«r–>ñ3 >Àî?­ªq¯?E& Û!2ÁôìYE&ºúGN©F±,Áµr^’àJ¦”µM+!®3­mzgú/uu#ÂMŽqæêB¨×´­ËÖEªš…ÎÉWWèrµ¾Ýú[æ·•™Ñð…è±KtNþÉFµ¦éœëKôÏ)ÇïJªÂk²BòÉ£×K‡iÉÙõ$ ¸Ä2€ë¿þÐqIÞî‰ÏÙ´x–—¹¶1@Íè…àÌ~½½ Öq‘’Ø{Œxò»tKӘζ_rTiWcu|µ¹qÉ­~“ĨÔ‘éʰ:F—-Ñk¿˜ž4ã‘} òî‰èìäý‡s"ŠŠL9Ž1¤È¬±)¼’"(ŠÊ»gômb`õBî†Hû€]U°SÌ.ü—÷Ï>Úaà-qQItG”8Ì©/õ˜ègæ ‘¿„9d. ÿ{ìQ DSØÄ ~˜xù›¦þ|Ùù¼J{ ›Ý…¿Ð°)vAPî™H >G´$jÍš}|JáÓ¡p¢”¿%øû)Pß_ V±¢LÑYhªe 5Ýc'™œÊ›ËdôJµ‘üA§fFÕ‰…Ä—Š §PQµZ£¡â´¯Q˜vo1j1™lìvð*TÈ2û9v+Ç]ÊòÉu¾€ßéK°yQ;Ë…¤Ó£N¡M 3¡›H"IZp—'‚ÂÄ4!p=,gT8¨’Ï#qîû ⇶kéîSR­Nÿéõvw33Ûl°ìûU§ @4Ý—›í€p“cœ›mm'T¶.ÒÕ“ãHv Î(X›`L\×sˆ.3¯‚c_>g<ËI&«š®Õªê`X¢†0±‘}§¿ |ÈQ"Ô¹ðáàC‚½æßùpâ?gçÃÓ?Þx<{ÿí+ò#g!ˆ4Âý*<ŸŠ\ñGÌ+W¢2%øâÅä†Y#†y6e)y•²\äµãÿ^/{Íy7™e­è5Kþ#ƒÀÑ'Rµ¯˜·üþÆOüLT4<–Ç[!3`þ Þ– Ûíþ¥ŒŽ0¡6ð€¼´Ägh“CŸ ÝM|Ö© —ÏþÛzÑÀ·'Ì=[´_àíbÍëüÎ&oÕè®AŸ?¹Ï4<ë1ÉcåA)Ó‘u K ¶õ‘µ5§‰œA r€:KäS‹&"׋.9_3¹éÆTÔ„¹™‚A`ÇqBv51-Ã[3-ÍL¢d̲r6]§²ß0²ä³¢èÚ`8 }Ð0ènLãÂ^M Â;•‡%'ï ×—M!#8Ã6Ô ¶ PgÙæÔ¢‰mêEÙ&_3²ªl#m7gd%‰Õ&U6q:ùƒ·ÑçÁA³àØ h(àsv‡ˆ¾¼C wHÐÃ3ÿ=rkÀ?²7yÙÇ W3á“ÿzà3LÆI^ÞBx^vUŽÈŸ©‹é'ÙIŸï"÷&U@øÓrb~âÃÄ+ ± íë4è@Î’4¶ÜKé»”¸Ÿ%¹DÀœÞ°fµL›‘» A1Žbă«»‚Éþ¸Gbª°¬ë«ÊŽxg÷Þ{ãL…±Ö­Tß7VôÞPá§Ã­‡ùG&~“O˜ÉÅmÊL¼»U¤¼g47,RwèÁï,7XIk„:½­92Öä-SÎATҹР!×þ=oÎ&—Šë8™!Å+(u4ŽÌeó¢""}ôlJKS-\<5¸¿º¦7½,¥ŒR›ëz/Yññ9—\›¨¾Ó—ð}ç@úÈõ¡jð1T*¤Ë| xAkš/’¾â qLõYÉcŸ1^ªOq‹õ_J×$ó%OXæA¼Ü¾„(é†WôfzA+Å’¬K3ËQ´­³j4”2 ¯<°å¬Õ<Ë&Ö¿ÁbN»þ½ì½ŸŸ ¿Vž)ü|ø{—ª‰eJR%?Ö®rãKVœ~êÛº¸N…6bÕÔpZ)8{¥]»ÅÍužoÉW†Ž ŸÎÊá1“D)˜IÇØY*"_'¤¡ßgM[†‰Yvˆ@L=§M';Œ¶«“2óa$¤!±ï>5“a/„§+Êëøð/0^ÖÑ:¦#T—5–t"ÈYèÎ Æ‹¶…PìØœ¾ò[çÈÑ\Ox I’ EF;™B{¤ª`yD؉lV['Ã}vð1tF£|ÃÏÇTTtÅÑn [Èá.BÙÆv¦_Ô7NKwξøM>anßfh)(C^9Ľƒ¦úßïÂEîg;t¦qЖ;¬ \„:³¯2ÜWH#kï˜oc%rŒˆ'DP·,‚ZÌE†«ý_À²hjþ0ÿ!ämuÖí¢Ûœ|÷Ô±4¾ž'†Qy‘t¶1éJ> b¡dt”ZW)•htüç1itÌ¿pñCq?R‘Ï  ípZ4¯»z€CHLØÁ­ó‹B7­µpuî°·ö §FøM>až>œ¡Ezd-=õ6”l îé«mTì¡Î,®ºÆ£ÊÅC8+«çwp4Tç¨i<“aÈ¡Ž…Š:á:*ž\4†Š³E—BÅbÍ¢1KÉÔk¬ZqM Ȇóôº.+~úh§†µ¦ ‚Ýû.(@=;|‰ÞMy¯’}VÈõwY¾aëÁ«ëÅ!üÞËm¨›O’ùüV¤Ì@ íH!Œ¹«©Á¾ÉO¦º´ë r9W·[jpÄ—ƒK8·•õGœêcÂǬ>W`ßWÊ]3|‰P—ÂÁÂÆ›àüµYÎÛ y§«§÷DÞP²³Ž‹%_c)`&Œñ½|QVo}ºµÞuÔv³ã„^ÆaŠþ ªÑœKB²hxæÜc‘£ž"m§2A\õWFõì}Œ2Wž¤` ‰ §â‹†{,׃}Ï è¯ºãÞî¸/ì¼ÖM/Q—hÛH«õ—Ö"ÂMŽqþ£Ø_Ó·.[˜ HH!ˆ§àÐWeÒ¥­*~&ð¯¬þyÇV»ÖâZ,פÞ&'#ö7“Ó·> në†>Ý&´m=µ.´êª{I§î%-|Ë›cˆYTªµ[¡s² Ú#´o}·wؾrõç]‹ aSuäÒq¨½®+Y5lU™ªqQɼr2E?/k0~N[ˆ2B)¤":P²ªümŒ–Øò{ª‡Vú~ÜcµLŠûU%ÿšöE6W|I÷b†áxõ1/>Šõ|â6³GOžð¡¯ñÅÃ|‘q©§ñÊëû OÃû±5©+ßãýÉãhüûåõígöN2®|ì6zí<ö«ú+M7/G˜ÅþJ«Æ¡€¤ˆÍM—Õ·æ•3g‚¹"ÂÕëÖ¤«‚ÖK\\ûÑN4ÛÈvçyù‹ÚÂMŽqîr»•|¶.Ršn*îýŽÏ|ŸH4¤âи{â±£ýpTæ†>úñšî—~¦ÖV6¾¬2)Ÿ%ÍòK^ö 5ßÙÜž¾I–^ny+žtª}ÕÕsv]f«.±¡2 Úº³YIYß‚UúHe=ZK–â3¸N´Øj¸üN5À_îcx|›á<ëЂ4à"D¨<'ÝL¸}w&’ QiþU[üv†š®xüT¯óÝ®FVÿfG|öovbÓ5Y¦q|`ü¡ m«>ê‚ß¼—’&¯é°¾CZßÙõ¦”©ü§AeÎ\•[Gƒg×7²³îtìœÍ+( ^„¶2bÂ}ÍÂæø{Ö…õþE± Gendstream endobj 256 0 obj << /Type /Page /Contents 257 0 R /Resources 255 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 263 0 R /Annots [ 259 0 R 260 0 R 261 0 R ] >> endobj 259 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [166.1317 385.2318 246.1806 397.0923] /Subtype/Link/A<> >> endobj 260 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [136.7605 326.014 197.9689 336.8532] /Subtype/Link/A<> >> endobj 261 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [313.0813 314.0588 333.3451 324.898] /Subtype/Link/A<> >> endobj 258 0 obj << /D [256 0 R /XYZ 74.4095 789.6651 null] >> endobj 102 0 obj << /D [256 0 R /XYZ 74.4095 771.7323 null] >> endobj 262 0 obj << /D [256 0 R /XYZ 74.4095 263.2493 null] >> endobj 106 0 obj << /D [256 0 R /XYZ 74.4095 257.2969 null] >> endobj 255 0 obj << /Font << /F43 152 0 R /F8 155 0 R /F62 224 0 R /F14 210 0 R >> /ProcSet [ /PDF /Text ] >> endobj 266 0 obj << /Length 3108 /Filter /FlateDecode >> stream xÚ¥ÛnÛÊñ=_¡¶¡Ká.ï}(=EZœ¶@ EÛF¢}„H¢+Êuü÷ëÞDÚ ‚@1w9;3;;÷¥YåðϬšrSæ]µjÚnSוYmïòÕ¼ûã;#0eYoʪn`0óv]Ù|ÓÖµ]­C$¿¿{÷á§vÕmºÚÖ«»û¼+ª¢\5µÙ4u׬îvÿÊþyÓÙøtc²óͺ,óì3<öÛÛd_à _<ò‹i{†Áž&LvÉ¢Ë&q⿆<Áã0ìàÿ 'Ød#?îéQ°é ?#Ø/¸–‡Ûñtc[šÜ“`ïæá{ù‚ ²‹½Çºcâ°¡AãK‡p ˜ì½§±e©ðO9øÏÝŸVkSn:Ø=<˜MWU–$ùŒ2öËÒ0ÙÃͺ(,1±WT[¢{&µe¶ArEöé‚ @¶?ñ’÷À›ã™~â¿Çž¸yáÿÎM)0@‘õHi~2´ÀÀÞ-RìŠ@†iê‹· ñYO8ÝûÇ ÏÎò@” ™àqn)Šš«$ I2Ùm:'<¶™Û;uKkÜà@²ÂñQåjè{U0”¸­²;Q6$À²žF!rÏ¢g]µgÕPväQßr‚FDRî‘$ËE^…*«{d@“@°×t¶]FöITIdžDŒ¬¢Ý¶kc&»ú-E^Ò«'"2Û5¡}"ÒYOØSOa§¨eŒì$‹^„ØvŠy~É (zÄ‘0è¥ ë·ìV޳tÎ}lûܘÍ¢³yAæÀh0!õ"iÑkRÉ.w:Ýv1Í<Ò¸³ˆ O}<¨÷<©wÙG]CVÁ2Ç…È.-[8§ŽÐìÆKf´ ^6ž”S+’ËpÚ‰¨Ù-OñÆÓ™θRw©Mm MÁLä05ÝöU?ÛX®íÛrm]ªfidenAÝ<â{~ôân9›pùìÎÏѲnþ4Ú&enê/x“͆.I{;—&d©½¤¸HéŒ'£º—ƒ¬-£Võ‚1…]=<‡¼×åUP´QòÖGG+ í'¡víj@¡ZÌ~œìíd„} J’3ÖÝRîëv£j)¼œáŒ_üpäG—Ò³bž4ˆ×6/ ÒÝQçõp&‰HytÏš‚¢[qõŒ•r`çCÙÁpK§!2à¹ðf=ŸóßÒV "vލ0¢ Xµµu”^…ãA—Îû†¶^mâÐ¥vøÒUÆ$û‘ýåŽûiÆfÎ.”ß°h8¥n¡YÐRµ:¯²O'Æ"¡eÙÿ¤Ñò6æLÏ·iýc#y e€ªÞMÄ‹âŒUç¨A‚©È-‰¼iD/ú¹Üg­LŸ”òMò(ûÒ² !\M +#M™ðÁ Ѫ¿ÆœœoO¬ƒ¬™3iÓfŸ°¤ªš šš\Ïúc_5U­ë²TI½Œkcg8 ÐÐÇ!Â$L¿Å^„GP!SÀ‰ù2§Z0Gý Ûi‚*ÉòŒH7a/‡a®á2[‰k8,¯}ŒýJ/Ž'2Oj¹¨y°7¯¨a“ø¦H‰PmÔ¸^Ó}ÂÍ‹` òªc¯EM2év~Ý6mý\"³lQªA ±aÁsèÓ‘ 'ÛTN*Ë{ªošMÛä,Y¨Èn@ÔØÌ¹é Œ|p,ûú›¦€v|:ó|6ºhy‡‡á:ŸÇ£k7EËFñ KQaŽWHÆï‹'5hÐf½;É:ÝosÝĹåù€F=×X S¶0Ÿ)’xQľºhf¢VE-†rá±Ñ¦ŒTæýöô|2B¡9…Ù‰ï*œïZhO)¯¥)¬JSE`NOb¼œÆ¹l$/¥©]æ0>Piuœxµ*5‚<‡…¾tÂÉ*Þ/ÌY¨íBŽ[ÕÃ:¿?ˆ´R?XUhÁˆy!aBD¡kŒ˜˜óÝñÁ^$yõ&ý@µ¼ï±,¶6JÛnª®¬~ µ¢Xnm8(dÿ,%öIJïG×ÒˆÚ [žDé©Éã‚/¹|c…N°k¼…vµSüN’÷A•Ïøü–]›%¶0ɼ0Äߥ½à­ç+¿ø+<ÿ™•)#î|I¹Þ++ µ¼:ßé]\:~[Œy¶éý ¼äTŠ [͹«Ýµ 8ü"¡Í+™ÙÏ©ßÒ)_yý·2i_äK´£8]¯>Šï?’[‹u îvÐ8Fñö•¶ÁóBÎSž¤mƒ&Nâ€WYÆÕ›ê,ç£-ãªxË* ¨ÀÄu²gÅ7òläAše¢É¼cMø©³#';i7ÔpÄwAÚŒôÂ,×?åµd8ïnïmÿŠZø€ÅùÌHõK‘»&,y+ËüÂÆ¨`èŽ}â媚6f—#¾åçÀ—Ç3¾`Åâõ`Û´š$j>w£4Ê:Çïè1\ï™f7l»¨2ºM§®ö8ñT”Y.ú좲µåøìŲÏvPßá³×þQߨ³´¿£¡ª Úä¡O“9³h µk7"ßX££V7©7¬ˆ—î^KÈMQ:eñÌšì×ü~®Ø —ÞVÝB ²+oŒ¬ÌšR\„בö㫤À mì=t ùËø¨}£w›(…uaLÐ1Þ¢ò.½DP½Õæð@fƒÖÉgÒØ0¹º^é'Ç·Eø>j7›À`Œ“G|s \%W;&J$À1©GQoÕA|o1„×ú;ý\kݸ ÏÕÎ_©­žtº9qÍîÍ˼Œ:ye^é¶=×i<ê@^„Ÿ4œä£… /›÷hÁ"E–ºÓf/ÈŽšÐ\òÀÕ.ƒ4Šð* õöuæ—”òÅŒÖߪ†¹<é˜ïFÂù4³m c\8.„qAŠg“È‹’ï.rNÁòæÕ;” KÒ=ñ8C§Fæe„äÌ&z_dcFŒ$"w+ÃUˆ‰Ë+f6Î/Lbn8³=hèˆERÈyׄ®%í#…X¾Ê@Àϲœ8î»A:¸¢”8D¶÷ž»[1XŒ_fˬ€óÿ°ç)réQR´e.îJAš0wI/zöš¨ÿ“`Œn ~,Ò«ó9ß'·wA^>Û„b­Ôvù>NÍ_ëùb*~½{×Öô£¬µ­SX÷5‡ûJš:÷e<Òýìö;×®±fÓæÒ¯ù ÷W±oj“îyt=cfš7mÚ“¨«ê¤½ªNZ”PÐD=QW¤•)Od;ƒ³XèqéF%^ôð#F Ñ5I+Ö7Ê÷#U—g§XZ³ †×zŠZKínLz…ô²ß{EW´0þ¬ª®ß´Ùë¯YH£S`ÓÖ›ª¶?Ò¶Q,§ÀŠÜAð5Ä)ú‚À¥¾Ã7æ·ú&8ø"é¦Â¹'÷m[zÿ V"0–¢´€¿·št~¥ÀA(æzƒï m6öÂÊ>¨aò.ú"0ÒÙÅ„÷!ÈÝùš² ñ–B}‹„Iÿæ7˜j°Ü7»´áœxOJSÔï³ÛH\×>è5qÂ_Ë•aø)éUÿý Å¥¬ëÚ­šnVkf]}ïk»jcÊÆ:L(¡6%ç>ž¡÷L{ endstream endobj 265 0 obj << /Type /Page /Contents 266 0 R /Resources 264 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 263 0 R >> endobj 267 0 obj << /D [265 0 R /XYZ 74.4095 789.6651 null] >> endobj 268 0 obj << /D [265 0 R /XYZ 74.4095 516.7486 null] >> endobj 110 0 obj << /D [265 0 R /XYZ 74.4095 502.826 null] >> endobj 269 0 obj << /D [265 0 R /XYZ 74.4095 271.2446 null] >> endobj 114 0 obj << /D [265 0 R /XYZ 74.4095 256.2511 null] >> endobj 264 0 obj << /Font << /F8 155 0 R /F62 224 0 R /F50 163 0 R >> /ProcSet [ /PDF /Text ] >> endobj 272 0 obj << /Length 2922 /Filter /FlateDecode >> stream xÚÍËrã¸ñî¯P%‡H)‹&$÷”le'™½%qjS53Z¢=¼¢¼žùûô / ´ÇžÃº\´¢ÑèÝ ³þŠY]feÞV³ºi3cªb¶Úžå³èûûY!0ei²²254½K×½TuÖ´U™‚*Ú¬U•ž@Ñ–™Öe3[Ö¦ÈjÓÖõãåÙÅ;£f0Ò(3»¼žµm¦ D[¨Ëõ‡y¾XVJÏÿ¼(æð”¶9úÑÆÔðÏÏAlàÙó‚§“6~¿‚çž´2n'p÷Ò¾•ñGžÊ6d¢ûºøtù3pº,Ь­*EtkèÚ¼êß™îµtß…4_¼kñ/éôÌÊd6ÞÃø²hiܯ*gJñ_·qȦüÔ³_€©ÌùÿÚGz9uô:¬‡äök‘âì=à­4ötÈòMð˜w Õd]¿-*ô '“d†îøÇÊôh›Keæý5;¤I&+HÄ–œ=ꡲŲÎõüÝ¢)ÚDz(³¶Ôml&ýäh{o¹>“€ÌÕRµ&œVµõ|…íÇÝCuL4ôvZLHÏþ( ®‰ÅÙ±]±uxÓ Œ^T$H¦sþÝ:¡?ÔcîIˆ?“1ÆKB*u1¿¼êÜoœ)1÷2¶gÞ„}GgŒ%ÖàŠ´±vÚåß½pTÕüñÖZ ˜‰ííT0eQ²¾÷ÖN× xÆšôD&W%KÆó&Fßÿ‡ß¯xR Lÿ1/JÑÕÝBÍ·œ@ƦeŒðC·•™KyGz¼9³‚98z„e­•åší˜0X‘÷6ì"´9üÞñg^=ýgÏ'vöÎÀþã‰àñc Þ€¨P¼áäÒ«•èÙy¤–f2•Œ]e[ìc%lYà,A@Z›4šd /UÍÿAz£~u5¿;òï#~Û>“N·5¸pQâ<'æ†@²¦`M&|,)7p?ÞÌüýŽi±±ønl³ Bš©ínŒƒí:ÝpÛ»@ÕÓÎyDb­´Qd»-ã• 9DF¬ÃÜLgššán˜ ×êÇ­Î&tlBUÀÔØ¡&»ñËø³õJÛ>6RžÕF>}¶^"ðyd¼?àg?]º ÜfU£³²mÌwDõ!Šé¨ÞA!sd5ì]”ZÌÿ2õÚHÖú™Oðü‘£Z±d|]²…àëYàsa1·/RNb-Ô=ÂóEÞ—'ïKò›×µ>W^êWñR¼I^Ì«xQoÒÆªWñ¢ß¤^ÊWñR¾I^ô«x©Þ¤©WñbÞ¤^Ú'yI×…Þ²_nüë ù)ÞòžYЋøQoY?ø"~ô[æ'§×ñS¾õ­|?Õ³µW.*¼§B•+BTß@FÒ¹„Zûkü òäAÀžI9uS»4»¡”¤1ÿXèò:¨ÁâóìRÉjÍÌ`ާ|y§ÁŠÕ#ƒ”À%¹æL϶Ç"U®¹HÐßÇ Óé‚ú¡šÌħ«­÷Ï­¤À5ÂuŠQc`²ûVÑ$«¥¼.Nª(eׄë"-%ì°Å%“%g:ϳBåz¦[“©œŽm~=ûð)Ÿ­!ûù,ÏtÛ”³Gh`ÛªÙöLgmSÙææìßgÿô©šÃ· Rª¡ÎˬÈ+?+LVÖnîíÉYŽT4䌴?xyÞôG‘åQØ^iä©Òlu³ÎŸ–ðÀ%Þ¥RmfÚª9uo“öŽ…æRs9B«q1p\‚ŸL•µŒWåß“*‡(¦Se…œ]I”´¢ôÞY8™–2Ý^²Ùe³Ëª6ú›Òè‹oôB—¨.HÛ« _E¨Æaµ6¬ÛhåÖqXŠO†l‡Ë¸~`ECê²ÖïèQqKʵ£`Xë›:‡}á+-«ÎIЬ×ñ›ØPr$ÞJyæAŽç†þWÑ“;¨`³Sâï˜Ú©B”07x¨ ¾ýx·°œ²åÔ¹‚­öÛmg—Ö¹Ÿ„æ+Ntu°‚ã"d²†>-Ñÿ2’Ø<–I·Ì>f´\ÏO ònn<ËkÚ©Vû{®ûñ&•7c Wþ˜ÌŸ'ˆXiÛú&ùY3ù›ÿ˜W¹=ËUèn­ËŽ6ÁÖFÇ0¶˜6íi :Ÿ˜%÷»_±•ÚL™\©']ÚâíHëž©Ìíì‡öc¡#ûÁ]î›ÚŒ'÷vTêúi×N´‘} BgD^4[=i8ìb:|˜VBÅZJi.Í[žÔZñÌ4xþªËHÜ WʆapET»ÿ*禰ÚÙ3åØêj‹ÞŽ:XÆþ|èOùSºªü U“lîŒ Ö/'¸ãÞ„íbïµ­&oŸP7Ö¾,O­îfÁAeæÿÙÙý 1ò&µ76‚wsq#€rr@‡2ÛŽ{’[Ó9÷…*)ôd(^¨'æ!wèÉ'}¼Å:A&ÿtä[Ddg9¡ÞƳø®‰ƒŠÈ“™JÙ%`_-oÐäÃg|‹dŠŠÈ Ær±E£J^U×8Àë¨oú`whŠH‡áqÍŸCÄ<ÕÚmò=©áO’ª"¡F`­Od}JNt²ï‹*<͉üÖí~¤N¬­ç§€á(£@8ˆ.ÚíåRÊ(’lÆ_ˆalá²Àë;¤L|ã8zuäV¨ºèÑD—“{Í%8¥Ë4ÔžŠ kÕíN¨ÊñÄ>ašx0iVwa$¦Ú’2H¼ö2ÜóÝ¢/Ÿ¿¿æÏÑ›jlK­95wO¥“ºl?ˆà4æ,Wã©èõ‹Xf›>ƒ'ÀÈ¡¶þ„?^‹)nÂ8G&F¸ËGåS~ž¸³Z#îÇz’ŽŽ_Më¢NS36–5t !®ì…” æ‘ûG–UUylYfdá2Ü™—‘íÅ•^a{¿[ÏßCc0šæ3ã±Ä-ÇZã…ü“[)¨þºŽÎ©M"¸³7EN.0ƒŠùÆF÷q¥èÀâ ØÚ‚»8»Q*0qÉ&ºê3ŠJãÛ)ð1Þ¶\Þfs?—Ù ý>¬K%Bó Š—"~)´'Š“+‹Å“u°—xÒAò¿úmO» p‰ÇøAHI-Ã÷ª®ùÕ•Œ°áv\£NãÓ  ]óM3—šü¹;ˆ R–‰0tËCK$gЦ8€¦.šfŒP„|°A“TNÇ[Ö± ö‹6ÚSƳ–ÂFÜÅ¢×TqÚyAÉŽŽûrº¸„ã‚ 15ÿ¶s²‹íløê˜Ø¢»ê¯Îµè§²~¾ë$ÓOŠcZû‰Õ?^[eÌWœì`3¸9ßÂÎ'秪Yëî°&keçÏ5“ã׆öWñý䢟\סüÃq{Ò]…Íèû.*o”Ï®"ÉoG÷”û—$ðv¬ãk‹ØÞB/KI;‡ƒM¼ÕÖ Ž]¯$ô¶AU0|I™ºÀLš:v†&³Œèš²nââ:©œç9I×U÷&øÒq*—¾jÍb¢>4m%¡§´ˆÇûÜk(œ2ÞlªŒÜ6™ªê6Y(¶0Ëè¤N1ZV”µr˜P¸íxºJåYcŒJÍ÷‹ísàendstream endobj 271 0 obj << /Type /Page /Contents 272 0 R /Resources 270 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 263 0 R >> endobj 273 0 obj << /D [271 0 R /XYZ 74.4095 789.6651 null] >> endobj 274 0 obj << /D [271 0 R /XYZ 74.4095 692.0911 null] >> endobj 118 0 obj << /D [271 0 R /XYZ 74.4095 677.0975 null] >> endobj 275 0 obj << /D [271 0 R /XYZ 74.4095 151.1799 null] >> endobj 270 0 obj << /Font << /F62 224 0 R /F8 155 0 R /F50 163 0 R >> /ProcSet [ /PDF /Text ] >> endobj 278 0 obj << /Length 2560 /Filter /FlateDecode >> stream xÚµZëoãÆÿî¿Bý °hî.ŸùÖ½ö‚"@{Š Z¢}ÂI¢#Jçø¿ï¼öE‘ªÏvp°½Ù™Ù™ßÎÌ.OÍRø§fe–diÏʪNŠ"W³Õî*=ÀÜ߯”ÐdY‘dyQBgdv™ë4©ŠBÏ–!“¿Ü^Ý|È KL“·÷^V¡’²¨ËÙíúçy¹X*¥óù¿Û~¡æÇî°Ù?,–¦Ìçw ¬FÍ¿@ãôØ/~½ýáæC5«“ºÐrLgK­’*­ñúÐ}†Ÿv¿XfÚÌÐî÷ð«yÄNuGžÚà6³ù/©Ê GÄG¿ð?¸ö†²œÈì¶·ôCý’·Í3Ë£U„»ç:ÀN®þvëlh´NŒ.ëYipsªD þvõó¯él ÿá*ML]e³'褉ªk=Û]™¤®rÛÝ^}ºú—÷‰c¸ 9’OBû]$F/­ˆ»éK]:c­ad#&jW¸¹›Ï<ûKš§Ð»IF­ ­¶ÂÝBWv rlï‘ö$¶DJà¤àO²X–*Ÿ$3‡s•Ô©Ég”¤ÎsMZ6}*=ìÅ‘Uí¬¾ñC4¯ªÈM@ü›.æ-ì˜ü`£ „”i ˆÈÁ: Ž®™Ó=s¦öƒ~Ë<#¤'F°½Z©ùm y ¤´J‡ž€‘zД½uwÈàN&ŸÉpil°×¼çfCØ^êZ[ôã280d@$H|B•Ú5Y×ál#âq¼'kÙ:´ôž'Ы=YÒNˆ¸gäÔHmfñÌç„íÀ2™Iç…I³wbµãì|Ö·8m 9°i±ýtg"™ìZW†‚V¢%n$¶'›¾Ûµ f\‘é@µÝXœ@+¾åW¢PabÃ1!S Æp}ƒNûŠNñÆù6«UÛ ã#sÛ$ø¨ÏȬt" Bø“ŠATîþ™û«f/·í@Ì˃ßÜÍõ fÈÒ'Ô¡³™gÍif`M>䤙îèj#`äo9:86ˆHA“+»v î6g a:ª3ÑaxHâ0#cZòÚ ×ý‰K2,ó,¹(+“ªL x‰’ï°0‚u¨ïºýöy´¤SUbª´¦Õ6Kš2ã\ìÁL‘oÅú¸B3¥áù¦—Ø"ÇßŰA ¶ÝÖ­f‚no9g¶˜@BAö¹*Ï,ÇãUö–×2®©p. ôÈÒÆæ¤ÐåX)IÜ"þ#ѵ±%V÷Ð:Ž.Fª²òÅHY 뿲]5GìD úg ÆÎðuÉÚ”20L²XVA’qeL7Bþd#ÐgduÁ~ì"ecÔJn(3¬8Fmµ¶mo‹É£(Ùœ!$K!ðè’ÝIA¼ƒ8¥ö:ÁB×<áÃ~åü ܰzÄé]ËaÉx*´‚]eë]"ë™îè(¼¬†t‚?³Û³ÂÌÿÁ1µìªƒß×KoõÞA~ˆ÷@‹±bÉ;ÏÝf¡åÂp/YÊäu„ü<ÀG\ÒÂNKì{'HíYå,ÆnhY,Ï=}öêqŠÎ »ÓÿhDÃæ©œ':€ÓŽNƒ'*ƒÆÃ!Ð}œdóÞ¦_΢Í` M ö÷’BCiÚ<üÍâJz ¯ÓÒ.™òµ’7̮߹,„½öè¬ATCj§ i½ô.Ôh$‡ÏÍ‚ë"»¯ÁÕ‡¼õtèmàãò»1å>.§&Ó˜–4¦%ý¹o9‡z <ýtcüã•ÆètõµvJЬ=:,uèfîtCd —¨ÀÐÊåz"˜€.™Ú8‹itª´šP—q&5<² êÆc¨¾æDìB*“sI†_¼¥yîÞ^r¥¤y¹¹ùÄ?âá©ÛñÒ¤…Ôè8¯±x˜µ¥PZDqH·öPàyJËè­È?`d&óµ ¬RŠž$ÏX„tLjm ¼‡°‡!¸MíDé£'ôpNðž}XÑÁÙSgOTd²ú‰êîÕC©è«ô苆RÃÚF¢Ôý2M™Ãä-CnŸPI>àÈ×x›¸ôµº\x-BÍòüÅšI3‚É]w o“¡ƒŠ4ÂtǪ=ÈŒÃTX;O óf1 90ÀèÀ½.ƒD‘s—ÎâÜô’úF×vËÒï|¹'züøf?qÛÝZ ý‰î¤HNÇÃNá«`E›Þ¦?ºróaå‹ û¢cÜ•è&¨çé#ËÌüŸ”ž¾ó—p E¶¬éþÂÃUGîòÔùûY_©6žãÉ>Z¯Â˜³Þºä‚ÕÈAœy0J„r<¿»òó1üÄ÷Ó—½? ^žU¡’ª†«Z–‰*‹ü­/ÏŽá2äxöò¬Šrkžy¹çOϸŸ¯‹¼à7Íbãkõ ¹vus˜x…Æ×éV^jÚßl©ܠůô–m³TƒÊ÷KïÜãÚ™) w›±Ï' l¢s3ñm¥Îc² Œ° c:°f]' ïÑ‹š@§q-J`Í'ã¿6;º18}E9¿kÅûg>ü ¢Íÿ“ÑíYq´¤f h‘Ý£¾>£D/òb6•¶Ày“¡[Í¿Ÿr‹© h¤åܲ˜v‹£¢°àZ^cˆºæ…V'Kò¼à~,ÉÀpt/Ypž§ê-V X\°¢¥z³ß»ú[,>Lº/¶¿> endobj 279 0 obj << /D [277 0 R /XYZ 74.4095 789.6651 null] >> endobj 122 0 obj << /D [277 0 R /XYZ 74.4095 771.7323 null] >> endobj 280 0 obj << /D [277 0 R /XYZ 74.4095 666.298 null] >> endobj 126 0 obj << /D [277 0 R /XYZ 74.4095 652.3754 null] >> endobj 281 0 obj << /D [277 0 R /XYZ 74.4095 562.2036 null] >> endobj 130 0 obj << /D [277 0 R /XYZ 74.4095 548.281 null] >> endobj 276 0 obj << /Font << /F50 163 0 R /F8 155 0 R /F62 224 0 R >> /ProcSet [ /PDF /Text ] >> endobj 284 0 obj << /Length 3017 /Filter /FlateDecode >> stream xÚ­Ûr·õ]_Áé‹É™r `½ä-íÔn2§Õ‡Nœ‡5µ¢Tñ¢pÅhô÷=7`år-Û,\Îý‚•ž)ø§g¥Í¬ªÝ¬¬ê¬(œž­wWj¶½wWZ`¬-2ëŠ&#»Ë°½4eVÕÎŽAé:«Ë/ ¨m–ç¶š-ËBgeQ—õ·ë«ÕÛÂÌàdaŠÙõí¬®³\@´‡º¾ùu¾[èù~N𳇟§ÅÒ™|¾‚a?,7ðó(ó;9ò$óÕâ·ëWo«èª% 'O8^u½¨r8¸ÌUEgÛî 'Mé="ü+¬i3ß`Ikû…áÑa„oyºJ%*‰D¢oÅ07‚þˆÇÖ„ ‡/|IÓñï#ßaJ>œ-–6wó„L"ÑumDºPE¨¼hy@J¶„¿²sᨎÚ?v?r%¡dâO‚áFøzCAƒLmVÛ¼†Îjç ÷à(H"y>o>Éi™{*aø|I{aÞõ†{ןéÆoµýIÍ"͈ܵš¨}@rŸQƒÆÍ›-QÚ,Rö­JÙ§çèÀ‹ÂŒ•v¬–Îý9Aë»ÁH¬—‘\vïï­(ÎÚ‘8ë/1ÙgÇe…àc,Ç@”I×ne“Hë/¸l a$±?®@éB8R=Š´Šzh¤p¯©ÌœLó†O|YY]›â9zÿÜÜ .ài"M |ѵÃ]ŸEånöh¢*¡²Ç⩊!Ñ@igœÂ¼9öàÛ>>?¤1!o½*0ªÃÞhPè*•öº‰­tó£õº½•¤ ;,ä—È?âPU2…¡í½§å-qáuÃ~À‹ïßÂä#öápËóGoW>yJ¸ƒ­ —¦¥Ê‘‚O=±ÜpŽ,òàðȼ†—†´o"HމñÝ•¡2 ÉÅèL»¢*WA~.ñDÜë8²ù Z–W³nAËN×óï½øÎÏAŸ…š#]6m<3•UÂ$Ž»§(Yne_Hå ŽÀRKy¤´«ÄëñJ‹"{°!ï‘;Òʸ…`ïM€`ÓBI n}„ØñüÎC‘Î>6›ÑLÁ ýË˹!ã¡ì}0mS±Ð *<ìd'°«kâ_·9 u~¯ÈÏ”]^øÜ%wrE”òa’ð HšõºeÅ{ÇÚÍ8õ½i”wñ|{ûŸXìc9€iP$ƒqû€ž%Ÿ®Cî7¹· Øêk£#ûIª£<%4k ÜÙ÷wÅE í¼µœf 4r¼½l¯@Gñ®»ãÀ‡"E"72œ¿š5ž}ÍGOƒêãǺ%Rç´—H÷unYRxù_xñ<ý“³Œ÷AI0&! ôÞ‹eéíðžÒzT^oZ9—JèrC‰ÌÐ+ÿ„p!uÞê­SèÁ¹…¦j|Xn º/¸º¯ @(kþ~د·'ìîᆳÎNUª¢C?ÜÂ}¶ŽŒÁ²fÛ…ÏäF¢$IÁÖiüîCLÇKi}îõ:ä{n±Nù¢.Z#†]×M¹ËSÏ{XÜ3½ÐK(ÏêX\<ŽŽt>a¥ñð| Âë[9Â&Á€©Évq¶ ÕÏŽûëæ$nzØ']ó©Ë®ç¨7e­ ,Ĺ’¢„eBÞx4Îz:™fÂVéÁ@ÉH‘PEÇ‚T” =8ä}^8'(‹9ÃÇrh×¶ý³À-»Io0áZ dTdÀÍàa!rDïí‡uwÝÔµEÐN6i.7Т:ð·¯L»œ—óîÑKÃHÚ<ø„?I¶Æ†6*Pp’žlhdW¬ ÷ÈÃZ^¾Mãã3#lEê¾P;±Bˆ;!bÔMTvoö4ô%+²êEÐúÞO_È¢¬Í8Oc¥¬]ºêŸԜȧ=2Éö†S ƒk¯“j¾Òñ1ò`zéª0Яn+¬@Kå_)T¢7œ÷zÃ3IK+FDtY§Ý<’Êþì±=Þ”A9~ÿ1•ÁWÀò£æÛ̓¼þ CÖfºFº:$ààêzcÑB -HšbG5ÿYB¶‡ø8ÊH9‘Ø‹g‹#_qyxÓ ëÃ.°O¨¢é^@Û¤]£éávÎHßy]6Ÿâ~©íq\hÖ‰°­7èM®ëžãàk„ç´‘Ôï=‘ É=ˆÇ× ;øáÔ¿%iÇg¢¢cÀS7QÁÿ—³)3­Öáq̃åúÄÃÃc0Gß ¯:8¼˜.û÷f[Oî½C̵eêWp‚Hj6-:r. 1ý{'ôÍá}ÞVùϹ gÇÃ<ù–…”a%CÚ§ñË‘(òu= íæ ß•­6™†ÿ¾áa9Fqùe9@ùNdúý˜žšYÙŸ{"6Q=Xŵ–¯þ|ŒÅê'¼§ÅÎn뉚ÅVá«Î [ ­õoEkR‘NèW4ܵ«añUŸÕ¸>ë?ÊPy&&v×W°´1 tá`\Œ¢É! {èÅ—ÄË&%ú®7«Çô½7~ÜÓIh¢v"­ rsIÄgÖšÜuß·,IËÈE³Î ÖéÜ7˜uŒâ²Y¨/6kneg-'¶´ÿ`²ŠÖvò1eõ%N°Ä2Ü;6á‹¡1:ʦáõ —© 2z¨Äq©Õ!øð<•»/Äb„ åì†bðŽP. ¤H6û §ñ@K_gn^§è1سó°®È ÙYn ”„=Ü:næ—ø«²‡_ÆÈbÑŸ£å·Kqó'1…ïPq«çççÌ¿:Ž|ȼ›nVCê]é²Òån@ýÀ€Ô9Íi|E•™­ø›_-­øO‡cËï³Ç¶#Ñ×m7$¨¨3k*33•ËŠÒÕ£ôx e EäØ<’¡§&@!9XOÜ?, P™™Ï‘è–+(ºÞPµlÈ1(¤oð¿P׸w¾v-P¡{OѝJ«>Î)B·gÌÏÞÖ‹\ eM´"wë], 3ÿ}“At~Ÿ‚^DZ~hŒÚe ábR|¤+m}¬ºl¨Â+G„œØ©@%2ž6Sz¤~q¢O.TóFÆ*5±ਲ¢ÿ_Ä-×gö£óÌT:ÀïW¿þ¦f7ÀìW@m †ùŒœgº®Ílw•ƒ@œŸn¯>\ý;25Á7-…B—™)ŠT Ýø_= .ÀJójZeKW»LiåúP|Ù/ØVŸñ Åß¹ˆx;$ï.u5‹±ŽUþY£ÒJeÊåc$Æò ` ‰Óf=,m§ƒž†„¬èzŠ¡%߬¨´~­È­Ë*š¹‡B~Þ½òþÃN½~äß¡´«LhL`øQ9µöA©%¸ßFñ¢¡hò°(ì¼ÁÕÂ=äêÚ¬TU=‹iýJEWfE­Ìã±"XÂø´"7TœRv‡[‚7þ¯H"zD¯Ôçnfñu8ƦxÇï]™S¹éû€i—ÕJéÏèÜCÅõÜŦ•δ®g1î¯v¶ì\å#„¦Î&` ¡t”F_ú»ƒ†úÊJNg°Y+u>Ét`¢6•Ó¡í)ÀUBi=­…|ý’2uéäçŸgz0`0cztÇW¦RmJ`¦¡7у@%äN»Ê!úºÙuwÓaÏäuftOr´Ô ֿܲ•aOWE¦lí¦5 ÎZšó~fLøW˜ñM_ë(ἡúL•ý§WÞÆBÉ‚žäk©K“UE]Ì–U‰jOU^ÌËºÊ âŽ×(¦6Yá 7ó@È–>K ºªÀÆ´Çå/ü?£¼åendstream endobj 283 0 obj << /Type /Page /Contents 284 0 R /Resources 282 0 R /MediaBox [0 0 595.2757 841.8898] /Parent 263 0 R /Annots [ 287 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R ] >> endobj 287 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [455.4161 336.9233 576.7497 348.7838] /Subtype/Link/A<> >> endobj 289 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [419.3607 282.189 665.4349 294.0495] /Subtype/Link/A<> >> endobj 290 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [99.0569 262.2637 195.1055 274.1242] /Subtype/Link/A<> >> endobj 291 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [256.694 242.3384 433.9275 254.2936] /Subtype/Link/A<> >> endobj 292 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [105.104 222.4131 213.1676 234.2736] /Subtype/Link/A<> >> endobj 293 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [126.9317 202.4879 240.2156 214.3483] /Subtype/Link/A<> >> endobj 294 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [126.9417 182.5626 248.2754 194.4231] /Subtype/Link/A<> >> endobj 285 0 obj << /D [283 0 R /XYZ 74.4095 789.6651 null] >> endobj 286 0 obj << /D [283 0 R /XYZ 74.4095 580.5095 null] >> endobj 134 0 obj << /D [283 0 R /XYZ 74.4095 565.516 null] >> endobj 288 0 obj << /D [283 0 R /XYZ 74.4095 337.9196 null] >> endobj 138 0 obj << /D [283 0 R /XYZ 74.4095 322.9261 null] >> endobj 282 0 obj << /Font << /F62 224 0 R /F8 155 0 R /F50 163 0 R /F43 152 0 R >> /ProcSet [ /PDF /Text ] >> endobj 223 0 obj << /Length1 1607 /Length2 8861 /Length3 532 /Length 9821 /Filter /FlateDecode >> stream xÚí—e\ÛM·®¢ÁÝ ·â xqw‡ HñàÅÝŠŠ»»CK±âN)^\ -°ó<ïÞOû¾ûã9ŸÎï$ùûž™5׬53ÉŸžZM“MÂÂÑ "ãèàÊÆÅÎ%|¥¬¥ÅÅ äbçä”ÐÓ¿‚BÀ®6ŽR`WˆKP(áró¹8…x¹a=𕣓ÔÆÊÚÈôŠù¯N  „=jcv*ƒ]­!ö°æ`; ¦£¹ ÄÕ‹(agÔøk„ PâºC,Ø\\@ sW ÄÊÆÀñ“¼ƒ¥#ô/ÛÂÍéšÜ!PéoLf ÒÂÑÁÎ h±p¨8ÂfƒÀXþo`ýgp7;;°ý_áÿÎÔÿjÛÛØyýwG{'7W¨ìh:ügW]È¿à”!6nöÿÙ*ï ¶³1—p°²ƒ9ÿeÙ¸ÈØxB,Ôl\Í­®P7Èß6ÄÁâ?`™û›€C_^RFB–õ¿‹úw£ØÆÁUËË韨õþ[sýÖ°ô@m<†œ°ürÁ:ÂÞÿóÍø?&“v0w´°q°róñÁP(Ø Û>0ÅôæÚ8X@<O0»ƒ£+l–_ ¥#ðWEyx€°f;°ý_þ¿,> ‡ƒ›½Ù_E¶røÇæår8¡;ˆ¥ëo—ë¿ÝUú›ÈvåÞÆÅö·É ä0w´·ÿv`SY{9YCþ˜†6ÎÑâ·r¸Ø]¬;@Ž·¨ãoCÈáèùGóÁ`]=~·óÁ0]­¡?zÀ-Ý ¿ X&,mÜÿèÃuUá ƒu¸ÿÁ Ë8äßÖÍCu°ùDà¯5Û9þÄC8»Áöý? ÅꯃùMÛü;.?,ŒÔ?J 6·…¸þ[1yþñÿ½‚0t7ØV€º˜;BÃÁN$ÇïbÂæ0û­`5ÿGqqÂjñ‡ükÈ¿’ù‡„qXý!ak±þCÂ`lþ0Û?$ŒÂî Ãø½5¹`§ˆÃá ÃpüCÂ0œþ0 ç?$ ú‡ü«œHX-]ÿ0*·?$ŒÊý £òø-¹aTžH•×Fõöoù¿¯ IIGOo6^ 7ìÔx¸€œœ¾ÿÖÍÜ ;]®_Á°«æ´¥ ì^‚@Äîhž½<âƒW^ýR–¢_øùýÙÀaž“”Ö.Ê7j¸>C÷ƾ¬~žL¦vxh=µNºsYoøŠNJâÊD°ß›pÔVÖåŽnxw¨’_ÃÝš#GqKæ,¶L¼ Ïd#X1’²º]‰1&Â5÷pЛeU÷eTG϶;,u\í™ÜÐl¯ëó‚›ýµ‰fÆ2Fº;¨Ä„2)è¢{ŒR!ƒ©x($ÝR©Œcëò¬*X.”“»Dú’8E,KõÂlP˜ÆXÚˆûö‰Bq<˜² §9”øÝd·MP‹%ð‹ðúÇ•+ÒÉçR}*GX> ý´I7Ïá;%uñjx.{QŸp'Ò”çœòûû¾_0åÒ磿§$êõcå{E%ië+qð#dÅœQ3µèYù>êÆ›@î õžM†WŽ?]YŠ,{VµšZ7&nù´ç’apÿgz½2¶/¨¸5[Ø*sÌðì$9ñ.‰ b¼JÜöú¤zû‹Öë n.¥awÙ&6¯°°›’uÒÜñ×(ú æÇ9{Ë3ûz:i&š/g¢û¥‚ñŒ½K,þmž}žHË ¾÷EŽó5aN‡üªð«ñ#÷5_ëO¸ðuùÇ+Ê£‹z+陂mŒå»"©*N÷l2[Ç¡Q_hhrÍx2†Ev—ø\¾~}K`Ö‡;«0'Z`¨»=Ùô ]Žø›f9î×Ü ám;§j©— ûzgïF1¥kCÞ/!b’:é€ÁrÌcRWª¢GǘSzÀ(£´bjÚˆbBvp‘%45\ãXÑÄk#ÌÔ]•Ð$ì,ç.×=ôü'‚߇FxÐfUEYow’GŽL3߉µDë…32µË³Î ¦Å¶—ÚïÊYyv—hRœy‚g,¢~˜Ô]€² A¬›»òåínÕ'ŸW6{¬å„E¨ñ*Ú(´Fßp³W@7èîèCßž¼âYzú/4““Ò”èjá Ì¯ûL£kù^SÅÛÊJ—cFÒÜšv>‰ý8Å’T8ä} úŠß꾃æ"³¸ðýy^iZnÊh£c«ÀƒÖq0«cÙrü9™Dä×–ñÄó_5ö_'3’æ¡Ì Ö¤ 8'"ÛË>Wü¶J ªR!ßÆÚ¥²îª Þc3ꪘªp}QI²DƃVÿØÙ¼¯;øpT£÷¶Ã$ÆnΖû½óaȵ|þ@t¸Ö:ì,fpU ný'+ŠœØlû¹¡Îc½þ´5x’©.tøL#D9óuâ)5úûµ´àOizç«Máìðõ&ƒ»9ä±¢›½í%)œ>uý|Ã….ø9–„×dG¹ ŸôƒÛS8!ˆzý¢…|‘^i¬¤­¢C&j|¾‘JëpÌÛÑMɶÔV—)•E…T8?y}W”éûâ …Ç /—üo€¼&´“5ö×:ÉæGOéu„EÎOcáfYé™7Nù+ÆÇ³mzæØ­ OW ¢uÃJÛ}smÍOå–$ù0E1-ѯ'®û+_?#– «ºòµù`5(ý“mÜ0ÒÙŠßÌÛbJ›´:ˆC…ìñ= úxK£q¡¿Ï*aÖ¾ U3ëqN™¥¸Çt$Ù@,®EaÐÃJ™,W€Ÿ½¯¹VfíÄ 9ç¦L÷¬õ2<¢V¡/æe¢óÝŸ»bZž0Ü~ËJø|’:Åq‡ãëÄ®Ñ*iâ,+¦×šß¡=ÝUÊâœ2"Õ®‘f´?¼#7l¶ª¥ü2ÌŸ²aЈ°­XŒ6'ñk{Üg{l H‚b uÃ%lÑ™Å+(‰¥ e|Óјˆñåh^»=î¢m¦ã5‡eTÓUTµÄ¸Ù9¹oTO1Šg£$¦‰¼AB͸9 p$zŠ÷¢¸‰ Áá*¨ ÅUÅÐÚqøx©j-lŸW°Ý5‡×âñð >ÍïÄûvÿl„+ìz8Ä6öÝz¾Œäý$™£÷BëCÁ¼Ù¸´T×Ķ2ëdAúuE_Š@+”µ)ƒgTÙõƒarAÆ—…"²Õ;¹,«ØÄ§Œ×d[ÚÆlÆ6PqÙBÊ"œà2®~“í¾—×#ým°ÇãŒèGàÕ¡UÎ Fªœhߊ†JŽõ.·ië S’\EÂVĺoÕq¦ïÓð–‚±Bc°™QúÏjÃÉ9‚7ßo,aÒpÖSÊ)èñJ‡O•à†”ìÏ V)17_za÷ÑÐfún¡a¶çÒçÕ°bË§ÅØx…âïåîe„¿št°çúC­ÖGf¬’׿Áå-¿nϺÇh¹_;ÒÙù`†VÀöµ°M23? I„·1ý‚¦•·XßÚê{©¦¬8&<Áó!ãÖ£’iõrüâG?vÆ Nêõ´FÈ©./î·ðÊG=÷s>ŒÛJ¸S*۲ȋ¿â?µHèWˆ‚‰”2ǧ[ÚÞ‡>Âɼ¸†;_í’K»>Jjfºçà\t6¶ÛIF7-Ú_Öçì!Lhër6NQ~xçr¥í)#E.·;¡ o½µªÏùaÒô­)2žü â-8ò2t¿Ïa=ÉÁ¥°;VšWg¦ZY^§­{>K=Þ|woõ|íÍ$$ÑÜ ßXºrßzÝ0güda^x0|enx)0Ê3©Çtš©èyê·ot,­©.&Iš;o=*gœ Ù;•IMN¿Á·t<9¢çªïJ\ЊÇܰÍÎmߘɷh/¸¥»¨¾èŇïgÅqÌÑZ²Eb¦¯ìÛy·¢§Òßæ®E4ö]°8ïky¥½-Æž“Ü#uîŸfÐøW •N¯9)èû¿2:°‡Š¬âŠE|ÚoLä*LX¦gM¨ ÀînÿöѪQ<-œ\Ôåûˆ†E~qå]8Û&îIìÓ±% 7ßu¢Û a蘜;6¤ê¨·a²èE!Gø2fðr²suoƒþ¯Aªkáü‚êÒZ-Òùµž¹ÎlºŸUO]“¨ˆ¾À³ ôåyÊŬtRÍïÖ«l#¥€ªÉà×¹½ JÌ^Ѫ)RàxY¿Rj÷âÙ`kE œwªýà%„ ìº>1ajh|© °ýªv™ôfëÕREic£öºlD<­ƒM3¶úב:7ul%£Þý=ïWÛ NÙPÆèÚ&](3nJ&üeL32e'…˜‚ö“ˆ×¼X÷È€yk}‘ ʨÿSkþ >šW*"OϤ>Ù·~éŽQFšq{¨N> ›ñÛtü°Š§ßa×'B_žŽ¹ŒºSÎnVÉ)cqª«üò€ˆóeýI€,¸e_%@O‘ö™„„‡X“„¥ùp“ÿéY}êžßP~åЄ CC$B¦ÆälÌyÂ, |qtø£{“<í{»ë'аøT€yÎÌÏúÆFï8Ù þÓGv,LE€®*¦,Û£F lj<Æ)zŸ/Ë µ‰ç=²ÓÎ×$ÈÝè†ù1.yŽ»„DÖsœYa4%sÔðቀ\Ná›G†Y7ÛqC‘!kÍ­¥¥ÌŒ«—ýÏæü%¯­Âò»EÙ‘¬>R´t^„ôŽÎñçÄ!R[¯—H©üû…¥åÀ“ßä P”'¤Çý(⦮"³ 'þCþÏÒö*ÇI2Ãm=Î ^ëÖ ‡>£Ö;ÎC»ã[Z–Âèå …ÜOX‘>â¥?Éß—$7WƳ•ó%¿¡–#~×8™Üžœíù¢îp,–KCúûM~ÂD0徥尣C¨EÓqf"ž¨cÈøu´ì÷ӆѣï9‚n#þýuÑÙY„ïØö/¯r¾Aã§´9%8sb®Pòjì*-’–°Î˜NË‚ßÐ( Ó©´¦þr[¢ý}¦© •~»7sùëä°Q޲mUݹXPäçä°KDg8Ù‹:eŸŸ:8Ëùm $¡\|Qap€£€ÔløÂ¯pöyÏ~°&wjŒÆ©p­G ²'rr½•— $¸&=;>µ²tì·ðyêaö HO5Ô;æì‘À˜@ªtgve}[è ÉÆJ´Ä«¿ªlc>a$F_,ÜÌfÒz$+TסuÚTl¹¢U;<²ÁOÈ:-I^ žl‰¥ëÄq­?y¿>+ªª ׂ§±Ýd"+æ/ØXŽ•©î)º^­põâF¹q¦;Η¶ˆ t>1ìMÕæ‚¦Ð¯g¯µüÀ"øôh!ц3à õâXÏ8sº¨Ðl´Å6xÁšÉôŹ]gz¼æk ®eû[ðïŽà´n1ôô †;÷æ£ ~ظ‘í¶îåÛ÷¿â>›ÇSâ{1ª3ð’^„’¶¼^í.-3!±á”9Úýˆz–)Ú7æ£zC1®KÆW3ä˜j½’”z”C§´0°ûþÁÌ× æÎ½C O™Ý¤ ½UÞ˜š{zŸ&¸¬Ód·@+ ®«0°;q1äZ‰‘zs `ߘhD¢{øÒ£÷»‚*¯÷tA~Jèï‡à~v÷¬ƒù»¸™¯>Ö·£8fÑ!>&8ˆ«,3òÙE\oßY"–Ø›æ„ZžO× v¿0DDµ( Þ-‰›TPñ}ô(ÝÀkã™G¶“¹žNOf°Þ8{˜¢çGj¾JV›-?òoä^ òÛÛ“úi’ݼ׌ŽB—¨JòŽ%J€µÛpPV;ŸöìžQÁðõIáÎQÊlñ«Kb”òÂëé`”(Ô‹7} ê­ÆBð”§òáX#uËeà$@¬Ýë©?›ÈæºÜÝ÷sk%dt¬2ë,ÄÔ»ÃÜ•@>Û"Ÿv"ØåyÍð3¤¢¨ËFÄd‘³“~ͼ‰ÚÁbá^.î¦zןoróE½û¶ Óqn©U ü;’¥ a•"³çüˆæ†GuàÇ;ÍØgë±à¬œIëBþÓ#Ã…Š«GÔho¢Z›–qÐYm îL¦ÜìsWYõ'TpÔÁE™â{Ô'úÛ „^J‘\]÷TÅtŸ…Uþå9”…Jò8P1>cMú’Ù{ˆóÙÔ\`‹WEÉZPểhùøs¸p\µD:ª  ŠFk/&Œ'³ýÌQt1v_'å7 âÊišU¸- μ¢´ÅÖ±ºæ„ÆbKŸ¯•bewl5ç)k[Æ1a!†x©Hdƽ,J³çɺ Ü´ó¬å^’kl¼—’[ßÞcÁûÅʾ“»{ôÏ{nÙyw¨ÃCµsÓˆ[<›Sÿi·édÚw’ÛúDë3ðn [gºò¹Iì­mQea™#Á¯ÕFáân °3Ç)ª5i(­? ŠWn2QEÝù<Ù7Vg©ÔÌÜ×ßô™—ÒúŠ‚Ì¬…V|çy+´õ_)LSª;ßq¿‘½ö¨ºü'<±Ñ‚T7V‰Ïgz‰.\³Paö y\>é…жízœ·ŸNcã¾»€ƒi!o¤“Jbz¶ÚëÊŒ±T*JkÔ‚ý¸¾ ­¤»¤‡ÝEz# +ìU¿Zèš&×ù:u½Š¯¹ù5&Ž wbXe$üœÈ|cl§µùæöÒ<^\ ‘ _Õî<*hùpà3‹AÊÄ9k‘€›RÎÜñ˜ÍóÌZô©Ëò"†¯‘Ñ›pBú`qƲÕuýÆ9V•#m½o[ã°A”™eŒXÛÃÈãyt„´#Å]Åæá þ-ÂŽÄmöðð|¢?Ãüè°Ú‘(ÃWrG‘wøRùÛ’Xî+:í`šXsa|[Ôé5ÂÄõD«ÎÆ,gÌ Rj¸ÓÚÁíAνôù”Tc­ïü^W On´m—0*û[«ÏŸçU›+`Ñt,!j_êØø‘*JÄ\ˆñâSé.ˆÕqçÈéÓ <‰# 1ølª–ÑÂóô^ŽŠb®ì5>6¿¯p²m[éËø_e¼««º2zçS5´}HF)‰NŒãMÓ(®ïõ®bæçq Î%Ò/´2©háÏVßi ÎÐW0h0ˆvqéê™x«y—¤OEüÎm˜e‘­˜fSYçX<ƒ Ÿ-ZÉØ¬‰BéÎì9H¸M:8-_“K(…sι¹!™·?m(ú¶~9Á{Ž,-bDUe²UúݬZg}.¯—?ûш':×Üà ¾åœTP±L~WJ3£áò¼V1ËÔ}@')Ð*ݯb)%üU¤äwô™ª’‡Á)þ;Tj·B ¾µÝ^OÔ;'ù×†Ä è´o‹tá;ˆ2r8~L007ûžvÅu„ßú<4 pª»“ O¡-xž_u£M.1#©sp\‰3ƒÑÖZ˱ ¦*²Gª­:›Ký3aëgís’Ì`5¯è<Ê&Dÿ'n¬Áµ¦»¨SL‚%]Í\Ÿ7ü½.m°Þš•…£o€™òèÛµº ­ñIµÐ§HÛ7g»×:j|Œ,Rö5æIéŠM¿ÎÔ.BHKÒüÌŽ,"[‹KÌ‚Un‚ÚL}ˆãO,yÊ©¾†Ýo»ÝÀÅ~8&p0k/p eBÎÌzùÅi*…òc^ÜA[°îú56†óºˆ†Rˆuvˆ¥ë½ ADâ¿èЫÖX#b¯Cq„q ;I_ììØ`Qq|Ï$§h£ßq-i› q#•¼DÞ×Aõ–šs+åoNÓà«z¤‹„7Ès¥º(jÞ8’ÿèIJr=.)““Ãa.y}HsÜx=y*…NF¨ÞÝÿë ï‰\y®:î(Ë•"^ÌmÛðáyS¾µYB‰ËàÏîëó\Â…ã½úæE·ê>v<™ïvÂU[ ”ÜAWD;<²ÜçÕ _¥Q”7ÑH]Ÿ£”¦iÃXˆy >t¨¯¿à}J¿óÉxˆE6.þpÝ_r€¾çdGzcx@$”Ôë*ŠLì|Ó ?a¾¼ìI >±,ܳ´íŒçßB*NÞà¯(\K»*Þ{ŠýqQO¢>ÎK^}°M5昅…‚xY=ð{,«qTDW޲åÓŽNüà›{V5Nû½*Ï×î¡~⺠P$ÀÏ’þ—[¾ê‚ëZüüW|·C#v © –©—©Í…·Ÿ¤ÈÔn6EŽBת‹ÐEºêš¼³õ3Iõ ÍiŠ–¶¾e^„äoÖ3S=2ñZu6oO9<‹‡7ež#£F•%Êo1Xö(.¡ÄåÁçÞšO+¬ÉßSœnÒ56¡ÈöÞ`BÈ9”Z=“9•´ûP»!ˆG§áÆ‹?[ˆÜ@ÞW•á;YVÞ—SØcÝ e1ñýe~)y{Ö;‚6³Ì•Ϭ=wÌAÛ~üÞ‰T.LW™Õ•Ëâx²-) µ8¦i?»hj\iÚ Ð^Ìa9ÕaÒM+)ÞNZßTèãrFŒaµü§nñ(ç„´tcMm`OGh¤*3Uõ¥ ÅNÝ7Cá™4í §kjßZ]¡´ƒÚ~2Çko´›vÞNûê—öa|?Nh£á±O&õ„JNªð¤0µß1d¥éÂÍ6_–>ÅgòÙ§ ¯ ÝŽ7“_|ÆZ¬4Ð4 åLüò­°ãMÊ`ìýÑXkE®Œ>z¬£{SµA¦¨l¥2_ZÁ0,fsST3%œŠDeD\ðʆ °1Ù´3̾¼-òúýŠvºs+¢IÕâ&rk¦%(jmˆZØÙ‚Ã@2f$ ¶wß‚Û9U}›„·%1) f P²MŽîIì‘é2‘ebFÆ&%æ|€F…73§:Wâ*²9/9yÆáÀ =÷ÄŠ–U‡8‚­ùòz¦§ ÝíÌD~ØÐÊ2õ¬G‰¦ªŒÒwÀ³rÙíQÜqÈ ŒÌÊ)d„­ÍËR[Æ>”9Ñ|;Ê›7X(^œgÚ ò5 ê†_ÝE5-žöËb@l/œØR èÎÀW~,”~‹“«Þ$?åså5üVoIÚä25™ê<‚JýyÖ}2¿úmXNJQeÒ5¡EwzB‘E±qˆMö¢ã—–°× <î½½w¤ôÏ;ø@§»_n¢hã5w€™¶ ñ—z!z±¥ ñK ¶ªÒŸíʉÒúäuEU3röw±ï„¸^Év»^à¢FÞ¥r›Á‡w×u%… T1­?SÀÝä¼Y¢°ÓTjKØtªj1$tt¢fþ9l陚ŠB»jã3æÓ±*ö]6©âO ÀÕŠW»§ø*£>'Z‚M"“ÕÄ/ Ÿ»j6?Ä¥õïE t»uuöùÍèåŽcƼšã‹šØBþ÷õ«*¹ý:=#'rÙÑãàÊ~m³dÝNìw2\ÏlAššZ?¶Áí!´öM£B¨TçuâÈ\G‘­šî¢©æ;úBFÖB‡,Vú+ä.Oñ쉟 Óê§iß…;&’Ó¢²3+žBoÖL0¦KYSèí~þ2î¹­[óîñ׫-tõ='yÉÍÎÒØˆg~/öer¾y#-YÂʤ€}Y\A+ö>Â-à3eÐ1‹ím#bݡՆ±ûŒ¥s¨ž¡þ©wµÄ²ZöÚGÜð×n\VeX"ÐD ¿k›µ@áz¼-ë¹'*Y3™1³içøB0:2Èé¥ÌYÿœÞ*|Ä<­×þ4?0OWVK&@ýJ:[aâ×¾°!š^P MP aˆ™êüPòwÇì ÝøÉ8L@5%Nº˜wN#ìq´¾±‘ï’,3šŽç ‹=³±þÅ^)^’Êð/çü)zTÛñ®o¾³½n÷'~Û÷»Q€·Í¡O”’Bãî…a²çÕ|I+»¨¸‹­*4—çãfà¥~¢n’ñp%Ú@{—0ÝeÒ2Iˆ†Ò¸kþXPÙ#¾"A›òÒauVE÷Äq0ÏJvâ`õàÉãtZ{6}²ñ´óþtlÔñ³Ä´mÚa‰6¹}0XGHƒH„µb1¯ë~H]„1*·µí„Ç–ôª=ûij¼ì÷ˆ6>²ÀÛQ&­±ñú""\ÓU¢f2›”sWÑЃ̈́ýói¦þ¨"— 'ÞèVâÝqùgç(‚Ï áª™2ôIº*%Òx¡~ñä4zÙ´bŒ²™Ýh'ÏϰKÖŒ¿šà²0?Ô¢­™ÏöŸŒîƒÎژΠ”#5ßê̇–í-²ìÎ"»;Ò!š­ë 6i;ôgf.;ñç ?P¼œu1|>¿ñ©DRþüCÌáIÐÌ-6cœ1îZqùÃ+’/Ñ`Öl¥ëÅóúcÿeÜ‹Â.ŸE?Mi`Tï*£=Í(&¼!èxÎ=ˆõ3è:lKóhbí ö£XÕä¾&7A…†Æ€|¸6åh¾gk‹“¤÷Þý´/]c~E7néh4$öyüqI¸ü5Uºª]b®½eº~ù„|ß…œ¾~A”vâ;d­1Õ»Vl¤Uýgèu¾Üòf1S@Ä(„»ª†__×àú%–ŸNm0fÆWÀœ,õŠ`JÑ´ל614V”®Úé} 7ê_ë“»~á·–ö+ððoYhð"CŽD$1sà+ IIHø§¦Ÿ<™‘÷r¥ÕpPÛõ ]8Ÿ…ÎΛmÓçЦ4¹P–ÈÜ'ͫЮ‘zʇ?÷ÌPÈy1mrœëÂ_ù‰B1E} Û‚d™®Í푾†ýªá½,~Zј^½NHÖðÉ(j2y;ß$ãØyâ'ì[ÒvJÏxký2ç 4Œ»ˆµ…#GË(“ׄ(*Ù‘¬¨’rœŠö›_£]¸jûÉb º _L¿ÆùFXÜ5ÒZ¤>èJ¤9áÉ´º€¿¡ ŽßPf)ÒÝiçk–LÜQý`ôùç—…S$Vh0"­ŠÑ?… süEîUfXcçJ¼I…­´¦6{ ˆV€·Ø .BY{G¶Ò(k*EJIR˜é¾ ²È®»ÄÒ›ˆùŠu×­BR0äk ½ÈöÖø3Îçÿá ðÿü?À܆º:Úƒ¡¶€ÿr˜endstream endobj 224 0 obj << /Type /Font /Subtype /Type1 /Encoding 295 0 R /FirstChar 33 /LastChar 122 /Widths 296 0 R /BaseFont /YIBFAG+CMTT10 /FontDescriptor 222 0 R >> endobj 222 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /YIBFAG+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/exclam/numbersign/parenleft/parenright/asterisk/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/equal/greater/at/D/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 223 0 R >> endobj 296 0 obj [525 0 525 0 0 0 0 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 0 525 525 0 525 0 0 0 525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 0 525 0 525 0 525 525 525 525 525 525 525 525 525 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 295 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/exclam 34/.notdef 35/numbersign 36/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon 59/.notdef 61/equal/greater 63/.notdef 64/at 65/.notdef 68/D 69/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 95/underscore 96/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 209 0 obj << /Length1 775 /Length2 709 /Length3 532 /Length 1265 /Filter /FlateDecode >> stream xÚSU ÖuLÉOJuËÏ+Ñ5Ô3´Rpö Ž44P0Ô3àRUu.JM,ÉÌÏsI,IµR0´´4Tp,MW04U00·22°25çRUpÎ/¨,ÊLÏ(QÐpÖ)2WpÌM-ÊLNÌSðM,ÉHÍš‘œ˜£œŸœ™ZR©§à˜“£ÒQ¬”ZœZT–š¢Çeh¨’™\¢”šž™Ç¥r‘g^Z¾‚9D8¥´&U–ZT t”‚Бš @'¦äçåT*¤¤¦qéûåíJº„ŽB7Ü­4'Ç/1d<8”0äs3s*¡*òs JKR‹|óSR‹òЕ†§B盚’Yš‹.ëY’˜“™ì˜—ž“ª kh¢g`l ‘È,vˬHM È,IÎPHKÌ)N‹§æ¥ ;|`‡è{¸¹…E:jCã,˜™WRYª`€P æ"øÀP*ʬPˆ6Ð300*B+Í2×¼äü”̼t#S3…Ä¢¢ÄJ.` òLª 2óRR+R+€.Ö×ËË/jQM­BZ~(Z ô“3‹’sR“A±V’…H˜*è'Ã<"„éC'§üŠj]#K]K3 ††f ææ¦µ( “K‹ŠRóJÀ‰N0~Z&0lSS+R“¹n^ËO¶nÉš¾­meëâ «Xõ9žXûò&ûˆu³3SjƒMç*¦—,yµðÑÖ¾ÃâÙ%¼’­§ m‘ìõë‰û²HxÍÖ®Ë"&4˜î×»,^ÙÜ5÷Ÿ¶ú+ÏÃ…a3æ´>’¶Ú_ôxV§²ÎÍ/Êõ'x楼pŠZ¼ïû½kÜBZA“´”¤Ìo®`¿Ë(&^y÷ùeùO;ê§·M~wö–g€x±[—úÅ4;î¤/‰ßžpŦ•]¼¨øÌñà•Ê%Rþø÷ì®x#Û¡Ô®úñH𲊯]uÒÕ×O°‹_êxÝ»ðk?'×~Y§£w/n9þH¿¿Á}Ÿ¬Ì‰ÇÆ¿¥NhûMI7¸gÌ´éÙÉÓYOB7®7lÿÿ‚]jiÝe‰Ùs¶O‘uySU¸|·í÷PñÞZ=ïm3"ß/Ù}˜ûÚnQCaû+7ûÎçô;ÃÖeä[ºõÛ´}¯õÅŸ¾59sí‚û’Ç ¹ <’skc·sõú'ºýcë=øô^÷Ñ3gÁÀ7 6ÝçGî¾¼6Þvfosêú²+ç³Ø~§=<}þ¶Uúæò³éÕÓYßµZÝðüÑÕÔ§â¿´1»–CÖW²tin¹ø„CR"8÷=K4 šj¯vxÎ3y>aïÃ!,ÿô¹kU|gå§=¹!~ñX€ £Õåx½{S’­û^9m¨oÞ•2_h{˦U¿B´N?vèäº9–×øwå\ÌZ»õþ­ýJŸëT|?Ϩ߿4ÀðüY·µÌÎ];ûÿFõw‡úßÉŸÿùhþ+µ˜& ­ój'CuÚ£¹YÑ­—ÿOüÑñÄ5½0|éÌüã‹÷Jîú¼xÏg{vÉ“|ÞøaaÓÝoßÙå·°ñ¸ÿ¹,øÑ‚°ÙwûVÖà6m*‰ÝÙâm",ÍÛø¶õ‡èÎɇvlö¹{lÝô„ülk™õ%fú«›všrT‡õå%»³ö8äµ÷˺Ëz(×4,ØýèÒÒÒNé-®Q†…ÀR4±¨$?7±(› õØÃendstream endobj 210 0 obj << /Type /Font /Subtype /Type1 /Encoding 297 0 R /FirstChar 13 /LastChar 15 /Widths 298 0 R /BaseFont /HFFVYA+CMSY10 /FontDescriptor 208 0 R >> endobj 208 0 obj << /Ascent 750 /CapHeight 683 /Descent -194 /FontName /HFFVYA+CMSY10 /ItalicAngle -14.035 /StemV 85 /XHeight 431 /FontBBox [-29 -960 1116 775] /Flags 4 /CharSet (/circlecopyrt/bullet) /FontFile 209 0 R >> endobj 298 0 obj [1000 0 500 ] endobj 297 0 obj << /Type /Encoding /Differences [ 0 /.notdef 13/circlecopyrt 14/.notdef 15/bullet 16/.notdef] >> endobj 162 0 obj << /Length1 1467 /Length2 8168 /Length3 532 /Length 9031 /Filter /FlateDecode >> stream xÚí–UX\˶¨q ,@€ÆÝÝBpwi qm܃»»{p'Hp× Á‚‡àÁ!Èéµö>+9û<Þût¿ÛýÒÿ¨Q£þ9ªæœME¦¬Æ$fæ`’v°wabcfãH(ˆk³±ؘYQ¨¨$À  ‹•ƒ½$ÐÄ`ããcˆ¹ZØYlÜüœü\œ(T GO°•…¥ €V‚î¯$€˜le ´(],Av¦@[€šƒ©ÈÅ“ fk Pýk†3@ä »Ì˜QØØfV¦.…•= Ë_F²öæž…Í\ÿ{È v†Hh!’tˆ¢™ƒ½­'À dŽÂ¢èY 1ù¿!õŸÅ¥]mmv•ÿ»Kÿkhgeëùï ;GW à`Ûÿgªè_râ¶ÿkY ­•©˜½…-Àú¯•³´•ÈLÙÊÅÔ`´uýÙ›ý§¤m °¨+HhªŠ1ü{?ÿTZÙ»¨{:þSö¯ì¿™í7Cº¶òè±2³²²A!ßÿþeð‹IÙ›:˜YÙC7=Q 'B\o6€•½Èò€³0Û;¸@¦ -ñ˜;€QþÚNˆ‹¹Õ_±¿‘“ÀâƒìmAæ.¿£lÿŽþk7ÿ sCÂýt0ûâ°xÀ¿|{Ð?ÌYÀÅý÷8¤´‹%ôGÆ_F®àߎ¿ÝþÈà°8CÚósAä²ÿ˜þ‡+€ÅÞênÈ$±ß–øM«ü‡x ÊÒ¿ ¢÷î7AÜddYùß©©ðñBæ©þ&È%¨ÿ&ˆ‹Æo‚ÌÓú‡ 7 ð7AÌL~¤¹¦ÿ+DÔì„´ôþÕ×?bnñB„,ÿ@ˆ‘Õ‘°ù!¶ DÃî7²A4ìÿ@ˆ†ÃÑpü!ë‚ÿÀ¿¶ò„4Ôå„h¸þ ·?¢áþÙ!ëzþÿûîwððf‚,&vÈdcãàðp±úþDSW0äÄ»üýàƒÜãÿÍæV'ä2EY^p0¶Nk-÷“*𮀧‡·h‰Wlì™ëD ZJ€¶ý8&çD¿Þ ýP™‰¾¿GêþHäÙá£òEú,À)>}þyÏÍx/Ó«Hû"SÁsבü6製ùëÕ1´Òìúxy²Nñ`ÎùÐQ2­¤ú>â*T¯ž[SoV07¶t¦­FXH5™*fºSy8gØš;fr"ÜÚTŸuR+ÃÊO‡××EHùIÏF°f_4oåNS=Ѷuâ'n_×0(‹ÜvÍWÈЉ­~4Ñ[%ÍfÓ³½ˆÎúJsÉ袟QÓåø­ækn±î½g…LÄ{4«ÈÏÅdPõñµÔþS-k…–ƺŠ7$E o-åd^>…{ œl4Í¡Ç~¢`£~s„^K›EGùòžC.d9n!DꩺÉ?ƒÄ9¾ýÀZº¤6ܼ“\™r~7”IvýÓÒñxʲxÐ ·eq¼“¤&æ¹à¶1²V¤MOc…T¦"ä7ý^æyÑOþ›;à¦ù²J6VŠ›è~ƒ´Vƒæz{Â5ØBN˜šÎA–H_ÀR[+2bŸ‰Í¼hpQ´±²žfJü›Ý½V˜P¾üù U)—Kñ:³“b,ª‚ú”?'!ÑŠ0µ{o²›bµö`ÈUîO$‰gŒ¼ïËP1æh»¨Y‹…eàŒ¶\óÅL¢6Ím‰‚¬¤‘T?§·0÷?'ðþ:ë]F?A4vm¤¸ÖœQœkÂs2>R~‹ÞNÀ\}0ä×›~zéGQ~Ø'ì žl»Ÿ?`1ŽÅs. sóäbœ—‘l«¤|e‘ÆÀÕÀg¥›š/¦#; ùÞ¨R}êÕ†•:fŒömíjÜ”ü<÷»MNÿûŠ7w‡a¬(+g? ûbÓ‡½dm}h:’]”ð¹D2. {rzµ„`—Èùùà™²Ôùõà‚ËÆ«üøµÏ¸Iª¥£Nóǵ×ÚšÄ ›>O}¶®„Ísòsõ Q!îuN´è/óóéŸ_I¶Š ¹Ž`ð`h_¶`%>ÀDmjy{@ñ³Bˆߟ[Ǻ#Y·u­Û¿¼ý\N,¯HúÍèVƼ[µÕ¿Áï´Û¸¿‘ù3ÆñâìôéT¾AšÁb3݃9É'L)¬åk:îV(ÅàÕ 'ÁÀf*×Ó€ÈЧà#Ri\ó÷¯—éÆ9Ñ¢°|Ci>¯Éøågf`e~³â¸.µçE¹UEÕ~¤Œ±î´0F0KÑ™gtß( `óÈÔ^Šcü ìK°{a[»6 ÂÅ`Äî, ²…ÿÈu„?§: _µ#óPͨƒ  "‚±%SÜàµ8¿|ì¾Ì<‘ÄßE´º³eþÉ/Šˆ–ДÞFóìÑ2°`³U%_·SÍø4⩜šÂ§h˜Ð‰4šÁ²×á3¶8™²¶gÏ÷T>÷ëWŸEeOû…¾·Í‘èh„ƒéfJh©͓dU®À¡°P){â£è³špÑU–éca"=—õ-ê0É0Xôh#7G_ä)$O™ï±t×ÁP™û«¿R(_}–w÷#âî_Wº‰Þ/A¸’›Ê„ƒfRRÒ·?京yANk²½Q<|]“ü¹ëE*c”ænyÈ™ÑF•®' NOÿj@Öî8•ø%6óÍVlÛÐ…W«ñ³RžŸ†fªÈ®¹Îr¢¦+ä?sZRLŸ@ÏÝ »¯—û©•ÿ ¶Ü ûtÀ¹us6ûú“pùÛ¸ ‚-ŸsÇʬ•ôÉlq„(ÁÇÍZnn²A[Xêƒi øÉ8vwã{œãô–e½ üÖ¡Œ×v ?æó÷‡a£•Pá£éhÚ>^R,¿!ê±ÿî¼u!0‡T·`˜G×EÂOé g°fOØìÐh¶HÇðDqØ‚;¤Ü¨¤Æã?>O½¨Îò¼OŸŸ¶EOÍGfz0Üeü+2òêãìÃý²œç€6²¤ üåýXkcäÛ”ük½îf^Mñµ˜Ö34Ä4ë¦0!NF^µ7h"¸'QM¿×/•ÜËñëqª»ÉZ§£©_öibGîYǦºN¢h­ÏR…ðv½y2º¿ÆÄR_B§”è3[º °&ÿp¾M(jý’IÀþfÝ­,D¦?¬Ð‹ìÖ?š‰L>×´ò¨¡ØfÈÉÁËç0‡Ùù· :)o7>è̤eÉ¢†¡¥ÉéÛSàO¼^cP†5Ìör²ÞYûrŠ,N? RÔÂìõÀªT$çöÐLõ^|Ê´]X8»lJ¼ÒßëiäF§ìûfhÁŸå·}ºâOÈžÌÐj²ÒíBø¦Dëµo™eá°0»h”˜úì9TC}Òk‰ÐÇyàfòÉO*FÍ"-˜Wõòðá¡ú±$ͨÂ(I%»uÏ´ÄX¶U‚æQ[„Ç%äu4«Ž«ã¹º;çÕÁ«¬ÓØæ8µ´ìعÜAqÉÛ—õÄÍîÕX|ÛÆuÓ´©oѾŠÖyº†  W8ì"žv¸ø€¦Þx·¤h+S•PÓCÎ.ÔV% ¤‡UN3éñXI¢a L)ŒÌ08õkä’8¹–°¬ØnÖÜxZ=â+Œ8Äú_–”ªªrl&Ù´X‹$´=Ù"Kâ¥µŠ ¤ÄO† nX†ßÜU”R‡Ë]äw”ê8»Rƒ¾ÂSðue"^å"H£mŠÒJ<ƒ¨Óú¯ÍÁlÓ˜,–)!ã(EÞ´÷·¬­ò7gíÒñòWt¹‹#àõo/Åðï 4½`h&9ƒÌ–à+¥zßu›ªlv|x¬a2•(òn¹ƒÿDØÌͱÜ` ÁI„Û˜NrçyeŽmYaËU3nÚ«A÷ãh@1RÏ ”"º sa}ìž#óìC’ó±äznW™ÚÏÅ©G½R «õU-A¾Ýøšë™ÌA‡S¢ºÚú=áê § º“%†Ü•ëëÃÅ,ºõ2©sC ¹Ã/‹ºÓä“•~š†ÊÂVQ ç¢|®Vå×tÓ¯‚S–¦ï^__ãâ,°~ÿ\xÜC®Æ–.\¼h| ¦]x?Á:X³¦8$û†sñÆÙy¯γ'…6í‡ PŽüŽYO‚îÒïÙ•äÒuªóðc€ÉÉy)×bûŽLy}í‡Ãi|“œëåï>¼Œ9ú-=‰ÈªùÙòý±tNƒjÝߺ2OPàÊpÂËÊOF£\}4+’ oâúÍjH€ßxÞ×Ä-l79oWŒb$ '6UòeÛ-ð :_dÉne–¯–[dÒH]× ÒJÒ|ì•'¥p9~Ñ óÎhE¾88hjÚ ¯ÕHyEÓ3hl’¤X*7Ð'Ÿû¸ì†•_=6ïØHª0\vFwùôĔDž€Ò["ôì®OrMbÑîY‚‰Õ‡ùˆxTûÞg(ñF¨ãÖ&™,éaH{HðØÁû•¹ðyl¸=%ÚúZþΨ/ª in”îÇv8e[Þc‘vÂÞ<1勚Z©iØ…VrY:7Ãà^eX þC•” ºÎ¤:Éö°w£ód¤Á°»r‘È܈ Rõ¶!#á]Y³¸EèHÌùÂ|òuoÒzÚ³¢&K}¬‘ŽóÛ~ßä’±ÉòìÑÀ—µæ··¢…aôë2±ŸÜo‰û¾-7€ £p´„B-»º}Úí`xd].ë±È7Œµ v£.5 ¿‘ц€âf>9-âðÉ*5µ¨ìLWoÑΛ먻©0!ÝÎ$Ä:}žWk£Yxñ±i§üUx+\š»Ùt…ÅÚÁ§ƒó³Iu´„bîpUÅAMå5aÌÒN¾)² `ªàË÷Q¢!þxËf'?Ï­|Øû{@×!U®5²¹pɺC(Mß’0éë"³*cfä5nñréi©ƒ”lÓZAZ †Hý!Ó´œ‰ëç<Èaù¾a¾ñ@‡Z}·íÜ ¡d‘ÝËR5;¯^Ô™Œ˜m|^¼öSJÖVZpsD}£XyLñpÝìkØé{dYWæ“¶OyÜ%¸*"g«k4%ý]£ÊµŽö#fVˇ«o·nŒOË7ó¼ßß‘D/êy‹Sô(QEãý¬hÄ^-í[x*Û=Ìpªqç]EŠÌïPc &u(£A›]úö®QtT¦³p ^ÖTÎëíòGb[ÕX¡zsÝûÈüŒ¸Vþ÷by%Pá¢ÎЙcl³rƒùËð®!ËT[ VÇ½Û â¡£ÕÑ`àØG üÔ°[ÆÃMò‘¸-fy Ñ]ðœÙ›žÝqUkNhöd¨2þCØ›¤VÌÍŸ‘d„¯yU7åƒM4zb©–‘ö¨ýp©Œz“·Ôn+¢o‘ü‚›4´¡¥ož¼õ,a¤Ç^n>ml¾@ÑÌVk¼ªÅk’ÞUÉØoX_Ľ=oƒu©*ß0*Ð ¯ˆUzu]|ÌÉÊš#/°ýº¯­Ê(•F_’²óÄ8âZntQ^ôº! JÎçR¤¶E^õr·¾sIÍ£cOpþò̦BÆdm=ër¥H;Êpv8ð|Ò"`€òèe†–ºÔRÜÁlrFŽŽ¬tíœR?²¿¾·[Å bYó¹w/§U.¹£ŸJ'£”oV­ïtO0DN QKýà!pëâƒ+*+Ö¥|ÖËwàQA]·ïpÐH/^£0àÅ~#„=°õ˜Õ>ÄÅé!¦Fï ËE*ÚvÜÉGm 5Ê—6cšõYÍ®èr7UPaœ†ðx((šu7Jyí›È޹\ÙCâ„ø³‹ ›‰4ƒ_¦[™Æ¬hÅ=ÜEÁW`Ö7öNïY @i‰¾qîl5rÖèÁ µ­1qø|ÚkF8˜V4pf™H¸¶ýRH»ým7 sª ž´îç”êB­Ïm´4d-oñ³Kv°¡63h‰y²$»áéîðõ€xG¹Í"þ8á;¹ûW;­¦ŸØë¸RÒú±“bwîs¨'²ùïhSȶßïz?z*©†ä¶ÄÃÚSiÆÆt„l²NÂ3”"|{t»D» &W„1D’ˆt-Ñ-ÅÐ4A`ã¶Þê¯ úŽÅW§.{_2»ú4ÉíÔ‰_ÍÕŸû‰%Ä·péE$bºŠ„^Ý:FxX%äUz c† ¥k#ä=˜Í ZOŒG?Z±‰Mù…ãhèmdÉÕÅu79Ð WºÊWmÓÈÊ‹liÁŸ‡‘wdWŽkiqÙñ MÞˆº´³öx#¿¿‡Ähh=C©Í’ûnl'ÙûÊø¡@) ­t™…1·Å”¢¶ÆGµ»…ɪ ½l—¾T>,ñ»*¿g€‚ÕùJ`©ŠVFÒèé»Ú§ÂâÂCK0áØcæ›gûÁÉÒÍЋNŠ_©"ÄÈïh6÷²I½#,Äãùb×T*£Vg~„ÉVêZ/l˜W¾L­ðd ëä LfÀ&Ÿ²Àµ¬ÖØ¡Ðï?RžBÖúü(䜒넪ÐzâKÃ`cßñŒGê­²Xš‡È›Ö÷~¦o¸‰2q «ëT‹ûŽÇ˜!6µœšG‘åÔ,Fo_œv‡ã9Ϻï<®ê›?;?GL᜿TÈ$·Åœw÷g>—©ºèb%†Ôµl‹bËM—)L¿8\ç`®Aæ%-ŠÌ9½™È¯‡ö³Dößt©+…h_ž*‰˜:ˆæÞKxUŽI%D|Ì‹g×ûxüÚIÀd`¥)2ºkµÔ;uêxÕÓ„_á3!c‰L4Ãåz¨^jê½8Æ-•É qe_ËFšmÓ9Ç⹩)­ô©6ÒéÙâ8 ‘o¹éíM¡|Õt¸TuØ0 ;ó÷Óâ…5ŒÌÕÁ‘ð˜ A AC %^#¦âÖ³3Ž™å@eî]¨mXt¦öEEàÌIûR¡là ®ˆ·oµÜMQìÜv„µÍÖÚhZ3ñˆ";n[‰ü•Ô‚½á-fÃ,÷´cÆ!`¥!‘Òlö eŒ‹¦w«uîæªí“0˜Ÿ]Òô$UC'¢ÜW”¬Äžôu‡˜†9}T0X;cô…²|埔¿Ñ´?óFŒ}©íZ XW®–gï+ëÇU©_ñ+ª}§,É×ôR›|˜±£Ë>¯j÷o«Œcâž}…/!W´uÆûIðn¥ÏŸ‘Ü‹c¢9}(à§œ¬l"ì› x<²¥¬•È^T€Âìn³ÍB6õjÊÙ41WÜ~žcç Áûl_òË6^žÉ› @ gš6šh &ꕞW„ò|‘³ØÅ”J'jc;ÿ‘Yý˜€+±ÅüWÛ+ŸË%ÝÑ:ž²Èáða£7õ÷ï;—ËOÉ%ßULÏõØ·ýJéõƒAÿxòàý eO)\EµFXE|EyÎÅá|XÄc»|àD²FN.ÿ×'¹nq/‡¾PF’aàú³Ç¬%z'ýWµmþ‘!MÊg¹%Õllðó÷ihO¾­S!%*˜¬ru<튋ìjQ¦¯ìq•T'‰œWfçoMîm?ÍÒûòí‘(±l¯Ïè¯þ$V௻FìÕ%*v|éGÍë€Äsw+-æ³x¡B Ê’ +wšÓ¾ñmkQM~6p'ô]!¹ÆKUŽÍ!Ó}œñãTòóœñ&¾ïïhGæEKX˜ÁõI‡~³¬µ­ãNBñ G÷ÔFF4µâ ¥ æ´¸ùϺº”ÈüBý•LÛfázÖ±,ž±ãLB¹PAò\$LկɌÝ÷à'–?¿²8'’$fõ¶žYCˆƒ34±p{ûhñ‰ÙÞ°¡ó„ˆŒ#ì×àÛx ëb£Ëˆ9ÈwbHÙ[ï®RiôKHŠžLª ;Ó)[ÙqúõÇfò† ãzöÒ_$©c.2Ž ”¬x˜¶ÈòÍñŠaÓµíBý jöÚöûtœ’µQÔeÿH¹Œ£¸ &Ñ…ò‹„g'уµ[L% ™c^VÝ”óí¾°ØDk2 Ó~€+wé.Ø„™òp9Ï…„ oœÿüÚœ£ºŸ=Š h9ÌVŸdêŸ1ŽÞíøéÌ¢ZßH3õ žgˆõ+ÖëeZà®Wf7‹KÚ±¤;v…u…VÔjÕ°¼N€ñÉÏÒ?ßSÁWdbe,d\@µú¸Ñ¶Ë›§x{â²9¿ P~È9ùfyô¾à’÷$®N{ÚÄî½iP ³Nfÿ…Sq]ÄyâÎû¬ ™I}ö_wޱïBÃIösµIpo¯^lhY ·j¯„¶ºm82Lù—9Zkâ†sf¥Ä‚xïf«Sxì›`–+b}é´_“þ(:Fk!Pv«5!Ar+™Ü°C“ !ûZðX”Ÿ”9,0p¿!DXz°»* ¿|pu»SÞülêbé,€„B¡ÃXñøð,$ü.Êf™×õ ÿC?‘×”F~¨“ñó¬ˆ/–Ÿ¬Ú[œÉ ¥|Ž&ŽÆK½ÄXÍO™Áiíû Òïqô$ó™”ò~ž)_’Å z­ÓáÆØXJF(t(~‚#Ûp]&ñ9ˆ‡¸Û‰ òæö¼½”½Îk^TõŸ,õ( µá¹ 1ÒL⣉ŠfeÐ<ó²ø#a!º‡’cuR••Œ€Ã*…¢Ñå范ˆUâ~5r¯ÆO1>zØŒˆŸ¤:;EÕÙµà¿$CÝ_? ÐÜÝñ©õù¹ùe‚fÚ†oª 7¤Å×c<PÊÞl‹Ä„ºkô =äVÃÚ9H‰vLRºõ\u¤·H5÷PÑrN‘Ik‹Jsù2êêóŒq¥Oïj§r¸co6ÌÓ«ò§íp”`ýBú”7cÒ¹Ô„œ³–"TG„å#®dàH Òe:;JÉ{ðQÝ8­ú5<]ûVnÿV€‡­·öL*Bñ|‚'g‚†öòCÌÛ—{ôמE°6\ª=J­†ÃwKrh6ßê{¥Ç×f­º eã\[›<ö¶|$(Õz"ƒ Œ@‚~[| ©™_ ŸÑð—(:·ÐU ™¦LÃÕˆÉ0iT£ŠÜ@ˆ@õ#8ÃâWÜO&<‰µ0‡qYÓ‡J…·˜µèPvBøB(ËŽ…?ù­&‚¢È—ãáWÕF‡'òÚk)‘2ß/5yo½MÄ̼Õo$!ÇÞÏÞ*!–­‹(8 ´û 7Uc/ëú–sØ;&uâËVô•gÀ™-) ¹àm—¨ûHX\Í­xzšç[í*3wÒ×KÅm»ˆ„ù/‚Gº²àK‰ÝÕá,PÜ4ÛѰطsµú±Fœù’S‘ÖyS’ kç%+#%ïU™í—AãQ ŸáöÌÕcêíàic•.Ô°[£2Ü:º&~Åx™Wž´Ã,vP0m¦ ŽÂ~µ¸¯ÔȽ ö'+â=¨ÑÐ]g¾[ÊcxÔ:*’™ÒL“Á‚n@E½2ëì[ÇF«æû†ðUޟ䇾t´–Q9ƪI:¨—>F1 ±²ÚÎa²š3'Ù83üÉo§]&Ãìm¢Ù‰qÒgª{ö¤û º‚™-Ø‘Î`ã¹|ÌæîϘo· Ùˆ6Š-@Šˆ…Y0Yœ§ŒŽ³l„H]ˆh­­ wO‚¾¢ó(Ù7¶ `ÌéêïXq)5Ÿ>u)ÕÊ÷1D3ž_$Í g÷¥X¯„¢å»TÓ=ÙF_ºjÙ°+U+)«cÑ¥—)ì8š·¹ EÅ™JƒíÅ‚¤oº,‡Ÿ;êöÕé ¿1  >)-k;²j9ÓaÌXª›"uÖ$Ï|õ)€sQŽhjöüxŬT “qýJj集ï‰8o,fNA9'Ù^È3ûáTpÍ/ÅýQŠ‚0å8ïP%wUÍ)íŠâm¦HÇ+ vÜ6{Ìt­ì5^ÀQâõh “µÎ7sTjÑIÍÁ•óŠ/†.‘ þÒrÊÃȲÍ\Ð*ÎÁÄjß¾¦i}a‹ ý²R8÷ÊgÏÊËæ-ŽÏ^5vHy­”,q€&n‡‰p_Þó²)®xø£x°Þ)—Þ«Y£÷%ïýuOʧ`BØlØl•Ø0ZÑ£- 7@œt'¡‚ì…Ûžj?»¬ á³[u÷ŒWŠË.f‚ùÎÜT]YI2û÷~@‡H÷«á>^ð™-*ôŸJsñ^xâÜ}¤Lg¾5†Ë!4•2I¦S&.[áZÌEÄÒŽQÓŸ–Ü'±uú–` foŸ{‚6½Ôà:éGžõÿðƒòÿ ü?QÀÔ»8ØÁ6(ÿ“Qˆendstream endobj 163 0 obj << /Type /Font /Subtype /Type1 /Encoding 299 0 R /FirstChar 12 /LastChar 121 /Widths 300 0 R /BaseFont /TMCVRA+CMBX12 /FontDescriptor 161 0 R >> endobj 161 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /TMCVRA+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/fi/parenleft/parenright/period/zero/one/two/three/four/five/six/seven/eight/nine/A/C/D/F/H/I/L/M/R/T/U/W/a/b/c/d/e/f/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/y) /FontFile 162 0 R >> endobj 300 0 obj [625 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 437 437 0 0 0 0 312 0 562 562 562 562 562 562 562 562 562 562 0 0 0 0 0 0 0 850 0 812 862 0 707 0 880 419 0 0 676 1067 0 0 0 0 839 0 782 865 0 1162 0 0 0 0 0 0 0 0 0 547 625 500 625 513 344 562 625 312 0 594 312 937 625 562 625 0 459 444 437 625 594 812 0 594 ] endobj 299 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 40/parenleft/parenright 42/.notdef 46/period 47/.notdef 48/zero/one/two/three/four/five/six/seven/eight/nine 58/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 70/F 71/.notdef 72/H/I 74/.notdef 76/L/M 78/.notdef 82/R 83/.notdef 84/T/U 86/.notdef 87/W 88/.notdef 97/a/b/c/d/e/f/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w 120/.notdef 121/y 122/.notdef] >> endobj 157 0 obj << /Length1 771 /Length2 1151 /Length3 532 /Length 1711 /Filter /FlateDecode >> stream xÚíRiTSבª¡¬2©¤j=,Œy5„„1 £ soÈ-ɽôrIˆ8PIU–EltÉ(*J…UE (µÄ*¼N¤U„GX>‹T­Š€S/XWWéÏö×[ïœ?gû;{ç;›æ)cˆ lŠ¡ƒÃäA°T*á°yf³)4Z0Ë CCä,À¬Ôªw`ó…¼eBŸBÁXºGRUð ¦Oø@¤qD!GTN¨` YC!W¦@`BÏ"µ¬¸‘ÖÂ0ž CL ‡ DA€ p*‚RXš$¨ü70¤M›Ê„ñ Rðš”I¤HCÕzÁJ k5FvƒI-ÿ„¬©ÅCµjõj¹f¢ü¤SÉË5ˆZÿ;Ó¤k R ‚qt*5~#N CˆV35+!äjD!BSÕ0`p–3ÙËßàHF(¢ƒ¡H„P¨€R®Î€'q…¦*!ý›ÔÁŠ”†GÇzÿþµ“ÉH9‚Qút°ÿ`OÆœ?bÒ$Ñ6“ÍæDr¿=%Mi&F„ ©€Ëór—ë)ä‘8A!X`©˜ÅD1‚¼Hgr€Ã)ÿêÃ,5œ‘1¾¸€•:1{¤{Ø_Ÿ„é Œe\ÀàòÈVìå¾€Ïcçü‰¨Ðâ8Œ“ãCô6V"¤§0¬ƒË Lá·åã½§¶Õ䊫:ÚÓ3æ›oi?·õ¤É9Ôëçr oü! þàWç­Î#ÇœJ†#¾bAJ^õ”(Ûl±¶ö8›Ýèûd3(†“§]*kk}Os`û]ËBkz£÷ƒ=ŸÞɲfÿ…%‰EO*bȉݼ9– O²"åWQkûÙsQþ_ࢀB ËqÓÈñ4ÊoÆŒ¤endstream endobj 158 0 obj << /Type /Font /Subtype /Type1 /Encoding 301 0 R /FirstChar 60 /LastChar 62 /Widths 302 0 R /BaseFont /PMHUCW+CMMI10 /FontDescriptor 156 0 R >> endobj 156 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /PMHUCW+CMMI10 /ItalicAngle -14.04 /StemV 72 /XHeight 431 /FontBBox [-32 -250 1048 750] /Flags 4 /CharSet (/less/greater) /FontFile 157 0 R >> endobj 302 0 obj [778 0 778 ] endobj 301 0 obj << /Type /Encoding /Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef] >> endobj 154 0 obj << /Length1 1994 /Length2 15214 /Length3 532 /Length 16311 /Filter /FlateDecode >> stream xÚí¶UTœÝ¶®‹»»[pwwwîîîîîîîîÁBî܂ˮεf²Ö¾<çê´ST«VOýëï;ú‚ŒXQ™NÈÄÞÈTÜÞÎ…Ž‰ž‰›HDN‰‰‘ˆ‰ž‘Q†ŒLÄÉÔÐÅÒÞNÔÐÅ”›ˆ‰‹‹™HÜÔððæfcåfc†!#±wðt²4·p!¢¡ú'‰ƒHÈÖÔÉÒØÐŽHÎÐÅÂÔPÃØÐ†HÙÞØÒÔÅ“žHÈÆ†HéŸ'œ‰”LMÜLMèa˜˜ˆL,]ˆŒLÍ-í`þ±$egfOÄñï°‰«Ã¹™:9LQþË&À¤‰½'‘‰© ƒ¼=@Íàåÿ [ÿ»¸¸«¼¡í?åÿiÔÿ5lhkiãù_ ö¶®.¦NDrö&¦Nvÿ;UÝôßÞäLM,]mÿ÷¨”‹¡¥±¹)ã¿C–Îâ–¦&Š–.ÆDf†6ΦÿŠ›Ú™üo€Îý˃–œˆˆˆÍ¿×ô_cІ–v.*žÿ©úOò¿˜éºãdéA¤Íh/ ð÷ßßtÿ—–˜±½‰¥93;‘¡““¡' `÷ˆÈ›‰ÈÒÎÄÔƒÈÔ`˜ÞÎÞð '¾DföN0ÿ,(`ÍÌþû72Ðò²Ðæ²þ“üg˜0 ¨mchû'Hqtµw151²ù÷Úÿg„ˆÁÎÕÖ蟭cn÷'ÌNÄ`boccèô'Äõ_5þgVF"C'S;S³¿¢Lÿý_ÉÆö¶¶†"} O Ó?Ú¬m€Š½ÉŸƒ³¡³ÅŸ'ƒ—©“ýŸÀž½é˜ àËÅýÏ8À‘‹…“é_ÿtÕÞõÏ Ùþé«¥Û_»Î€ÿÌ:›ºýå°º ¦ÿcŠl«v–áügÎ6ö=ÄõO[Ëÿe4ut5ü³°ìyÃ?•ÙêB ,ü‡ª" )ú‡rbÿ!@_Äÿ@Tâ:"ù‡íúC3ÒàEæ¼Èþ!€¹?ð"ÿ‡^þCœ/Š ®ô‡êÊ ®ò‡êª §þ‡z §ù\Óÿ9ÿc»î@†?{’ PÂèJÿ9lŒÏ&á?«öþ³§þBÀ$ÌÿBÀ,,þBÀ4þ:ÕŒ€.Zý…OÖ!ÀÔ_gžàêÏùfÜc v!À•ý_påð\9þ…WNá?›ü/¸rù ®\ÿB€+·¿àÊý¯k àÊã/¸òü ®¼þ…ÿ÷=-,lïáMÇ 8´€ÆºÎEÄÅÎåû?2]7ŒË¿~×ý³™%àÇÁÔÔÃÔfuÉÞ˜'Ä*½-¬ÒO¬x¦ œXؼ=A¾¹¾6x%ئlRÆ‘z«Iã¥: áüÐý ×9ªÛçëñ«@Ç„ŒÅC7ƒÃ,¯N\Û,9Ï’Çà3Äom ÷çlÀ s[ß+S4KFr¯GÏ )EUŽ 7ˆ´ÝZ²CØ94ijlTÃC›ÈYˆ•2+#XÃ7Ý‘R’À6ûY…CuÐ¬ßØw»¢¼C$è<¢Ç#w²(íR£) œW”„#!6~× f™+;‚¯A)MJ硆ÕçzáˆéÏ^cN‹Eȹ]Ñvvk¿“±ën•íë³Ðè[”H¯”2^'Û×ÄR€+2æ4EÊÀCL+³ ëXX.›•r”\újª~¿íŠ$Q¿L”q^ ÜQgŒ˜Á‘vx&õõ—¶+sã{q««gëQ:uõÀˆœÌ·'¬\ÇŽõûTŮӜ›NŸ¾±©4©¸©ähL¤6Sß“/ešëáêhÞh0’ΔG{ÏC¾XM! "ÀbpÛÝè—§@û1?Œ#îÞx®VV‡€µM”mAÕÈ?a,—™Ç ƒmuû­/D(œ¨º4;£I‡˜­æî$Z%¸Z"ÈjÍ2g1Oe¥ÏEûl«€2·Þ™ØÒtŒM<‰ƒ¢o-Ïǽhðbjm<Ú  Ó{iÆ&™[”]¤pO4gØÄùÍó”üÄìÝe¨Ÿ>îVFy¢3?»D›¢—¡Jþðàão!”ž> rͶ’5Û]Ax ³®…8øÆ:7 ù4q¶°’@¿ã†9TWóÝgˆ)½ʶ}› ökB|š¥{OL,ä{ÏýŒ†¨¼¯o¢Gìi¦O/¸X½9¶ŒwñØ{•·2Ø,"~ëVò¹ÅVf‚ع‚F=åm$óf„¹MÚÎ[&’reðº“Ñ6´$ëwÑ_H³¢ gŸ°h2xÙstΞJF§Lãåă VpH¸•éðÐ7§ å.” º‚š]T5ô|Nâ]U¯‘.úœàâ`ªãîYdr ±Sö˜$Я{¡^÷©å·Í2ãÉ«ÂbƒD²oK¥£ùWƒÚû(ßiN_f¸ïEÊ‚¿5§õa4Ü{æÞòî£x¦m…àÚçFå©õxf[%‡eD=9~ýË}:œ¡¾F£‡´zǧî©kj߆ÑœÞlHÌTÔpïdj”ïÃÍ–QŸoŸA¼\ù.Ääóýñ´#´¸†L®/äÅÒS¨àÙ,ÂÐ#útŠh+(ÝDˆ·4>LËš³{ép?ÈIââ“Ðd¯A¨,›TjòÁLämyñãÎnø»~ª¯ôÚ3–bqc¹éöAÀŘ«š&.=‰…’…xR†E”ذËÄŒpÎα”ôŠ–ÔÈñ’ç ÅZ3˜~€ê¬­D|ü+yè“Æ–€òÍtÁ2ìÝ4¨oAžÿk·@¤)ÛÌÆoÙÐÂ5]XcÒÙ[ƒ½3ÎݯsU˜~wMZÔRýu[°‘»î¿iû\ä¯Iyó— F\LànÐ3‘½„o}c)éX%µf1”+¶ú~ù¨R#{öÓxqxиðÁ?é ³ôæÓ¢®O|ò=ÓJ•^eÌÙŽæÓn9FîtœŽÎ/ÃC¿Z¥r{€Ê‹ŠÊÚèJ1ô{éÛx~bŸEîqºÄžé9NbíóU:*‹›JehWØcÙ©ð-κ<9ƒØmüÉ‘9ÊŸ]¡±¨À™( Ý–œGþ*Á=¥µ n¢^.ô¥8#Àî|]Ø»1ø·X 8ÙòΈ.³H˜‘^îªAdóØPÊ\›¨ù§³ç×Öh뜗.?©4×^y͵7]¦,¼?c Æåî¬E<†/†P9µ§6¡\1¢k­­ŠU!VëS)”¾zÊá%™Í<>|0å„lÔd¿4˺Xê‰æýÌ+^̱–#ÉM y?{ùÆ…_I·rö¼ŸË`?üÇ<‹µŽ5å*zµcÄg÷^mó÷.Ñ_¸¥IÜxà|âAßÂ0îåwb›Zƒ2îË(s*“ñû87ÀŸrg»ø_vK#tv4è9dGU²•kÎoq¥Šþ®¯ÁëG´é”nËPƒŒÉ¢o³î×Ù´‚ Afðå@BÀ#ú[-ýC¢èì{“`àÀÒ0³9Þ69CQl{ñØŠ²Ì÷2°ˆÓ/ð#í¼NuáÊY¹~”ƒ½àoà¿c7Ñ=æ(j;¯gÕ˜7[*Gù»âèußæóèôG1ØA+Xß47›³ ½+F¢ûU¬ÆûT”5´îðŒ…s×ÄF”ßü65ÁÓ«Ñ3㣠]j&„žtÑë§ÓìZk£ P~Ø­?B"ðf3¤µÞ ÈâyUÛ±¼`9«Uú”ᘢh›M.mÑ€GÇK,äÄß]SÀö ~Ãâ°Eë^}9Qíß7vfó5hLa¾Âºüñ!8î­CºŒµV³­}ú†YÐËÐO³»s˜³Òïö$õSåca X.ìe:®·0‡æ>ʱëv Y7°‡º_cìÙâň Îÿ·š²óž±|C>œ„êЬ­XȰƒ Ï”ñªŠtÿ¼"Î6|×ZÑf*%µ)ÕÜi—êØ0˜›càPPíU‹ÓùŸ¸˜Òë³*Ö×’¸ÐÆï&^Bäê#:÷¥7~ÜæÆy¬½8± ¢¶nUÀÍ@3±<Üw¾ ùjÕû*°%£ÃipC„a“Jü‡:ÛŒ/«l3Xd¸¨zë P+<žµÏ¥f—òvµ®R͉éyî•›vÊ[Ì~æ‘i¶l¾ 7;üšHI“ÓVì‘Ú³ÿNíª_óå;?rNE}DZ¾“¼hÿ)†çúÁAáp’®†&’z—ŽþºùÍ ¸üûv¤ö¤FJÑBㇳ¡šŒ¦ËpqGÛ'•–3ÝC‚XÒ,)_ûù5‰Ý¸7Gê±ÉHC EÁæ]þ†Ùî‹ï?çÜý‹ÓÂ# Á-ƒ›–²ôFA€Ë F¦Ç&:¶–†Íœ¬>£ˆ]è;ïæaá mâ"{Ó;R‰G=©µšrñÊw2N‘ðyŸ¶c:U`N©¶7¶„ˆ½cÜoo]sj€ªpH,]˜´#Qf%î¡êmÇ‘w\^†¸àñÉ÷*uþ,!=бÅ©‡Ïkk`1—¯¸£[­EÑn+:ØÑbø]$ïÆÐ•.ÔeIç"sªê¬¬£ D¯CS žoiWV¯ªs÷zj öNOzÊycG~ŸB Ê„„ _A3úœ›ŠÔÄNߨ‡8Õg¦„~ZðãÉ[—‡Ý©È•X#]Úðsìñ¶ç³Ì¶l‹Òf‹›wäx> <üѤ°I¹ Ð(ßC¥[An©¬=#³Y8gÞ-Aá›cæA˜ì¥Hl{ ÕÝW•‰FTwW‡SéŽË6D¶>îÂÛØÇê¹ÎÝI>JjT•ÚºW[é< ‘Ýs,ë¤"Å ¬VRÂt^o¯@mÛâÞÞ-üÐ :¡À›–”4ðؽW\¼Þ,‘úG ÔW¯u 16ACf'—±jƒæ'Ý6ÉüÆH×Eò´aó«b2Ï\¼Tÿ®s •¤Ó0f⩆b<énÀÆAHyh}Ÿ&#Ó ³´@šHúú­mßÁÑ4£rþÑ«—µóÇ9"™éwÐÆÕ;5½A‹Ñ2š|0’_üSƒ»²ÇYÇ6ï?4I š‘·ŠOGýÊôç«&Ÿj§fb$Vï¬Z,KŸÉˆÅ(áÿ0QN~;Àkd}à)¸ŸI0 íYãy£ž™ªÙøÝ9»”ô²^å:§V}ñÖÒ ©oÜ´hI`ѤÂäÚïâQ]õµÈ ô¸pU9™Ê¸#=ô‡¶Þ4+ÙO)S^’ þíÃ6®ì\”Þ<#ARÛÚ"Á0†,3=àôŽÇB*§Xî]JͽÀ Z¿ž BŠQ÷Á¶[Ê3‘~ìåh»üý9÷$÷||%“<‰#;ž_º’õÖh:SÔ©eéþœïãT†áoT×Õ¤Wý‰CÒ¢}¨ãU˜žU›È(2%þeTiAeX©Uíºrv¬U¶Ã ¿å Fô{Õ+`ß)Ü}ŠHZ¬«%÷)ÞŠâ éóOú êõâ §îYÓg]gCø¬ì³ª¤n¸—3$^;,O—Š”§y@$€<+#[s3Ì÷²ÂE þ§TOÜŸ}Ý9¹ø\ˆ¼J­)ת ®¡Äê+Ú„_àÇ !¢J µ0nÄ€M%g,˜ždÑ÷‘¬. uD‹GâFy†~õ¡*k"ÉmÒâXIYžJ¦>ÓY¹åÞ£{ ‚ŸVvÇB±ä²FD‘‹®¬”12Þüž¯s³Ž_£«ÈQ<­rü =¤··@7 W²ä-’i&›3/Kä;1 ºíBžãÆßFáI’‹„:,Æ.oüèž)ëf×½œ(©ßÌóG9œO™S»+–ëÉ äÇmƒ:%!Ê“¼ “ñŠƒÈyRCC1/äàûdfŸGñŸé÷Ec Øæ6¬#2jp1¡J¸G®Û.+V €½RëÞAÏyµ>ËÓ«f.d§§€ yöºh€¯e Jñc»¾á“'c^¸~"±òÕÂeéš$ŽÕ%]‹òmߎ~aa3f%>÷žyž/„©ßßŠÑ w¯¸»zl„z®'ž®öì â|Øœ`T0šÆ8”jÜ2P9¾è=6"Vý‚Å'Ö3È»Í/'Ááš.>ñÓˆu×nahzG!ÆÞ9.dW!á·×ñlåÏhµ*þ'Nn§¯Ò/k#™gæEK©§¹ñæÍLžD!ßñnÓj4£Ÿ>Æ´Uœ ¼>‹¶Ò/çúY Yõdúa:Òê×Geþ`&Ìã¸Ôò {Èþ—"©ë?ÿ2­À BnºRié“wÒÞŠÓŠ‰ÃѦõRº ¤æ8"R ‚™ƒÌÍÝíEÇe*â”y6MåŒÌ”%&¦ŽA£¨Ë—Îÿš^Ì&ßñ#qíùÅ2òn,[(™ qñ’Œ™V¡Ñø0,/dò: YJKÜÄè¥6+Þý–gîêkêzüôÊìÙöÇžs˜úãùâhŠ»Ô—-;’‰:kïiWð äj>LØ¡Á Ð’1}VïXü'9‹¶° HX ¸ÏTö¥Û"$T2²zfíŧNs ßײó%¾!¢wÔ#‘° úc`W4Á³ÚA⇫(Ýz¾A¨õ Kk[-ÕqOofüV#ëá©ç“ÂU|Ý™¸þžü\Ú3Á¥jN;kK^æú¨'ÒŒ —„ð'¿Ã…Ë—X¤a  $¯×ÉÎÏo«ÂK*U½NßÙõ©©o«oËÊL$¾Ì¤mõzyBºªç"Ht¶mý¶p±=Ÿ?±Úoveíú€ÓQä9ÉMˆ¶²ƒë˜GÇ"ÎnOdùfü¥ð½ÿ¦&…¸DZûTKÍ569U^µö.áM?ZÚÕTeI÷õVRs­ÛkÝ gÁ_ ¹Yê»ã(<ÃFNȯþ¾Û­oi:\oQÄ'¨ÓE„ê’ÚÞŽK°¸PzÜÈ[ê÷ã–ÐÅ‚+§ŸqÉ£Âù#þøº!c¹ó±žÃ@£\ž˜BäàD‘UîZê°¼ ?5ò-½¶äzLÙêÎîgg×}dI’4R$Òœ&˜ß®7àw@zóË<_¾ÀãÆoÖ\]йì›Ônè7'Ã~Ãà¢ÿù]²f”k®×ÛìùØoék79ýó‡r‡–ó“Sa2²ÐPó„@ömÚov_‚ÇË;*™ÚnFÈ–eÒ@OvD¹‹޼ŸMùO~àˆÚüûÇež\Lö©Ïå”èéÄ_ ~®iBæiÁ¤9TÀÇòc¸$AyКMƒø,bƒ“áNMŽ’ÃŸÊe»,À9;ÔÛPÏÜó4£8ˆ>‹Åu¥?ˆè8Þ›G;ÞÅÓ‚ZQ"Û5ûí !*#CK|QI’æ±@¡WlÖWSë¹R=™†ÄT®î“Ÿ~ô(0ê9q•;8û>9Ñ3Ð"(Ÿ~¨J-¹¦?㇣Ze.½ˆ I»Q€ÐÍ Ó¢°µ&ŒÅ•çÜQ—]èA\ù(ùÃV7úÍÝ‘•ÆîtAÁéùU¡Órš=yGOê÷5P€1ª­áÆ4HŒò—¬Ó†}[ñÿÀÐm ñ@”µZOtvñó°T“ŒxÑ`w"D¦‰î½rXç\lvè²!UÏÀ ŵ¾~á&ºPVüüÒ¥s§«.ÊPÏp6Â’¹D¶˜fp8šK‘äìâj‚œ‰_}÷ðPj2pÜŽ'#„«¿èÀ“ ÷²¹;XÙ…Éõ p r”õhLx`ÙNSÃ¥ã&Æ¢Îec0¯/3>8ç‹rÇ&›:Ù>‹a÷BX•µ§¡æ˜öÝSL1ºAïOèÈ"ó¾©ìTF`Ó¥íBߤyñAEFN[…È‘Ôæäñž©ç•éÙ ”EaÍŸRl\~¨¿3úªó6ÎhOÙ¯®û.3|Ø¢FK.¯¯LAòÝ’=çjF…Vòûñj^ˆJØæZ‘»1QcŠ»2[ýÀriË8éÙò¯VC°¼1ãçåù]«ÜÓ;&þ›î²?‹Šé¨Tç¼Óo 7@ÔdX¥ãý Ü‚¬³ØøÇ׃\‡$i$N VÒâŸÛ=GÌõmpë7ᨈ_Üíå}sJ@(›ÚõBÏrùŽìig`Èɽ¿)5¢ò¿‘Pir,'§~Ô “ºc`Z*§f‡ZÃÅz vc1¥¬¯¦pG§’ë©ÞY_®]ºržU4L¡oRZÖ©WžqLæšâ>´‹$F&}u°²ÛôܵÌ9—¢1·!‘ •qþF8שNÔ–=Omåtü™ël:»î\ü†A”ûmË5Šéiî¶é¨)Ô9™!+•7Êœ¹!Ut xÄöÞÏáæV;iL’œX^9ã,ªtüÁØ´7öÙÏŽXw†f°Žp¦’}@+o¯.]€ Ãó”gõÆÂ„py:$»-.BHs%¿oÜ›‹”ùÍù&Gõ˜\f®îSwŸÀy8ªUÙJÊ ¿¾»f×þàè"…èN¥ëж &òÒ²ZÝúÇä붃92Z³‘ÚNý…b¨T“ÉÍÚ7d6 Þ#=xÈvÐ}¿ç £·hç-†eÈèùÔÔ(÷p{°xHÑ‹5T?çO9gÏÈÄœ¥=cdè^†}¦Œ )S«ã9¶P“ˆÞ#i_O†)îÓ%ŒëuuY‘¬˜¹–Wt™’µ&4¬“¾e…Yÿ:•­xæ*¼X–Ae¬ðºY (‡‡ïJ­„ ˧î©ÛÆ¿R#?­@4Il¤0E–¦¬¾O9'¦f\ÀfÂxaËŠ ›ÛWµì§¼yìT$A eìݸ਻cr}ÛôX~½ñ3½„i i<¨mº×vmçOf¾ùTÇ jôá—„NÿN™ÇS“c·:ƒ€´áÀ͹ ¼‚Ú‰^ê? %¦““?·¾ó’¢ÅP„5ù>·›þ"µ‹ÅnrƒòShIÏTá×™¾jójäÁPæž j6Žƒžd±—ÒInœ3þ¶©!e§´—ÛåNþ¨Y¢¤œœà1ý`u ¼¤duy§5QÓ#Œj”j±o𬪦‡U"ƒeòÐ:¡¿RÎùöcWÕ),*‚l'9çiºëÉ…/Ñ×?ÑE_:ü1üüÁYJ>K Ïçé& <"–vÀÇÉî¬IŸ*¯µ@ ;wŽ}ær§Ô'Á£bˆy””E)‹òLp! d¡R{-•œlgJòø¢åòv^ C{AìØ•çyßÄô›5:ø(”ʦ¼LÞ‘ë<7Ф:–¸wïG…}’.öVM± ¬÷:élK£Hw¡î 4™ØßUZ<{¸z–É!¥ ͼ^‡øNPe„Ny IÜ:xz‚jY80a†è'’&ÉZéµnQíà çˆFoÄ­g(º‡ô…~ýU%x<á¶ÉîV.¿ =#Ö›ê¾S+îµKfR,žÛe2;ë å`Þ§I·Nâ­ç|hCQ¿–PzYU~ör¨Ê” +/¢—äC œCÐÃv´æ¸üøýšuf!' öåË›+ÍpKâñ¹JüÁ%Y2,a«,ÂÕûÂ^XM¸ÛhH¦S&ÒÆQéÞ.ŒWþ7,jƒDß|4ÿÖ/3õ€±¬HéeZ¥k5Ëæ®@vÂ(­&øø¯ºµœ´¦«³`±ãèO(^‡GÜçIÒçýö¢MNÂÐa×ûS‰öo`!uÅ~’àn耵‘I:?;Ó"«&¡Šòç£o쪟‹ZeV* YIÔèGNA‚»>~U ™ÀÓãÄ„1T_G¶D+œáu'É/?Í-û¤>TfªY-ËiÅžNõ çÞÌ•S¥E¨T¥-:ŸæÇ±å$²d5œ¬Z­;nKlâÄ0úñÐ2¢ÛXY|¿\ìb\ðÔ°&]j^¿Wg<1ê9Y}r"M~„Å%|U6ƒ—2ë;Æz‚ÿɇÑÁÎÛÎ6”ú.q-ÿãëNLmÕ4ý7D´¸â½ëm½ñ9øõtñ¶Ì8‡ƒ›o\ígU÷ž*õÄ›{å}Ž:;“m 0{“ì0RDóªVä /*Fìä#\'Ö ~ዘPµw½Òa[¥¢Äj>Á>¸/œ¨´Ÿb´j¸pÁ19>Nœ7ykɬŒ%ë.Q§-SŒMâ"½’:1w‹À¨ü½²ºÚ¿†ûmòY–Þˆz‚éç@»Ï´±®iZédÛgäÝ—y4}ŠMl†Ç¦wÁY}=~]ƒËUºŠÿ:oG‡J›G„‹ ¶kóÙ¶ïâ”™kV1jÌûjÜÿ&”Hò@yÜÆ_xLøeÊYö‹”òRÏÙ\¼³âGÆÔTÀ†­&¦E“m;Û#´Dî'£ö©YêSü™B[…ÔÈŠ¼iö({ê¹þšPSp´Úò@ˆÓ‹~ž/êô±´ýxüBB0D8ù4$Ïæé†¯úGbDKÇ£ÖŒEc4¬PòP{³‰ÙtAßpÓY¯•3¬õGÓ†zÈ=î‡dÑ¾ßø@·WŸRËE£;–‡T¡ä‘8õj‡Ã­Ã˜­¶¶KoÕ¼¥Ûž©–§`vkeø«´’´>‚ƒk£¸X° Öšàqhh¼aιÃCÉ(¢«ˆ'æÏß.Mè Çàž&{STWà3Ÿ¡nZÓ4ÁLÄøiýs¯5ûäJ¿ß¹`€µOŽÏ™ju4 Òb¡îQ©š'I*Æ`T¢G]Ír=~—û”KŠ|P]^±·¹/Âßš)»:“ ƒE½Ë­Äµ vRëˆ?¾Ý—ª(7¯`±u×  À_PÔÁøÕ‘ί¶ àƒœ.y±ÓyFD4×4s"0Ì­ÈE`ÂL;A˜çH@ÏTRßgæ0’×svÙ^Éf€A[öV'¡¯†ñnÿD8EN3È.êÝWiâÚ<ÃyÃc‚è˜-ØîÎxíù¨7‡à ¥_ xµ…md* a°”5-&ö.}}Þôò9”4¥ç±vv¤|åp¸!³ªrcÖÂô9nC%K¬Í÷®lß. ß ’RéºêÕFÎzÒ,ýé¿íê{¢…½¯ãâHBh“Þ9¥Ž û½çVìø¹}:o¦%Ä;­<¬ÐS‘Ò2’~>Ë%ø&Ï׺Âw]-¢”cöˆ¹e¦å¦-—µó+Ùþ|ÈíÀðµžXãUy:~%û© Êë$óÁ@ED³rW)ä]sâZ<Ï|v óÍz41ãÃz_JKn ³æ>½Á¦k¢,^W -Z;<²ýè3”&-4$Ïa¼6ã<WE’8ùãž=W·•ĸÄWD)~Ù(ôòÁä.Ò@…‹¯³°°Úè÷°h²¢øA—†~lȺƒ;¦É_íä säKtÜÔnÞ6ÞÈê۾ȋ·šÃúIœˆn¤×)sjºtDĕԒµdõÒÚ !íÆY–Þ4°«›}¯U˜Â°Uaãª:n¹ì~8uPé,¨!´N?zl¥ƒ« [‚‰|[¡à]ëY‰â‹“Õ…Sø0ª;ð„žÊãJGu š]DÝ×÷e‚+#[L¸g¼'oØéÊÖIŽÖe´2ÆY©Š‚'ò8ä|·CØY±qL¯sK—ùQy*±‘ÚØùyî‹o÷ß­Ô¿ ZSh6£lr¹!Aå¢öååÄ¡]j@h-Sƒ[@žfõ’Â>YÀvAƒÙº7×eÙTýPìºïÆÆ²òS² D¼MοPKÈŠÐÅ#:aþ{Cf^pBIÔÄÓX×: ²mkëv,;¸CÀÔ°^ô6înÑz9Åá&3•Xp–Ðeë],:Ùe‰ÆræGtp€ÉJŠoñz8É,:a"µ™&O–íÁ‘ÈÆ€âtâÂÒ‚*ë;q©ów¼Œï•HzO®cƒoë ÒÀC0”¸ÜêÈJãñ0f·ìöÑýt*ü쬿âGÙ{D–ã3_[?¡ÌaºjO’uî«KÖgáBlû£htÅál¥·úD!#I÷ëqt@àC Â²R•ò•Á ¼+x¯¯—;&ópëW‡~?㦷üÚˆ}TŽ.µEWnZ¤:àÕ ÿ5S…Ë™6LO*á'ô3ÚHÜ_ܬ’°guYvôYÇÎ]ë¡WäÒ›“š ÒÊ&3“ZAÃËø'a< ý÷ŽÎ ê ëò£ð-´‚ú/$,«ܱóÁp/à_‡ñªÅ‚:¾í*‰ƒiav­( ~[è‰d9‹ùY HP×r׃5Í ˆÆ÷ÞOÁ­ÍžK—#êÑ6cK/ˆ®tð1 “»Èe½ZØ%²> ‚ƒ{Qqå|uãÝuMZîy!ð ß/N"\ °fB3ö‚Duc7™jüÍiàlI#µàVë ÇÐiF®,š­ÕC ÑÐÎðÂ#HÈK9v€C‹«§†ˆ"èî€Ív¾ìåþL_™‰Ý%oA‹Ð϶Ï3e¤vÉ?ÎÆú¹|éK„üëH§mUja¢ Ý!y“Ël=ŒM9/ød®Éû9„ù) „589‡œ·Ã<©&D ^”ô ÏϺðœFnðV IUˆÐ-9Z©;Nó •dœ™3u¥b˜sâ–«²2 +†ªA¾¿¦Rb{˜>%EŒŠ¿e£ §Í8û,é·ù¿qJnïu|²g?‰‹ûBÄÈJYMA‡kÉÚUÔV×°àºâæäÇO÷’³‰HýŸã®æXflµ¹Ü‘£¸±\lõVZEÏÆJ¡‘Õ˜of¿ÚFÖò¼®§+îàb|áêS¦N®_¢À£"•æ2ógƿÅöO{|2B…lx䟡ˆ G^ùíu«PR¼¦Ï™¯¾®¥›$ÎÈT®p79'tPÀ»×tÈœör•¨.â‰JœÜv²zòa¦Oä»ü ž }ÓѪ  dWTÒÉipí dY!P0æ½îØÍÅÿæYŒŸ@`ôA=w"̘[ äËM—¬Áˆ8¦ ©|ÁýY¨¦‚ã#'Ô`_SZúÑ]a; ^.Šcò½­‡HÁ1¤°F‚¶³ŽòCYõŽpÝnÂÇ8ÓãmXž!3~ÑOìò† —ÚÔ+è”iˆ"c6ÖäZ«D´õÅg`h ×âmŠ¡˜±o@'&ÃT¯Âšµ&›®é)MûSã5ºÎ* ôÞçF.ÌЊwÌ= W£ ü{97>ÙêŸð ’vÒŒ‘ª$xG<]³ée.ì¸ë}–¥‚Óï‰0ÎXKh¤×2“l8àŽ#'Âîµ¹3é÷‘þÃ0švAE›{3KÏœ–áÃÁR<[D ®NS(Ît¬Ê¬BïAèoß–ñõäwÊ UÆ$¯LË2mè^hì/x÷ûÞ~+fzbZÌšJq-|©Ò¨#-ôc¶Õò7Q¢º€ét|k­qGž¬Šz×Ï´åzO$f3à8aAé [²³žk®õµ M‚u_ôaÉ rkPÌ bIJÖ*. Í[wÎ;ƒD\€S2цƒÔFÍ"ÃQ…ï˜k+¾bpNzo¡Û$WD’Pϲ.½‡£ËÛZ¹Èn'Ocç8›Ô'KXí]2[Ä„,a7 ùîÓɬž­D ÿµ:êJq¤Ñ¦Ý»Ïp,/.=7 U še.-rM¯Ê)ž;S^eœ0o)•´Y:“žNô¹!¤¼Fý™2ba*i(d>âS¤¤­½ 6±‹`0ÎWÏi–ÿ‰´ºî˜¿µ*W~j¢û%´ p˜}Ñ€äkú-Í=ÉŸ¹ÄBÏZ¥ÀLHLzÁ>wbø/s$A?›ð–óRZVã¯ßô ­,)kÚ÷nôPP¸w efZpQ«úxvð*›k³h¶ö—pE„kWñM7”ëÉ®ÞM¸™»[ÝÓšñ½ÄÚóÚeNñ¯„=[¥+ÀäÈÚCú9Ô„±/'4]¡^‡I¤/Õ_BÃÉ…¬Cwá³Öà3Ñïúkü¦Ûòl²é&é¶ç²Z´¦ïª°&§Žpú;BêЖéãÇ:ᆯÜ#6ÃÍ´‹vYESêt˜„:Þ?é™Árzè¹f‡YŸÉ/tb£yÖØ[‚§ƒ`˜ëÛP¾5tª“‰€¡:ŒE.O†HŸ°`ðH£3*0"ïà«|~Sm¨"ôò·eHr±žºÒ)_aƒY”“`s‡ÚSn›†FAYŸŠ¡'Õ9ØÔÞÊ΄Ùôêÿ-C®‚—M¯;’à‡%)dËä¿CO¦„ŽÍÿ ºö­v…ÞáVrýÎæ‡X šêêk\œ7÷ë/r"÷‹B“QrºŒ¥šé3óÓ¦í™h6È{¦8!ù«*¸:ró`m©3Bïî&вNÎÌ_òS© ;Áè}ÆWÍl6K gß,¿ßž×J‘ýüþeŠe­ Îw{Ú#ä~ ¨¦åµÔeý«žFƼØÓÊäuÀšõ“Ý^!Ùê´Ø‹È%f/U&;ÛN•ýS®­¸ó®í·)0ðJ‹œŠsbB ¹Ip˜ú2ü9ë©ÉîˆbFŒLÖ¹W¹"î½bìYu÷˜#àÍÄ»u)>½o VDɳK—@ŽÁõÉ-Ñ.ö)´)&-¾Ùf ¿c<äž5¸®',:<ïËë^]C5é9o‚¾7o Có¶TªB{Lf;È©EÄ¡9£m‚Çtóè—«±b“©Ôœã*ûªê¬CÆö+Ûu"™ bœµ·:™ò‘**lTR½J£^tžsú`#Þ1Š®aNˆÀÊÑàfµPœ˜êÄüÒÞX‰Ž=éœx¬Œ¯Çæã­ùŽéâÏ÷ºF¹‘1ŠS3¼•{Y¦xÕØUµuÆc•Q!аH‰Ž9ŽªNºÄFëÞAᥔö S{ï0ÖÁ×ûÕj:Ù³ ÞzJ?÷9þ†>¾å¨Â;‡&ôÅNФÓA~ )äá.§ä 6§Ó¸ZDÜìDß™›C¹aèJ ‰výç9AŠÓò‰±7íÁüà–§²¦qT‡ƒ¦WÎJâÈY¯ÉÁ+ò{3Ýf'<;ç^¥ ïf˜fã«”q¦‚²Z±ßÙ9s;+süÛ–é : ÎØþ©hq‡É09 P¶P%Oy »áî…ü8§Î½nŠ».¯hÉeȈÓÇûÛ½:ÊX†Û!~£7n‡1&J(Ÿð»XÅCè²(WJÌ|ˆïz+Gç<öN×ù¹ÙÑ/Î/ëþÁíNÔíû?ÝÖÐlvH vY¸Æ—Ð#»IC{¶Im~mú^æþ¸öm†ÿ§hú ã`‰Oìõ:J\¨W#º`,æÊ:â´ÿSH±uÁ=.œéÔhïLrfø!ÊPf³¬Í‡ Ù§û=ø&!œðgèkõ6Û‚Rè ×xc¥n‡rT%ñ^oòÆÝxU*Ižcòý›é¥y¼`F˜¦#¤×ÀuAéD‚Î.¼\ÜÍÛ‡ºjìTW©ðuZLŒ³;(¥`ÚÔ~Ì›:vµˆ#¬|´ØZ;L²üŽ$pñ[·Ÿ%\˜úb—(‹ñÏ\ß 2„KAmÖÔÙ%>VV‡*~˜%+ó‹<>Lߌ„ð¢,5ß¿9h‘½º{ß`€sH-@þZ\˜ËÕSö…=„šTÎróu/“:c¨Ìd/ $èµ”¦Vnúb²zåö«§X¾Aäv«‹xÖSJÓîSH‰AË8ú ‰“s Æõ‰u6Á‰ñ¼Nkò$;Ïr×¹sÖ|¸•çæ¶auŠÂ÷>åÍDZ‚[]TÜAh•$™Ñtâe3ãõÈ7p.îOžÞ£(±̓ßÙMh˜M¥¾ÍvÜ”ÌûÒ`ySíñxÖϱ\ßÞí*â]¢¾\ Õ5§Y‚§"êÄ085é¢,¡Ü&yÑe4hF$êb`Î cÍ=Kõà¿^ 6Ü3ÕêLß{mœJU Ú~ð{°|ÖžÚïójD Eæ%.¼„bF‰•GаÌi  ` e_È2à‰/6~3㪠ÔKžÿ$§o˜‡>HîL¤m±|g¾£xÑ¢×zEÛ.¦ ]¸S` ‹m.u ÙÒn[‘*vÀÎW7eœuKJKË(ÕÞ)ØsÖÞo»jеfW+BæImÃ<¬q´;R?··,FÀ‘p‰&²·Ñ¢½°®\kjþ„À~z BµÄT…*Óp/8XC-yüb™OßSv›`å”Ö7ùlÂý˜ØtÏ]íœWM+D&Åsá='j ÔÝZ½™aÒáDØOÑõÅ€=³‡Ô¼Ösz+ªÓk2x& ð›yŽ™ºe_eðR“ëë¨ø›bùÛ`.«r¬¡L êSq/øæþ×_|ÃcO´ßî`²+±¾–Ø• 0înÑ]¦K']xo¨+AíR³0×ÞÉ2¥M^áS·Í‚n»úJÃóór¿qh®’™oì8æÑ¢™y|ûá|3ßÕ…]ɹ””t©÷`‘üÊŸUÍ ›(<ÿµé³Vñ•V"Æ_ÜÔü»B&÷c˜?YjÑ,A ­ªNï®5†ËFŸöXèeF€Ç$y<+X3·ëú>,ÁZç‹‹î‚Z„‹aBáŒí¥A Û>Xây” “d‡£mLßä¡‚¦ýÄgO¯É²¯•íê+¡2{FÔH¨3õ”óù×äçùÆßÆï ˜&zHÏY(ÛMAœæhB/y^yp¢hlÚꨇ¹ Á;PÝ“õvÄÀëÝA‰á ŽÈ7X“ç?^€ЉêÑ ÎjõàHžÞ«¢^^ú%i—š¹šìË 6ò¹öæ0/Iæu ݽÙ=Lˆ†ðòñœ†=ÎpgžÌ؇ÙG!To¨ë?A9aÏCTüD·„ Zð<¸Ó…Ú'è^ëÿTuüI]N=©ú‰ÛCPü…2H¶œæ”o2vš4jÅ[ªÄNH±ec8ˆ/· a£y!_6ìJ ƒ2M¥/-‹_>ˇÜåÔóœ¡=ùcô ñʧÂâ@|¸!¾Z÷´cÄ¢Àá›ä£oåHÙ[t‡ÛZŒUÉ®ÚÉõód@WïàϪªÑWsƒK§*ü½\{¶qÆ•‰* %ÂÃû‘òÓ‘ð%*Æÿ‡/˜ÿ¿Àÿ' Û˜:¹ØÛ:YÃüFÏ~#endstream endobj 155 0 obj << /Type /Font /Subtype /Type1 /Encoding 303 0 R /FirstChar 11 /LastChar 122 /Widths 304 0 R /BaseFont /ZMCCCX+CMR10 /FontDescriptor 153 0 R >> endobj 153 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /ZMCCCX+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/fi/fl/ffi/exclam/quotedblright/numbersign/dollar/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/W/X/Y/quotedblleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) /FontFile 154 0 R >> endobj 304 0 obj [583 556 556 833 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 500 833 500 0 0 278 389 389 0 0 278 333 278 500 500 500 500 500 500 500 500 500 500 500 278 278 0 778 0 0 778 750 708 722 764 681 653 785 750 361 514 778 625 917 750 778 681 0 736 556 722 750 0 1028 750 750 0 0 500 0 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 528 392 394 389 556 528 722 528 528 444 ] endobj 303 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi/fl/ffi 15/.notdef 33/exclam/quotedblright/numbersign/dollar 37/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 60/.notdef 61/equal 62/.notdef 64/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W/X/Y 90/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 151 0 obj << /Length1 1560 /Length2 10373 /Length3 532 /Length 11287 /Filter /FlateDecode >> stream xÚí·UT\í²°‹‡@ 8wwww÷ÆÆÝÝ ×àÜÁÝ=Xp îö÷·öÞ+ù×¾<çêŒÓÝýÔ[³êykÊ“‚DI•^ØÌÁ(á`¢gf`æˆÊ‹h13˜˜˜D)(DÆ +{1cÀÌÍÍš€ÿ€<ìlZ–¢]ÔŸ}>pœ¯D%¦¶ÿn•⇮[ÃÌN-‰ [õðÐo”¬$*è_œÊ"ØÂ×ÜÑS’`Ö&ƒý¬Ãá[h^8t¸b<Âç%¿B<˜ÂEG»àE,‚PVNñƒ|[78é¹Ù{¶sö+s›Ê'ä«ñ»wu6iŸ%D=Ü[oõȶÛˆ·ÅÖ†+ðùF»ƒ–ø5æ¿¿ŽâÐ×n§§]šÍÁw¾s~EõKŠ Éøv€,Ä®O|S‘©r6©ƒVîGm›ŠoWŸÙ¶º=à¢ÓƆûµ;(¸.X82ã<àcÛ%Úä°Óbá[ó;?)B$öÝkÝ5~¹¥W•ÝÏ'ϬGé¥ü|ª+†h*XòŽá‹=… !Õ¾\Ä« ×–O ¹ŸƒìêoEYãCÞCıFE&RIÜ&Í‹xÎ`ì‡bÂ×kùöÆ6›”ÓÑPæA$îü–î¡߬ »½ŠÍap;ÑP¯úù ˜£óÃë¨Úèˆîx†7’ÜâDºï:¡–‘L²Ý™Èuãâ"¡[I•¾¼ËR/ôSЮ¦ÉáhbË-èά»¹P84üÂt oàçðÒ¼R‡;†þ’ Žf2wDCƒ+ØG&ý„ShÉeòŒ>Á„10 Øâ÷kíÞ-óÆ hÛ£çlÕ•7xÞ=ªxV5X“§œÿÔusºi¡‡í_Ôñ„¤lEÿ®ö{{2²BZçV?~¸ñWÓ n–-ÖÇBýo4ëèdìó«.2Û•¿Íµ“ŽM0‰ŸŠ„oÞH–çú/mn䌱õªÜc¬ô~×8nC6›ë©——ÕtlûV:ørKûšpÁRèG?¢(ú‹¿Ž/e£ôd«™SêS5vÛ#„d`UžÄĬXôµêórÑEÊ£Y|nwÚG¶v«QѬÚ5(B±’ø—Ÿ>²Ê?½ñsë9sìÌŸJ½ýZG°8†¤XÃQ9(WÔçb”f÷n¿eçí/R±‡]ÂÿŒÕ‚aàñÙÕ="âLü ºãyÔ¤óÚ&h\bÚ€ RÕݵ͎…[{û(¬—âæç0NûøØpnOÇ’±Ù&L,8OºÜ˳đ¹¸:¼‘Îé!ÅÈþLã?p{Äý…PŽŒª?_Ú^›†ÿêr9O yÖÜÔÿ@d‹Ôòþ×+ê­—x;Ï”-s, ]`¹þXÝ™ùþ†›£VL}V®ÈowÓÂ|gQš¼ëw'ickn¥ì½vÙ-÷£æcN IHó@³ùuTX#ôw"ÝÉß<â¢Jqeš`>^&|¥é¾Qx¡dáM¿ˆ˜+*C¢0Yt’2õ­ÿxÄò©„Þù|éÏ’ŽyGos¬e,¸¾ØøÀi ®«l_›­¨æÂÝ/숒Èì+F4q æ—žßT«”Ú ¥ÂPêýR[à¹ñnyËj$ò¹./n³q‚Û>48Á ç éÕ{`b¥gSÁƒz}¢èG"‡ºÜó|ÄžUÏÒš"гK•î8ê `d2Ét[JÇð#ìâ<´ÛÅ<Ú™jíXE˜–îûüfÙ†F2lŒß%DÖè,øÈ«Ò°¨å¬ñø­(þ¦UmŽÝÖBSB `! AgOgÇEBGvÐs]Ù ЋPË~{?°;D±Ãê€Q­“œácR'9[ ·öõìŒË«5;û0`ä =§ZB Fª<ªTÍõ:zÃëúÂ=¼-̾D«ìÍ,$kYKÞ,T“…¡kÛª"ÌšBºÙ$7PTà “iðéÛ/0b†ÀÐEáµ)~‘Vg¾Å˜$®S‹Tæw6ÌlgìUJŸ7&ÀOÔ3GÝÛç„%`ëU®5Á¹•Hn˜=í±á+®òÅÄãñ:×Ô4»Ûö5L€…‘3#´yø×€Šv»°L#ßSï+ä|úëžbQxŸÿ³4¢Ör2˜¶y,8qÝ´"¾Hï\#ýÞ*äÛ»Ø&Õ—)‡r½}è÷$±¾*‘²„TícãPÑÝëÕ÷~ik$KÇ_ÞJ›®ið"×{½¿lŽ\Uš ;.À?åAQªËÑé«Hœ¹^ƒßCc¾$ð …{‡úíãS»êv®¾ÁÃòô¬Ôü a9E£)d™ÅVŸØ±yLlË’+.!äÛ;*CGJ.ìEï ,¦–*¾H¨#;±£7k}v|X²™‘§îÕ˜#±Q_Î=J÷€/£E½þ·…ýùÌ9c-%D9Œ^÷åù–¬Í7¾&êÞ68ßX“$Vôç³ßÇâÑ:ÕFÚŸßò¶.~îv¼½Ñæ/ÇtYt\<ôÊÝ æî=ñc”³Ž!_¨u½Õc˜*îºýzhýü]¢ÏG¦õü8¨(W‘ꋜéYuÉŒ°jéâÞB»]f¶¹Ny™‡{1{LÇý{[ŠÙ †vï¼î^ñ`CÌÁ¶0¼ë|aÔóØt ’r¾}J3¯öŠ<èýî’®›D|Fï¨2ÕØ¶qº )vFO¸^9ÍôžôÆ]Ì—;"¡:‹Ê×AR„¡òã‹ÌªÐ­C ¬8‹Õ°+fÚ‡t.M?Qû–fþÌ âM¥¼}ÏÝøqÚYy)&ʸ#(³œï§2 Ðhý¹ìàŒBØß”ò%çÑŠ%Z1TœÐ¼<ˆà»vdOì¸&:´W.Uå"g-‹¿8ššå3¯¦ùÓŒ2”î‡+.›—²Ü;˜·ÞRô^Wî°¿[$ãÓy®°iIäÂñRéÔ›¢9þªàøÓe@yË‚È7ý}AÃñ'+>–iRË]¾W6Áaø™³\oˈ‰ÆDuFÏÜ<Ý1·¼™ÔéÛ¦^óO¤ã®À ¬“¤Û¹Q¥¯cm *L>;ƒ‹ºj¯®ÃÓË!i‰YH§2s»ä þxL¡À>u=Síž–=ѽÓÅB«Š˜&Ús 6莂cÌㇹ0]]®&®ÙN*‰°OôK²Îô`óÅ>H}%ɼ¼Å 7ý #õâ.ÖPUm~ „ߎ>Ï÷ÃHÑÞ1r›f·ªž&I3S V[wl¾AîÒ༹qŸŠpa"3s¿U¢¢›ýq©šÒµƒ;¶ƒÞzQ^´Hµ{¯¤‚z”¨ÕqÊ+¥÷’¥åì£ðšÞšQÚe»WÅo8†¦°Oí }°NµÝhìw?6ÐE”N‰® k*c½x’ZWcF[—‘k»íÑìR£¡ JýÉP+Í-(NfaÛ)YÒ´pÈ[´b'ºz»=ÁSÝP%Bò¬6ÞÏ·b„<-ÆäÆ`î†5™ÆÊÐ!Ÿ b˜j·çy è0myëvnpç4r’1? ÿ°´†còCˆ1"ܪõ%?s¸²Uåý$þ•Gùð©ÑÙ•hëü×íÖIB….\r²7ÚÛaGé•שî[‘«Oj±[ï5~™å¥Üæï_Þ¢ÙM ôrôÈe7MÔ$èÈZ?…ÉË]x9µï—Þ¡üJ3#ÝIž§nÏmÀß*ØÌ@•»–—zbv™Î¬áÕÒRH¨°ÅûdŽ—ÍHÆcpnuIÒdËFpì§5ëM¼~âGÊ‹&úèŽÚ®ä‰éµ 7‡œUâsùNu•òÚçàn…Ñ0(ºW¯²cŽÉ†+¾õdiX'yu÷D'0"(b®sR§`ƒ$ PD7êƒ0_ù£¦âƬ ¾F‡•vµ!tú€–H%\®Ì‘ª¢ŠG]ì-SÍûWôxí,X|ß„Ã;än&Õ²CÞr̸@ë´–âIÄ[¼£Ð뙳ŒìïçH&1¥Æ²j¨#ÆßDˆêÈ4†çà_¿ ½eý¨_ÎÅôaư¼B‘h&›‰ñ»~ÕLËF½w;‘h¢0<ž[ô“åÈa^'É’šRÎ4®'½wvÚ/ü1îÐQ™}|ŸÂ<ƒ!”Tc8ñwÑê´´¹|½ TdNÎк;ºäÇ\gŠþÏoc¿!ÛQù».™ÆÍ&0I©We)wÌâÏ*¹‘±[éë•—¼Äîºä bÞ|{—±L ºÙ²Ÿ·3r>qf鯗<§“AÕMåA¦†êC2›ÔÒ»!öºù¬ø hß§Qay¶o-ö 46©œœ¨4æ“‚¹ífïÕRÑ{–‰˜è8Ío lz×'‘¸~ßkêŸo>šú›ªh%ŸÀ¸^ZâÑÅK@GùW*Fxæ¬>©…c·–Íë„¥vÛ.Ïߦƒ*Ä’;Dé·•ÿb˜rA3Ÿà“sƒE+´(Tz«?}éåíjºýæjÖRó#9dm½ óÇX@9ŠÂºå—x#ùi;î$ê٤µN$o•ËõrçÏ$"ØT‰’,ÔçDEŸ:]¿š¥J`{Ç\'u7˜MÔ‰f™«˜cJUÕ}IYÍBûI\ƒËöf¯È»ä7…U¬ØM€8~üÄ9 ׃Y‘Áéó]^ÀöºYˆ£káʼnJGVÞ/ç1aâÕz Þáõ Êl£Õ~oÍR/ ÷=ý´I…·w§âýÛSfsöF†’3PÏt¶JÇ»P”z•gŸù"»Ò~ IOûûšÖ}þ}¸r´~þqæÞ&Ç>wUâÅ6Ž8¼dáiצÀÕŽvÔö°[™Ç×R™ºå:axs2¨§{¯öÒðžì-lÍ:ï£Ëáö7çã‘×8É’ˆ¼ó¿|ËÿZ°X.7ÿ]€ 6ò¡´ h?—P‰¨N 8)#4œt³4N-åL«¨VЛÿ©¼R,Ô®K¼¤æh?N“”2j`7©Ve y̹z—é¨BFà̰|³²¦ ù^½¸y?dø¾ïôŒúìÚŽê%)¯•}ÓEŸ„Éuÿ ?U&uŠÖ¤ÞÀµÈãþCèŽÚ¤¦žAÞî°'{«€c¯uϾgú!ž¾÷quÄݘ +mÄ£NÇc*£Àà•GÇÉ6ê¯âÃç)Ê Ç‡ÖÅ(¸©ä‹ c}Ï2ö¿“¼èSÌi ÍŠ6Q 9Å¿wî]o”*µõÄq.îÏ*›ò1M”óû´Ï5ÌÔÿIrâÐøv×ëh$PuºØ„)Ññ –dž‚ú8~Ä*®"ßÝÆKšQ~?¢NÙb ñnUŽ×Pñ–ÚÁÐ@;OA°}Zžå£ $ ½Íºè¡Äor6†£\µ‘-d#Ñ}á·2nÁÖ œ|²>r¼I/çú„ÏL»X{7í´­f/«“X‰£i˜ËζÚg¨#4:âšÓB% jT(fËÖˆò³c¸yCi‹\ú¤ºHu8ܾ.,Õ1!·rB¸R\À0Çùô¤TfUu©â·mˆ"n—ßY¡&¢[vÈ¿›sÎx˜Ì—v0K2‚—õ ¥6õkT’ÐU9ï¢øbæzM*:ʾT¾…ŒÝ,÷MÜæÓnãÙ× kj=uk–øé/â.²EÕl,goý¨Úc1Á1ƒlP0ÕÞÖ€hŠFæ=)B²…íàõDj¤¤ÏÝè±Ïm%Ÿ/ ²é‚xõL¿ñJ8:.Yx6a\Ƹ±:c-ž³ôÒ©Y)Rr›f³»†á(¨W%ýva‰´{ßÙ5pˆCÝQ‰y*+»kÎÙÓzöºïÜ],¨Û'g×(²^ˆ×¯½®‡7ËÚ;cìªW6\çÆ[l89•!ÊïA™£ßÄ ü>_íc7‘Ê¥èÞ-‡¤NLUwï8£hÄïÐ2…ƒY]¸áÝ‘ÿžÇ­f—ðj›Ï\b%vB¦>ý^îù–h'šÙO¥%V}³&šPJ¬Æ…}o;BM£Vgvè»:}ëø5ãÿ!¢…Ñu%âp4`®Ä§õÃ Ç ÙE)¢‡é6ó5äÊ®.†Ã^N@vE±¡všÎ:ÓÇíÿòº¸dÖd5{eZĀءÓ× 3ÉFJPÁ¹Úd¡ÒÒsG€$/l±G¥3Së[U&±Ÿð«Wľ¼|„æH1 ¡‡%Ã^ Ó¡B°2D–ÌN¢FÌÏ”Mÿä4„ƃZn–ƒ^ß2_Ï•x¢ ¡éñ.„F…‚ïï¨JÙ;mÊE&¾jñоô±Ä€ðßZ—½"ˆÕ¥l~ìðŒ 4 ìJÁ¼–´Ö`Øi:Dž~D¬èo‘ÑÎI‰àAÏW€†Çn¹¹" †ÜÑöú„uÒ¦ïðFÆ\„Î{KÑòR.) ´ˆŒ¿(¬$†áuÎÛóäÕyè‰ XÜÚ–—¿x‹ Ù‰zÖ‰?ž1ܪòF( È%˜÷µ¹­QÌõ‚½LyX8qÞSÎÐb 6›|s@ç´Í¡&Žsõ]èËFîÕP’Ւ使x¸ Ï¡µ äX°lt©™ é`T²:{ÀaÕß ÏæX‚½âd5!]î|¤g—ÎCµŒ¥Nÿ¸­‘ëÏyÀÐFKd¸ ?¨H¥,]Ó×ÖyÉ0P W÷Ãu3*¢×E™{ܤÎ~¦éT`‡\ëq)ä…:«õÚ‰˜DkáÒ¹›“ %â~ö½äÒ‡ ö”l)±}¹0âÂŒ¯^)]"ë°Ò(ðsÚ†B’Rdcöh<£.D‡E%ˆøØ½râIÖZñdé üDMÃtûƹ3\ÙçZk:÷,Dè<œ×bÃIýü?Ƀà±ÎØ4 ¥áÆPì"èž5QüŽìkìÐâ*È”åF³ƒõWB™ôö9µcnPõl%?ÜCÝ[Y­"Œk¼·Û^R­N%Òöi?]´øÑôä‚àâ|²v!вåÎÔVéÌ÷‚‚n%ßêtÒŠœmJqýܳ]û]u#СhÈÔ‚ ë»È ýñ<zþwÓ3¦ê¢[~ÉwÈg pÆÊMÜ™mΎܽû?ß| b<òP}/ðñ¥pV%£ÑFàÞ„ˆ`äüÀ{x-k;È&ôõ%øÔî ™œ çùâôq½%Riî€I…³Áϱ7ìç¯ÈÈÃ$eæha—ì«& aTTÜD¿´B÷zÇ´3Sç é}µà\?›8q§6÷×U+ušÑc¥/Ìä³#¬§±¦ŒBž_ëCI~Ó1® m¿LUèi_ãÿ…qg±Žðï†À%Í"¸q6L0Bõé¶=–¤\ð?ùé(b.| @°%ÞFÉg¡GƒBƒ¿V,Çáß¹4òÕIÀ±VYŒù¨'û½¢BO5F- Ô¢–&Ùó =æÀC,†×ª}–Äã ½·á Ã6-Æ¢× ñ®WTŽ:ù,! ËÒÞ¯ŠæFòÕ±‘åý[•»ç¨bÖÏ+<èæ˜6‚¸ ¥O%[¸$¶K·¡\¬zÑ(iÀë[â·d7²ìóy~½Â3Ãdm+Pš~IÃÖ0œ˜sË: Z³ËÕ²­M;Ÿ ;ù>Ä@%AæÅS/é|¶7ü¦FŽ„v]ð‹h§Úg6N¯}E¶ò»ºÓ!®C¹©ì‘NQž^ýžðNnE¨‘öIã ¼˜a¦&ž·ý󭕈РòÂT¨! G¾wwyÍ¥ekð^À£¨¨…ɿ奭øçId.a‡ 7£š¨¼K~º`ñ¿v™;?Yl‰Ì1Ïð–Ѱ¥f™!ÿFª9 ~}ðƒTÀ³(ÓtêD³µwùBFá\À-.7ª„Ÿ¡˜#4ïttºø&Ç@S¿U‹Å°‚o.ÎÜJ¢ÿ§×û=QW²¥çašAO²PTäÏ¿ó¸vÞ—í]ÝfôîL¿[$'ÈÌ#¬©(l<¥iÅžŽ¡³v@jbÈ»¶B]S¹x¢áXºM¦‰y­„Ó.ßú÷cMçúk>v|VÍðíáæiù ùˆEUÜÆŽW"BT~|½ö¸{çnfÈûy|Ê ¦ÌJWÖ’šZèLrwå#k6ÙûDš¹l¹ão°qO;‚J›€}yÈ6]|ß_DpBaª¯×jE’aF¤öz=ýdT–Ò¡>.³‹¡F#¾§›CÌE¹FŠ$Ó£ß*N,]¢~g¤–Ÿxg5iÕÙ­ÌöC,ühŒ oríŠ8LÉ ê-ë r# ÑoÕõT¡“hÜí7c6$2÷%¦ŠJ©•õ‰˜ëdç—dÈÜ%ëfÖ÷Xz=¬—6(È×+"|»ƒ~Ò€é®Y#€U£QËÊA mŽ|*ð(Ûš¨¬´ƒ{[¯W8Ö‡¸¥n%6òM[ò_X»ÐÏòYù\°ø)ò4pØå:sŠ—•ÿ¡­‹ÊMñÙiùË•\ñ·ñšIìã‹|ñH/‹pcI“X5Œ<=øæUv|Úq‘oè€Qù'Kþ°Ë:ÏîÍ'º6}ÑÈ-ΧHœG¤8©ŸA{È]a޳5O¸ƒ7T2î7´ì(2¨FÕÙMl ò³Êßxè‹V)ï)Äˤ²]‘4‘¿ÚŠèÃâ»~é«ÚŽŽ>Œ>ø4žíå„EÉÁIŸ”ŒzC ¢ºQøö=[À¶ß5–Û ÊÞ…²9Ea%7ºÖÜéÒF—ß'2 äë"Q’7ÿÞR-㇢”P™&“[F2Å,oËœ“‹~ýIž²á´o 4íEiï+ä²apOøÊ¢‡±“J‹“ÞùrF-kÃU;»´¹fëP/;ScšÓþÒ‹èâµuƒ}Hææ”DüÌÐç4ˆIÏ/}ôÅ«Â}d7>–½fHåþ (ÆYc¬\j<Ð9is_Ú uðæú×Û/sZ~)=ÝLõÝL–w­^W>È”¼§ˆÇ(­&5ïf:‡O,Ì×^¹Ž©êæ iËÒaFŸƒÔçæJ:ô G]U“„}›1áÏRh¸Š#|ml£eºLWe𸈚’‰¼ØÓë¼I³õ¿ÜŸ¦(øëËúI[IÙºpVZ;÷¬eIò›oç N¿Ê[ÞgÂ÷üT¹o¹<ëÒh•8[ÇÔa²ùmœÍ4‡N·LÞ¯ãÜddKYºÑÌ4`ü&ßÍ¿4rS+øÓøúÊÁŽÂ`üý‡nŒ³TÊF8¯ÓNB½H~CY@àÃk£eÒÁÁø[]Ôo¡ÁqSƒORø³úן«ë>rA’•ÀV$r*ÄÔÄó«Äúâ›R„´ð* õò$×T|ù%: uŽ“²ní‡Áo2nÁ„Öl×Ôëb w¸‰þÂ…Bºf¯ÆvIÎKG±þq´#¤ü¤)ûÅUtZŸ2¿°Àß}ÅxT|R˜‹Yÿ©„òn3ÞßÍ.Ë¥m5\âB°èæÎÏ ‰05§)MŒÉÇMØ ÙÿWmÇE‚ࣤòoAÛ.e y].]»¡ñw©¿]‚¿lü’P~'*ö뺤ú Ç¢V™ô*Ó zƒìwÂFÅÕMh"§þ9Q „”·|⣮~â0 ’¥jÉ·ú*„Z_+utŸÛà2§˜N¯6­€Cã<ö€›ƒ Ñ£Û“»Qí9©‡i‰K–ÁSKß,My‡úo÷eó»6_îí?çA#õDBBô^9xÉá¨`e.Wù/ã.‰êÖ °È)mpà_pîz›:û#Гà×±s1s˜óyÉ×|UIeû*½š7c\ Çngœ6Ô–/æWÃDPAúV:÷þ~Ž©Cp†A¼å0ù¡¼³í¨{˜p¤þ\«W/gõ^µ¼¬¢JùÁcEíJÀÆï¤V¡gŒ67OW¢ wÞå{%߯žžýÂÜÅ5EDû³¡o¨y‰¿&óXÛ†±Uâ;®ÐSÝÏfqûÅ®kRtŠ/¢Žµ"6†dª6ñꨑ–^Ï,jú¹zM°³«nTÓl~kp^±rŒ}4EÌ&_«Ôã%çÿ¶C‚i½#†¸HóÀÉ^ÁÚÞ°,TãÃwçñ€³«ØùD“K)%p‚ƒEõ¸UyW MÖûImqK^›³dÁÕ+vG€QpÔ"æbËAzÑ/Ä'lÖàï9³!iaј~éüY¥ã «¯oí^^ •-ƒ#<ÜÄØ6;†/—b¶nv”<Òº8ïÊøêÏ›¤eÈ Ì+6ažßR9´ñêš²3êéY? åÞ¯ÄÈbÄ+hµ#¹×ð‹Æ€`Ö"™£|Hs8G ýÊtäo4Ú`žáyQƒ2² R¬—ÎH{/ÆyFBxÓ³*ÿ‹_M-˜µÅ~Mj Ÿ×¬’D(3Ù£øå%…nÒˆü±Õ‰”¹á³Ï(Î8”š£€ð’èÛdNc/È)o݉0kп8Û¦žµ­òãí×PZÕ›K’+§ã=“¦FÊçj˜ïê^xŠ©™_9ê³QÙ¬Pfd‘(½œãõ{Õn¿nRc²,"në* ît Î}L““@Ñû%ÜÞo.n(9,µiy0nÖ++Þqk@· ]¶#†•˜¿ñaJÕÈC@„äUm…‰Ád§¶ìý̇€Q¹ê:Ð¨Š«òKæ7µð~k·Àδ¦7F….É rײ¯·nŸ_ÔËÄ{¾ç8tü¶tÐ`7ÔN^^ô„ß“ ¾j*R±›¢ˆØ®•ë/Æb[ï­z—Ð.3®Oe0H÷Ié„ÒßC^ˆîeÛʶ¼80åK}lE"]HÉúQ6ÄNeÑ·¿#øö#›»µ£¤metê*¤Žà°˜T¾3BO8³Æj#…Ê@²'?‹dñ€©éè*ÕRIÜŽ|Ìž"ó7–v½6t3-]l"óq&¶ÿz:fZebÅ”êÉ‘a}†{EôÍxÃÆgUíó”ÄÏ÷‚ÍBĈ@Zó §ß-ù²Ùö™š ƒÜÜv%Š«3üzqŸ!2¡ õ¦©Â+¾Ì q{ÉÔÏÞ×b7)EÀé/+1± [äâ?î¾~ھɎú¥Ö·Í]Ïe‘ç:wl÷,À<ò+YÒÂî\ I#ÔGR¿¸ÆTÁGufA–ÇCõM·Fó-¨ÆdW·"9lN¤|l9ÿ …´÷Wúø@/¥#ͺ ÒC«¡Ò dA4R&·iEîõ ¤«¥m}-g˜¹õU!%þ+§ æ@Ÿ“(kØÁ°çkíY{‰êQª¡#¥}&'ô'‚‰ã€Évæ¹òÌæ<öšˆ¬­Ö„«ùÔ[Ë>v|ñݹL¥<»»ü®]e7…1YBó ÄÔ{Ê[ ŒÖž°µ5`e$³†p±ò“ŸM™2¦UQöY@ßã:,÷4ö€.&Kà´0á.r±×F¶6 H›5Qe?PšTôÁMf-ldÎóÂKø¶ÔÇ핳kñ¤…sæ±ö¶ã¶Vùæî¥ßû¸ÃƒýYÞÍî'Þn¡&R„u~ ×^Ëj—£wZðú:"»±Îþˆ¹1»üG„Mó)BTì†Ð}H ٞƵªvâsž/Œ 4Œz´º.Ô‘]¾5öx>ª+7ËÀ„°û $ä4E ±Á­Ïs(UçÑø¬ó¨3æU5Ã6†à¯O:=Ÿ E“bÖZx^„½}!м–Êuñ&àÜFS,Õª¶iý’$Ýi°Ô&!üÂó$JÄ\¹•y5†ü–4Ýü¼Îôg·*°É_òqã«ú¿j\‹|ß6™‹ò1Õ~ÈbþÌ9vHÜ…d½!%PÑ`pÚGµ¬Í¡€YÁ÷P‚3E…N¥eµ•/—óÈ궺*Ùñd®Èe¨!**:}X­£$ðkJ”rÿBN%`–Á.±9Í{K“Íq¸Ús¸¼‡A9qrÿ<KYsr*–Ùý¦¥ÔT=Y®¥h)øžNL…Þ¨tô§¹{fЄaN÷aâêv}s¸NÔ'±ì’aãU†A©Rj}ÓÿÃâÿ_àÿLmÆÎ ;cgÄÿþU‡Åendstream endobj 152 0 obj << /Type /Font /Subtype /Type1 /Encoding 305 0 R /FirstChar 12 /LastChar 121 /Widths 306 0 R /BaseFont /TWAVKS+CMBX10 /FontDescriptor 150 0 R >> endobj 150 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /TWAVKS+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 /CharSet (/fi/quoteright/parenleft/parenright/comma/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/A/C/D/G/H/I/M/N/O/P/R/S/U/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/y) /FontFile 151 0 R >> endobj 306 0 obj [639 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 319 447 447 0 0 319 0 319 575 575 575 575 575 575 575 575 575 575 575 0 0 0 0 0 0 0 869 0 831 882 0 0 904 900 436 0 0 0 1092 900 864 786 0 862 639 0 885 0 0 0 0 0 0 0 0 0 0 0 559 639 511 639 527 351 575 639 319 351 607 319 958 639 575 639 0 474 454 447 639 607 831 0 607 ] endobj 305 0 obj << /Type /Encoding /Differences [ 0 /.notdef 12/fi 13/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma 45/.notdef 46/period/slash/zero/one/two/three/four/five/six/seven/eight/nine 58/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 71/G/H/I 74/.notdef 77/M/N/O/P 81/.notdef 82/R/S 84/.notdef 85/U 86/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w 120/.notdef 121/y 122/.notdef] >> endobj 148 0 obj << /Length1 896 /Length2 2892 /Length3 532 /Length 3513 /Filter /FlateDecode >> stream xÚí’y<”ílj,c+’-<¶l™1cŸd_“i’]dÌ<Æ c,‰lE)¢QB‘hDc/”o‘5TÈd/5q¦:ïûv:žó×ùœçþçù^×ïºîßçºnôA-sÉ´!)Zp( X::Á 8T¢¢bI1<‰h…¡€HndÌ#„6×Gê"ºÀ’J%ã)€š¥úw‘`’ñX pÄPÁv,†$añ … Ì Àé{E8à†ƒäH…Àá¥~`ž}7dOô'?øˆÐ?S‘ 9œm Pc›TØq$" à@ Ebß²ü7LýÞÜ&‚@@aB¾·ÿ>¤KcBðê?¤Ð HI8Lü]êþôæâð!¿gí)kN €€öÏ>Ü âÐx 6ðÇÂÁqˆûÝ{n?,ÀP®VV¶(ÍŸûü‘CcðDŠ35ô¯®ßÅ?þ7³§CÆG^ÚPmm8[È>þyÿv—5KÂá‰ì¡§`Èd Â~lÒbàžˆ£0šm%’(ì€=“£€?‰ ù¾N³ûúIFlÿ_d¨ Àœÿ&æö±w ÃüEpm¶4ðo„k0â/`¤_}gè/È®%ÿ‚z,üÔ`”øï3¶° EÇhéèZ=mÀHW0Ð5:ú/:l™ )?ž/{Q²?ž½VŒ±¡$ì\FJyœuñ³ë›58-ê΢jZŸ·$fr®v:„iŒÝrÿZ‘/&<½yZ>jM&<­9ö@—ÍbBØÙ¼þõéHßéü# 2îïó©S¡Š¬ÄY‘&FßÊœçþÞ±?ʳ=J:hKf‹ÐjVÎoyG8Ú¼"kÛ ’ô Ümò .©É·vê(8mÉ +?¡›ú2jKö9î—݉qA©|õš#ˤæѯÅ|—³Öóú\.‚ˆÓç7÷sÑJdÕÄóÅOsUJÔk¼*©xÑ5DRí ©s(Í{máwì3g ]¸ €/xdz¾;IÚäæƒjûç±fɨ‰µ MÄœœ~—;Ž˜/Æ%N ¦aƒ¦×k†Æ^jœÉéH®òšÍRœ‘ÝðQš5$Š–\z¼ú¥¶ý"ñÃÓkÇ£‹è´k̪ý7•æ?O52ôv·½w½"£n³}±1cÅúæ^ûØråOöô[“2vÅégy-£ çóγï·#»Þ±Ù«”’Ô¯zNÉÿîÕÕÁÊ•W†uÙäÞr¡¼P)û Ðeh®m#á<½c ¤zWÌ"c>È6žÔ>RB¯tG1ÇoKª=¯ÿœ„qo¿˜ϞЀ×êÙ$…öõ©Ü;lð¾¯Pä„uF¸äm(A¶¼·-õ¾¨º{# º²½ vç¾O=‰´¦43ŒÈ.¡XØÄ¥¯yŠ.\žý*6¹"‰ ½Ï…+ª?pñË5o-5(m25ó1—*5)¡Ì«\™rÆÎ…•ÇL¶:M'ˆžÇH¹u“!¢+pÕïDin”%+AÁñLyë=V<‡˜BŸQTKí[áTìúÑÌsõ©s'LªÑèÀ²÷9NÆU–@ñ.Ê=…OFÇÞÕTꑇÊvfkOò¾q³PÆH$¯©ç>¶Ëh `{ŠVÖ%¤+¥@™\]F¼Xç P/l¤|*žÌ ubÑßX…Õ!ɦ»Wj媇„-˾A[f¥âyw@«Hš\>íe–’—²4»šÖížÜ‡¼™‰ró’0ÄÎ×ÂfœHå¸ët{p“yÛpî28Ê{ü=Ç€Š@›H:oÑ/í3=OI}Óø5•ö.ç¬~ЈTÓ)P@ŒpÇö”®ïèV£zÝÝŠ7Ü…Å·ün7³ü–8‹Ž_oÏ|¢ýÈÂã´¢{ Íþ@ OhÔÚ3»ž[»öe”õ~mp¸ñHÖ¡'„ŒVð:žˆkKwL”¨lªùt¯3ÄëšÀ¢9§ =:‹W¦ÕEkÜš¯sÞ*½èŽHg¹ŒèCÍò\Ävº™É’Z ú6‹Ik3§sR”˜K{ÂFñ^ÜZ©è¼c”gzY «iUˆ,tª g.7ðaÒðÃS—òLO¢æÕ”?¿b¶Û)&`ÑÞ§fF ‹ ç—ÜéæŠÉî¯j](¤Ò|©Ä,þÁ C’›“Ô ß˜Ýw­»E ý¦Sf¯‡Kàò‹f³÷ªÌ¹´+Ò±H…DÉ4¦94¶ÉÊXAÇlŸŒ.†iïÇMÑâÛÝ`ïžÀµ1‰9@Ð}©‰‘¬Ý$â:Ù*ç~ÏÓý¼? s‘™ÔW!¸,õò™lC¦©úµ®ŽEzî-—Q•Ã7x;Äd®†$ªZˆ†ž ÔBäõqu•õÏ~NE¨îÁàþ+…àJòrõ²íóƒv=VÁû®U]Û”~3ˆn‡ð;W¤ï˜vαäu:«Gg55í9KV\ص†÷ aYaŸÓÀ©¬×8õÇØ¹:l÷ÀÒbKÏww!áëÓtnßjÚ̽Âêûì” øBi7=Rņ \nYlõ‹kÄtzz…•Xhò6¼È£ ßqâT_F¨äø)¾— Ép=â¤b „?‚œWË._!”{,â¨M’Î,Îz¦ Œý;¼``–ˇ°‹‹ð-ŽÞÛ[14«Æy+Šÿk«RA3Fg2¯Êöþ}ikùCEOÓÒ JĹ3³> €ÖŸ2/0çJ}]4 «9óhÖ…/¾ÕÇãŽø*$Õcrw8ÚÎ^?&x5?jÉ~£y>¼ãú*\ÿµGú!³ÔÓú[œ ÃÎ]ëÇ“œ¯˜·ï÷f ÐÔ£«¥å†ªäË=Ã4?4¯Æ?XŠRáç™4eñ½3Ò›`&r­éw—KžÏÌ ¿SöqôØ) >Å\±[QÙM|äÐü$º¬Î;ÎsRQgu"ÒCeÊìö+OBÇ/`éóƒñV¾ÚŽhäËÕwQ¥Ýïn ú¨G|w{6Žz*=ÚV>SHMÙ˜ 1Æo~ÿ‹´”°jƒ%ª ïSÖ¾±^$R”rÐx¢S±m3#^ÜõtDŽ©Ÿ€󂱌4–Ù«f'Qµyƒ}È¢—Y/•ß#¦¶x•NÑG«+vÃðƒUi£Ã 5˜ç‹c16šÄ¶k»CS®€20Í{×Oô¥‹œÊÝ­:žœùGä7uáÅÉÅÖ•“±‹ŒéÅsÃ\t¯âx¹uâr-AµB"´´t+‰Å='²BË’£yy–Lbcýj¥Ë}š½0'èÙóÀÜEå´¿ÙÁ}GL…ŸVÆß’E*E;³*ù<¡fÒuí}€O2­èb¸)zk°÷ݕץɱoØÓ£OÓŠª8Q|–ѱ:§ù5‡ÒBê7Ceå…]®é-hEžž}ª©eHOx"Z÷]Œ/¨|÷RDk*J%ö´zú»OÜ"ÜŒ½m|4¹„gÙ)-c½ûýÖo¯.š‘BržÕæ^Æ X~êžk¡Yé=ܪZ‘kËžh`^?Îûfõë€H(‡ÉÛµ-N ü‘¾tÆõç_ÛïøÖOˆÂïIJ÷Š}öñIãfvîiƒëž!-™ª&â"»[³ãLe~‰+¨Þ;OÑ”c¥¿|ÆuàLË ,™¥Njßâµ¶zjÙQo“*40lÝÐä.ÇÜK&yvŒt»Ä㽓ÎãWLø§µ/„Åöî+Œç8Åë<(Ü47ú%HR[gÚ2+pQãÃ/ó9ÍöîæòÊ%JVsåË~‡‰Ù:c›9]*Åÿ+%·eÑq\þ/ªàÃôXA5éfíuõ ªDØxèø«•Œ“Êžiꉙ÷³f–)¢àî¬hE~»ü‰yA‘“ûý…í‚%] ){Z4i¡âN¿ƒMuñ>Á?íØ{kVìaN$~<‚{TÖ²"'©?L³Õ7Ý×éwDvGûÇš3ŽO·¾‡ð` ×3¤Ïx,"ŒÓ¢Í ….*VÐè=?îî!ÛN4ʆÉOä$.Qʲ¼ÛM­÷a!®µtö\ÑQúÌRäçÖ¥j­êQ î†-z‚L7!YÁ‘ ÿ(d?xJ Gà>÷ã.;qÏí½Óo_6o+߆t1>¶6Hõµ ÒÒi~mSÞ£ œ,óuSwÔ¾ Uã~,ýÈ­Žþ\↌vWCkñ­.?QTÞC4ÿöì´ãÒ L ÚS³o >4œ¶þþæT昙¾mÀ_âê'Ñqº23YÚcr’eÉEë´±;ÙBÊAæ‘Ø(‡Ì§äÌY5ñ·Çûµ¯z÷‘ýÎN!…™ï ÜÝÃÙ¥¢•ÙZËóËR¾PWþ[:È-\wíÓ"“S$qÜ ª°í3‘H*ÂÛdE¯‘ ^לóxdæïåÑa]v´‹5´Ëge,è@@úmã=µ·û™Æ½&Œ®,n®wÛìi:¥Úÿáùƒÿ‰Xˆ!SH!r0äÃmendstream endobj 149 0 obj << /Type /Font /Subtype /Type1 /Encoding 307 0 R /FirstChar 72 /LastChar 116 /Widths 308 0 R /BaseFont /NVDDGN+CMR17 /FontDescriptor 147 0 R >> endobj 147 0 obj << /Ascent 694 /CapHeight 683 /Descent -195 /FontName /NVDDGN+CMR17 /ItalicAngle 0 /StemV 53 /XHeight 430 /FontBBox [-33 -250 945 749] /Flags 4 /CharSet (/H/O/T/W/a/h/n/o/p/r/s/t) /FontFile 148 0 R >> endobj 308 0 obj [693 0 0 0 0 0 0 720 0 0 0 0 668 0 0 955 0 0 0 0 0 0 0 0 0 459 0 0 0 0 0 0 511 0 0 0 0 0 511 459 511 0 354 359 354 ] endobj 307 0 obj << /Type /Encoding /Differences [ 0 /.notdef 72/H 73/.notdef 79/O 80/.notdef 84/T 85/.notdef 87/W 88/.notdef 97/a 98/.notdef 104/h 105/.notdef 110/n/o/p 113/.notdef 114/r/s/t 117/.notdef] >> endobj 192 0 obj << /Type /Pages /Count 6 /Parent 309 0 R /Kids [142 0 R 194 0 R 217 0 R 229 0 R 237 0 R 247 0 R] >> endobj 263 0 obj << /Type /Pages /Count 5 /Parent 309 0 R /Kids [256 0 R 265 0 R 271 0 R 277 0 R 283 0 R] >> endobj 309 0 obj << /Type /Pages /Count 11 /Kids [192 0 R 263 0 R] >> endobj 310 0 obj << /Type /Outlines /First 7 0 R /Last 139 0 R /Count 9 >> endobj 139 0 obj << /Title 140 0 R /A 137 0 R /Parent 310 0 R /Prev 135 0 R >> endobj 135 0 obj << /Title 136 0 R /A 133 0 R /Parent 310 0 R /Prev 123 0 R /Next 139 0 R >> endobj 131 0 obj << /Title 132 0 R /A 129 0 R /Parent 123 0 R /Prev 127 0 R >> endobj 127 0 obj << /Title 128 0 R /A 125 0 R /Parent 123 0 R /Next 131 0 R >> endobj 123 0 obj << /Title 124 0 R /A 121 0 R /Parent 310 0 R /Prev 119 0 R /Next 135 0 R /First 127 0 R /Last 131 0 R /Count -2 >> endobj 119 0 obj << /Title 120 0 R /A 117 0 R /Parent 310 0 R /Prev 115 0 R /Next 123 0 R >> endobj 115 0 obj << /Title 116 0 R /A 113 0 R /Parent 310 0 R /Prev 59 0 R /Next 119 0 R >> endobj 111 0 obj << /Title 112 0 R /A 109 0 R /Parent 59 0 R /Prev 71 0 R >> endobj 107 0 obj << /Title 108 0 R /A 105 0 R /Parent 71 0 R /Prev 103 0 R >> endobj 103 0 obj << /Title 104 0 R /A 101 0 R /Parent 71 0 R /Prev 99 0 R /Next 107 0 R >> endobj 99 0 obj << /Title 100 0 R /A 97 0 R /Parent 71 0 R /Prev 95 0 R /Next 103 0 R >> endobj 95 0 obj << /Title 96 0 R /A 93 0 R /Parent 71 0 R /Prev 91 0 R /Next 99 0 R >> endobj 91 0 obj << /Title 92 0 R /A 89 0 R /Parent 71 0 R /Prev 87 0 R /Next 95 0 R >> endobj 87 0 obj << /Title 88 0 R /A 85 0 R /Parent 71 0 R /Prev 83 0 R /Next 91 0 R >> endobj 83 0 obj << /Title 84 0 R /A 81 0 R /Parent 71 0 R /Prev 79 0 R /Next 87 0 R >> endobj 79 0 obj << /Title 80 0 R /A 77 0 R /Parent 71 0 R /Prev 75 0 R /Next 83 0 R >> endobj 75 0 obj << /Title 76 0 R /A 73 0 R /Parent 71 0 R /Next 79 0 R >> endobj 71 0 obj << /Title 72 0 R /A 69 0 R /Parent 59 0 R /Prev 67 0 R /Next 111 0 R /First 75 0 R /Last 107 0 R /Count -9 >> endobj 67 0 obj << /Title 68 0 R /A 65 0 R /Parent 59 0 R /Prev 63 0 R /Next 71 0 R >> endobj 63 0 obj << /Title 64 0 R /A 61 0 R /Parent 59 0 R /Next 67 0 R >> endobj 59 0 obj << /Title 60 0 R /A 57 0 R /Parent 310 0 R /Prev 31 0 R /Next 115 0 R /First 63 0 R /Last 111 0 R /Count -4 >> endobj 55 0 obj << /Title 56 0 R /A 53 0 R /Parent 31 0 R /Prev 51 0 R >> endobj 51 0 obj << /Title 52 0 R /A 49 0 R /Parent 31 0 R /Prev 47 0 R /Next 55 0 R >> endobj 47 0 obj << /Title 48 0 R /A 45 0 R /Parent 31 0 R /Prev 43 0 R /Next 51 0 R >> endobj 43 0 obj << /Title 44 0 R /A 41 0 R /Parent 31 0 R /Prev 39 0 R /Next 47 0 R >> endobj 39 0 obj << /Title 40 0 R /A 37 0 R /Parent 31 0 R /Prev 35 0 R /Next 43 0 R >> endobj 35 0 obj << /Title 36 0 R /A 33 0 R /Parent 31 0 R /Next 39 0 R >> endobj 31 0 obj << /Title 32 0 R /A 29 0 R /Parent 310 0 R /Prev 27 0 R /Next 59 0 R /First 35 0 R /Last 55 0 R /Count -6 >> endobj 27 0 obj << /Title 28 0 R /A 25 0 R /Parent 310 0 R /Prev 7 0 R /Next 31 0 R >> endobj 23 0 obj << /Title 24 0 R /A 21 0 R /Parent 7 0 R /Prev 19 0 R >> endobj 19 0 obj << /Title 20 0 R /A 17 0 R /Parent 7 0 R /Prev 15 0 R /Next 23 0 R >> endobj 15 0 obj << /Title 16 0 R /A 13 0 R /Parent 7 0 R /Prev 11 0 R /Next 19 0 R >> endobj 11 0 obj << /Title 12 0 R /A 9 0 R /Parent 7 0 R /Next 15 0 R >> endobj 7 0 obj << /Title 8 0 R /A 5 0 R /Parent 310 0 R /Next 27 0 R /First 11 0 R /Last 23 0 R /Count -4 >> endobj 311 0 obj << /Names [(Doc-Start) 146 0 R (all-users) 281 0 R (automation) 269 0 R (backup) 254 0 R (backup-script) 262 0 R (change-to-the-source-directory) 226 0 R (cmd-cp) 243 0 R (cmd-du) 251 0 R (cmd-logger) 250 0 R (cmd-rsync) 244 0 R (cmd-ssh) 245 0 R (conclusion) 286 0 R (configuration) 234 0 R (copyright-and-license) 207 0 R (create-the-config-file) 235 0 R (decide-where-you-want-to-install) 227 0 R (disclaimer) 212 0 R (feedback) 213 0 R (how-it-works) 274 0 R (install-the-program) 233 0 R (installation) 220 0 R (interval) 253 0 R (introduction) 204 0 R (link-dest) 252 0 R (modifying-the-config-file) 242 0 R (more-resources) 288 0 R (motivation) 215 0 R (page.1) 145 0 R (page.10) 279 0 R (page.11) 285 0 R (page.2) 196 0 R (page.3) 219 0 R (page.4) 231 0 R (page.5) 239 0 R (page.6) 249 0 R (page.7) 258 0 R (page.8) 267 0 R (page.9) 273 0 R (restoring-backups) 275 0 R (root-only) 280 0 R (run-the-configure-script) 232 0 R (second-version-for-the-impatient) 221 0 R (section*.1) 160 0 R (section*.2) 164 0 R (section.1) 6 0 R (section.2) 26 0 R (section.3) 30 0 R (section.4) 58 0 R (section.5) 114 0 R (section.6) 118 0 R (section.7) 122 0 R (section.8) 134 0 R (section.9) 138 0 R (subsection.1.1) 10 0 R (subsection.1.2) 14 0 R (subsection.1.3) 18 0 R (subsection.1.4) 22 0 R (subsection.3.1) 34 0 R (subsection.3.2) 38 0 R (subsection.3.3) 42 0 R (subsection.3.4) 46 0 R (subsection.3.5) 50 0 R (subsection.3.6) 54 0 R (subsection.4.1) 62 0 R (subsection.4.2) 66 0 R (subsection.4.3) 70 0 R (subsection.4.4) 110 0 R (subsection.7.1) 126 0 R (subsection.7.2) 130 0 R (subsubsection.4.3.1) 74 0 R (subsubsection.4.3.2) 78 0 R (subsubsection.4.3.3) 82 0 R (subsubsection.4.3.4) 86 0 R (subsubsection.4.3.5) 90 0 R (subsubsection.4.3.6) 94 0 R (subsubsection.4.3.7) 98 0 R (subsubsection.4.3.8) 102 0 R (subsubsection.4.3.9) 106 0 R (testing-your-config-file) 268 0 R (untar-the-source-code-package) 225 0 R (what-you-will-need) 206 0 R (where-to-go-for-more-info) 240 0 R] /Limits [(Doc-Start) (where-to-go-for-more-info)] >> endobj 312 0 obj << /Kids [311 0 R] >> endobj 313 0 obj << /Dests 312 0 R >> endobj 314 0 obj << /Type /Catalog /Pages 309 0 R /Outlines 310 0 R /Names 313 0 R /PageMode /UseOutlines /OpenAction 141 0 R >> endobj 315 0 obj << /Author(Nathan Rosenquist )/Title(rsnapshot HOWTO)/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() /CreationDate (D:20061007190324+10'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref 0 316 0000000001 65535 f 0000000002 00000 f 0000000003 00000 f 0000000004 00000 f 0000000000 00000 f 0000000009 00000 n 0000016718 00000 n 0000119733 00000 n 0000000054 00000 n 0000000084 00000 n 0000016842 00000 n 0000119661 00000 n 0000000134 00000 n 0000000171 00000 n 0000016967 00000 n 0000119575 00000 n 0000000222 00000 n 0000000262 00000 n 0000017091 00000 n 0000119489 00000 n 0000000313 00000 n 0000000342 00000 n 0000017215 00000 n 0000119416 00000 n 0000000393 00000 n 0000000420 00000 n 0000020457 00000 n 0000119329 00000 n 0000000466 00000 n 0000000495 00000 n 0000020582 00000 n 0000119204 00000 n 0000000541 00000 n 0000000572 00000 n 0000020707 00000 n 0000119130 00000 n 0000000623 00000 n 0000000681 00000 n 0000020832 00000 n 0000119043 00000 n 0000000732 00000 n 0000000780 00000 n 0000020957 00000 n 0000118956 00000 n 0000000831 00000 n 0000000880 00000 n 0000024455 00000 n 0000118869 00000 n 0000000931 00000 n 0000000982 00000 n 0000024580 00000 n 0000118782 00000 n 0000001033 00000 n 0000001076 00000 n 0000024705 00000 n 0000118708 00000 n 0000001127 00000 n 0000001165 00000 n 0000024830 00000 n 0000118581 00000 n 0000001211 00000 n 0000001243 00000 n 0000024954 00000 n 0000118507 00000 n 0000001294 00000 n 0000001335 00000 n 0000029433 00000 n 0000118420 00000 n 0000001386 00000 n 0000001430 00000 n 0000029558 00000 n 0000118294 00000 n 0000001481 00000 n 0000001525 00000 n 0000029683 00000 n 0000118220 00000 n 0000001581 00000 n 0000001609 00000 n 0000029808 00000 n 0000118133 00000 n 0000001665 00000 n 0000001696 00000 n 0000034062 00000 n 0000118046 00000 n 0000001752 00000 n 0000001781 00000 n 0000034187 00000 n 0000117959 00000 n 0000001837 00000 n 0000001869 00000 n 0000034312 00000 n 0000117872 00000 n 0000001925 00000 n 0000001953 00000 n 0000034437 00000 n 0000117785 00000 n 0000002009 00000 n 0000002040 00000 n 0000034562 00000 n 0000117696 00000 n 0000002096 00000 n 0000002124 00000 n 0000039653 00000 n 0000117605 00000 n 0000002181 00000 n 0000002207 00000 n 0000039779 00000 n 0000117527 00000 n 0000002264 00000 n 0000002300 00000 n 0000043388 00000 n 0000117450 00000 n 0000002352 00000 n 0000002396 00000 n 0000043513 00000 n 0000117358 00000 n 0000002443 00000 n 0000002473 00000 n 0000046923 00000 n 0000117265 00000 n 0000002520 00000 n 0000002552 00000 n 0000049971 00000 n 0000117133 00000 n 0000002599 00000 n 0000002636 00000 n 0000050096 00000 n 0000117054 00000 n 0000002688 00000 n 0000002717 00000 n 0000050222 00000 n 0000116975 00000 n 0000002769 00000 n 0000002798 00000 n 0000055059 00000 n 0000116882 00000 n 0000002845 00000 n 0000002875 00000 n 0000055184 00000 n 0000116803 00000 n 0000002922 00000 n 0000002956 00000 n 0000006182 00000 n 0000011314 00000 n 0000003008 00000 n 0000011062 00000 n 0000011125 00000 n 0000115872 00000 n 0000112078 00000 n 0000115711 00000 n 0000110928 00000 n 0000099357 00000 n 0000110766 00000 n 0000097959 00000 n 0000081365 00000 n 0000097798 00000 n 0000081014 00000 n 0000079022 00000 n 0000080853 00000 n 0000006540 00000 n 0000011188 00000 n 0000077892 00000 n 0000068578 00000 n 0000077730 00000 n 0000011251 00000 n 0000006719 00000 n 0000006873 00000 n 0000007033 00000 n 0000007192 00000 n 0000007351 00000 n 0000007511 00000 n 0000007666 00000 n 0000007821 00000 n 0000007981 00000 n 0000008141 00000 n 0000008301 00000 n 0000008461 00000 n 0000008621 00000 n 0000008779 00000 n 0000008933 00000 n 0000009092 00000 n 0000009251 00000 n 0000009411 00000 n 0000009577 00000 n 0000009743 00000 n 0000009909 00000 n 0000010074 00000 n 0000010239 00000 n 0000010405 00000 n 0000010571 00000 n 0000010737 00000 n 0000010903 00000 n 0000116432 00000 n 0000017340 00000 n 0000014762 00000 n 0000011437 00000 n 0000016593 00000 n 0000014976 00000 n 0000015131 00000 n 0000015286 00000 n 0000015441 00000 n 0000015599 00000 n 0000015758 00000 n 0000015913 00000 n 0000016656 00000 n 0000016068 00000 n 0000016779 00000 n 0000016904 00000 n 0000068211 00000 n 0000066666 00000 n 0000068050 00000 n 0000016243 00000 n 0000017029 00000 n 0000017153 00000 n 0000016414 00000 n 0000017277 00000 n 0000021082 00000 n 0000020272 00000 n 0000017450 00000 n 0000020394 00000 n 0000020519 00000 n 0000020644 00000 n 0000065461 00000 n 0000055357 00000 n 0000065299 00000 n 0000020769 00000 n 0000020894 00000 n 0000021019 00000 n 0000025015 00000 n 0000024270 00000 n 0000021179 00000 n 0000024392 00000 n 0000024517 00000 n 0000024642 00000 n 0000024767 00000 n 0000024892 00000 n 0000029932 00000 n 0000028988 00000 n 0000025125 00000 n 0000029307 00000 n 0000029370 00000 n 0000029130 00000 n 0000029495 00000 n 0000029620 00000 n 0000029745 00000 n 0000029869 00000 n 0000034687 00000 n 0000033877 00000 n 0000030042 00000 n 0000033999 00000 n 0000034124 00000 n 0000034249 00000 n 0000034374 00000 n 0000034499 00000 n 0000034624 00000 n 0000039842 00000 n 0000038868 00000 n 0000034784 00000 n 0000039590 00000 n 0000039026 00000 n 0000039200 00000 n 0000039380 00000 n 0000039716 00000 n 0000116549 00000 n 0000043576 00000 n 0000043140 00000 n 0000039952 00000 n 0000043262 00000 n 0000043325 00000 n 0000043450 00000 n 0000047049 00000 n 0000046675 00000 n 0000043673 00000 n 0000046797 00000 n 0000046860 00000 n 0000046986 00000 n 0000050284 00000 n 0000049786 00000 n 0000047146 00000 n 0000049908 00000 n 0000050034 00000 n 0000050159 00000 n 0000055247 00000 n 0000053478 00000 n 0000050381 00000 n 0000054933 00000 n 0000054996 00000 n 0000053668 00000 n 0000055121 00000 n 0000053845 00000 n 0000054047 00000 n 0000054218 00000 n 0000054407 00000 n 0000054581 00000 n 0000054756 00000 n 0000066194 00000 n 0000065890 00000 n 0000068464 00000 n 0000068433 00000 n 0000078576 00000 n 0000078238 00000 n 0000081258 00000 n 0000081228 00000 n 0000098854 00000 n 0000098451 00000 n 0000111649 00000 n 0000111302 00000 n 0000116224 00000 n 0000116090 00000 n 0000116658 00000 n 0000116728 00000 n 0000119842 00000 n 0000121895 00000 n 0000121934 00000 n 0000121972 00000 n 0000122102 00000 n trailer << /Size 316 /Root 314 0 R /Info 315 0 R /ID [<1973FC8F088882F56282ED21311821BD> <1973FC8F088882F56282ED21311821BD>] >> startxref 122420 %%EOF rsnapshot-1.4.2/docs/HOWTOs/0000775000175000017500000000000012632661200015154 5ustar travistravisrsnapshot-1.4.2/docs/HOWTOs/rsnapshot-Mac-howto0000664000175000017500000003777112632661200020773 0ustar travistravisTo: rsnapshot-discuss@lists.sourceforge.net From: Jonathan Guyer Date: Thu, 19 Apr 2007 11:18:06 -0400 Subject: [rsnapshot-discuss] Backing up a Mac to an external FireWire drive I've been fumbling around trying to get a satisfactory backup of my Mac laptop to an external FireWire drive. I like the design principles of rsnapshot much better than the (large) number of other backup tools (including some very expensive commercial options). There are a number of issues though, some relating to it being a Mac (I've been using a Mac since '84, so I still have and still care about things like resource forks) and some relating to it being a laptop (it's not on full-time and not reliably configured the same way all the time, so cron jobs aren't entirely reliable). After a lot of fumbling around, I've come up with a scheme that seems to back up *all* of the information I care about and which does so as automatically and painlessly as possible when I plug in my backup drive. I wrote this up for my own purposes, just so I'd remember how to get things working again when some future OS upgrade or hardware purchase inevitably breaks things, but in the hopes that it might prove useful to others, I offer it here. Any comments or corrections are more than welcome. ========================================================= What I did to back up a Mac to an external FireWire drive ========================================================= :Author: Jonathan Guyer :Contact: guyer@nist.gov :Date: 19 April 2007 :Copyright: This document has been placed in the public domain - Get, build and install ``rsync`` version 3 from `CVS `_. The ``rsync`` shipped by Apple is buggy and the fixes proposed by http://www.onthenet.com.au/~q/ rsync/ and by http://lartmaker.nl/rsync/ don't work. .. note:: If you don't care about Mac meta data (resource forks and such) then you don't need this, but are you *sure* you don't care about Mac meta data? You *are* using a Mac, right? - Edit your ``rsnapshot.conf`` file - set, e.g.:: snapshot_root /Volumes/Backup/snapshot/ and be sure to create the appropriate directory. .. note:: If you wish to `Set the backup to run automatically when a FireWire drive is mounted`_, you don't need to declare ``snapshot_root`` in the ``rsnapshot.conf`` file, but you do still need to create the appropriate directories. .. note:: The NFS protection schemes suggested in the ``rsnapshot`` documentation aren't too applicable to a Mac, but you can protect the backup directory from all but ``sudo``. This idea was suggested by `Giuliano Gavazzi `_ - Create a ``backup`` group using NetInfo Manager (not in ``/etc/groups``) containing all user accounts. (Is there a more automatic group that will accomplish this?) - Use Access Control Lists (ACLs) to secure the backup directory - Enable ACLs:: $ sudo fsaclctl -p /Volumes/Backup -e - Set desired ACLs:: $ sudo chmod +a "backup deny add_file, delete, \ add_subdirectory, delete_child, writeattr, writeextattr \ directory_inherit" /Volumes/Backup/snapshot - set:: no_create_root 1 to prevent ``rsnapshot`` from making a mess in your ``/Volumes/`` directory when the drive is not mounted. - set the path to the ``rsync`` you installed above:: cmd_rsync /usr/local/bin/rsync - set the backup intervals appropriately - pass the following arguments to ``rsync``:: rsync_short_args -a rsync_long_args --delete --numeric-ids --relative --delete- excluded --xattrs The important one here for the Mac is ``--xattrs``. If you don't care about Macish resource forks (are you sure you don't?), then you can omit this and you don't need ``rsync`` 3. - you may want to set:: one_fs 1 - exclude transitory, dangerous, and boring things:: exclude /dev/ exclude /automount/ exclude /cores/ exclude /.vol/ exclude /Volumes/ exclude .Trashes/ exclude .Trash/ exclude .TemporaryItems/ exclude .Spotlight-V100/ exclude Library/Caches/ exclude Library/Safari/Icons/ exclude /private/tmp/ exclude /private/var/vm/ exclude /private/var/tmp/ exclude /private/var/spool/ exclude /private/var/launchd/ exclude /private/var/run/ - back up everything else:: backup / path.to.machine/ Backing up to ``path.to.machine`` is arbitrary, but makes it easy to sort things out later if you back up more than one thing and ``rsnapshot`` requires you to back up somewhere. .. note:: Can you back up to ``.``? .. attention:: If your home directory is protected by FileVault, then you'll want to add:: exclude /Users/.username/ to the excludes list and:: backup /Users/username/ path.to.machine/ to the backup list, otherwise the encrypted FileVault archive will be recopied, in its entirety, and the visible ``$HOME`` directory will be empty in the backup. .. caution:: If you do this, the backup ``$HOME`` directory will not be encrypted. Appropriate physical security measures must be taken with the backup drive. Set the backup to run automatically when a FireWire drive is mounted -------------------------------------------------------------------- - Apple's `exhortation to use the disk arbitration framework `_ is somewhat less than helpful, and R. Matthew Emerson has a peculiar definition of "well-commented", but `his code `_ is a useful starting point:: // rsnapshotd // // Mac OS X daemon for detecting the mount of a backup drive and launching // rsnapshot // // Jonathan Guyer // // This code is in the public domain #include #include #include #include typedef struct { CFUUIDRef uuid; const char * snapshot_root_conf; const char * snapshot_root_dir; const char * cmd; const char ** argv; pid_t pid; } tRsnapshotContext; // Lifted from Steve Christensen on carbon-dev char* CopyCStringFromCFString(CFStringRef cfString, CFStringEncoding encoding) { CFIndex bufferSize = CFStringGetMaximumSizeForEncoding (CFStringGetLength(cfString), encoding) + 1; char* buffer = malloc(bufferSize); if (buffer != NULL) { if (!CFStringGetCString(cfString, buffer, bufferSize, encoding)) { free(buffer); buffer = NULL; } } return buffer; } void hello_disk(DADiskRef disk, void *contextP) { CFDictionaryRef diskref = DADiskCopyDescription (disk); CFUUIDRef uuid = CFDictionaryGetValue (diskref, kDADiskDescriptionVolumeUUIDKey); tRsnapshotContext * context = (tRsnapshotContext *) contextP; diskref = DADiskCopyDescription(disk); if (uuid != NULL && uuid == context->uuid) { CFURLRef pathURL = CFDictionaryGetValue (diskref, kDADiskDescriptionVolumePathKey); CFStringRef uuidStr = CFUUIDCreateString (kCFAllocatorDefault, uuid); char * uuidCStr = CopyCStringFromCFString (uuidStr, kCFStringEncodingUTF8); if (pathURL != NULL) { CFStringRef pathStr = CFURLCopyFileSystemPath (pathURL, kCFURLPOSIXPathStyle); char * path = CopyCStringFromCFString (pathStr, kCFStringEncodingUTF8); FILE * f = fopen(context- >snapshot_root_conf, "w"); syslog(LOG_NOTICE, "performing rsnapshot backup to disk %s, UUID: %s", path, uuidCStr); CFRelease(pathStr); fprintf(f, "# This file automatically generated by rsnapshotd\n"); fprintf(f, "snapshot_root\t%s/%s\n", path, context->snapshot_root_dir); fclose(f); free(path); } else { syslog(LOG_NOTICE, "performing rsnapshot backup to nameless disk, UUID: %s", uuidCStr); } free(uuidCStr); CFRelease(uuidStr); switch (context->pid = vfork()) { case 0: { // child process int err = execv(context->cmd, context- >argv); syslog(LOG_ERR, "rsnapshot backup failed to launch: %d", err); exit(1); // in case exec fails } case -1: syslog(LOG_ERR, "vfork failed"); break; default: { } } } CFRelease(diskref); } // // This handler is pointless. The disk won't unmount as long as the process is running, // // so the the process must be killed first, which means there's nothign to kill here. // // I welcome suggestions of how to do something useful with this // void goodbye_disk(DADiskRef disk, void *contextP) // { // CFDictionaryRef diskref = DADiskCopyDescription (disk); // CFUUIDRef uuid = CFDictionaryGetValue (diskref, kDADiskDescriptionVolumeUUIDKey); // tRsnapshotContext * context = (tRsnapshotContext *) contextP; // // diskref = DADiskCopyDescription(disk); // // if (uuid != NULL && uuid == context->uuid && context->pid != 0) { // kill(context->pid, 3); // printf("\n\ndisk unmounted\n"); // } // } int main (int argc, const char * argv[]) { DASessionRef session; CFStringRef uuidStr; tRsnapshotContext context; if (argc < 5) { syslog(LOG_ERR, "Usage: rsnapshotd UUID SNAPSHOT_ROOT.CONFIG SHAPSHOT_ROOT_DIR CMD [OPTION ...]"); exit(1); } uuidStr = CFStringCreateWithCString (kCFAllocatorDefault, argv[1], kCFStringEncodingUTF8); if (!uuidStr) { syslog(LOG_ERR, "Unable to create UUID string"); exit(1); } context.uuid = CFUUIDCreateFromString (kCFAllocatorDefault, uuidStr); if (!context.uuid) { syslog(LOG_ERR, "Unable to parse UUID string"); exit(1); } context.snapshot_root_conf = argv[2]; context.snapshot_root_dir = argv[3]; context.cmd = argv[4]; context.argv = &argv[4]; context.pid = -1; session = DASessionCreate(kCFAllocatorDefault); DARegisterDiskAppearedCallback(session, NULL, hello_disk, &context); // DARegisterDiskDisappearedCallback(session, NULL, goodbye_disk, &context); DASessionScheduleWithRunLoop(session, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); CFRunLoopRun(); CFRelease(session); exit(0); } If you save this as, e.g., ``rsnapshotd.c``, you can build it with:: gcc -framework DiskArbitration -framework CoreFoundation rsnapshotd.c -o rsnapshotd ``rsnapshotd`` takes four required arguments, followed by any options to pass to the command: ``UUID`` The Universally Unique Identifier for the disk you wish to back up to. You can obtain the ``UUID`` by executing ``diskutil info `` (run ``diskutil list`` to find the device ID). ``/PATH/TO/snapshot_root.conf`` The (writable) location of a file to put the path of the backup disk. This is necessary. .. attention:: You must be sure to include the line:: include_conf /PATH/TO/snapshot_root.conf after (or in place of) the ``snapshot_root`` parameter in your ``rsnapshot.conf`` file. ``snapshot_root_directory`` The relative path to the backup on the backup drive associated with ``UUID``, e.g., ``snapshot/``. ``CMD`` The fully qualified path to ``rsnapshot``. .. note:: There's nothing magical about ``rsnapshot``. This daemon will launch any command with any options you supply when the appropriate disk is mounted. ``ARGS`` Arguments to send to ``rsnapshot``, e.g., ``-c``, ``/PATH/TO/rsnapshot.conf`` and ``daily``. - Rather than setting up a cron job, add a file ``net.sourceforge.rsnapshotd.plst`` to ``/Library/LaunchDaemons/``:: Label net.sourceforge.rsnapshotd ProgramArguments /PATH/TO/rsnapshotd UUID /PATH/TO/snapshot_root.conf snapshot/ /PATH/TO/rsnapshot -c /PATH/TO/rsnapshot.conf daily OnDemand RunAtLoad LowPriorityIO Nice 20 This will cause the daemon to sit quietly, waiting for the disk to mount (it will trigger if the disk is already mounted when the daemon is loaded). The ``LowPriorityIO`` and ``Nice`` keys should prevent the rsnapshot process from being too much of a resource hog when it launches (``LowPriorityIO`` is probably more important than ``Nice``). - Install the daemon by executing:: $ sudo launchctl load /Library/LaunchDaemons/ net.sourceforge.rsnapshotd.plst -- Jonathan E. Guyer, PhD Metallurgy Division National Institute of Standards and Technology rsnapshot-1.4.2/docs/HOWTOs/rsnapshot-HOWTO.en.html0000664000175000017500000017216512632661200021376 0ustar travistravis rsnapshot HOWTO

rsnapshot HOWTO

David Cantrell

2004-01-20

Abstract

rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well. This document is a tutorial in the installation and configuration of rsnapshot.


1. Introduction

rsnapshot is a filesystem backup utility based on rsync. Using rsnapshot, it is possible to take snapshots of your filesystems at different points in time. Using hard links, rsnapshot creates the illusion of multiple full backups, while only taking up the space of one full backup plus differences. When coupled with ssh, it is possible to take snapshots of remote filesystems as well.

rsnapshot is written in Perl, and depends on rsync. OpenSSH, GNU cp, GNU du, and the BSD logger program are also recommended, but not required. All of these should be present on most Linux systems. rsnapshot is written with the lowest common denominator in mind. It only requires at minimum Perl 5.004 and rsync. As a result of this, it works on pretty much any UNIX-like system you care to throw at it. It has been successfully tested with Perl 5.004 through 5.8.2, on Debian, Redhat, Fedora, Solaris, Mac OS X, FreeBSD, OpenBSD, NetBSD, and IRIX.

The latest version of the program and this document can always be found at http://www.rsnapshot.org/.

1.1. What you will need

At a minimum: perl, rsync

Optionally: ssh, logger, GNU cp, GNU du

Additionally, it will help if you have reasonably good sysadmin skills.

1.2. Copyright and License

This document, rsnapshot HOWTO, is copyrighted (c) 2005 by Nathan Rosenquist, with some portions (c) 2006 David Cantrell. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of the license is available at http://www.gnu.org/copyleft/gpl.html.

1.3. Disclaimer

No liability for the contents of this document can be accepted. Use the concepts, examples and information at your own risk. There may be errors and inaccuracies, that could be damaging to your system. Proceed with caution, and although this is highly unlikely, the author(s) do not take any responsibility.

All copyrights are held by their by their respective owners, unless specifically noted otherwise. Use of a term in this document should not be regarded as affecting the validity of any trademark or service mark. Naming of particular products or brands should not be seen as endorsements.

1.4. Feedback

Feedback is most certainly welcome for this document. Send your additions, comments and criticisms to the following email address : .

2. Motivation

I originally used Mike Rubel's shell scripts to do rsync snapshots a while back. These worked very well, but there were a number of things that I wanted to improve upon. I had to write two shell scripts that were customized for my server. If I wanted to change the number of intervals stored, or the parts of the filesystem that were archived, that meant manually editing these shell scripts. If I wanted to install them on a different server with a different configuration, this meant manually editing the scripts for the new server, and hoping the logic and the sequence of operations was correct. Also, I was doing all the backups locally, on a single machine, on a single hard drive (just to protect from dumb user mistakes like deleting files). Never the less, I continued on with this system for a while, and it did work very well.

Several months later, the IDE controller on my web server failed horribly (when I typed /sbin/shutdown, it said the command was not found). I was then faced with what was in the back of my mind all along: I had not been making regular remote backups of my server, and the local backups were of no use to me since the entire drive was corrupted. The reason I had only been making sporadic, partial remote backups is that they weren't automatic and effortless. Of course, this was no one's fault but my own, but I got frustrated enough to write a tool that would make automated remote snapshots so easy that I wouldn't ever have to worry about them again. This goal has long been reached, but work on rsnapshot still continues as people submit patches, request features, and ways are found to improve the program.

3. Installation

This section will walk you through the installation of rsnapshot, step by step. This is not the only way to do it, but it is a way that works and that is well documented. Feel free to improvise if you know what you're doing.

This guide assumes you are installing rsnapshot 1.2.0 for the first time. If you are upgrading from an earlier version, please read the INSTALL file that comes with the source distribution instead.

3.1. 30 second version (for the impatient)

./configure --sysconfdir=/etc
su
make install
cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

The rest of this section is the long version.

3.2. Untar the source code package

tar xzvf rsnapshot-1.2.0.tar.gz

If you don't have GNU tar, you may have to do this in two steps instead:

gunzip rsnapshot-1.2.0.tar.gz
tar xvf rsnapshot-1.2.0.tar

3.3. Change to the source directory

cd rsnapshot-1.2.0/

3.4. Decide where you want to install

By default, the installation procedure will install all files under /usr/local. For this tutorial, this will be OK except we will install the config file under /etc.

We are assuming that rsync, ssh, logger, and du are all in your search path. If this is not the case, you can specify the path to any of these programs using the typical Autoconf --with-program=/path/to/program syntax. For example, if Perl was in /opt/bin/perl and rsync was in /home/me/bin/rsync, you could run configure like:

./configure --with-perl=/opt/bin/perl --with-rsync=/home/me/bin/rsync

3.5. Run the configure script

This will poke and prod your system to figure out where the various external programs that rsnapshot depends on live. It also generates the Makefile that we will use to install the program. The configure script accepts arguments that can be used to tell it where to install the program, and also where to find the supporting programs. For this installation, the only non-default option we want is to put the config file in the /etc directory. To do this, run this command at the shell:

./configure --sysconfdir=/etc

If all goes well, you're ready to install the program. If there was a problem, it should be descriptive. Most likely a problem would be the result of something that was required and not found (like rsync or perl). If this happens, you must figure out where the missing program is located on your system, or install it if necessary. If you know where it is but configure couldn't find it, you can specify the path using the --with-program=/path/to/program options described above.

3.6. Install the program

If you've followed these instructions so far, you will have configured rsnapshot to be installed under /usr/local, with the config file in /etc. Under these circumstances, it will be necessary to become root to install the program. Now is the time to do so. You will, of course, need the root password to do this:

su

This will prompt you for the root password.

Now, to install rsnapshot, run the following command:

make install

This will install rsnapshot with all the settings you specified in the ./configure stage. If all goes well, you will have the following files on your system:

/usr/local/bin/rsnapshot The rsnapshot program

/usr/local/man/man1/rsnapshot.1 Man page

/etc/rsnapshot.conf.default The example config file

If you decide later that you don't want rsnapshot on your system anymore, simply remove the files listed above, or run make uninstall in the same source directory you installed from. Of course, if you installed with different options, the location of these files may be different.

4. Configuration

4.1. Create the config file

In the install process, the config file is not created or installed. However, a working example is provided that you can copy. To copy the example config file into the location rsnapshot will be looking for the real config file:

cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

As a general rule, you should avoid modifying /etc/rsnapshot.conf.default, simply because it is a working example that you may wish to refer to later. Also, if you perform an upgrade, the rsnapshot.conf.default file will always be upgraded to the latest version, while your real config file will be safe out of harm's way. Please note that if you run make upgrade during an upgrade, your rsnapshot.conf may be modified slightly, and the original will then be saved in rsnapshot.conf.backup in the same directory.

4.2. Where to go for more info

The rsnapshot.conf config file is well commented, and much of it should be fairly self-explanatory. For a full reference of all the various options, please consult the rsnapshot man page. Type:

man rsnapshot

This will give you the complete documentation. However, it assumes that you already know what you're doing to a certain extent. If you just want to get something up and running, this tutorial is a better place to start. If your system can't find the man page, /usr/local/man probably isn't in your $MANPATH environmental variable. This is beyond the scope of this document, but if it isn't working for you, you can always read the newest man page on the rsnapshot web site at http://www.rsnapshot.org/

4.3. Modifying the config file

In this example, we will be using the /.snapshots/ directory to hold the filesystem snapshots. This is referred to as the “snapshot rootâ€. Feel free to put this anywhere you have lots of free disk space. However, the examples in this document assume you have not changed this parameter, so you will have to substitute this in your commands if you put it somewhere else.

Also please note that fields are separated by tabs, not spaces. The reason for this is so it's easier to specify file paths with spaces in them.

4.3.1. cmd_cp

If enabled, the cmd_cp parameter should contain the path to the GNU cp program on your filesystem. If you are using Linux, be sure to uncomment this by removing the hash mark (#) in front of it. If you are using BSD, Solaris, IRIX, or most other UNIX variants, you should leave this commented out.

What makes GNU cp so special is that unlike the traditional UNIX cp, it has the ability to make recursive “copies†of directories as hard links.

If you don't have GNU cp, there is a subroutine in rsnapshot that somewhat approximates this functionality (although it won't support more esoteric files such as device nodes, FIFOs, sockets, etc). This gets followed up by another call to rsync, which transfers the remaining special files, if any. In this way, rsnapshot can support all file types on every platform.

The rule of thumb is that if you're on a Linux system, leave cmd_cp enabled. If you aren't on a Linux system, leave cmd_cp disabled. There are reports of GNU cp working on BSD and other non-Linux platforms, but there have also been some cases where problems have been encountered. If you enable cmd_cp on a non-Linux platform, please let the mailing list know how it worked out for you.

4.3.2. cmd_rsync

The cmd_rsync parameter must not be commented out, and it must point to a working version of rsync. If it doesn't, the program just will not work at all.

Please note that if you are using IRIX, there is another program named rsync that is different than the “real†rsync most people know of. If you're on an IRIX machine, you should double check this.

4.3.3. cmd_ssh

If you have ssh installed on your system, you will want to uncomment the cmd_ssh parameter. By enabling ssh, you can take snapshots of any number of remote systems. If you don't have ssh, or plan to only take snapshots of the local filesystem, you may safely leave this commented out.

4.3.4. cmd_logger

The cmd_logger parameter specifies the path to the logger program. logger is a command line interface to syslog. See the logger man page for more details. logger should be a standard part of most UNIX-like systems. It appears to have remained unchanged since about 1993, which is good for cross-platform stability. If you comment out this parameter, it will disable syslog support in rsnapshot. It is recommended that you leave this enabled.

4.3.5. cmd_du

The cmd_du parameter specifies the path to the du program. du is a command line tool that reports on disk usage. rsnapshot uses du to generate reports about the actual amount of disk space taken up, which is otherwise difficult to estimate because of all the hard links.

If you comment this out, rsnapshot will try to use the version of du it finds in your path, if possible. The GNU version of du is recommended, since it has the best selection of features, and supports the most options. The BSD version also seems to work, although it doesn't support the -h flag. Solaris du does not work at all, because it doesn't support the -c parameter.

4.3.6. link_dest

If you have rsync version 2.5.7 or later, you may want to enable this. With link_dest enabled, rsnapshot relies on rsync to create recursive hard links, overriding GNU cp in most, but not all, cases. With link_dest enabled, every single file on your system can be backed up in one pass, on any operating system. To get the most out of rsnapshot on non-Linux platforms, link_dest should be enabled. Be advised, however, that if a remote host is unavailable during a backup, rsnapshot will take an extra step and roll back the files from the previous backup. Using GNU cp, this would not be necessary.

4.3.7. interval

rsnapshot has no idea how often you want to take snapshots. Everyone's backup scheme may be different. In order to specify how much data to save, you need to tell rsnapshot which “intervals†to keep, and how many of each. An interval, in the context of the rsnapshot config file, is a unit of time measurement. These can actually be named anything (as long as it's alphanumeric, and not a reserved word), but by convention we will call ours hourly and daily. In this example, we want to take a snapshot every four hours, or six times a day (these are the hourly intervals). We also want to keep a second set, which are taken once a day, and stored for a week (or seven days). This happens to be the default, so as you can see the config file reads:

interval    hourly  6
interval    daily   7

It also has some other entries, but you can either ignore them or comment them out for now.

Please note that the hourly interval is specified first. This is very important. The first interval line is assumed to be the smallest unit of time, with each additional line getting successively larger. Thus, if you add a yearly interval, it should go at the bottom, and if you add a minutes interval, it should go before hourly. It's also worth noting that the snapshots get “pulled up†from the smallest interval to the largest. In this example, the daily snapshots get pulled from the oldest hourly snapshot, not directly from the main filesystem.

4.3.8. backup

Please note that the destination paths specified here are based on the assumption that the --relative flag is being passed to rsync via the rsync_long_args parameter. If you are installing for the first time, this is the default setting. If you upgraded from a previous version, please read the INSTALL file that came with the source distribution for more information.

This is the section where you tell rsnapshot what files you actually want to back up. You put a “backup†parameter first, followed by the full path to the directory or network path you're backing up. The third column is the relative path you want to back up to inside the snapshot root. Let's look at an example:

backup      /etc/      localhost/

In this example, backup tells us it's a backup point. /etc/ is the full path to the directory we want to take snapshots of, and localhost/ is a directory inside the snapshot_root we're going to put them in. Using the word localhost as the destination directory is just a convention. You might also choose to use the server's fully qualified domain name instead of localhost. If you are taking snapshots of several machines on one dedicated backup server, it's a good idea to use their various hostnames as directories to keep track of which files came from which server.

In addition to full paths on the local filesystem, you can also backup remote systems using rsync over ssh. If you have ssh installed and enabled (via the cmd_ssh parameter), you can specify a path like:

backup      root@example.com:/etc/     example.com/

This behaves fundamentally the same way, but you must take a few extra things into account.

  • The ssh daemon must be running on example.com

  • You must have access to the account you specify the remote machine, in this case the root user on example.com.

  • You must have key-based logins enabled for the root user at example.com, without passphrases. If you wanted to perform backups as another user, you could specify the other user instead of root for the source (i.e. user@domain.com). Please note that allowing remote logins with no passphrase is a security risk that may or may not be acceptable in your situation. Make sure you guard access to the backup server very carefully! For more information on how to set this up, please consult the ssh man page, or a tutorial on using ssh public and private keys. You will find that the key based logins are better in many ways, not just for rsnapshot but for convenience and security in general. One thing you can do to mitigate the potential damage from a backup server breach is to create alternate users on the client machines with uid and gid set to 0, but with a more restrictive shell such as scponly.

  • This backup occurs over the network, so it may be slower. Since this uses rsync, this is most noticeable during the first backup. Depending on how much your data changes, subsequent backups should go much, much faster since rsync only sends the differences between files.

4.3.9. backup_script

With this parameter, the second column is the full path to an executable backup script, and the third column is the local path you want to store it in (just like with the "backup" parameter). For example:

backup_script      /usr/local/bin/backup_pgsql.sh       localhost/postgres/

In this example, rsnapshot will run the script /usr/local/bin/backup_pgsql.sh in a temp directory, then sync the results into the localhost/postgres/ directory under the snapshot root. You can find the backup_pgsql.sh example script in the utils/ directory of the source distribution. Feel free to modify it for your system.

Your backup script simply needs to dump out the contents of whatever it does into it's current working directory. It can create as many files and/or directories as necessary, but it should not put its files in any pre-determined path. The reason for this is that rsnapshot creates a temp directory, changes to that directory, runs the backup script, and then syncs the contents of the temp directory to the local path you specified in the third column. A typical backup script would be one that archives the contents of a database. It might look like this:

#!/bin/sh
/usr/bin/mysqldump -uroot mydatabase > mydatabase.sql
/bin/chmod 644 mydatabase.sql

There are several example scripts in the utils/ directory of the rsnapshot source distribution to give you more ideas.

Make sure the destination path you specify is unique. The backup script will completely overwrite anything in the destination path, so if you tried to specify the same destination twice, you would be left with only the files from the last script. Fortunately, rsnapshot will try to prevent you from doing this when it reads the config file.

Please remember that these backup scripts will be invoked as the user running rsnapshot. In our example, this is root. Make sure your backup scripts are owned by root, and not writable by anyone else. If you fail to do this, anyone with write access to these backup scripts will be able to put commands in them that will be run as the root user. If they are malicious, they could take over your server.

4.4. Testing your config file

When you have made all your changes, you should verify that the config file is syntactically valid, and that all the supporting programs are where you think they are. To do this, run rsnapshot with the configtest argument:

rsnapshot configtest

If all is well, it should say Syntax OK. If there's a problem, it should tell you exactly what it is. Make sure your config file is using tabs and not spaces, etc.

The final step to test your configuration is to run rsnapshot in test mode. This will print out a verbose list of the things it will do, without actually doing them. To do a test run, run this command:

rsnapshot -t hourly

This tells rsnapshot to simulate an "hourly" backup. It should print out the commands it will perform when it runs for real. Please note that the test output might be slightly different than the real execution, but only because the test doesn't actually do things that may be checked for later in the program. For example, if the program will create a directory and then later test to see if that directory exists, the test run might claim that it would create the directory twice, since it didn't actually get created during the test. This should be the only type of difference you will see while running a test.

5. Automation

Now that you have your config file set up, it's time to set up rsnapshot to be run from cron. As the root user, edit root's crontab by typing:

crontab -e

You could alternately keep a crontab file that you load in, but the concepts are the same. You want to enter the following information into root's crontab:

0 */4 * * *       /usr/local/bin/rsnapshot hourly
30 23 * * *       /usr/local/bin/rsnapshot daily

It is usually a good idea to schedule the larger intervals to run a bit before the lower ones. For example, in the crontab above, notice that daily runs 30 minutes before hourly. This helps prevent race conditions where the daily would try to run before the hourly job had finished. This same strategy should be extended so that a weekly entry would run before the daily and so on.

6. How it works

We have a snapshot root under which all backups are stored. By default, this is the directory /.snapshots/. Within this directory, other directories are created for the various intervals that have been defined. In the beginning it will be empty, but once rsnapshot has been running for a week, it should look something like this:

[root@localhost]# ls -l /.snapshots/
drwxr-xr-x    7 root     root         4096 Dec 28 00:00 daily.0
drwxr-xr-x    7 root     root         4096 Dec 27 00:00 daily.1
drwxr-xr-x    7 root     root         4096 Dec 26 00:00 daily.2
drwxr-xr-x    7 root     root         4096 Dec 25 00:00 daily.3
drwxr-xr-x    7 root     root         4096 Dec 24 00:00 daily.4
drwxr-xr-x    7 root     root         4096 Dec 23 00:00 daily.5
drwxr-xr-x    7 root     root         4096 Dec 22 00:00 daily.6
drwxr-xr-x    7 root     root         4096 Dec 29 00:00 hourly.0
drwxr-xr-x    7 root     root         4096 Dec 28 20:00 hourly.1
drwxr-xr-x    7 root     root         4096 Dec 28 16:00 hourly.2
drwxr-xr-x    7 root     root         4096 Dec 28 12:00 hourly.3
drwxr-xr-x    7 root     root         4096 Dec 28 08:00 hourly.4
drwxr-xr-x    7 root     root         4096 Dec 28 04:00 hourly.5

Inside each of these directories is a “full†backup of that point in time. The destination directory paths you specified under the backup and backup_script parameters get stuck directly under these directories. In the example:

backup          /etc/           localhost/

The /etc/ directory will initially get backed up into /.snapshots/hourly.0/localhost/etc/

Each subsequent time rsnapshot is run with the hourly command, it will rotate the hourly.X directories, and then “copy†the contents of the hourly.0 directory (using hard links) into hourly.1.

When rsnapshot daily is run, it will rotate all the daily.X directories, then rename hourly.5 to daily.0.

hourly.0 will always contain the most recent snapshot, and daily.6 will always contain a snapshot from a week ago. Unless the files change between snapshots, the “full†backups are really just multiple hard links to the same files. Thus, if your /etc/passwd file doesn't change in a week, hourly.0/localhost/etc/passwd and daily.6/localhost/etc/passwd will literally be the same exact file. This is how rsnapshot can be so efficient on space. If the file changes at any point, the next backup will unlink the hard link in hourly.0, and replace it with a brand new file. This will now take double the disk space it did before, but it is still considerably less than it would be to have full unique copies of this file 13 times over.

Remember that if you are using different intervals than the ones in this example, the first interval listed is the one that gets updates directly from the main filesystem. All subsequently listed intervals pull from the previous intervals. For example, if you had weekly, monthly, and yearly intervals defined (in that order), the weekly ones would get updated directly from the filesystem, the monthly ones would get updated from weekly, and the yearly ones would get updated from monthly.

7. Restoring backups

When rsnapshot is first run, it will create the snapshot_root directory (/.snapshots/ by default). It assigns this directory the permissions 700, and for good reason. The snapshot root will probably contain files owned by all sorts of users on your system. If any of these files are writeable (and of course some of them will be), the users will still have write access to their files. Thus, if they can see the snapshots directly, they can modify them, and the integrity of the snapshots can not be guaranteed.

For example, if a user had write permission to the backups and accidentally ran rm -rf /, they would delete all their files in their home directory and all the files they owned in the backups!

7.1. root only

The simplest, but least flexible solution, is to simply deny non-root users access to the snapshot root altogether. The root user will still have access of course, and as with all other aspects of system administration, must be trusted not to go messing with things too much. However, by simply denying access to everyone, the root user will be the only one who can pull backups. This may or may not be desirable, depending on your situation. For a small setup or a single-user machine, this may be all you need.

7.2. All users

If users need to be able to pull their own backups, you will need to do a little extra work up front (but probably less work in the long run). The best way to do this seems to be creating a container directory for the snapshot root with 700 permissions, giving the snapshot root directory 755 permissions, and mounting the snapshot root for the users read-only. This can be done over NFS and Samba, to name two possibilities. Let's explore how to do this using NFS on a single machine:

Set the snapshot_root variable in /etc/rsnapshot.conf equal to /.private/.snapshots/

snapshot_root       /.private/.snapshots/

Create the container directory:

mkdir /.private/

Create the real snapshot root:

mkdir /.private/.snapshots/

Create the read-only snapshot root mount point:

mkdir /.snapshots/

Set the proper permissions on these new directories:

chmod 0700 /.private/
chmod 0755 /.private/.snapshots/
chmod 0755 /.snapshots/

In /etc/exports, add /.private/.snapshots/ as a read only NFS export:

/.private/.snapshots/  127.0.0.1(ro,no_root_squash)

In /etc/fstab, mount /.private/.snapshots/ read-only under /.snapshots/

localhost:/.private/.snapshots/   /.snapshots/   nfs    ro   0 0

You should now restart your NFS daemon.

Now mount the read-only snapshot root:

mount /.snapshots/

To test this, go into the /.snapshots/ directory as root. It is set to read-only, so even root shouldn't be able to write to it. As root, try:

touch /.snapshots/testfile

This should fail, citing insufficient permissions. This is what you want. It means that your users won't be able to mess with the snapshots either.

Now, all your users have to do to recover old files is go into the /.snapshots directory, select the interval they want, and browse through the filesystem until they find the files they are looking for. They can't modify anything in here because NFS will prevent them, but they can copy anything that they had read permission for in the first place. All the regular filesystem permissions are still at work, but the read-only NFS mount prevents any writes from happening.

Please note that some NFS configurations may prevent you from accessing files that are owned by root and set to only be readable by root. In this situation, you may wish to pull backups for root from the "real" snapshot root, and let non-privileged users pull from the read-only NFS mount.

8. Conclusion

If you followed the instructions in this document, you should now have rsnapshot installed and set up to perform automatic backups of your system. If it's not working, go back and trace your steps back to see if you can isolate the problem.

The amount of disk space taken up will be equal to one full backup, plus an additional copy of every file that is changed. There is also a slight disk space overhead with creating multiple hard links, but it's not very much. On my system, adding a second, completely identical 3 Gigabyte interval alongside the original one only added about 15 Megabytes.

You can use the du option to rsnapshot to generate disk usage reports. To see the sum total of all space used, try:

rsnapshot du

If you were storing backups under localhost/home/ and wanted to see how much this subdirectory takes up throughout all your backups, try this instead:

rsnapshot du localhost/home/

The latest version of this document and the rsnapshot program can always be found at http://www.rsnapshot.org/

9. More resources

Web sites

Mike Rubel's original shell scripts, upon which this project is based

http://www.mikerubel.org/computers/rsync_snapshots/

Perl

http://www.perl.org/

GNU cp and du (coreutils package)

http://www.gnu.org/software/coreutils/

rsync

http://rsync.samba.org/

OpenSSH

http://www.openssh.org/

rsnapshot

http://www.rsnapshot.org/

rsnapshot-1.4.2/docs/HOWTOs/rsnapshot-windows-howto0000664000175000017500000002631212632661200021752 0ustar travistravisDate: Sun, 25 Feb 2007 13:34:00 -0800 (PST) From: Bruce Hohl To: Rsnapshot mailing list Using cwRsync 2.0.10 and Rsnapshot 1.2.1 to backup a WinXP computer. ---------------- A- What to use: ---------------- 1- Method #1 - connect to cwRsync server on WinXP source: Install cwRsync server on the WinXP box and define modules (rsync file share). An Rsync client will connect to the cwRsync server module on the WinXP box. Files are transferred over port 873 unencrypted. B 1-3 Except OpenSSH parts. B 4 Module definition; Add module security as desired (man rsyncd.conf). C 1 Rsnapshot config entry for connection to a cwRsync server module. E Restoring files. 2- Method #2 - connect to OpenSSH server on WinXP source: Install cwRsync server and OpenSSH server on the WinXP box. An SSH client will connect to the OpenSSH server on the WinXP box. Files will be read from a CygWin drive. cwRsync will be used for incremental file transfer. Files will be transferred over port 22 encrypted. B 1-3 Except cwRsync parts in steps 2-3. B 5 SSH key authentication C 2 Rsnapshot config entry for connection to Cygwin drive over ssh. E Restoring files. 3- Optional Features: B 6 SSH and SFTP access with passwords. D 1-2 Backing up using Rsync. Notes: - Routing: Routing over a WAN (internet) will work only if only if DNS and routers (firewalls) are configured such that the destination (pc1.mycompany.com) can be reached reachable. +++++ Alternatives: Use VPN between source and destination. Use SSH tunnel(s) to the internal source(s). Incorporate into each backup entry. Open and close tunnels with preexec and postexec. Use firewall port forward rule(s) to the internal source(s). - cwRsync Server: Under Method #2 the cwRsync server is not used. - Windows file permissions: Rsync (Rsnapshot) does not preserve Windows files permissions. So use an appropriate method to restore files - see last section. Rsync runs on the WinXP box as SvcwRsync 1007:513. When files are copied from an Rsync module the files at the destination are owned by 1007:513 with mode of 755 for directories and 644 for files. The files on the WinXP box are seen by SSH as: rwx------+ ???????? ???????? When files are copied via Rsync over SSH the files at the destination are owned by root:root with mode of 700 for directories and 700 for files. - Rsnapshot relative parameter: backup administrator@apost1.mycompany.com:/cygdrive/c/\ Documents\ and\ Settings/apost/My\ Documents apost_My_Documents/ \ rsync_long_args=--delete --numeric-ids --delete-excluded Without --relative path to backuped files is: "/home/rsnapshot/daily.0/apost_My_Documents/My Documents/..." With --relative path to backuped files is: "/home/rsnapshot/daily.0/apost_My_Documents/c/Documents and Settings/\ apost/My Documents/..." ---------------------------------------------- B- cwRsync 2.0.10 with OpenSSH setup on WinXP: ---------------------------------------------- 1- Installation: Install cwRsync_Server_2.0.10_Installer.zip on WinXP computer. Choose the Optional OpenSSH server. Service account user:pswd = SvcwRsync:Ncj97P8hO1 2- Server settings: Set Rsync and OpenSSH to start at boot: Control Panel > Admin Tools > Services For RsyncServer: Right click then click Properties. Click Start button. Set Startup = Automatic. For Openssh SSHD: Right click then click Properties. Click Start button. Set Startup = Automatic. 3- Firewall settings: Open Firewall ports needed - for Windows firewall: Control Panel > Security Center > Windows Firewall General tab: On = Y. Exceptions tab: Click "Add Port" and add follow: RsyncServer 873 TCP RsyncServer 873 UCP Secure Shell (ssh) 22 TCP Secure Shell (ssh) 22 UCP 4- Rysync [file share] module: Add a file access module in C:\Program Files\cwRsyncServer\rsyncd.conf for the directory to be made available. Restart RsyncServer after any change. The default setup allows anonymous read-only access using the rsync client. Access can be limited to specified hosts and by module specific passwords. # global parameters: use chroot = false strict modes = false hosts allow = * log file = rsyncd.log pid file = rsyncd.pid [My_Documents] path = cygdrive/c/Documents and Settings/apost/My Documents/ read only = true transfer logging = yes 5- SSH key authentication: For passwordless rsa public key access to the WinXP PC do the following. During connection ssh requests a public keys before prompting for a password. (1) On the other computer (key maker) generate a key set as follows: root@linux_box:~# ssh-keygen -t rsa -b 2048 Accept default location and press enter when promted for a password. This creates key files id_rsa and id_rsa.pub. (2) On the WinXP box add the contents of id_rsa.pub to: c:\Program Files\cwRsyncServer\home\administrator\.ssh\authorized_keys (3) On the WinXP box edit config file: c:\Program Files\cwRsyncServer\etc\sshd_config to include "StrictModes no" Now root@linux_box can ssh to administrator@WinXP_box and will connect without being prompted for a password. This allows secure automated connections. 6- SSH passwords: Optional: for ssh and sftp password connections: For ssh and sftp access using local accounts on the Windows PC copy the local Windows users and groups to the CygWin environment as follows. These steps must be repeated if a needed change is made to a local account. Start > Programs > cwRsync Server > Start a UNIX BASH Shell $ mkpasswd --local > /etc/passwd $ mkgroup --local > /etc/group Note: A partial CygWin environment is installed at C:\Program Files\cwRsyncServer\ It includes a small subset of a Unix environment including directories for bin, doc, etc, home, tmp, var. OpenSSH access: To access the Windows ssh server using a local account with a known password: Secure shell $ ssh administrator@apost1 Secure FTP $ sftp administrator@aposta1 ------------------- C- Rsnapshot setup: ------------------- 1- Method 1 - Connect to a cwRsync Server module over port 873 (unencrypted): Add the following to /etc/rsnapshot.conf on rsnapshot server. Use tab separated entries. +++++ backup rsync://apost1.mycompany.com/My_Documents/ apost1/My_Documents/ +++++ Use a /etc/crontab entry to run rsnapshot: 0 22 * * * root /usr/bin/rsnapshot daily > /dev/null 2>&1 0 22 * * * root /usr/bin/rsnapshot weekly > /dev/null 2>&1 2- Method 2 - Connect to a Cygwin drive over ssh port 22 (encrypted): cwRsync client will be used for incremental file transfer. Add the following to /etc/rsnapshot.conf on rsnapshot server. Use tab separated entries. +++++ backup administrator@apost1.mycompany.com:/cygdrive/c/\ Documents\ and\ Settings/apost/My\ Documents apost_My_Documents/ \ rsync_long_args=--delete --numeric-ids --delete-excluded +++++ Use a /etc/crontab entry to run rsnapshot: 0 22 * * * root /usr/bin/rsnapshot daily > /dev/null 2>&1 0 22 * * * root /usr/bin/rsnapshot weekly > /dev/null 2>&1 ------------------ D- Rsync commands: ------------------ 1- Method 1 - get files from cwRsync module over port 873: To see the modules available from the rsync server: # rsync apost1.mycompany.com:: My_Documents +++++ Files are accessed from rsync module "My_Documents". Anonymous connections are allowed (if so configured). Uses rsync on port 873 without encryption. +++++ command: # rsync -azSP --numeric-ids --delete apost1.mycompany.com::My_Documents \ /home/rsnapshot/My_Documents/ 2- Method 2 - get files from CygWin drive over port 22: File access via CygWin drive "/cygdrive/c/Documents and Settings/apost/My Documents" Uses encrypted ssh connection over port 22. Under this method the password for user 'administrator' must be entered unless passwordless rsa public key authentication is setup (see above). +++++ command: # rsync -azSP --numeric-ids --delete --rsh=ssh "administrator@apost1.\ mycompany.com:/cygdrive/c/Documents\ and\ Settings/apost/My\ Documents" \ /home/rsnapshot/ command (alternate form): # rsync -azSP --numeric-ids --delete -e "ssh -l administrator" "apost1.\ mycompany.com:/cygdrive/c/Documents\ and\ Settings/apost/My\ Documents" \ /home/rsnapshot/ ------------------- E- Restoring Files: ------------------- 1- Method #1 - From the backup server by the administrator: Mount the client WinXP box: # smbmunt //apost1/C$ /mnt -o username=administrator/MYCOMPANY Copy needed files from the backup server to the mounted computer: # cp "/home/workstations/daily.1/apost1/My Documents/Some File" \ "/mnt/C/Documents and Settings/apost/My Documents/ 2- Method #2 - From any computer by the administrator: SFTP into the backup box as root. Move needed files to a public file share. Have user to retrieve the files. 3- Method #3 - From source computer by the administrator: SFTP into the backup box as root. Copy needed files to the source computer. 4- Method #4 - From source computer via Samba by the user: Here is one possible approach under which the user would have read only access to the workstation backup intervals via a Samba file share at //backup1/user. a- Install Samba. Join backup1 to the domain for centralized user accounts management. Or create a local unix and samba accounts for each user. b- Set the homes shares to read only in /etc/samba/smb.conf. [homes] comment = Home Directories browseable = no writable = no c- Create home directories as needed: Example: # mkdir /home/apost d- Create symbolic links to the appropriate backup interval directories: Example: # ln -s /home/workstations/daily.0/apost /home/apost/daily.O # ln -s /home/workstations/daily.1/apost /home/apost/daily.1 # ln -s /home/workstations/daily.2/apost /home/apost/daily.2 # ln -s /home/workstations/daily.3/apost /home/apost/daily.3 # ln -s /home/workstations/daily.4/apost /home/apost/daily.4 # ln -s /home/workstations/daily.5/apost /home/apost/daily.5 # ln -s /home/workstations/daily.6/apost /home/apost/daily.6 # ln -s /home/workstations/weekly.0/apost /home/apost/weekly.O # ln -s /home/workstations/weekly.1/apost /home/apost/weekly.1 # ln -s /home/workstations/weekly.2/apost /home/apost/weekly.2 # ln -s /home/workstations/weekly.3/apost /home/apost/weekly.3 e- If rsync via ssh is used add a cmd_postexec script to the /etc/rsnapshot config to set file modes so that file acls do not block the user from reading the needed files. script: find /home/workstations/daily.0 -type d -exec chmod 777 {} \; find /home/workstations/daily.0 -type f -exec chmod 666 {} \; rsnapshot-1.4.2/configure.ac0000664000175000017500000001524312632661200015434 0ustar travistravisAC_INIT([rsnapshot],[m4_esyscmd_s([git describe --tags --always --dirty])],[rsnapshot-discuss@lists.sourceforge.net]) AM_INIT_AUTOMAKE([foreign]) AC_PROG_MAKE_SET AC_CONFIG_FILES(Makefile) dnl dnl get the current working directory for the regression test suite dnl CWD=`eval echo \`pwd\`` AC_SUBST(CWD, "$CWD/") dnl general test-directory AC_SUBST(TEST, "$CWD/t/") dnl snapshot_root in conf-files AC_SUBST(SNAP, "$CWD/t/support/snapshots") dnl template-source to backup AC_SUBST(TEMP, "$CWD/t/support/files/template") dnl dnl PERL CHECK (required program) dnl dnl if the user specified a path, try that first AC_ARG_WITH(perl, [ --with-perl=PATH Specify the path to perl ], [ if test "x$withval" != "xno"; then if test -x "$withval"; then PERL=$withval else AC_MSG_ERROR(perl not found) fi else AC_MSG_ERROR(perl is required) fi ] ) dnl if the user didn't specify a path, hunt for it if test "$PERL" = ""; then AC_PATH_PROG(PERL, perl, no) fi dnl bail out if we can't find it if test "$PERL" = "no"; then AC_MSG_ERROR(perl is required) fi dnl dnl RSYNC CHECK (required program) dnl dnl if the user specified a path, try that first AC_ARG_WITH(rsync, [ --with-rsync=PATH Specify the path to rsync ], [ if test "x$withval" != "xno"; then if test -x "$withval"; then RSYNC=$withval AC_SUBST(CMD_RSYNC, "cmd_rsync $RSYNC") else AC_MSG_ERROR(rsync not found) fi else AC_MSG_ERROR(rsync is required) fi ] ) dnl if the user didn't specify a path, hunt for it if test "$RSYNC" = ""; then AC_PATH_PROG(RSYNC, rsync, no) AC_SUBST(RSYNC, "$RSYNC") AC_SUBST(CMD_RSYNC, "cmd_rsync $RSYNC") fi dnl bail out if we can't find it if test "$RSYNC" = "no"; then AC_MSG_ERROR(rsync is required) fi dnl dnl CP CHECK (optional program) dnl dnl if the user specified a path, try that first AC_ARG_WITH(cp, [ --with-cp=PATH Specify the path to cp ], [ if test "x$withval" != "xno"; then if test -x "$withval"; then CP=$withval else AC_MSG_ERROR(cp not found) fi else CP=no fi ] ) dnl save the program for testing AC_SUBST(TEST_CP, "$CP") dnl if the user didn't specify a path, hunt for it if test "$CP" != "no"; then AC_PATH_PROG(CP, cp, no) fi dnl if we couldn't find it, provide an example if test "$CP" = "no"; then CP=/bin/cp fi dnl either way, set the cmd_cp var AC_SUBST(CMD_CP, "cmd_cp $CP") dnl dnl RM CHECK (optional program) dnl dnl if the user specified a path, try that first AC_ARG_WITH(rm, [ --with-rm=PATH Specify the path to rm ], [ if test "x$withval" != "xno"; then if test -x "$withval"; then RM=$withval else AC_MSG_ERROR(rm not found) fi else RM=no fi ] ) dnl if the user didn't specify a path, hunt for it if test "$RM" != "no"; then AC_PATH_PROG(RM, rm, no) fi dnl save the program for testing AC_SUBST(TEST_RM, "$RM") dnl if we couldn't find it, provide an example if test "$RM" = "no"; then RM=/bin/rm fi dnl either way, set the cmd_rm var AC_SUBST(CMD_RM, "cmd_rm $RM") dnl dnl SSH CHECK (optional program) dnl dnl if the user specified a path, try that first AC_ARG_WITH(ssh, [ --with-ssh=PATH Specify the path to ssh ], [ if test "x$withval" != "xno"; then if test -x "$withval"; then SSH=$withval else AC_MSG_ERROR(ssh not found) fi else SSH=no fi ] ) dnl if the user didn't specify a path, hunt for it if test "$SSH" != "no"; then AC_PATH_PROG(SSH, ssh, no) fi dnl save the program for testing AC_SUBST(TEST_SSH, "$SSH") dnl if we couldn't find it, provide an example if test "$SSH" = "no"; then SSH=/path/to/ssh fi dnl either way, set the cmd_ssh var AC_SUBST(CMD_SSH, "cmd_ssh $SSH") dnl dnl LVM COMMANDS CHECK (optional programs) dnl dnl lvcreate AC_PATH_PROG(LVCREATE, lvcreate, no) if test "$LVCREATE" = "no"; then LVCREATE=/path/to/lvcreate fi AC_SUBST(CMD_LVCREATE, "$LVCREATE") dnl lvremove AC_PATH_PROG(LVREMOVE, lvremove, no) if test "$LVREMOVE" = "no"; then LVREMOVE=/path/to/lvremove fi AC_SUBST(CMD_LVREMOVE, "$LVREMOVE") dnl mount AC_PATH_PROG(MOUNT, mount, no) if test "$MOUNT" = "no"; then MOUNT=/path/to/mount fi AC_SUBST(CMD_MOUNT, "$MOUNT") dnl umount AC_PATH_PROG(UMOUNT, umount, no) if test "$UMOUNT" = "no"; then UMOUNT=/path/to/umount fi AC_SUBST(CMD_UMOUNT, "$UMOUNT") dnl dnl LOGGER CHECK (optional program) dnl dnl if the user specified a path, try that first AC_ARG_WITH(logger, [ --with-logger=PATH Specify the path to logger ], [ if test "x$withval" != "xno"; then if test -x "$withval"; then LOGGER=$withval else AC_MSG_ERROR(logger not found) fi else LOGGER=no fi ] ) dnl if the user didn't specify a path, hunt for it if test "$LOGGER" != "no"; then AC_PATH_PROG(LOGGER, logger, no) fi dnl save the program for testing AC_SUBST(TEST_LOGGER, "$LOGGER") dnl if we couldn't find it, provide an example if test "$LOGGER" = "no"; then LOGGER=/path/to/logger fi dnl either way, set the cmd_logger var AC_SUBST(CMD_LOGGER, "cmd_logger $LOGGER") dnl dnl DU CHECK (optional program) dnl dnl if the user specified a path, try that first AC_ARG_WITH(du, [ --with-du=PATH Specify the path to du ], [ if test "x$withval" != "xno"; then if test -x "$withval"; then DU=$withval else AC_MSG_ERROR(du not found) fi else DU=no fi ] ) dnl if the user didn't specify a path, hunt for it if test "$DU" != "no"; then AC_PATH_PROG(DU, du, no) fi dnl save the program for testing AC_SUBST(TEST_DU, "$DU") dnl if we couldn't find it, provide an example if test "$DU" = "no"; then DU=/path/to/du fi dnl either way, set the cmd_du var AC_SUBST(CMD_DU, "cmd_du $DU") dnl dnl TEST_SSH_USER CHECK (optional param) dnl dnl if the user specified a path, try that first AC_ARG_WITH(test-ssh-user, [ --with-test-ssh-user=USER Specify the path to rsync ], [ if test "x$withval" != "xno"; then TEST_SSH_USER="$withval" AC_SUBST(TEST_SSH_USER, "$TEST_SSH_USER") fi ] ) dnl if the user didn't specify a test ssh user use current user if test "$TEST_SSH_USER" = ""; then AC_SUBST(TEST_SSH_USER, "$USER") fi # replace perl paths AC_CONFIG_FILES(rsnapshot:rsnapshot-program.pl) AC_CONFIG_FILES(rsnapshot-diff:rsnapshot-diff.pl) dnl try to find dependent programs for the config file AC_CONFIG_FILES(rsnapshot.conf.default:rsnapshot.conf.default.in) dnl testsuite-files are following m4_include(t/include.ac) AC_OUTPUT echo "" echo "Now type \"make test\" to run the regression test suite." echo "Then type \"make install\" to install the program." echo "" if test ! -e "$RSNAPSHOT_SYSCONFDIR/rsnapshot.conf"; then echo "After rsnapshot is installed, don't forget to copy" echo "$RSNAPSHOT_SYSCONFDIR/rsnapshot.conf.default to $RSNAPSHOT_SYSCONFDIR/rsnapshot.conf" echo "" fi rsnapshot-1.4.2/t/0000775000175000017500000000000012632661205013411 5ustar travistravisrsnapshot-1.4.2/t/link-dest_-t_when_only_one_snapshot/0000775000175000017500000000000012632661204022544 5ustar travistravisrsnapshot-1.4.2/t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t.in0000664000175000017500000000126512632661200032472 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 5; use SysWrap; # Make sure snap_root directory does not exist before we start ok(! remove_snapshot_root(), " snapshot root does not exist before testing starts"); ok(0 == rsnapshot("-c @TEST@/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf daily"), " first rsnapshot ran"); ok(-d "@SNAP@/daily.0" && ! -d "@SNAP@/daily.1", " daily.0 exists but daily.1 does not"); ok(rsnapshot_output("-c @TEST@/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf -t daily") =~ / --link-dest=/, " link-dest is used"); ok(0 == remove_snapshot_root(), " Removed snapshot root to clean up"); rsnapshot-1.4.2/t/link-dest_-t_when_only_one_snapshot/conf/0000775000175000017500000000000012632661204023471 5ustar travistravis././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootrsnapshot-1.4.2/t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf.inrsnapshot-1.4.2/t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf.0000664000175000017500000000030112632661200033540 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ link_dest 1 interval daily 7 backup @TEST@/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf link_dest rsnapshot-1.4.2/t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf0000664000175000017500000000044112632661204033473 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync link_dest 1 interval daily 7 backup /home/travis/build/rsnapshot/rsnapshot//t//link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf link_dest rsnapshot-1.4.2/t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t0000664000175000017500000000162012632661204032064 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 5; use SysWrap; # Make sure snap_root directory does not exist before we start ok(! remove_snapshot_root(), " snapshot root does not exist before testing starts"); ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf daily"), " first rsnapshot ran"); ok(-d "/home/travis/build/rsnapshot/rsnapshot//t/support/snapshots/daily.0" && ! -d "/home/travis/build/rsnapshot/rsnapshot//t/support/snapshots/daily.1", " daily.0 exists but daily.1 does not"); ok(rsnapshot_output("-c /home/travis/build/rsnapshot/rsnapshot//t//link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf -t daily") =~ / --link-dest=/, " link-dest is used"); ok(0 == remove_snapshot_root(), " Removed snapshot root to clean up"); rsnapshot-1.4.2/t/relative_delete_bugfix/0000775000175000017500000000000012632661204020111 5ustar travistravisrsnapshot-1.4.2/t/relative_delete_bugfix/relative_delete_bugfix.t.in0000664000175000017500000000162012632661200025377 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 7; use SysWrap; # copy files into place mkdir("@TEST@/support/files/a") unless -d "@TEST@/support/files/a"; ok(0 == execute("cp @TEMP@/a/1 @TEMP@/a/2 @TEST@/support/files/a/")); # run rsnapshot once to copy the files into the snapshot root ok(0 == rsnapshot("-c @TEST@/rsync/conf/rsync.conf hourly")); # now remove a file from the source ok(0 == execute("rm -f @TEST@/support/files/a/1")); # run rsnapshot again, it _should_ delete the "1" file ok(0 == rsnapshot("-c @TEST@/relative_delete_bugfix/conf/relative_delete_bugfix.conf hourly")); my $path_to_check = '@TEST@/support/snapshots/hourly.0/localhost/@TEST@/support/files/a/'; # make sure the file was --deleted ok( ! -e "$path_to_check/1" ); # make sure the other one is still there ok( -e "$path_to_check/2" ); # clean up ok(0 == execute("rm -f @TEST@/support/files/a/1 @TEST@/support/files/a/2")); rsnapshot-1.4.2/t/relative_delete_bugfix/relative_delete_bugfix.t0000664000175000017500000000262512632661204025004 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 7; use SysWrap; # copy files into place mkdir("/home/travis/build/rsnapshot/rsnapshot//t//support/files/a") unless -d "/home/travis/build/rsnapshot/rsnapshot//t//support/files/a"; ok(0 == execute("cp /home/travis/build/rsnapshot/rsnapshot//t/support/files/template/a/1 /home/travis/build/rsnapshot/rsnapshot//t/support/files/template/a/2 /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/")); # run rsnapshot once to copy the files into the snapshot root ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//rsync/conf/rsync.conf hourly")); # now remove a file from the source ok(0 == execute("rm -f /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/1")); # run rsnapshot again, it _should_ delete the "1" file ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//relative_delete_bugfix/conf/relative_delete_bugfix.conf hourly")); my $path_to_check = '/home/travis/build/rsnapshot/rsnapshot//t//support/snapshots/hourly.0/localhost//home/travis/build/rsnapshot/rsnapshot//t//support/files/a/'; # make sure the file was --deleted ok( ! -e "$path_to_check/1" ); # make sure the other one is still there ok( -e "$path_to_check/2" ); # clean up ok(0 == execute("rm -f /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/1 /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/2")); rsnapshot-1.4.2/t/relative_delete_bugfix/conf/0000775000175000017500000000000012632661204021036 5ustar travistravisrsnapshot-1.4.2/t/relative_delete_bugfix/conf/relative_delete_bugfix.conf0000664000175000017500000000033212632661204026404 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 6 backup /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/ localhost/ rsnapshot-1.4.2/t/relative_delete_bugfix/conf/relative_delete_bugfix.conf.in0000664000175000017500000000017212632661200027007 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 6 backup @TEST@/support/files/a/ localhost/ rsnapshot-1.4.2/t/snapshot_root_with_space/0000775000175000017500000000000012632661204020520 5ustar travistravisrsnapshot-1.4.2/t/snapshot_root_with_space/snapshot_root_with_space.t.in0000664000175000017500000000132412632661200026416 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 5; use SysWrap; my $snap_root="@TEST@/support/snapshots space root"; # Make sure snap_root directory does not exist before we start ok(! remove_snapshot_root($snap_root), " snapshot root does not exist before testing starts"); ok(0 == rsnapshot("-c @TEST@/snapshot_root_with_space/conf/snapshot_root_with_space.conf hourly"), " first rsnapshot ran"); ok(0 == rsnapshot("-c @TEST@/snapshot_root_with_space/conf/snapshot_root_with_space.conf hourly"), " second rsnapshot ran"); ok(-d "$snap_root/hourly.0" && -d "$snap_root/hourly.1", " hourly.0 and hourly.1 directories exist afterward"); ok(0 == execute("rm -rf \"$snap_root\""), " Removed snapshot root to clean up"); rsnapshot-1.4.2/t/snapshot_root_with_space/conf/0000775000175000017500000000000012632661204021445 5ustar travistravisrsnapshot-1.4.2/t/snapshot_root_with_space/conf/snapshot_root_with_space.conf.in0000664000175000017500000000030312632661200030021 0ustar travistravisconfig_version 1.2 snapshot_root @TEST@/support/snapshots space root/ cmd_rsync @RSYNC@ interval hourly 6 backup @TEST@/snapshot_root_with_space/conf/snapshot_root_with_space.conf localhost/ rsnapshot-1.4.2/t/snapshot_root_with_space/conf/snapshot_root_with_space.conf0000664000175000017500000000042212632661204027422 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t//support/snapshots space root/ cmd_rsync /usr/bin/rsync interval hourly 6 backup /home/travis/build/rsnapshot/rsnapshot//t//snapshot_root_with_space/conf/snapshot_root_with_space.conf localhost/ rsnapshot-1.4.2/t/snapshot_root_with_space/snapshot_root_with_space.t0000664000175000017500000000155112632661204026017 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 5; use SysWrap; my $snap_root="/home/travis/build/rsnapshot/rsnapshot//t//support/snapshots space root"; # Make sure snap_root directory does not exist before we start ok(! remove_snapshot_root($snap_root), " snapshot root does not exist before testing starts"); ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//snapshot_root_with_space/conf/snapshot_root_with_space.conf hourly"), " first rsnapshot ran"); ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//snapshot_root_with_space/conf/snapshot_root_with_space.conf hourly"), " second rsnapshot ran"); ok(-d "$snap_root/hourly.0" && -d "$snap_root/hourly.1", " hourly.0 and hourly.1 directories exist afterward"); ok(0 == execute("rm -rf \"$snap_root\""), " Removed snapshot root to clean up"); rsnapshot-1.4.2/t/support/0000775000175000017500000000000012632661210015121 5ustar travistravisrsnapshot-1.4.2/t/support/files/0000775000175000017500000000000012632661206016230 5ustar travistravisrsnapshot-1.4.2/t/support/files/a/0000775000175000017500000000000012632661207016451 5ustar travistravisrsnapshot-1.4.2/t/support/files/template/0000775000175000017500000000000012632661200020035 5ustar travistravisrsnapshot-1.4.2/t/support/files/template/a/0000775000175000017500000000000012632661200020255 5ustar travistravisrsnapshot-1.4.2/t/support/files/template/a/10000664000175000017500000000000312632661200020331 0ustar travistravisa1 rsnapshot-1.4.2/t/support/files/template/a/20000664000175000017500000000000312632661200020332 0ustar travistravisa2 rsnapshot-1.4.2/t/support/skel/0000775000175000017500000000000012632661200016056 5ustar travistravisrsnapshot-1.4.2/t/support/skel/testcase0000664000175000017500000000227512632661200017622 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 4; # pack here your amount of subtests use SysWrap; # # Write here in brief, what you want to check! # # your code follows here # there are MACROS, which should aways be used: # @TEST@ you're always referencing your testsuite-directory # in a test-file it could look like this: # ok(0 == rsnapshot("-c @TEST@/cmd-post_pre-exec/conf/pre-false-post-false.conf hourly")); # @SNAP@ always references a possible snapshot-root # in the configuration-file this could be one line: # snapshot_root @SNAP@ # @TEMP@ the template directory. Use this as your backup-source # in the configuration-file this could be one line: # backup @TEMP@ localhost # # there are of course other MACROS, too. check them out: # $> grep AC_SUBST configure.ac # The first parameter is always the macro_name which gets replaced #here is some pseudo-code to give you a hint, how your tests could look like ok(0 == rsnapshot("-c @TEST@/cmd-post_pre-exec/conf/pre-false-post-false.conf hourly")); # you can even skip tests SKIP: { if($condition){ skip("Cant SSH with \"$ssh_test\"", 1); } ok(!rsnapshot("-c @TEST@/ssh_args/conf/ssh_args.conf hourly"), "ssh_args parsed"); } rsnapshot-1.4.2/t/support/skel/testconf0000664000175000017500000000024412632661200017626 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 2 cmd_preexec /bin/true cmd_postexec /bin/true backup @TEMP@ cmd_pre_postexectest/ rsnapshot-1.4.2/t/support/snapshots/0000700000175000017500000000000012632661210017127 5ustar travistravisrsnapshot-1.4.2/t/support/snapshots/hourly.0/0000755000175000017500000000000012632661210020621 5ustar travistravisrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/0000775000175000017500000000000012632661210022613 5ustar travistravisrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/0000755000175000017500000000000012464456623023556 5ustar travistravisrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/0000755000175000017500000000000012632661200025050 5ustar travistravisrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/0000775000175000017500000000000012632661177026166 5ustar travistravisrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/0000775000175000017500000000000012632661177030207 5ustar travistravisrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/rsnapshot/0000775000175000017500000000000012632661205032220 5ustar travistravisrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/rsnapshot/t/0000775000175000017500000000000012632661205032463 5ustar travistravis././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/rsnapshot/t/ssh_args/rsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/rsnapshot/t/ssh_a0000775000175000017500000000000012632661205033501 5ustar travistravis././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/rsnapshot/t/ssh_args/conf/rsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/rsnapshot/t/ssh_a0000775000175000017500000000000012632661205033501 5ustar travistravis././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/rsnapshot/t/ssh_args/conf/ssh_args.confrsnapshot-1.4.2/t/support/snapshots/hourly.0/localhost/home/travis/build/rsnapshot/rsnapshot/t/ssh_a0000664000175000017500000000043512632661205033505 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh interval hourly 6 ssh_args -p 22 backup travis@localhost:/home/travis/build/rsnapshot/rsnapshot//t//ssh_args/conf/ssh_args.conf localhost/ rsnapshot-1.4.2/t/include.ac0000664000175000017500000000310212632661200015330 0ustar travistravis # this part is autogenerated by autogen.sh AC_CONFIG_FILES(t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t) AC_CONFIG_FILES(t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf) AC_CONFIG_FILES(t/relative_delete_bugfix/relative_delete_bugfix.t) AC_CONFIG_FILES(t/relative_delete_bugfix/conf/relative_delete_bugfix.conf) AC_CONFIG_FILES(t/snapshot_root_with_space/snapshot_root_with_space.t) AC_CONFIG_FILES(t/snapshot_root_with_space/conf/snapshot_root_with_space.conf) AC_CONFIG_FILES(t/cmd-post_pre-exec/cmd-post_pre-exec.t) AC_CONFIG_FILES(t/cmd-post_pre-exec/conf/pre-false-post-true.conf) AC_CONFIG_FILES(t/cmd-post_pre-exec/conf/pre-true-post-true.conf) AC_CONFIG_FILES(t/cmd-post_pre-exec/conf/pre-true-post-false.conf) AC_CONFIG_FILES(t/cmd-post_pre-exec/conf/pre-false-post-false.conf) AC_CONFIG_FILES(t/SysWrap.pm) AC_CONFIG_FILES(t/backup_exec/conf/backup_exec_fail.conf) AC_CONFIG_FILES(t/backup_exec/conf/backup_exec.conf) AC_CONFIG_FILES(t/backup_exec/backup_exec.t) AC_CONFIG_FILES(t/rsync-exitcode/rsync-exitcode.t) AC_CONFIG_FILES(t/rsync-exitcode/conf/rsync-exitcode-good.conf) AC_CONFIG_FILES(t/rsync-exitcode/conf/rsync-exitcode-bad.conf) AC_CONFIG_FILES(t/configtest/configtest.t) AC_CONFIG_FILES(t/configtest/conf/configtest.conf) AC_CONFIG_FILES(t/rsync/rsync.t) AC_CONFIG_FILES(t/rsync/conf/rsync.conf) AC_CONFIG_FILES(t/gnu_cp/gnu_cp.t) AC_CONFIG_FILES(t/gnu_cp/conf/gnu_cp.conf) AC_CONFIG_FILES(t/ssh_args/conf/ssh_args.conf) AC_CONFIG_FILES(t/ssh_args/ssh_args.t) # this part had been autogenerated by autogen.sh rsnapshot-1.4.2/t/cmd-post_pre-exec/0000775000175000017500000000000012632661204016726 5ustar travistravisrsnapshot-1.4.2/t/cmd-post_pre-exec/cmd-post_pre-exec.t0000664000175000017500000000127412632661204022435 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl # Testing: Only pass test, if both cmd_preexec and cmd_postexec succeeds and the exit-code matches use strict; use Test::More tests => 4; use SysWrap; ok(0 != rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//cmd-post_pre-exec/conf/pre-false-post-false.conf hourly")); ok(0 != rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//cmd-post_pre-exec/conf/pre-false-post-true.conf hourly")); ok(0 != rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//cmd-post_pre-exec/conf/pre-true-post-false.conf hourly")); ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//cmd-post_pre-exec/conf/pre-true-post-true.conf hourly")); rsnapshot-1.4.2/t/cmd-post_pre-exec/cmd-post_pre-exec.t.in0000664000175000017500000000100312632661200023024 0ustar travistravis#!@PERL@ # Testing: Only pass test, if both cmd_preexec and cmd_postexec succeeds and the exit-code matches use strict; use Test::More tests => 4; use SysWrap; ok(0 != rsnapshot("-c @TEST@/cmd-post_pre-exec/conf/pre-false-post-false.conf hourly")); ok(0 != rsnapshot("-c @TEST@/cmd-post_pre-exec/conf/pre-false-post-true.conf hourly")); ok(0 != rsnapshot("-c @TEST@/cmd-post_pre-exec/conf/pre-true-post-false.conf hourly")); ok(0 == rsnapshot("-c @TEST@/cmd-post_pre-exec/conf/pre-true-post-true.conf hourly")); rsnapshot-1.4.2/t/cmd-post_pre-exec/conf/0000775000175000017500000000000012632661204017653 5ustar travistravisrsnapshot-1.4.2/t/cmd-post_pre-exec/conf/pre-false-post-true.conf.in0000664000175000017500000000024512632661200024742 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 2 cmd_preexec /bin/false cmd_postexec /bin/true backup @TEMP@ cmd_pre_postexectest/ rsnapshot-1.4.2/t/cmd-post_pre-exec/conf/pre-true-post-true.conf.in0000664000175000017500000000024412632661200024626 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 2 cmd_preexec /bin/true cmd_postexec /bin/true backup @TEMP@ cmd_pre_postexectest/ rsnapshot-1.4.2/t/cmd-post_pre-exec/conf/pre-true-post-true.conf0000664000175000017500000000043212632661204024224 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 2 cmd_preexec /bin/true cmd_postexec /bin/true backup /home/travis/build/rsnapshot/rsnapshot//t/support/files/template cmd_pre_postexectest/ rsnapshot-1.4.2/t/cmd-post_pre-exec/conf/pre-true-post-false.conf.in0000664000175000017500000000024512632661200024742 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 2 cmd_preexec /bin/true cmd_postexec /bin/false backup @TEMP@ cmd_pre_postexectest/ rsnapshot-1.4.2/t/cmd-post_pre-exec/conf/pre-true-post-false.conf0000664000175000017500000000043312632661204024340 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 2 cmd_preexec /bin/true cmd_postexec /bin/false backup /home/travis/build/rsnapshot/rsnapshot//t/support/files/template cmd_pre_postexectest/ rsnapshot-1.4.2/t/cmd-post_pre-exec/conf/pre-false-post-false.conf0000664000175000017500000000043312632661204024453 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 2 cmd_preexec /bin/false cmd_postexec /bin/false backup /home/travis/build/rsnapshot/rsnapshot//t/support/files/template cmd_pre_postexectest/ rsnapshot-1.4.2/t/cmd-post_pre-exec/conf/pre-false-post-true.conf0000664000175000017500000000043312632661204024340 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 2 cmd_preexec /bin/false cmd_postexec /bin/true backup /home/travis/build/rsnapshot/rsnapshot//t/support/files/template cmd_pre_postexectest/ rsnapshot-1.4.2/t/cmd-post_pre-exec/conf/pre-false-post-false.conf.in0000664000175000017500000000024512632661200025055 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 2 cmd_preexec /bin/false cmd_postexec /bin/false backup @TEMP@ cmd_pre_postexectest/ rsnapshot-1.4.2/t/SysWrap.pm.in0000664000175000017500000000124712632661200015763 0ustar travistravispackage SysWrap; use strict; use warnings FATAL => 'all'; use Exporter 'import'; our $VERSION = '1.0'; our @EXPORT = qw(execute rsnapshot remove_snapshot_root rsnapshot_output); sub remove_snapshot_root { my $args = shift(@_); my $snapshot_root; if(defined $args && $args ne ""){ $snapshot_root = $args; } else { $snapshot_root = "@SNAP@"; } if(-d "$snapshot_root"){ return execute("rm -rf \"$snapshot_root\""); } } sub execute { return system(@_) >> 8; } sub rsnapshot { my $args = shift(@_); return execute("@PERL@ @CWD@/rsnapshot $args >/dev/null 2>&1"); } sub rsnapshot_output { my $args = shift(@_); return `@PERL@ @CWD@/rsnapshot $args`; } 1; rsnapshot-1.4.2/t/backup_exec/0000775000175000017500000000000012632661205015662 5ustar travistravisrsnapshot-1.4.2/t/backup_exec/backup_exec.t0000664000175000017500000000057512632661205020327 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 2; use SysWrap; # Ensure passing behavior ok(2 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//backup_exec/conf/backup_exec.conf hourly")); # Ensure failing behavior ok(1 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//backup_exec/conf/backup_exec_fail.conf hourly")); rsnapshot-1.4.2/t/backup_exec/conf/0000775000175000017500000000000012632661205016607 5ustar travistravisrsnapshot-1.4.2/t/backup_exec/conf/backup_exec_fail.conf0000664000175000017500000000025312632661205022722 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 2 backup_exec /bin/false required rsnapshot-1.4.2/t/backup_exec/conf/backup_exec.conf0000664000175000017500000000060112632661205021724 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 2 backup_exec ls -ld /* | grep "/u" backup_exec echo "hello world!" backup_exec echo 'hello world!' backup_exec /bin/true backup_exec /bin/true optional backup_exec /bin/true required backup_exec /bin/false backup_exec /bin/false optional rsnapshot-1.4.2/t/backup_exec/conf/backup_exec_fail.conf.in0000664000175000017500000000015712632661200023325 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 2 backup_exec /bin/false required rsnapshot-1.4.2/t/backup_exec/conf/backup_exec.conf.in0000664000175000017500000000050512632661200022327 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 2 backup_exec ls -ld /* | grep "/u" backup_exec echo "hello world!" backup_exec echo 'hello world!' backup_exec /bin/true backup_exec /bin/true optional backup_exec /bin/true required backup_exec /bin/false backup_exec /bin/false optional rsnapshot-1.4.2/t/backup_exec/backup_exec.t.in0000664000175000017500000000041412632661200020717 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 2; use SysWrap; # Ensure passing behavior ok(2 == rsnapshot("-c @TEST@/backup_exec/conf/backup_exec.conf hourly")); # Ensure failing behavior ok(1 == rsnapshot("-c @TEST@/backup_exec/conf/backup_exec_fail.conf hourly")); rsnapshot-1.4.2/t/rsync-exitcode/0000775000175000017500000000000012632661205016351 5ustar travistravisrsnapshot-1.4.2/t/rsync-exitcode/rsync-exitcode.t.in0000664000175000017500000000065612632661200022105 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 2; use SysWrap; mkdir("@TEST@/support/files/a") unless -d "@TEST@/support/files/a"; execute("cp @TEMP@/a/1 @TEMP@/a/2 @TEST@/support/files/a/"); ok(0 != rsnapshot("-c @TEST@/rsync-exitcode/conf/rsync-exitcode-bad.conf hourly")); ok(0 == rsnapshot("-c @TEST@/rsync-exitcode/conf/rsync-exitcode-good.conf hourly")); execute("rm -f @TEST@/support/files/a/1 @TEST@support/files/a/2"); rsnapshot-1.4.2/t/rsync-exitcode/rsync-exitcode.t0000664000175000017500000000150712632661205021501 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 2; use SysWrap; mkdir("/home/travis/build/rsnapshot/rsnapshot//t//support/files/a") unless -d "/home/travis/build/rsnapshot/rsnapshot//t//support/files/a"; execute("cp /home/travis/build/rsnapshot/rsnapshot//t/support/files/template/a/1 /home/travis/build/rsnapshot/rsnapshot//t/support/files/template/a/2 /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/"); ok(0 != rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//rsync-exitcode/conf/rsync-exitcode-bad.conf hourly")); ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//rsync-exitcode/conf/rsync-exitcode-good.conf hourly")); execute("rm -f /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/1 /home/travis/build/rsnapshot/rsnapshot//t/support/files/a/2"); rsnapshot-1.4.2/t/rsync-exitcode/conf/0000775000175000017500000000000012632661205017276 5ustar travistravisrsnapshot-1.4.2/t/rsync-exitcode/conf/rsync-exitcode-good.conf.in0000664000175000017500000000017212632661200024433 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 6 backup @TEST@/support/files/a/ localhost/ rsnapshot-1.4.2/t/rsync-exitcode/conf/rsync-exitcode-bad.conf0000664000175000017500000000032612632661205023632 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /bin/false interval hourly 6 backup /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/ localhost/ rsnapshot-1.4.2/t/rsync-exitcode/conf/rsync-exitcode-bad.conf.in0000664000175000017500000000017512632661200024234 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync /bin/false interval hourly 6 backup @TEST@/support/files/a/ localhost/ rsnapshot-1.4.2/t/rsync-exitcode/conf/rsync-exitcode-good.conf0000664000175000017500000000033212632661205024031 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 6 backup /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/ localhost/ rsnapshot-1.4.2/t/configtest/0000775000175000017500000000000012632661205015556 5ustar travistravisrsnapshot-1.4.2/t/configtest/configtest.t0000664000175000017500000000036512632661205020114 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 1; use SysWrap; # check for basic configtest ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//configtest/conf/configtest.conf configtest")); rsnapshot-1.4.2/t/configtest/configtest.t.in0000664000175000017500000000025012632661200020505 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 1; use SysWrap; # check for basic configtest ok(0 == rsnapshot("-c @TEST@/configtest/conf/configtest.conf configtest")); rsnapshot-1.4.2/t/configtest/conf/0000775000175000017500000000000012632661205016503 5ustar travistravisrsnapshot-1.4.2/t/configtest/conf/configtest.conf0000664000175000017500000000047312632661205021523 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 6 backup /home/travis/build/rsnapshot/rsnapshot//t/support/files/template/a/ localhost/ backup_exec /bin/true backup_exec /bin/true optional backup_exec /bin/true required rsnapshot-1.4.2/t/configtest/conf/configtest.conf.in0000664000175000017500000000030512632661200022115 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 6 backup @TEMP@/a/ localhost/ backup_exec /bin/true backup_exec /bin/true optional backup_exec /bin/true required rsnapshot-1.4.2/t/rsync/0000775000175000017500000000000012632661205014547 5ustar travistravisrsnapshot-1.4.2/t/rsync/rsync.t.in0000664000175000017500000000050312632661200016470 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 1; use SysWrap; mkdir("@TEST@/support/files/a") unless -d "@TEST@/support/files/a"; execute("cp @TEMP@/a/1 @TEMP@/a/2 @TEST@/support/files/a/"); ok(0 == rsnapshot("-c @TEST@/rsync/conf/rsync.conf hourly")); execute("rm -f @TEST@/support/files/a/1 @TEST@support/files/a/2"); rsnapshot-1.4.2/t/rsync/rsync.t0000664000175000017500000000127012632661205016072 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 1; use SysWrap; mkdir("/home/travis/build/rsnapshot/rsnapshot//t//support/files/a") unless -d "/home/travis/build/rsnapshot/rsnapshot//t//support/files/a"; execute("cp /home/travis/build/rsnapshot/rsnapshot//t/support/files/template/a/1 /home/travis/build/rsnapshot/rsnapshot//t/support/files/template/a/2 /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/"); ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//rsync/conf/rsync.conf hourly")); execute("rm -f /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/1 /home/travis/build/rsnapshot/rsnapshot//t/support/files/a/2"); rsnapshot-1.4.2/t/rsync/conf/0000775000175000017500000000000012632661205015474 5ustar travistravisrsnapshot-1.4.2/t/rsync/conf/rsync.conf.in0000664000175000017500000000017212632661200020101 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ interval hourly 6 backup @TEST@/support/files/a/ localhost/ rsnapshot-1.4.2/t/rsync/conf/rsync.conf0000664000175000017500000000033212632661205017477 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync interval hourly 6 backup /home/travis/build/rsnapshot/rsnapshot//t//support/files/a/ localhost/ rsnapshot-1.4.2/t/gnu_cp/0000775000175000017500000000000012632661205014664 5ustar travistravisrsnapshot-1.4.2/t/gnu_cp/gnu_cp.t0000664000175000017500000000075012632661205016326 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 2; use SysWrap; # make sure snapshot_root directory does not exist before we start ok(! remove_snapshot_root(), " snapshot root does not exist before testing starts"); # check for GNU cp my @lines = `/bin/cp --help | grep -i 'gnu'`; SKIP: { skip('GNU cp not found', 1) if (@lines == 0); ok(0 == rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//gnu_cp/conf/gnu_cp.conf hourly 2>&1")); } rsnapshot-1.4.2/t/gnu_cp/gnu_cp.t.in0000664000175000017500000000063012632661200016723 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 2; use SysWrap; # make sure snapshot_root directory does not exist before we start ok(! remove_snapshot_root(), " snapshot root does not exist before testing starts"); # check for GNU cp my @lines = `@CP@ --help | grep -i 'gnu'`; SKIP: { skip('GNU cp not found', 1) if (@lines == 0); ok(0 == rsnapshot("-c @TEST@/gnu_cp/conf/gnu_cp.conf hourly 2>&1")); } rsnapshot-1.4.2/t/gnu_cp/conf/0000775000175000017500000000000012632661205015611 5ustar travistravisrsnapshot-1.4.2/t/gnu_cp/conf/gnu_cp.conf0000664000175000017500000000036012632661205017732 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync cmd_cp /bin/cp interval hourly 6 backup /home/travis/build/rsnapshot/rsnapshot//t/support/files/template localhost/ rsnapshot-1.4.2/t/gnu_cp/conf/gnu_cp.conf.in0000664000175000017500000000016712632661200020337 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ cmd_cp @CP@ interval hourly 6 backup @TEMP@ localhost/ rsnapshot-1.4.2/t/SysWrap.pm0000664000175000017500000000156212632661204015362 0ustar travistravispackage SysWrap; use strict; use warnings FATAL => 'all'; use Exporter 'import'; our $VERSION = '1.0'; our @EXPORT = qw(execute rsnapshot remove_snapshot_root rsnapshot_output); sub remove_snapshot_root { my $args = shift(@_); my $snapshot_root; if(defined $args && $args ne ""){ $snapshot_root = $args; } else { $snapshot_root = "/home/travis/build/rsnapshot/rsnapshot//t/support/snapshots"; } if(-d "$snapshot_root"){ return execute("rm -rf \"$snapshot_root\""); } } sub execute { return system(@_) >> 8; } sub rsnapshot { my $args = shift(@_); return execute("/home/travis/perl5/perlbrew/perls/5.18/bin/perl /home/travis/build/rsnapshot/rsnapshot//rsnapshot $args >/dev/null 2>&1"); } sub rsnapshot_output { my $args = shift(@_); return `/home/travis/perl5/perlbrew/perls/5.18/bin/perl /home/travis/build/rsnapshot/rsnapshot//rsnapshot $args`; } 1; rsnapshot-1.4.2/t/ssh_args/0000775000175000017500000000000012632661205015222 5ustar travistravisrsnapshot-1.4.2/t/ssh_args/ssh_args.t0000664000175000017500000000106612632661205017223 0ustar travistravis#!/home/travis/perl5/perlbrew/perls/5.18/bin/perl use strict; use Test::More tests => 2; use SysWrap; # make sure snap_root directory does not exist before we start ok(! remove_snapshot_root(), " snapshot root does not exist before testing starts"); SKIP: { my $ssh_test = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no travis\@localhost true"; my $cant_ssh = system("$ssh_test"); skip("Cant SSH with \"$ssh_test\"", 1) if ($cant_ssh); ok(!rsnapshot("-c /home/travis/build/rsnapshot/rsnapshot//t//ssh_args/conf/ssh_args.conf hourly"), "ssh_args parsed"); } rsnapshot-1.4.2/t/ssh_args/conf/0000775000175000017500000000000012632661205016147 5ustar travistravisrsnapshot-1.4.2/t/ssh_args/conf/ssh_args.conf0000664000175000017500000000043512632661205020631 0ustar travistravisconfig_version 1.2 snapshot_root /home/travis/build/rsnapshot/rsnapshot//t/support/snapshots cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh interval hourly 6 ssh_args -p 22 backup travis@localhost:/home/travis/build/rsnapshot/rsnapshot//t//ssh_args/conf/ssh_args.conf localhost/ rsnapshot-1.4.2/t/ssh_args/conf/ssh_args.conf.in0000664000175000017500000000027712632661200021235 0ustar travistravisconfig_version 1.2 snapshot_root @SNAP@ cmd_rsync @RSYNC@ cmd_ssh @SSH@ interval hourly 6 ssh_args -p 22 backup @TEST_SSH_USER@@localhost:@TEST@/ssh_args/conf/ssh_args.conf localhost/ rsnapshot-1.4.2/t/ssh_args/ssh_args.t.in0000664000175000017500000000075312632661200017625 0ustar travistravis#!@PERL@ use strict; use Test::More tests => 2; use SysWrap; # make sure snap_root directory does not exist before we start ok(! remove_snapshot_root(), " snapshot root does not exist before testing starts"); SKIP: { my $ssh_test = "@SSH@ -p 22 -o StrictHostKeyChecking=no @TEST_SSH_USER@\@localhost true"; my $cant_ssh = system("$ssh_test"); skip("Cant SSH with \"$ssh_test\"", 1) if ($cant_ssh); ok(!rsnapshot("-c @TEST@/ssh_args/conf/ssh_args.conf hourly"), "ssh_args parsed"); } rsnapshot-1.4.2/INSTALL.md0000664000175000017500000001112212632661200014566 0ustar travistravis# INSTALLATION rsnapshot is a filesystem snapshot utility. It uses rsync to take snapshots of local and remote filesystems for any number of machines, and then rotates the snapshots according to your rsnapshot.conf. rsnapshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the GNU General Public Licence for details. ## QUICK START If you are installing for the first time (and just want the defaults): * Run these commands for a quick installation from source code: (skip these commands if you have installed rpm or debian package) $ ./autogen.sh # Generates the configure script. $ ./configure --sysconfdir=/etc $ sudo make install $ sudo cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf * Open up /etc/rsnapshot.conf with a text editor, and modify it for your system. * Make sure the config file syntax is valid (remember, tabs, not spaces): $ /usr/local/bin/rsnapshot configtest The rsnapshot HOWTO is recommended reading for first time setups. It will walk you through this process in great detail. The rsnapshot HOWTO can be found online at http://www.rsnapshot.org/ ## UPGRADING If you are upgrading from a previous installation of rsnapshot 1.1.x, please read the file: `docs/Upgrading_from_1.1` There are no special instructions for upgrading from rsnapshot 1.2.x to 1.3.x, since both use `config_version 1.2`. If you are not sure whether you need to do anything to upgrade your old rsnapshot.conf, you can run $ make upgrade or $ rsnapshot upgrade-config-file or $ rsnapshot -c /etc/rsnapshot.conf upgrade-config-file ## ADDITIONAL OPTIONS If you require more precise control over the locations of files: You can pass the following options to ./configure for more control over where various parts of rsnapshot are installed. The example values shown also happen to be the defaults. * --prefix=/usr/local This will install everything under /usr/local * --sysconfdir=/usr/local/etc This will install the example config file (rsnapshot.conf.default) under /usr/local/etc. This will also be the default directory where rsnapshot looks for its config file. It is recommended that you copy rsnapshot.conf.default and use it as a basis for the actual config file (rsnapshot.conf). * --bindir=/usr/local/bin This will install the rsnapshot program under /usr/local/bin * --mandir=/usr/local/man This will install the man page under /usr/local/man * --with-perl=/usr/bin/perl Specify your preferred path to perl. If you don't specify this, the build process will detect the first version of perl it finds in your path. * --with-rsync=/usr/bin/rsync Specify your preferred path to rsync. If you don't specify this, the build process will detect the first version of rsync it finds in your path. You can always change this later by editing the config file (rsnapshot.conf). * --with-cp=/bin/cp Specify the path to GNU cp. The traditional UNIX cp command is not sufficient. If you don't specify this, the build process will detect the first version of cp it finds in your path. If you don't have the GNU version of cp, leave this commented out in the config file (rsnapshot.conf). * --with-rm=/bin/rm Specify the path to the rm command. If you don't specify this, the build process will detect the first version of rm it finds in your path. * --with-ssh=/usr/bin/ssh Specify your preferred path to ssh. If you don't specify this, the build process will detect the first version of ssh it finds in your path. SSH is an optional feature, so it is OK if it isn't on your system. Either way, if you want to use ssh, you need to specifically enable this feature by uncommenting the "cmd_ssh" parameter in the config file (rsnapshot.conf). * --with-logger=/usr/bin/logger Specify your preferred path to logger. If you don't specify this, the build process will detect the first version of logger it finds in your path. If you want syslog support, make sure this is enabled in the config file. Syslog support is optional, so if you don't have it or comment it out it's OK. * --with-du=/usr/bin/du Specify your preferred path to du. If you don't specify this, the build process will detect the first version of du it finds in your path. The "du" command only gets used when rsnapshot is called with the "du" argument to calculate the amount of disk space used. This is optional, so if you don't have it or comment it out it's OK. rsnapshot-1.4.2/README.md0000664000175000017500000001371712632661200014431 0ustar travistravis# RSNAPSHOT [![Build Status](https://api.travis-ci.org/rsnapshot/rsnapshot.png)](https://travis-ci.org/rsnapshot/rsnapshot) rsnapshot comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the GNU General Public Licence for details. rsnapshot is a filesystem snapshot utility based on rsync. rsnapshot makes it easy to make periodic snapshots of local machines, and remote machines over ssh. The code makes extensive use of hard links whenever possible, to greatly reduce the disk space required. It is written entirely in perl with no module dependencies, and has been tested with versions 5.004 through 5.16.3. It should work on any reasonably modern UNIX compatible OS. It has been tested successfully on the following operating systems: - Debian: 3.0 (woody), 3.1 (sarge), unstable (sid) - Redhat: 7.x, 8.0 - RedHat Enterprise Linux: 3.0 ES, 5, 6 - Fedora Core: 1, 3 - Fedora: 17, 18 - CentOS: 3, 4, 5, 6 - WhiteBox Enterprise Linux 3.0 - Slackware 9.0 - SuSE: 9.0 - FreeBSD 4.9-STABLE - OpenBSD 3.x - Solaris 8 (SPARC and x86) - Mac OS X - IRIX 6.5 If this is your first experience with rsnapshot, you may want to read the rsnapshot HOWTO at http://www.rsnapshot.org/. The HOWTO will give you a detailed walk-through on how to get rsnapshot up and running in explicit detail. For a reference of all available commands, see the rsnapshot man page. If you are upgrading from version 1.1.6 or earlier, make sure you read the file [Upgrading from 1.1](docs/Upgrading_from_1.1). For installation or upgrade instructions please read the [INSTALL](INSTALL.md) doc. If you want to work on improving rsnapshot please read the [CONTRIBUTING](CONTRIBUTING.md) doc. COMPATIBILITY NOTICES (Please read) 1. Note that systems which use GNU cp version 5.9 or later will have problems with rsnapshot versions up to and including 1.2.3, if `cmd_cp` is enabled (and points at the later gnu cp). This is no longer a problem since rsnapshot 1.2.9, as it strips off trailing slashes when running cp. 2. If you have rsync version 2.5.7 or later, you may want to enable the link_dest parameter in the rsnapshot.conf file. If you are running Linux but do not have the problem above, you should enable the `cmd_cp` parameter in rsnapshot.conf (especially if you do not have link_dest enabled). Be advised that currently `link_dest` doesn't do well with unavailable hosts. Specifically, if a remote host is unavailable using `link_dest`, there will be no latest backup of that machine, and a full re-sync will be required when it becomes available. Using the other methods, the last good snapshot will be preserved, preventing the need for a re-sync. We hope to streamline this in the future. ## CONFIGURATION Once you have installed rsnapshot, you will need to configure it. The default configuration file is /etc/rsnapshot.conf, although the exact path may be different depending on how the program was installed. If this file does not exist, copy `/etc/rsnapshot.conf.default` over to `/etc/rsnapshot.conf` and edit it to suit your tastes. See the man page for the full list of configuration options. When `/etc/rsnapshot.conf` contains your chosen settings, do a quick sanity check to make sure everything is ready to go: $ rsnapshot configtest If this works, you can see essentially what will happen when you run it for real by executing the following command (where interval is `alpha`, `beta`, `etc`): $ rsnapshot -t [interval] Once you are happy with everything, the final step is to setup a cron job to automate your backups. Here is a quick example which makes backups every four hours, and beta backups for a week: 0 */4 * * * /usr/local/bin/rsnapshot alpha 50 23 * * * /usr/local/bin/rsnapshot beta In the previous example, there will be six `alpha` snapshots taken each day (at 0,4,8,12,16, and 20 hours). There will also be beta snapshots taken every night at 11:50PM. The number of snapshots that are saved depends on the "interval" settings in /etc/rsnapshot.conf. For example: interval alpha 6 This means that every time `rsnapshot alpha` is run, it will make a new snapshot, rotate the old ones, and retain the most recent six (`alpha.0` - `alpha.5`). If you prefer instead to have three levels of backups (which we'll call `beta`, `gamma` and `delta`), you might set up cron like this: 00 00 * * * /usr/local/bin/rsnapshot beta 00 23 * * 6 /usr/local/bin/rsnapshot gamma 00 22 1 * * /usr/local/bin/rsnapshot delta This specifies a `beta` rsnapshot at midnight, a `gamma` snapshot on Saturdays at 11:00pm and a `delta` rsnapshot at 10pm on the first day of each month. Note that the backups are done from the highest interval first (in this case `delta`) and go down to the lowest interval. If you are not having cron invoke the `alpha` snapshot interval, then you must also ensure that `alpha` is not listed as one of your intervals in rsnapshot.conf (for example, comment out alpha, so that `beta` becomes the lowest interval). Remember that it is only the lowest interval which actually does the rsync to back up the relevant source directories, the higher intervals just rotate snapshots around. Unless you have enabled `sync_first` in your configuration-file, in which case only the `sync` pseudo-interval does the actual rsync, and all real intervals just rotate snapshots. For the full documentation, type `man rsnapshot` once it is installed, or visit http://www.rsnapshot.org/. The HowTo on the web site has a detailed overview of how to install and configure rsnapshot, and things like how to set it up so users can restore their own files. If you plan on using the `backup_script` parameter in your backup scheme, take a look at the `utils/`-directory in the source distribution for several example scripts. The `utils/rsnapreport.pl` script is well worth a look. ## AUTHORS Please see the [AUTHORS](/AUTHORS) file for the complete list of contributors. rsnapshot-1.4.2/rsnapshot.conf.default.in0000664000175000017500000001766012632661200020073 0ustar travistravis################################################# # rsnapshot.conf - rsnapshot configuration file # ################################################# # # # PLEASE BE AWARE OF THE FOLLOWING RULE: # # # # This file requires tabs between elements # # # ################################################# ####################### # CONFIG FILE VERSION # ####################### config_version 1.2 ########################### # SNAPSHOT ROOT DIRECTORY # ########################### # All snapshots will be stored under this root directory. # snapshot_root /.snapshots/ # If no_create_root is enabled, rsnapshot will not automatically create the # snapshot_root directory. This is particularly useful if you are backing # up to removable media, such as a FireWire or USB drive. # #no_create_root 1 ################################# # EXTERNAL PROGRAM DEPENDENCIES # ################################# # LINUX USERS: Be sure to uncomment "cmd_cp". This gives you extra features. # EVERYONE ELSE: Leave "cmd_cp" commented out for compatibility. # # See the README file or the man page for more details. # #@CMD_CP@ # uncomment this to use the rm program instead of the built-in perl routine. # @CMD_RM@ # rsync must be enabled for anything to work. This is the only command that # must be enabled. # @CMD_RSYNC@ # Uncomment this to enable remote ssh backups over rsync. # #@CMD_SSH@ # Comment this out to disable syslog support. # @CMD_LOGGER@ # Uncomment this to specify the path to "du" for disk usage checks. # If you have an older version of "du", you may also want to check the # "du_args" parameter below. # #@CMD_DU@ # Uncomment this to specify the path to rsnapshot-diff. # #cmd_rsnapshot_diff /usr/local/bin/rsnapshot-diff # Specify the path to a script (and any optional arguments) to run right # before rsnapshot syncs files # #cmd_preexec /path/to/preexec/script # Specify the path to a script (and any optional arguments) to run right # after rsnapshot syncs files # #cmd_postexec /path/to/postexec/script # Paths to lvcreate, lvremove, mount and umount commands, for use with # Linux LVMs. # #linux_lvm_cmd_lvcreate @CMD_LVCREATE@ #linux_lvm_cmd_lvremove @CMD_LVREMOVE@ #linux_lvm_cmd_mount @CMD_MOUNT@ #linux_lvm_cmd_umount @CMD_UMOUNT@ ######################################### # BACKUP LEVELS / INTERVALS # # Must be unique and in ascending order # # e.g. alpha, beta, gamma, etc. # ######################################### retain alpha 6 retain beta 7 retain gamma 4 #retain delta 3 ############################################ # GLOBAL OPTIONS # # All are optional, with sensible defaults # ############################################ # Verbose level, 1 through 5. # 1 Quiet Print fatal errors only # 2 Default Print errors and warnings only # 3 Verbose Show equivalent shell commands being executed # 4 Extra Verbose Show extra verbose information # 5 Debug mode Everything # verbose 2 # Same as "verbose" above, but controls the amount of data sent to the # logfile, if one is being used. The default is 3. # loglevel 3 # If you enable this, data will be written to the file you specify. The # amount of data written is controlled by the "loglevel" parameter. # #logfile /var/log/rsnapshot # If enabled, rsnapshot will write a lockfile to prevent two instances # from running simultaneously (and messing up the snapshot_root). # If you enable this, make sure the lockfile directory is not world # writable. Otherwise anyone can prevent the program from running. # lockfile /var/run/rsnapshot.pid # By default, rsnapshot check lockfile, check if PID is running # and if not, consider lockfile as stale, then start # Enabling this stop rsnapshot if PID in lockfile is not running # #stop_on_stale_lockfile 0 # Default rsync args. All rsync commands have at least these options set. # #rsync_short_args -a #rsync_long_args --delete --numeric-ids --relative --delete-excluded # ssh has no args passed by default, but you can specify some here. # #ssh_args -p 22 # Default arguments for the "du" program (for disk space reporting). # The GNU version of "du" is preferred. See the man page for more details. # If your version of "du" doesn't support the -h flag, try -k flag instead. # #du_args -csh # If this is enabled, rsync won't span filesystem partitions within a # backup point. This essentially passes the -x option to rsync. # The default is 0 (off). # #one_fs 0 # The include and exclude parameters, if enabled, simply get passed directly # to rsync. If you have multiple include/exclude patterns, put each one on a # separate line. Please look up the --include and --exclude options in the # rsync man page for more details on how to specify file name patterns. # #include ??? #include ??? #exclude ??? #exclude ??? # The include_file and exclude_file parameters, if enabled, simply get # passed directly to rsync. Please look up the --include-from and # --exclude-from options in the rsync man page for more details. # #include_file /path/to/include/file #exclude_file /path/to/exclude/file # If your version of rsync supports --link-dest, consider enabling this. # This is the best way to support special files (FIFOs, etc) cross-platform. # The default is 0 (off). # #link_dest 0 # When sync_first is enabled, it changes the default behaviour of rsnapshot. # Normally, when rsnapshot is called with its lowest interval # (i.e.: "rsnapshot alpha"), it will sync files AND rotate the lowest # intervals. With sync_first enabled, "rsnapshot sync" handles the file sync, # and all interval calls simply rotate files. See the man page for more # details. The default is 0 (off). # #sync_first 0 # If enabled, rsnapshot will move the oldest directory for each interval # to [interval_name].delete, then it will remove the lockfile and delete # that directory just before it exits. The default is 0 (off). # #use_lazy_deletes 0 # Number of rsync re-tries. If you experience any network problems or # network card issues that tend to cause ssh to fail with errors like # "Corrupted MAC on input", for example, set this to a non-zero value # to have the rsync operation re-tried. # #rsync_numtries 0 # LVM parameters. Used to backup with creating lvm snapshot before backup # and removing it after. This should ensure consistency of data in some special # cases # # LVM snapshot(s) size (lvcreate --size option). # #linux_lvm_snapshotsize 100M # Name to be used when creating the LVM logical volume snapshot(s). # #linux_lvm_snapshotname rsnapshot # Path to the LVM Volume Groups. # #linux_lvm_vgpath /dev # Mount point to use to temporarily mount the snapshot(s). # #linux_lvm_mountpath /path/to/mount/lvm/snapshot/during/backup ############################### ### BACKUP POINTS / SCRIPTS ### ############################### # LOCALHOST backup /home/ localhost/ backup /etc/ localhost/ backup /usr/local/ localhost/ #backup /var/log/rsnapshot localhost/ #backup /etc/passwd localhost/ #backup /home/foo/My Documents/ localhost/ #backup /foo/bar/ localhost/ one_fs=1, rsync_short_args=-urltvpog #backup_script /usr/local/bin/backup_pgsql.sh localhost/postgres/ # You must set linux_lvm_* parameters below before using lvm snapshots #backup lvm://vg0/xen-home/ lvm-vg0/xen-home/ # EXAMPLE.COM #backup_exec /bin/date "+ backup of example.com started at %c" #backup root@example.com:/home/ example.com/ +rsync_long_args=--bwlimit=16,exclude=core #backup root@example.com:/etc/ example.com/ exclude=mtab,exclude=core #backup_exec ssh root@example.com "mysqldump -A > /var/db/dump/mysql.sql" #backup root@example.com:/var/db/dump/ example.com/ #backup_exec /bin/date "+ backup of example.com ended at %c" # CVS.SOURCEFORGE.NET #backup_script /usr/local/bin/backup_rsnapshot_cvsroot.sh rsnapshot.cvs.sourceforge.net/ # RSYNC.SAMBA.ORG #backup rsync://rsync.samba.org/rsyncftp/ rsync.samba.org/rsyncftp/ rsnapshot-1.4.2/utils/0000775000175000017500000000000012632661200014301 5ustar travistravisrsnapshot-1.4.2/utils/backup_mysql.sh0000775000175000017500000000206712632661200017337 0ustar travistravis#!/bin/sh ############################################################################## # backup_mysql.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # # This is a simple shell script to backup a MySQL database with rsnapshot. # # The assumption is that this will be invoked from rsnapshot. Also, since it # will run unattended, the user that runs rsnapshot (probably root) should have # a .my.cnf file in their home directory that contains the password for the # MySQL root user. For example: # # /root/.my.cnf (chmod 0600) # [client] # user = root # password = thepassword # host = localhost # # This script simply needs to dump a file into the current working directory. # rsnapshot handles everything else. ############################################################################## # $Id: backup_mysql.sh,v 1.6 2007/03/22 02:50:21 drhyde Exp $ umask 0077 # backup the database /usr/bin/mysqldump --all-databases > mysqldump_all_databases.sql # make the backup readable only by root /bin/chmod 600 mysqldump_all_databases.sql rsnapshot-1.4.2/utils/backup_pgsql.sh0000775000175000017500000000177212632661200017322 0ustar travistravis#!/bin/sh ############################################################################## # backup_pgsql.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # # This is a simple shell script to backup a PostgreSQL database with rsnapshot. # # The assumption is that this will be invoked from rsnapshot. Also, since it # will run unattended, the user that runs rsnapshot (probably root) should have # a .pgpass file in their home directory that contains the password for the # postgres user. For example: # # /root/.pgpass (chmod 0600) # *:*:*:postgres:thepassword # # This script simply needs to dump a file into the current working directory. # rsnapshot handles everything else. ############################################################################## # $Id: backup_pgsql.sh,v 1.6 2007/03/22 02:50:21 drhyde Exp $ umask 0077 # backup the database /usr/local/pgsql/bin/pg_dumpall -Upostgres > pg_dumpall.sql # make the backup readable only by root /bin/chmod 600 pg_dumpall.sql rsnapshot-1.4.2/utils/debug_moving_files.sh0000775000175000017500000000231412632661200020467 0ustar travistravis#!/bin/sh ############################################################################## # debug_moving_files.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # # This is an abusive shell script designed to simulate users moving files # while a backup is occuring. Hopefully your users aren't this evil. # # The general idea is that you create an "abuse" directory, include it in your # backup points, run this script in one terminal window and rsnapshot in the # other. # # Most people will probably never need to use this unless they want to debug # "vanishing file" problems with rsync. ############################################################################## # $Id: debug_moving_files.sh,v 1.3 2005/04/02 07:37:07 scubaninja Exp $ # change this path to your liking DIRECTORY=/path/to/abuse/dir/ # be sure and create it or the script won't work cd $DIRECTORY || exit 1; # ready touch 0 1 2 3 4 5 6 7 8 9 rm *.tmp 2>/dev/null # set echo "STARTING ABUSE NOW..." # go while true; do # move them for i in `echo 0 1 2 3 4 5 6 7 8 9`; do echo mv $i $i.tmp mv $i $i.tmp done # move them back for i in `echo 0 1 2 3 4 5 6 7 8 9`; do echo mv $i.tmp $i mv $i.tmp $i done done rsnapshot-1.4.2/utils/backup_dpkg.sh0000775000175000017500000000115712632661200017116 0ustar travistravis#!/bin/sh ############################################################################## # backup_dpkg.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # # This script simply backs up a list of which Debian packages are installed. # Naturally, this only works on a Debian system. # # This script simply needs to dump a file into the current working directory. # rsnapshot handles everything else. ############################################################################## # $Id: backup_dpkg.sh,v 1.2 2005/04/02 07:37:06 scubaninja Exp $ /usr/bin/dpkg --get-selections > dpkg_selections rsnapshot-1.4.2/utils/make_cvs_snapshot.sh0000775000175000017500000000145712632661200020356 0ustar travistravis#!/bin/sh ############################################################################## # make_cvs_snapshot.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # # this script just does a find/replace in the source tree to change # the version number to CVS-$DATE # # this was done before manually, now it's automatic ############################################################################## # $Id: make_cvs_snapshot.sh,v 1.6 2005/06/18 02:30:53 scubaninja Exp $ if [ $PWD = "$HOME/projects/rsnapshot/rsnapshot" ]; then echo "This is not where you want to be. cp -r to a different directory first!" echo "Quitting now!" exit 1 fi VERSION=`./rsnapshot-program.pl version-only | sed s/\\\./\\\\\\\./g` DATE=`date +"%Y%m%d"` perl -pi -e s/$VERSION/CVS-$DATE/g `find . -type f` rsnapshot-1.4.2/utils/README0000664000175000017500000000744312632661200015171 0ustar travistravisThe scripts in this folder are mostly quick and dirty examples of things that you may or may not find useful in conjunction with rsnapshot. rsnapshot-copy ------------------------------------------------------------------------------ rsnapshot-copy copies an rsnapshot snapshot root, preserving the intersnapshot hard links for unchanged files. You can use this if you want to copy/move your snapshot root to another place but find that rsync -aH on the lot is too slow (uses too much RAM). It copies intervals in chronological order using rsync --link-dest. rsnaptar ------------------------------------------------------------------------------ A script that can automatically tar up your latest snapshots and send you an e-mail when it's done. You may need to edit some of the variables by hand. backup_dpkg.sh ------------------------------------------------------------------------------ An example script to backup package info on a Debian system, to be invoked from rsnapshot using the "backup_script" parameter. If you have a Debian system, this will most likely work without changes. backup_mysql.sh ------------------------------------------------------------------------------ An example script to backup a MySQL database, to be invoked from rsnapshot using the "backup_script" parameter. You will probably need to modify this for your setup. backup_pgsql.sh ------------------------------------------------------------------------------ An example script to backup a PostgreSQL database, to be invoked from rsnapshot using the "backup_script" parameter. You will probably need to modify this for your setup. backup_rsnapshot_cvsroot.sh ------------------------------------------------------------------------------ An example script to backup the CVS repository for the rsnapshot project, which is hosted on SourceForge. This script is a good example of using the wget program to archive web content in your backups. This script is designed to be invoked from rsnapshot using the "backup_script" parameter. backup_smb_share.sh ------------------------------------------------------------------------------ An example script to backup a Microsoft SMB share, to be invoked from rsnapshot using the "backup_script" parameter. This requires the Samba program. You will definitely need to modify this for your system. debug_moving_files.sh ------------------------------------------------------------------------------ Debug script for rsync. Moves files around, so you can try backing them up to see what rsnapshot does. Only useful if you're having problems with vanishing files and want to have a known source of them. make_cvs_snapshot.sh ------------------------------------------------------------------------------ Quick and dirty shell script to find/replace "real" version numbers with a CVS-date version. ./rsnapshotdb ------------------------------------------------------------------------------ Directory containing rsnapshotDB.pl, a perl script with an XML configuration file for remote database backups. Please see ./rsnapshotdb/README.txt. rsnapshot_if_mounted.sh ------------------------------------------------------------------------------ Deprecated. A work-around for using removable drives as the snapshot root. Superceded by the "no_create_root" option in rsnapshot proper. rsnapreport.pl ------------------------------------------------------------------------------ This script just takes the output of rsnapshot using the rsync --stats option, and generates a pretty report, and tries to include errors at the bottom. sign_packages.sh ------------------------------------------------------------------------------ The shell script used to automate package signing for releases. rsnapshot-1.4.2/utils/sign_packages.sh0000775000175000017500000000146612632661200017445 0ustar travistravis#!/bin/sh ############################################################################## # sign_packages.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # # This is the script used to semi-automatically GPG sign rsnapshot releases ############################################################################## # $Id: sign_packages.sh,v 1.3 2005/04/02 07:37:07 scubaninja Exp $ for file in `/bin/ls *.tar.gz *.deb *.rpm | grep -v latest`; do # MD5 if [ ! -e "$file.md5" ]; then md5sum $file > $file.md5; echo "Created MD5 Hash for $file"; fi # SHA1 if [ ! -e "$file.sha1" ]; then sha1sum $file > $file.sha1; echo "Created SHA1 hash for $file"; fi # PGP if [ ! -e "$file.asc" ]; then gpg --armor --detach-sign $file; echo "Created PGP Signature for $file"; fi done rsnapshot-1.4.2/utils/mkmakefile.sh0000775000175000017500000000123612632661200016747 0ustar travistravis#! /bin/sh -xe # This mini script is to generate the Makefile for building rsnapshot. # # Usage: mkmakefile.sh [options to pass to ./configure] # # Example: mkmakefile.sh # Example: mkmakefile.sh --sysconfdir=/etc # # You can just re-run ./configure after running mkmakefile.sh to change the # options to ./configure. # # Inputs: Makefile.am configure.ac # Outputs: Makefile Makefile.in configure aclocal.m4 # # This script is executed with the sh -e flag, so that an error from # executing any command will cause the shell script to abort immediately. # trap "echo Previous command had error, mkmakefile.sh aborting." ERR # aclocal autoconf automake ./configure "$@" rsnapshot-1.4.2/utils/rsnapshot_invert.sh0000775000175000017500000000174012632661200020252 0ustar travistravis#!/bin/bash # $Id: rsnapshot_invert.sh,v 1.1 2007/04/12 16:51:58 drhyde Exp $ # This script takes one parameter, which should be your rsnapshot config # file. It will parse that file to find your snapshot_root, backup points, # and interval/retain values, and will create from those an inverted # directory structure of backup points containing daily.{0,1,2,3} etc # symlinks. Run it from a cron job to keep that structure up to date. # # There is minimal^Wno error checking, and the parsing is totally brain- # dead. SNAPSHOT_ROOT=`grep ^snapshot_root $1|awk '{print \$2}'` BACKUPS=`grep ^backup $1|awk '{print \$3}'` INTERVALS=`grep -E '^(interval|retain)' $1|awk '{print \$2}'` cd $SNAPSHOT_ROOT for i in $BACKUPS; do mkdir $i for j in $INTERVALS; do HOWMANY=`grep -E ^\(interval\|retain\).$j $1|awk '{print \$3}'` COUNT=0 while [[ $COUNT != $HOWMANY ]]; do ln -s $SNAPSHOT_ROOT/$j.$COUNT/$i $SNAPSHOT_ROOT/$i/$j.$COUNT COUNT=$(($COUNT + 1)) done done done rsnapshot-1.4.2/utils/rsnapshot-copy0000664000175000017500000000454212632661200017222 0ustar travistravis#!/bin/bash function usage { cat <<'EOM' >&2 Usage: rsnapshot-copy [--test] RSYNC-OPTION... SRC-SNAPSHOT-ROOT DEST-SNAPSHOT-ROOT rsnapshot-copy copies an rsnapshot snapshot root, preserving the intersnapshot hard links for unchanged files. It does so by copying one snapshot at a time with rsync, each time giving a --link-dest option for the previous snapshot. This technique uses less memory than others (such as plain rsync -H) that hold a list of all the files in the snapshot root in memory in order to preserve arbitrary hard links. As with an ordinary rsync command, either the source or the destination can be remote, but not both. The destination should be empty or nonexistent; rsnapshot-copy currently is not designed for incremental mirroring of a snapshot root (though an incremental mode may be added in the future). Each snapshot is copied using `rsync RSYNC-OPTION...', so you should probably pass -a and any other relevant rsync options used by your ordinary rsnapshot runs, such as --numeric-ids. --test: show the shell commands to be executed instead of executing them Written and maintained by Matt McCutchen . EOM } # To support remote src or dest, we must perform all filesystem access via rsync. set -e trap 'echo "Command failed!: $BASH_COMMAND" >&2' ERR set -o errtrace set -o pipefail testmode= if [ "$1" = "--test" ]; then testmode=1 shift fi # Test or execute a command as appropriate. function do_cmd { if [ $testmode ]; then (set -x; : "$@") else "$@" fi } if [ $# -lt 3 ]; then usage exit 1 fi rsync_opts=("${@:1:$#-2}") src="${@: -2:1}" dest="${@: -1:1}" # Ensure that the destination dir exists. (--exclude=* excludes everything else.) do_cmd rsync "${rsync_opts[@]}" --exclude=* "$src/" "$dest/" # Obtain a list of snapshot names in newest to oldest order. # List the src -> filter to `2008/04/09T17:59:43 alpha.0' format # -> sort newest to oldest -> read each line, ignoring the time. rsync "${rsync_opts[@]}" --list-only --no-r -d --no-l "$src/" \ | sed -nre 's,^d[^ ]+ +[^ ]+ (..../../..) (..:..:..) (.*\.[0-9]+)$,\1T\2 \3,p' \ | LC_ALL=C sort -r --key=1,1 | { # --link-dest option to use, if any ldo=() # Copy each snapshot while read st sn; do do_cmd rsync "${rsync_opts[@]}" "${ldo[@]}" "$src/$sn/" "$dest/$sn/" # The next snapshot should link from this one. ldo=(--link-dest="../$sn/") done } rsnapshot-1.4.2/utils/mysqlbackup.pl0000664000175000017500000000546112632661200017177 0ustar travistravis#!/usr/bin/perl =head1 Author: Anthony Ettinger License: GPL 2.0 URL: http://www.gnu.org/licenses/gpl.txt Notes: This script was originally written to function as a MySQL database backup script in conjunction with the open source Perl/rsync backup program "rsnapshot". rsnapshot can be found here: http://www.rsnapshot.org/ In order to backup a MySQL database remotely, the necessary database user must be able to connect remotely to the database server from your IP number (some ISPs only allow access from localhost - you may need to email your admin and ask for your ip to be given access) It is extremely important that you secure the /etc/mysqlbackup file so only YOU can read the file, 'chmod 0600 /etc/mysqlbackup', as it will store the database passwords in plain text format. =cut use warnings; use strict; use Data::Dumper; use DBI; use POSIX qw(strftime); ## WARNING: type 'chmod 0600 /etc/mysqlbackup' ## #file must contain 'username:password:host' #one entry per line. Functionality is similar to /etc/passwd, #however passwords are stored in plain text and NOT encrypted my $mysqlbackup_passwd = '/etc/mysqlbackup'; #location of 'mysqldump' program (required) my $mysqldump = '/usr/bin/mysqldump'; main(); sub main { #check mode of $mysqlbackup_passwd file my ($mode) = (stat($mysqlbackup_passwd))[2]; $mode = sprintf "%04o", $mode & 07777; unless (-o $mysqlbackup_passwd && $mode eq '0600') { die "Please secure '$mysqlbackup_passwd' file. Type 'chmod 0600 $mysqlbackup_passwd'.\n"; } #read in passwords from file read_passwd(); } sub read_passwd { open(PASSWD, $mysqlbackup_passwd) or die "$!"; while() { chomp; my ($user, $pass, $host) = split(/:/); #retrieve databases with this user's privileges show_databases($user, $pass, $host); } close(PASSWD); } sub show_databases { my ($user, $pass, $host) = @_; my $db_list = []; #arrayref to store list of databases my $dbh = DBI->connect("dbi:mysql:host=$host", $user, $pass) or die DBI->errstr; #execute show databases query my $sth = $dbh->prepare("SHOW DATABASES") or die $dbh->errstr; $sth->execute() or die $dbh->errstr; #fetch results from query while (my $db_row = $sth->fetch) { push(@{$db_list}, $db_row->[0]); } dump_databases($db_list, $user, $pass, $host); } sub dump_databases { my ($db_list, $user, $pass, $host) = @_; my $timestamp = strftime "%F-%H.%M", localtime; foreach my $db (@{$db_list}) { my $filename = "$host-$db-$timestamp"; my $dump_cmd = "$mysqldump -u $user -p$pass -h $host --opt $db > $filename.sql"; my $tar_cmd = "tar czf $filename.tar.gz $filename.sql"; my $rm_cmd = "rm $filename.sql"; #print "Backing up $db from $host\n"; system($dump_cmd) == 0 or die "$!"; system($tar_cmd) == 0 or die "$!"; system($rm_cmd) == 0 or die "$!"; #tar czf $db.$DATE.tar.gz $FILE } } rsnapshot-1.4.2/utils/rsnapshot_if_mounted.sh0000775000175000017500000000346512632661200021102 0ustar travistravis#!/bin/sh ############################################################################## # rsnapshot_if_mounted.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # ############################################################################## ############################################################################## ############################################################################## # # NOTE: THIS SCRIPT HAS BEEN SUPERCEDED BY THE "no_create_root" OPTION IN # rsnapshot. IT IS LEFT HERE JUST IN CASE ANYONE WANTS TO USE IT. # ############################################################################## ############################################################################## ############################################################################## # # This is a simple shell script to run rsnapshot only if the backup drive # is mounted. It is intended to be used when backups are made to removable # devices (such as FireWire drives). # # Usage: /path/to/rsnapshot_if_mounted.sh [options] interval # # Edit this script so it points to your rsnapshot program and snapshot root. # Then simply call this script instead of rsnapshot. # # Example: /usr/local/bin/rsnapshot_if_mounted.sh -v daily ############################################################################## # $Id: rsnapshot_if_mounted.sh,v 1.4 2005/04/02 07:37:07 scubaninja Exp $ # path to rsnapshot RSNAPSHOT=/usr/local/bin/rsnapshot # snapshot_root SNAPSHOT_ROOT=/.snapshots/; # external programs LS=/bin/ls HEAD=/usr/bin/head # check to see if the drive is mounted IS_MOUNTED=`$LS $SNAPSHOT_ROOT/ | $HEAD -1` > /dev/null 2>&1; # if the drive is mounted, run rsnapshot # otherwise refuse to run if [ $IS_MOUNTED ]; then $RSNAPSHOT $@ else echo "$SNAPSHOT_ROOT is not mounted, rsnapshot will not be run" fi rsnapshot-1.4.2/utils/rsnapreport.pl0000664000175000017500000001026612632661200017222 0ustar travistravis#!/usr/bin/env perl # this script prints a pretty report from rsnapshot output # in the rsnapshot.conf you must set # verbose >= 3 # and add --stats to rsync_long_args # then setup crontab 'rsnapshot daily 2>&1 | rsnapreport.pl | mail -s"SUBJECT" backupadm@adm.com # don't forget the 2>&1 or your errors will be lost to stderr ################################ ## Copyright 2006 William Bear ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ################################ use strict; use warnings; use English '-no_match_vars'; my $bufsz = 2; my %bkdata=(); my @errors=(); sub pretty_print(){ my $ofh = select(STDOUT); $FORMAT_NAME="BREPORTBODY"; $FORMAT_TOP_NAME="BREPORTHEAD"; select($ofh); foreach my $source (sort keys %bkdata){ if($bkdata{$source} =~ /error/i) { print "ERROR $source $bkdata{$source}"; next; } my $files = $bkdata{$source}{'files'}; my $filest = $bkdata{$source}{'files_tran'}; my $filelistgentime = $bkdata{$source}{'file_list_gen_time'}; my $filelistxfertime = $bkdata{$source}{'file_list_trans_time'}; my $bytes= $bkdata{$source}{'file_size'}/1000000; # convert to MB my $bytest= $bkdata{$source}{'file_tran_size'}/1000000; # convert to MB $source =~ s/^[^\@]+\@//; # remove username format BREPORTHEAD = SOURCE TOTAL FILES FILES TRANS TOTAL MB MB TRANS LIST GEN TIME FILE XFER TIME -------------------------------------------------------------------------------------------------------------------- . format BREPORTBODY = @<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @>>>>>>>>>> @>>>>>>>>>> @#########.## @########.## @>>>>>>>>>>>> @>>>>>>>>>>>>> $source, $files, $filest, $bytes, $bytest, $filelistgentime, $filelistxfertime . write STDOUT; } } sub nextLine($){ my($lines) = @_; my $line = <>; push(@$lines,$line); return shift @$lines; } my @rsnapout = (); # load readahead buffer for(my $i=0; $i < $bufsz; $i++){ $rsnapout[$i] = <>; } while (my $line = nextLine(\@rsnapout)){ if($line =~ /^[\/\w]+\/rsync/) { # find start rsync command line my @rsynccmd=(); while($line =~ /\s+\\$/){ # combine wrapped lines $line =~ s/\\$//g; $line .= nextLine(\@rsnapout); } push(@rsynccmd,split(/\s+/,$line)); # split into command components my $source = $rsynccmd[-2]; # count backwards: source always second to last #print $source; while($line = nextLine(\@rsnapout)){ # this means we are missing stats info if($line =~ /^[\/\w]+\/rsync/){ unshift(@rsnapout,$line); push(@errors,"$source NO STATS DATA"); last; } # stat record if($line =~ /^total size is\s+\d+/){ last; } # this ends the rsync stats record elsif($line =~ /Number of files:\s+(\d+)/){ $bkdata{$source}{'files'}=$1; } elsif($line =~ /Number of files transferred:\s+(\d+)/){ $bkdata{$source}{'files_tran'}=$1; } elsif($line =~ /Total file size:\s+(\d+)/){ $bkdata{$source}{'file_size'}=$1; } elsif($line =~ /Total transferred file size:\s+(\d+)/){ $bkdata{$source}{'file_tran_size'}=$1; } elsif($line =~ /File list generation time:\s+(.+)/){ $bkdata{$source}{'file_list_gen_time'}=$1; } elsif($line =~ /File list transfer time:\s+(.+)/){ $bkdata{$source}{'file_list_trans_time'}=$1; } elsif($line =~ /^(rsync error|ERROR): /){ push(@errors,"$source $line"); } # we encountered an rsync error } } elsif($line =~ /^(rsync error|ERROR): /){ push(@errors,$line); } # we encountered an rsync error } pretty_print(); if(scalar @errors > 0){ print "\nERRORS\n"; print join("\n",@errors); print "\n"; } rsnapshot-1.4.2/utils/random_file_verify.sh0000775000175000017500000000407612632661200020512 0ustar travistravis#!/bin/bash ############################################################################## # random_file_verify.sh # # by Sherman Boyd # http://www.rsnapshot.org/ # # This script generates a random test file to be backed up and # then tests it after the backup. It's a paranoid sanity check, I # suppose. The script then emails the results of the backup and check # to the admin. # # As it is currently implemented, it is a wrapper around an "rsnapshot daily" # command. It could probably be broken out into seperate preexec annd # postexec commands as well. # # Feel free to use and improve ... # ############################################################################## #Initialize echo "Started backup script on `date`"> /var/log/localbackup.log msubject="Local Backup SUCCESSFUL!" #Create random 100 byte file echo "Generating random test file.">> /var/log/localbackup.log dd if=/dev/urandom of=/path/to/files/you/are/backing/up/randomtestfile bs=1 count=100 if [ $? -eq 0 ] then echo "SUCCESS: Randomly generated test file created." >>\ /var/log/localbackup.log else echo "FAILED: Randomly generated test file not created." >>\ /var/log/localbackup.log msubject="Local Backup has ERRORS!" fi #Run Backup echo "Running rsnapshot backup.">> /var/log/localbackup.log rsnapshot daily if [ $? -eq 0 ] then echo "SUCCESS: Backup completed with no errors." >> /var/log/localbackup.log else echo "FAILED: Backup completed with some errors." >> /var/log/localbackup.log msubject="Local Backup has ERRORS!" fi #Test Random File echo "Comparing random file with the backup.">> /var/log/localbackup.log diff /path/to/files/you/are/backing/up/randomtestfile /path/to/your/rsnapshots/daily.0/localhost/randomtestfile > /dev/null if [ $? -eq 0 ] then echo "PASSED: Randomly generated test file is the same." >>\ /var/log/localbackup.log else echo "FAILED: Randomly generated test file differs." >>\ /var/log/localbackup.log msubject="Local Backup has ERRORS!" fi #Mail results mail -s "$msubject" your@email.com < /var/log/localbackup.log exit 0 rsnapshot-1.4.2/utils/rsnaptar0000775000175000017500000000374112632661200016066 0ustar travistravis#!/bin/sh ############################################################################## # rsnaptar # by Nathan Rosenquist # # A quick hack of a shell script to tar up backup points from the rsnapshot # snapshot root. Sends an e-mail to an address specified on the command line # when finished. # # I set this up in cron to run once a week, take the tar files, # and make DVD-RW backups of the latest snapshot. Your mileage may vary. # # http://www.rsnapshot.org/ ############################################################################## # $Id: rsnaptar,v 1.11 2007/03/22 02:50:21 drhyde Exp $ umask 0077 # DIRECTORIES TAR_DIR="/var/dvd_backup" SNAPSHOT_DIR="/backup/private/snapshots/daily.0" # SHELL COMMANDS LS="/bin/ls" TAR="/bin/tar" CAT="/bin/cat" CHMOD="/bin/chmod" CHOWN="/bin/chown" MKDIR="/bin/mkdir" SENDMAIL="/usr/lib/sendmail -t -oi" HOSTNAME=`/bin/hostname` DATE=`/bin/date +%Y-%m-%d` # uncomment this to gpg encrypt files # the e-mail address the notification is being sent to must have their GPG key # in the public keyring of the user running this backup # GPG="/usr/bin/gpg" # GET E-MAIL ADDRESS if [ ! $1 ]; then echo "Usage: rsnaptar user@domain.com" exit 1 else TO_EMAIL=$1 fi # MAKE ONE TAR FILE FOR EACH BACKUP POINT ${MKDIR} -p ${TAR_DIR}/${DATE}/ cd ${SNAPSHOT_DIR} for BACKUP_POINT in `${LS} ${SNAPSHOT_DIR}`; do # GPG encrypt backups if $GPG is defined if test ${GPG}; then ${TAR} --numeric-owner -cf - ${BACKUP_POINT}/ | \ $GPG --encrypt -r $TO_EMAIL > ${TAR_DIR}/${DATE}/${BACKUP_POINT}.tar.gpg # just create regular tar files else ${TAR} -czf ${TAR_DIR}/${DATE}/${BACKUP_POINT}.tar.gz ${BACKUP_POINT}/ fi done cd - # there are probably sensitive files here, so use the strictest permissions ${CHMOD} -R 0600 ${TAR_DIR}/${DATE}/* ${CHMOD} 0700 ${TAR_DIR}/${DATE}/ ${CAT} <sdsualumni<--dot-->org Blog: http://anthony.ettinger.name =head1 DESCRIPTION: This script was originally written to function as a MySQL database backup script in conjunction with the open source Perl/rsync backup program "rsnapshot". rsnapshot can be found at: http://www.rsnapshot.org/ In order to backup a database remotely, the necessary database user must be able to connect remotely to the database server from a trusted secure shell server. (some ISPs only allow access from an internal network - you may need to make sure you do have internal access from an internal ssh server to the database server). IF YOU DON'T HAVE SSH KEYS, this program isn't for you. (see:man ssh-keygen). It is extremely important that you secure the /etc/rsnapshotDB.conf file so only YOU (the user who's cronjob this is running from) can read the file, 'chmod 0600 /etc/rsnapshotDB.conf', as it will store the database passwords in plain text format. If you don't know who YOU are - type 'whoami' or ask a friend. For best results, configure and run this script from /etc/rsnapshot.conf. (see:'man rsnapshot', backup_script). =head2 SEE ALSO: INSTALL.txt, TODO.txt, CHANGES.txt =cut use warnings; use strict; use Cwd 'cwd'; use Data::Dumper; use DBI; use POSIX qw(strftime); =head3 WARNING: type 'chmod 0600 /etc/rsnapshotDB.conf' Currently 'dbtype' supported can be either 'mysql' or 'pgsql' Functionality is similar to /etc/DBPASSWD, however passwords are stored in plain text and NOT encrypted are allowed in the following file: Note: rsnapshotdb.list is deprecated in favor of XML config rsnapshotDB.conf and rsnapshotDB.xsd =cut my $dbpasswd = '/etc/rsnapshotDB.conf'; my $xsd = '/etc/rsnapshotDB.xsd'; #used to validate config file my $xmlUsage = 1; #0 if using flat-list configuation file (deprecated). my $verbose = 2; #0 for no warning/status messages, increase for more. =head2 WARNING: Setting the "temporary" directory: 1) the db dump might get left behind on error 2) the temp directory could fill up, depending on size of db and quota of user or directory =cut my $tmpDir = '$HOME/tmp'; #may want to change this^ my $niceness = '19'; #amount of CPU/Mem -20 high, 19 low priority. my $sshOption = '-o TCPKeepAlive=yes'; #keep ssh alive (avoid timeouts) =head2 DUMPERS: Location of "dumper" program(s) type 'which ' to find the path (ie - 'which mysqldump') Note: the hash key here must match 'dbtype' field in $dbpasswd file. =cut my $dbApp = { 'mysql' => { 'dumper' => { bin => 'mysqldump', opts => '--opt -C', user => '-u', pass => '-p', host => '-h', }, 'prompt' => { bin => 'mysql', opts => '-s', user => '-u', pass => '-p', host => '-h', }, }, 'pgsql' => { 'dumper' => { bin => 'pg_dump', opts => '', user => '-U', pass => '-p', host => '-h', }, 'prompt' => { bin => 'pgsql', opts => '', user => '-U', pass => '-p', host => '-h', }, }, }; init(); sub init { #check mode of $dbpasswd file my ($mode_dbpasswd) = (stat($dbpasswd))[2]; $mode_dbpasswd = sprintf "%04o", $mode_dbpasswd & 07777; my $localTmpDir = cwd(); unless (-o $dbpasswd && $mode_dbpasswd eq '0600') { die "Please secure '$dbpasswd' file. Type 'chmod 0600 $dbpasswd'.\n"; } unless ($xmlUsage && -f $xsd) { warn "You are not validating '$dbpasswd' against an XMLSchema file: '$xsd'. Defaulting to flat file format for '$dbpasswd'.\n"; } #read in passwords from file read_dbpasswd(); } sub read_dbpasswd { if ($xmlUsage) { my $xobj = rsnapshotDB->new( { 'dbpasswd' => $dbpasswd, 'xsd' => $xsd, 'dbApp' => $dbApp, 'tmpDir' => $tmpDir, 'verbose' => $verbose, } ); my $validity = $xobj->validateXML; #boolean test if ($validity) { #main module dump routine called within my $status = $xobj->parseXML(); } } else { die "flat list is deprecated, please see INSTALL.txt"; } } =pod =head1 END OF THE LINE: If you've gotten this far with no "die" errors, you should be good to go with XML config rsnapshotDB.conf vs. flat list rsnapshotdb.list Check the $localTmpDir or your /backups/.snapshot/foo/wherever you put your database backups using rsnapshot.conf. =cut package rsnapshotDB; =pod =head1 rsnapshotDB.pm =cut use strict; use Data::Dumper; use Cwd 'cwd'; use POSIX qw(strftime); use XML::Validator::Schema; use XML::Simple; sub new { my $proto = shift; my $class = ref($proto) || $proto; my $self = bless( {}, $class ); my $timestamp = localtime; my %data = ref($_[0]) eq 'HASH' ? %{$_[0]} : (@_); $self->_dbpasswd($data{'dbpasswd'}); $self->_xsd($data{'xsd'}); $self->_tmpDir($data{'tmpDir'}); $self->_verbose($data{'verbose'}); $self->_dbApp($data{'dbApp'}); $self->v("\n\nSTART TIME: $timestamp", 0); return $self; } sub validateXML { my $self = shift; my $xml = $self->_dbpasswd; my $xsd = $self->_xsd; my $validator = XML::Validator::Schema->new(file=> $xsd); my $parser = XML::SAX::ParserFactory->parser(Handler => $validator); $self->v("WAITING: validating xml...", 1); eval { $parser->parse_uri($xml) }; die "File failed validation: $@" if $@; $self->v("FINISH: validated '$xml' against '$xsd'.", 1); return $self; } =pod =head1 C Utitility to parse our XML file for values =cut sub parseXML { my $self = shift; #start xml parsing of conf file. my $xml = $self->_dbpasswd(); my $parser = XML::Simple->new(); #hardcoded xml tag names my $xmlRef = $parser->XMLin($xml, ForceArray => ['hostGroup', 'hostPair', 'databaseHost', 'defaultSSHHost'] ); #count hostGroup tags my $hostGroups = scalar(@{$xmlRef->{'hostGroup'}}); #process hostGroups for (my $i=0; $i<$hostGroups; $i++) { $self->v("START: hostGroup...", 1); #save default hostGroup ssh host my $defaultSSHHost = {}; #process hostPairs foreach my $hostPair (@{$xmlRef->{'hostGroup'}->[$i]->{'hostPair'}}) { $self->v("START: hostPair...", 1); #save databaseHost hashref my $databaseHost = $hostPair->{'databaseHost'}; if ( exists($hostPair->{'defaultSSHHost'}[0]->{'hostType'}) ) { #save default and continue to use it $defaultSSHHost = $hostPair->{'defaultSSHHost'}; } $self->showDB($defaultSSHHost, $databaseHost); $self->v("END: hostPair\n", 1); } $self->v("END: hostGroup\n", 1); } return $self; } =pod =head2 LOGIN REMOTELY: This is the section where you authenticate with the remote ssh server. I'm pretty sure, you can just leave off the password flags if you know what you're doing in the XML Config file rsnapshotDB.conf. Requirement: Net::SSH::Perl. If you don't have root, read about how to install a perl module as an under privileged user (it IS possible - /home/username/modules/). =head2 SHOW DATABASES: C<$self-\>showDB();> This should pull down the list of your database user's databases from the XML configuration file. Note: This is done on the remote SSH server with db access. Since we're not writing or reading there isn't a lock on the table. The one restriction here is that you can actually access your database server remotely from an internal ssh server via ssh tunneling. =head2 PATH: Make sure your prompt binary (ie - mysql) and dumper binary (ie - mysqldump) are in your default path for the ssh user. =cut sub showDB { my ($self, $sshHost, $dbHost) = @_; #ssh my $user = $sshHost->[0]->{'username'}; my $host = $sshHost->[0]->{'hostname'}; #db my $dbApp = $self->_dbApp(); my $dbType = $dbHost->[0]->{'dbType'}; my $dbuser = $dbHost->[0]->{'dbusername'}; my $dbpass = $dbHost->[0]->{'dbpassword'}; my $dbhost = $dbHost->[0]->{'dbhostname'}; #add dbApp binaries to you PATH on the server(s) my $dumper = $dbApp->{$dbType}->{'dumper'}->{'bin'}; my $prompt = $dbApp->{$dbType}->{'prompt'}->{'bin'}; my $dbNames = []; #results from SHOW DATABASES; my $dbpass_arg = defined($dbpass) ? "$dbApp->{$dbType}->{'prompt'}->{'pass'}$dbpass" : ''; #dbpass not required $self->v("START: showDB command...", 1); my $cmdShowDB = "ssh $sshOption $user\@$host \"echo -n 'SHOW DATABASES;' | \ $dbApp->{$dbType}->{'prompt'}->{'bin'} \ $dbApp->{$dbType}->{'prompt'}->{'opts'} \ $dbApp->{$dbType}->{'prompt'}->{'user'} $dbuser \ $dbpass_arg \ $dbApp->{$dbType}->{'prompt'}->{'host'} $dbhost\""; my $out = qx/$cmdShowDB/ or warn 'SHOW DATABASES failed...'; $self->v("CMD: $cmdShowDB -> $out.", 2); $self->v("DONE: showDB command.", 1); #fetch results from query push(@{$dbNames}, split(/\n/, $out)); $self->v(Dumper($dbNames), 2); $self->dumbDB($sshHost, $dbHost, $dbNames); return $self; } =pod =head2 DUMP DATABASE: This is the bulk of the app, via ssh tunneling, logs in to an internal ssh server with access to the database server. The main reason for speeding this application up was becauase a remote database pull is extremely inefficient directly over the internet. The idea here is to use ssh-keygen from this account to your remote ssh server, then do the database dump, and secure copy ('man scp') the file back here locally. The gained result here should be seconds vs. minutes. =cut sub dumbDB { my ($self, $sshHost, $dbHost, $dbNames) = @_; my $user = $sshHost->[0]->{'username'}; my $host = $sshHost->[0]->{'hostname'}; #db my $dbApp = $self->_dbApp(); my $dbType = $dbHost->[0]->{'dbType'}; my $dbuser = $dbHost->[0]->{'dbusername'}; my $dbpass = $dbHost->[0]->{'dbpassword'}; my $dbhost = $dbHost->[0]->{'dbhostname'}; #add dbApp binaries to you PATH on the server(s) my $dumper = $dbApp->{$dbType}->{'dumper'}->{'bin'}; my $prompt = $dbApp->{$dbType}->{'prompt'}->{'bin'}; my $tmpDir = $self->_tmpDir(); #remote tmp directory path my $localTmpDir = cwd(); #need by rsnapshot my $cmdRemoteTmpDir = "ssh $sshOption $user\@$host 'echo -n $tmpDir'"; $self->v("CMD: remote tmp dir '$cmdRemoteTmpDir'.", 2); my $remoteTmpDir = qx/$cmdRemoteTmpDir/ or warn "REMOTE TMP DIR failed..."; $self->v("SET: remote temp dir... '$remoteTmpDir'", 1); #dumper arguments my $dumpOptsArg = $dbApp->{$dbType}->{'dumper'}->{'opts'}; my $dumpHostArg = $dbApp->{$dbType}->{'dumper'}->{'host'}; my $dumpUserArg = $dbApp->{$dbType}->{'dumper'}->{'user'}; my $dumpPassArg = $dbApp->{$dbType}->{'dumper'}->{'pass'}; foreach my $dbName (@{$dbNames}) { my $ftimestamp = strftime "%F-%H.%M", localtime; $self->v("FTIMESTAMP: $ftimestamp", 1); my $file = join('--', $dbType, $dbhost, $dbName, $ftimestamp); my $cmdTestRTD = "ssh $sshOption $user\@$host 'test -d $remoteTmpDir'"; $self->v("CMD: $cmdTestRTD.", 2); my $out = qx/$cmdTestRTD/; if ($?) { $self->v("FAIL: $cmdTestRTD, $out.", 0); my $cmdCreateRTD = "ssh $sshOption TCPKeepAlive $user\@$host 'mkdir -m 0700 $remoteTmpDir'"; my $out = qx/$cmdCreateRTD/; $self->v("CMD: $cmdCreateRTD.", 2); $self->v("FAIL: $cmdCreateRTD, $out", 0) if $?; } else { my $cmdChmodRTD = "ssh $sshOption $user\@$host 'chmod 0700 $remoteTmpDir'"; my $out = qx/$cmdChmodRTD/; $self->v("FAIL: $cmdChmodRTD, $out.", 2) if $?; } #the actual .sql.gz remote file creation! my $cmdRemoteDump = "ssh $sshOption $user\@$host 'umask 0077;nice --adjustment=$niceness $dumper \ $dumpOptsArg $dumpUserArg $dbuser $dumpPassArg" . "$dbpass $dumpHostArg $dbhost \ $dbName > $remoteTmpDir/$file.sql'"; $self->v("WAITING: remote dump...", 1); $out = qx/$cmdRemoteDump/; $self->v("FAIL: $cmdRemoteDump, $out.", 0) if $?; $self->v("CMD: $cmdRemoteDump", 2); $self->v("FINISH: remote dump.", 1); my $cmdRemoteGZip = "ssh $sshOption $user\@$host 'nice --adjustment=$niceness gzip --fast $remoteTmpDir/$file.sql'"; $self->v("WAITING: remote gzip...", 1); $self->v("CMD: $cmdRemoteGZip", 2); $out = qx/$cmdRemoteGZip/; $self->v("FAIL: $cmdRemoteGZip, $out.", 0) if $?; $self->v("FINISH: remote gzip.", 1); my $cmdRemoteSCP = "scp $user\@$host:$remoteTmpDir/$file.sql.gz $localTmpDir"; $self->v("WAITING: remote scp...", 1); $self->v("CMD: $cmdRemoteSCP", 2); $out = qx/$cmdRemoteSCP/; $self->v("FAIL: $cmdRemoteSCP, $out.", 0) if $?; $self->v("FINISH: remote scp.", 1); my $cmdRemoteRM = "ssh $sshOption $user\@$host 'nice --adjustment=$niceness rm $remoteTmpDir/$file.sql.gz'"; $self->v("WAITING: remote remove...", 1); $self->v("CMD: $cmdRemoteRM", 2); $out = qx/$cmdRemoteRM/; $self->v("FAIL: $cmdRemoteRM, $out.", 0) if $?; $self->v("FINISH: remote remove.", 1); } } =pod =head2 SECURE COPY: At this point it's necessary to use ssh-keygen to connect to the server, the local command is using SSH tunneling. ARCHIVING: The move from $localTmpDir to '/backups/.snapshot/database' is determined in rsnapshot.conf and backup rsnapshotDB.pl option (see 'man rsnapshot' for script usage). VERBOSITY: Typically, you would first want to test rsnapshotDB with verbosity set to 1 in the rsnapshotdb.pl see:$verbose => 1. You can increase verbosity ie - 2 instead of 1. Typically, this will dump commands that are being execute remotely and/or locally. LOG FILE: /var/log/rsnapshotDB =cut sub v { my ($self, $msg, $level) = @_; open(LOG, ">>/var/log/rsnapshotDB") or warn "$!"; chmod 0600, "/var/log/rsnapshotDB"; if ($self->_verbose >= $level) { print LOG "$msg\n"; } close(LOG); return $self; } #Class::Accessors simulation sub _dbpasswd { my $self = shift; if (@_ == 0) { return $self->{'dbpasswd'}; } $self->{'dbpasswd'} = shift; return $self->{'dbpasswd'}; } sub _binPath { my $self = shift; if (@_ == 0) { return $self->{'binPath'}; } $self->{'_binPath'} = shift; return $self->{'_binPath'}; } sub _xsd { my $self = shift; if (@_ == 0) { return $self->{'xsd'}; } $self->{'xsd'} = shift; return $self->{'xsd'}; } sub _dbApp { my $self = shift; if (@_ == 0) { return $self->{'dbApp'}; } $self->{'dbApp'} = shift; return $self->{'dbApp'}; } sub _tmpDir { my $self = shift; if (@_ == 0) { return $self->{'tmpDir'}; } $self->{'tmpDir'} = shift; return $self->{'tmpDir'}; } sub _verbose { my $self = shift; if (@_ == 0) { return $self->{'verbose'}; } $self->{'verbose'} = shift; return $self->{'verbose'}; } 1; =pod =head1 MORE INFO: see README.txt =cut rsnapshot-1.4.2/utils/rsnapshotdb/TODO.txt0000664000175000017500000000161212632661200020136 0ustar travistravisTODO LIST: - as suggested by r00t in #bash, add option to split on tables instead of db. ie: ./hostname/database/table.tar.gz - enable split | gzip to get in under isp radar (cpu resource limits with I/O on large db's). - thoroughly test with postgresql, mysql on Linux only testing so far. 10/22/06 DONE - remove requirement for database password to be present in xml config file. 8/16/06 DONE - changed log file to 0600 permissions 1/22/06 DONE - Thoroughly test rewrite using ssh keys and tunneling. DONE - Optimize code efficiency, main reason I'm throwing this out on the web as GPL :-) - Decide whether to stop, or continue on errors/connectivity issues. Possibly throw an email/SMS at someone. Problem because assumption is that you're db's are being archived without error. DONE - remove support for unencrypted SSH passwords in rsnapshotDB.conf, should be supported with ssh keys instead. rsnapshot-1.4.2/utils/rsnapshotdb/rsnapshotDB.conf.sample0000664000175000017500000000336012632661200023210 0ustar travistravis mysql db.example.com user pass ssh2 foo.example.net admin StronglyEncryptedHash mysql db.example.org user2 #F0oB4r! mysql db.example.com me plain-text-password ssh2 www.example.com user optional rsnapshot-1.4.2/utils/rsnapshotdb/CHANGES.txt0000664000175000017500000000155412632661200020446 0ustar travistravis10/22/06 Removed requirement that a database password be present in rsnapshotDB.conf xml file. 8/16/06 Changed permission of log file /var/log/rsnapshotDB to 0600. When passwords are used to access the database, they are shown in the log file when verbosity is enabled. 1/22/06 Cleaned up code and removed password requirement for ssh server connection. Removed requirement of Net::SSH::Perl Speed optimization done with remote database dump and gzip compression before transfering file locally. 1/4/05 Switched to XML-based configuration file, and requirement of Net::SSH::Perl for more sophisticated ssh handling of database backups. Speed issue of remote database dumps should be slightly if not vastly more optimized in this release. Database tables were locking during a remote backup, which took down the web site temporarily ( ~ 30 mins on one forum I own). rsnapshot-1.4.2/utils/rsnapshotdb/README.txt0000664000175000017500000000066212632661200020332 0ustar travistravisSee LICENSE.txt for licensing information See INSTALL.txt for installation instructions See TODO.txt for more to come For latest documentation type: $ perldoc rsnapshotDB.pl or $ perldoc rsnapshotDB or $ perldoc /path/to/rsnapshotDB.pl Trouble Shooting: mailing list: rsnapshot-request@lists.sf.net subject: "subscribe" Other Info: Author: Anthony Ettinger Email: aettinger<-rm-@-spam->sdsualumni.org Blog: http://www.chovy.com rsnapshot-1.4.2/utils/rsnapshotdb/LICENSE.txt0000664000175000017500000004313312632661200020457 0ustar travistravis GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. rsnapshot-1.4.2/utils/rsnapshotdb/rsnapshotDB.xsd0000664000175000017500000000465112632661200021605 0ustar travistravis test valid foo.xml The root node definition Primary use is for segregating hostPair definitions Used for pairing ssh host inside LAN to pull database backup from db server host Default ssh host to connect to in order to pull database backups. defaultSSHHost can be defined once database server from which you are pulling database backups. See defaultSSHHostType for pull location. rsnapshot-1.4.2/utils/rsnapshotdb/INSTALL.txt0000664000175000017500000000342012632661200020476 0ustar travistravisrsnapshotDB has a few necessary requirements pre-install, as follows Pre-install Requirements: 1) Perl v. 5.8.7+ 2) SSH with ssh-keygen 3) Unix commands: scp, rm, gzip, mysqldump/pg_dump, nice These need to be inplace on both the remote and/or local server. If using XML conf, then definitely on both servers for scp, rm, gzip, and 'nice'. The "dumper" programs can be only on the remote server since rsnapshotDB version: 1.2. 5) ssh-keygen public key on remote server Ideally, you would automate easily by having public/private ssh keys on your servers. See ~/.ssh and 'man ssh-keygen'. 6) local access to database server This would also negate the need of storing vital (ie - "password") info in the XML config file. Note: This hasn't been thoroughly tested yet! Please report any bugs to mailto:rsnapshot-discuss-request@lists.sf.net?subject=subscribe http://www.rsnapshot.org 7) Copy rsnapshotDB.conf.sample to /etc/rsnapshotDB.conf BASIC INSTALL: Place the rsnapshotDB.conf and rsnapshotDB.xsd in a safe location (typicall /etc/) then type $ chmod 600 rsnapshotDB.* Copy rsnapshotDB.pl into a good location, something like: /usr/local/bin/rsnapshotDB.pl Then call it from the rsnapshot.conf file as: backup_script /usr/local/bin/rsnapshotDB.pl database/ SECURITY: The best option is to use ssh keys and network-authenticated database users. ie (only connect from localhost or 192.168.x.x -> db server without password). This avoids having to store your db passwords in /etc/rsnapshotDB.conf NOTE: If you have not logged in via ssh and keys before, you will have to do so manually as the rsnapshot user (typically root). This is necessary in order to accept the host as an authorized host. Once you say "yes" to accepting the key/host, you should be able to login automatically. rsnapshot-1.4.2/utils/backup_smb_share.sh0000775000175000017500000000306012632661200020127 0ustar travistravis#!/bin/sh ############################################################################## # backup_smb_share.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # # This is a simple shell script to backup an SMB share with rsnapshot. # # The assumption is that this will be invoked from rsnapshot. Also, for # security reasons, the authfile should be stored in a place where it is not # accessible by anyone other than the user running rsnapshot (probably root). # # This script simply needs to dump the contents of the SMB share into the # current working directory. rsnapshot handles everything else. # # Please note that because of cross-platform issues, the files archived will # be owned by the user running rsnapshot to make the backup, not by the # original owner of the files. Also, any ACL permissions that may have been # on the Windows machine will be lost. However, the data in the files will # be archived safely. ############################################################################## # $Id: backup_smb_share.sh,v 1.6 2005/04/02 07:37:07 scubaninja Exp $ # IP or hostname to backup over SMB SERVER=192.168.1.10 # The name of the share SHARE=home # The authfile is a file that contains the username and password to connect # with. man smbclient(1) for details on how this works. It's much more secure # than specifying the password on the command line directly. AUTHFILE=/path/to/authfile # connect to the SMB share using the authfile /usr/local/samba/bin/smbclient //${SERVER}/${SHARE} -A ${AUTHFILE} -Tc - 2>/dev/null | tar xf - rsnapshot-1.4.2/utils/backup_rsnapshot_cvsroot.sh0000775000175000017500000000160312632661200021765 0ustar travistravis#!/bin/sh ############################################################################## # backup_rsnapshot_cvsroot.sh # # by Nathan Rosenquist # http://www.rsnapshot.org/ # # This is a simple shell script to backup the CVS tar/bz file from # SourceForge. # # The assumption is that this will be invoked from rsnapshot. Also, since it # will run unattended, the user that runs rsnapshot (probably root) should have # a .pgpass file in their home directory that contains the password for the # postgres user. # # This script simply needs to dump a file into the current working directory. # rsnapshot handles everything else. ############################################################################## # $Id: backup_rsnapshot_cvsroot.sh,v 1.3 2005/04/02 07:37:07 scubaninja Exp $ /usr/bin/wget http://cvs.sourceforge.net/cvstarballs/rsnapshot-cvsroot.tar.bz2 2>/dev/null rsnapshot-1.4.2/Makefile.in0000664000175000017500000007524112632661203015222 0ustar travistravis# Makefile.in generated by automake 1.11.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/rsnapshot-diff.pl \ $(srcdir)/rsnapshot-program.pl \ $(srcdir)/rsnapshot.conf.default.in $(top_srcdir)/configure \ $(top_srcdir)/t/SysWrap.pm.in \ $(top_srcdir)/t/backup_exec/backup_exec.t.in \ $(top_srcdir)/t/backup_exec/conf/backup_exec.conf.in \ $(top_srcdir)/t/backup_exec/conf/backup_exec_fail.conf.in \ $(top_srcdir)/t/cmd-post_pre-exec/cmd-post_pre-exec.t.in \ $(top_srcdir)/t/cmd-post_pre-exec/conf/pre-false-post-false.conf.in \ $(top_srcdir)/t/cmd-post_pre-exec/conf/pre-false-post-true.conf.in \ $(top_srcdir)/t/cmd-post_pre-exec/conf/pre-true-post-false.conf.in \ $(top_srcdir)/t/cmd-post_pre-exec/conf/pre-true-post-true.conf.in \ $(top_srcdir)/t/configtest/conf/configtest.conf.in \ $(top_srcdir)/t/configtest/configtest.t.in \ $(top_srcdir)/t/gnu_cp/conf/gnu_cp.conf.in \ $(top_srcdir)/t/gnu_cp/gnu_cp.t.in \ $(top_srcdir)/t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf.in \ $(top_srcdir)/t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t.in \ $(top_srcdir)/t/relative_delete_bugfix/conf/relative_delete_bugfix.conf.in \ $(top_srcdir)/t/relative_delete_bugfix/relative_delete_bugfix.t.in \ $(top_srcdir)/t/rsync-exitcode/conf/rsync-exitcode-bad.conf.in \ $(top_srcdir)/t/rsync-exitcode/conf/rsync-exitcode-good.conf.in \ $(top_srcdir)/t/rsync-exitcode/rsync-exitcode.t.in \ $(top_srcdir)/t/rsync/conf/rsync.conf.in \ $(top_srcdir)/t/rsync/rsync.t.in \ $(top_srcdir)/t/snapshot_root_with_space/conf/snapshot_root_with_space.conf.in \ $(top_srcdir)/t/snapshot_root_with_space/snapshot_root_with_space.t.in \ $(top_srcdir)/t/ssh_args/conf/ssh_args.conf.in \ $(top_srcdir)/t/ssh_args/ssh_args.t.in AUTHORS COPYING \ ChangeLog install-sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/t/include.ac \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = rsnapshot rsnapshot-diff rsnapshot.conf.default \ t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t \ t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf \ t/relative_delete_bugfix/relative_delete_bugfix.t \ t/relative_delete_bugfix/conf/relative_delete_bugfix.conf \ t/snapshot_root_with_space/snapshot_root_with_space.t \ t/snapshot_root_with_space/conf/snapshot_root_with_space.conf \ t/cmd-post_pre-exec/cmd-post_pre-exec.t \ t/cmd-post_pre-exec/conf/pre-false-post-true.conf \ t/cmd-post_pre-exec/conf/pre-true-post-true.conf \ t/cmd-post_pre-exec/conf/pre-true-post-false.conf \ t/cmd-post_pre-exec/conf/pre-false-post-false.conf \ t/SysWrap.pm t/backup_exec/conf/backup_exec_fail.conf \ t/backup_exec/conf/backup_exec.conf \ t/backup_exec/backup_exec.t t/rsync-exitcode/rsync-exitcode.t \ t/rsync-exitcode/conf/rsync-exitcode-good.conf \ t/rsync-exitcode/conf/rsync-exitcode-bad.conf \ t/configtest/configtest.t t/configtest/conf/configtest.conf \ t/rsync/rsync.t t/rsync/conf/rsync.conf t/gnu_cp/gnu_cp.t \ t/gnu_cp/conf/gnu_cp.conf t/ssh_args/conf/ssh_args.conf \ t/ssh_args/ssh_args.t CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(sysconfdir)" SCRIPTS = $(bin_SCRIPTS) SOURCES = DIST_SOURCES = man1dir = $(mandir)/man1 NROFF = nroff MANS = $(man_MANS) DATA = $(sysconf_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CMD_CP = @CMD_CP@ CMD_DU = @CMD_DU@ CMD_LOGGER = @CMD_LOGGER@ CMD_LVCREATE = @CMD_LVCREATE@ CMD_LVREMOVE = @CMD_LVREMOVE@ CMD_MOUNT = @CMD_MOUNT@ CMD_RM = @CMD_RM@ CMD_RSYNC = @CMD_RSYNC@ CMD_SSH = @CMD_SSH@ CMD_UMOUNT = @CMD_UMOUNT@ CP = @CP@ CWD = @CWD@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DU = @DU@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOGGER = @LOGGER@ LTLIBOBJS = @LTLIBOBJS@ LVCREATE = @LVCREATE@ LVREMOVE = @LVREMOVE@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MOUNT = @MOUNT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ RM = @RM@ RSYNC = @RSYNC@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNAP = @SNAP@ SSH = @SSH@ STRIP = @STRIP@ TEMP = @TEMP@ TEST = @TEST@ TEST_CP = @TEST_CP@ TEST_DU = @TEST_DU@ TEST_LOGGER = @TEST_LOGGER@ TEST_RM = @TEST_RM@ TEST_SSH = @TEST_SSH@ TEST_SSH_USER = @TEST_SSH_USER@ UMOUNT = @UMOUNT@ # rsnapshot version VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # If you lack GNU make, you could use "test_cases = t/*.t" as an approximation. test_cases_in := $(wildcard t/*/*.t.in) test_cases := $(test_cases_in:%.in=%) test_configs_in := $(wildcard t/*/conf/*.conf.in) test_configs := $(test_configs_in:%.in=%) test_modules_in = $(wildcard t/*.pm.in) test_modules = $(test_modules_in:%.in=%) bin_SCRIPTS = rsnapshot rsnapshot-diff man_MANS = rsnapshot.1 rsnapshot-diff.1 sysconf_DATA = rsnapshot.conf.default all: all-am .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): rsnapshot: $(top_builddir)/config.status $(srcdir)/rsnapshot-program.pl cd $(top_builddir) && $(SHELL) ./config.status $@ rsnapshot-diff: $(top_builddir)/config.status $(srcdir)/rsnapshot-diff.pl cd $(top_builddir) && $(SHELL) ./config.status $@ rsnapshot.conf.default: $(top_builddir)/config.status $(srcdir)/rsnapshot.conf.default.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t: $(top_builddir)/config.status $(top_srcdir)/t/link-dest_-t_when_only_one_snapshot/link-dest_-t_when_only_one_snapshot.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf: $(top_builddir)/config.status $(top_srcdir)/t/link-dest_-t_when_only_one_snapshot/conf/link-dest_-t_when_only_one_snapshot.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/relative_delete_bugfix/relative_delete_bugfix.t: $(top_builddir)/config.status $(top_srcdir)/t/relative_delete_bugfix/relative_delete_bugfix.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/relative_delete_bugfix/conf/relative_delete_bugfix.conf: $(top_builddir)/config.status $(top_srcdir)/t/relative_delete_bugfix/conf/relative_delete_bugfix.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/snapshot_root_with_space/snapshot_root_with_space.t: $(top_builddir)/config.status $(top_srcdir)/t/snapshot_root_with_space/snapshot_root_with_space.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/snapshot_root_with_space/conf/snapshot_root_with_space.conf: $(top_builddir)/config.status $(top_srcdir)/t/snapshot_root_with_space/conf/snapshot_root_with_space.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/cmd-post_pre-exec/cmd-post_pre-exec.t: $(top_builddir)/config.status $(top_srcdir)/t/cmd-post_pre-exec/cmd-post_pre-exec.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/cmd-post_pre-exec/conf/pre-false-post-true.conf: $(top_builddir)/config.status $(top_srcdir)/t/cmd-post_pre-exec/conf/pre-false-post-true.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/cmd-post_pre-exec/conf/pre-true-post-true.conf: $(top_builddir)/config.status $(top_srcdir)/t/cmd-post_pre-exec/conf/pre-true-post-true.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/cmd-post_pre-exec/conf/pre-true-post-false.conf: $(top_builddir)/config.status $(top_srcdir)/t/cmd-post_pre-exec/conf/pre-true-post-false.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/cmd-post_pre-exec/conf/pre-false-post-false.conf: $(top_builddir)/config.status $(top_srcdir)/t/cmd-post_pre-exec/conf/pre-false-post-false.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/SysWrap.pm: $(top_builddir)/config.status $(top_srcdir)/t/SysWrap.pm.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/backup_exec/conf/backup_exec_fail.conf: $(top_builddir)/config.status $(top_srcdir)/t/backup_exec/conf/backup_exec_fail.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/backup_exec/conf/backup_exec.conf: $(top_builddir)/config.status $(top_srcdir)/t/backup_exec/conf/backup_exec.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/backup_exec/backup_exec.t: $(top_builddir)/config.status $(top_srcdir)/t/backup_exec/backup_exec.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/rsync-exitcode/rsync-exitcode.t: $(top_builddir)/config.status $(top_srcdir)/t/rsync-exitcode/rsync-exitcode.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/rsync-exitcode/conf/rsync-exitcode-good.conf: $(top_builddir)/config.status $(top_srcdir)/t/rsync-exitcode/conf/rsync-exitcode-good.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/rsync-exitcode/conf/rsync-exitcode-bad.conf: $(top_builddir)/config.status $(top_srcdir)/t/rsync-exitcode/conf/rsync-exitcode-bad.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/configtest/configtest.t: $(top_builddir)/config.status $(top_srcdir)/t/configtest/configtest.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/configtest/conf/configtest.conf: $(top_builddir)/config.status $(top_srcdir)/t/configtest/conf/configtest.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/rsync/rsync.t: $(top_builddir)/config.status $(top_srcdir)/t/rsync/rsync.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/rsync/conf/rsync.conf: $(top_builddir)/config.status $(top_srcdir)/t/rsync/conf/rsync.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/gnu_cp/gnu_cp.t: $(top_builddir)/config.status $(top_srcdir)/t/gnu_cp/gnu_cp.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/gnu_cp/conf/gnu_cp.conf: $(top_builddir)/config.status $(top_srcdir)/t/gnu_cp/conf/gnu_cp.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/ssh_args/conf/ssh_args.conf: $(top_builddir)/config.status $(top_srcdir)/t/ssh_args/conf/ssh_args.conf.in cd $(top_builddir) && $(SHELL) ./config.status $@ t/ssh_args/ssh_args.t: $(top_builddir)/config.status $(top_srcdir)/t/ssh_args/ssh_args.t.in cd $(top_builddir) && $(SHELL) ./config.status $@ install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n' \ -e 'h;s|.*|.|' \ -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) { files[d] = files[d] " " $$1; \ if (++n[d] == $(am__install_max)) { \ print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ else { print "f", d "/" $$4, $$1 } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binSCRIPTS: @$(NORMAL_UNINSTALL) @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-sysconfDATA: $(sysconf_DATA) @$(NORMAL_INSTALL) test -z "$(sysconfdir)" || $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \ done uninstall-sysconfDATA: @$(NORMAL_UNINSTALL) @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(sysconfdir)'; $(am__uninstall_files_from_dir) tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-am all-am: Makefile $(SCRIPTS) $(MANS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(sysconfdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binSCRIPTS install-sysconfDATA install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binSCRIPTS uninstall-man uninstall-sysconfDATA uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am am--refresh check check-am clean clean-generic dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma dist-shar \ dist-tarZ dist-xz dist-zip distcheck distclean \ distclean-generic distcleancheck distdir distuninstallcheck \ dvi dvi-am html html-am info info-am install install-am \ install-binSCRIPTS install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip install-sysconfDATA installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-binSCRIPTS \ uninstall-man uninstall-man1 uninstall-sysconfDATA doc: man html @echo "Documentation $(man_MANS) and rsnapshot.html are now up to date." @touch doc man: $(man_MANS) rsnapshot.1 : rsnapshot @# perl 5.8 for this pod2man -c 'rsnapshot-tools' -n 'rsnapshot' -r 'rsnapshot-tools' rsnapshot > rsnapshot.1 rsnapshot-diff.1 : rsnapshot-diff @# perl 5.8 for this pod2man -c 'rsnapshot-tools' -n 'rsnapshot-diff' -r 'rsnapshot-tools' rsnapshot-diff > rsnapshot-diff.1 html: rsnapshot.html rsnapshot.html: rsnapshot pod2html rsnapshot | grep -v 'link rev' > rsnapshot.html rm -f pod2htmd.* rm -f pod2htmi.* clean: rm -rf rsnapshot-$(VERSION)/ rm -f $(man_MANS) rm -rf autom4te.cache rm -f rsnapshot-$(VERSION).tar.gz rm -f $(sysconf_DATA) rm -f rsnapshot.html rm -f pod2htmd.* rm -f pod2htmi.* rm -f Makefile config.log config.status configure.lineno rsnapshot rsnapshot-diff rm -f t/*.t rm -f t/*.pm rm -f t/support/etc/*.conf rm -f t/support/files/a/{1,2} rm -rf t/support/snapshots/*.* tar: rsnapshot-$(VERSION).tar.gz @touch tar rsnapshot-$(VERSION).tar.gz: $(man_MANS) Makefile $(bin_SCRIPTS) $(sysconf_DATA) @echo building tar file mkdir rsnapshot-$(VERSION)/ @# core files cp -a AUTHORS ChangeLog COPYING INSTALL.md Makefile.am README.md \ rsnapshot.conf.default.in rsnapshot-diff.pl rsnapshot-program.pl \ rsnapshot-$(VERSION) @# autoconf files cp -a configure.ac Makefile.am \ aclocal.m4 autom4te.cache configure install-sh Makefile.in missing \ rsnapshot-$(VERSION)/ @# documentation files cp -a docs \ rsnapshot-$(VERSION)/ @# utils cp -a utils/ \ rsnapshot-$(VERSION)/ @# testsuite cp -a t/ \ rsnapshot-$(VERSION)/ @# remove git-files find rsnapshot-$(VERSION)/ -depth -name .gitignore -exec rm -rf {} \; @# change ownership to root, and delete build dir fakeroot chown -R root:root rsnapshot-$(VERSION)/ rm -f rsnapshot-$(VERSION).tar.gz tar czf rsnapshot-$(VERSION).tar.gz rsnapshot-$(VERSION)/ rm -rf rsnapshot-$(VERSION)/ @echo test: rsnapshot $(test_cases) $(test_configs) $(test_modules) @PERL@ -MTest::Harness -It -e 'runtests($(test_cases:%="%",))' # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: rsnapshot-1.4.2/rsnapshot-program.pl0000775000175000017500000065442512632661200017207 0ustar travistravis#!@PERL@ -w ######################################################################## # # # rsnapshot # # by Nathan Rosenquist # # now maintained by Benedikt Heine # # # # The official rsnapshot website is located at # # http://www.rsnapshot.org/ # # # # Copyright (C) 2003-2005 Nathan Rosenquist # # # # Portions Copyright (C) 2002-2006 Mike Rubel, Carl Wilhelm Soderstrom,# # Ted Zlatanov, Carl Boe, Shane Liebling, Bharat Mediratta, # # Peter Palfrader, Nicolas Kaiser, David Cantrell, Chris Petersen, # # Robert Jackson, Justin Grote, David Keegel, Alan Batie # # # # rsnapshot comes with ABSOLUTELY NO WARRANTY. This is free software, # # and you may copy, distribute and/or modify it under the terms of # # the GNU GPL (version 2 or at your option any later version). # # See the GNU General Public License (in file: COPYING) for details. # # # # Based on code originally by Mike Rubel # # http://www.mikerubel.org/computers/rsync_snapshots/ # # # ######################################################################## # tabstops are set to 4 spaces # in vi, do: set ts=4 sw=4 ######################################## ### STANDARD MODULES ### ######################################## require 5.004; use strict; use DirHandle; # DirHandle() use Cwd; # cwd() use Getopt::Std; # getopts() use File::Path; # mkpath(), rmtree() use File::stat; # stat(), lstat() use POSIX qw(locale_h); # setlocale() use Fcntl; # sysopen() use IO::File; # recursive open in parse_config_file use IPC::Open3 qw(open3); #open rsync with error output use IO::Handle; # handle autoflush for rsync-output ######################################## ### CPAN MODULES ### ######################################## # keep track of whether we have access to the Lchown module my $have_lchown = 0; # use_lchown() is called later, so we can log the results ######################################## ### DECLARE GLOBAL VARIABLES ### ######################################## # turn off buffering $| = 1; # version of rsnapshot my $VERSION = '@VERSION@'; # command or interval to execute (first cmd line arg) my $cmd; # default configuration file my $config_file; # hash to hold variables from the configuration file my %config_vars; # array of hash_refs containing the destination backup point # and either a source dir or a script to run my @backup_points; # array of backup points to rollback, in the event of failure my @rollback_points; # "intervals" are user defined time periods (e.g., alpha, beta) # this array holds hash_refs containing the name of the interval, # and the number of snapshots to keep of it # # NB, intervals and now called backup levels, and the config parameter # is 'retain' my @intervals; # store interval data (mostly info about which one we're on, what was before, etc.) # this is a convenient reference to some of the data from and metadata about @intervals my $interval_data_ref; # intervals can't have these values, because they're either taken by other commands # or reserved for future use my @reserved_words = qw( archive check-config-version configtest diff delete du get-latest-snapshot help history list print-config restore rollback sync upgrade-config-file version version-only ); # global flags that change the outcome of the program, # and are configurable by both cmd line and config flags # my $test = 0; # turn verbose on, but don't execute # any filesystem commands my $do_configtest = 0; # parse config file and exit my $one_fs = 0; # one file system (don't cross # partitions within a backup point) my $link_dest = 0; # use the --link-dest option to rsync my $stop_on_stale_lockfile = 0; # stop if there is a stale lockfile # how much noise should we make? the default is 2 # # 0 Absolutely quiet (reserved, but not implemented) # 1 Don't display warnings about FIFOs and special files # 2 Default (errors only) # 3 Verbose (show shell commands and equivalents) # 4 Extra verbose messages (individual actions inside some subroutines, output from rsync) # 5 Debug # # define verbose and loglevel my $verbose = undef; my $loglevel = undef; # set defaults for verbose and loglevel my $default_verbose = 2; my $default_loglevel = 3; # assume the config file is valid until we find an error my $config_perfect = 1; # exit code for rsnapshot my $exit_code = 0; # global defaults for external programs my $default_rsync_short_args = '-a'; my $default_rsync_long_args = '--delete --numeric-ids --relative --delete-excluded'; my $default_ssh_args = undef; my $default_du_args = '-csh'; # set default for use_lazy_deletes my $use_lazy_deletes = 0; # do not delete the oldest archive until after backup # set default for number of tries my $rsync_numtries = 1; # by default, try once # exactly how the program was called, with all arguments # this is set before getopts() modifies @ARGV my $run_string = "$0 " . join(' ', @ARGV); # if we have any errors, we print the run string once, at the top of the list my $have_printed_run_string = 0; # pre-buffer the include/exclude parameter flags # local to parse_config_file and validate_config_file my $rsync_include_args = undef; my $rsync_include_file_args = undef; # hash used to register traps and execute in bail my %traps; $traps{"linux_lvm_snapshot"} = 0; $traps{"linux_lvm_mountpoint"} = 0; ######################################## ### SIGNAL HANDLERS ### ######################################## # shut down gracefully if necessary $SIG{'HUP'} = 'IGNORE'; $SIG{'INT'} = sub { bail('rsnapshot was sent INT signal... cleaning up'); }; $SIG{'QUIT'} = sub { bail('rsnapshot was sent QUIT signal... cleaning up'); }; $SIG{'ABRT'} = sub { bail('rsnapshot was sent ABRT signal... cleaning up'); }; $SIG{'TERM'} = sub { bail('rsnapshot was sent TERM signal... cleaning up'); }; # For a PIPE error, we dont want any more output so set $verbose less than 1. $SIG{'PIPE'} = sub { $verbose = 0; bail( 'rsnapshot was sent PIPE signal... Hint: if rsnapshot is running from cron, check that mail is installed on this system, or redirect stdout and stderr in cron job' ); }; ######################################## ### CORE PROGRAM STRUCTURE ### ######################################## # what follows is a linear sequence of events. # all of these subroutines will either succeed or terminate the program safely. # figure out the path to the default config file (with autoconf we have to check) # this sets $config_file to the full config file path find_config_file(); # parse command line options # (this can override $config_file, if the -c flag is used on the command line) parse_cmd_line_opts(); # if we need to run a command that doesn't require fully parsing the config file, do it now (and exit) if (!defined($cmd) or ((!$cmd) && ('0' ne $cmd))) { show_usage(); } elsif ($cmd eq 'help') { show_help(); } elsif ($cmd eq 'version') { show_version(); } elsif ($cmd eq 'version-only') { show_version_only(); } elsif ($cmd eq 'check-config-version') { check_config_version(); } elsif ($cmd eq 'upgrade-config-file') { upgrade_config_file(); } # if we're just doing a configtest, set that flag if ($cmd eq 'configtest') { $do_configtest = 1; } # parse config file (if it exists), note: we can't parse a directory if (defined($config_file) && (-r $config_file) && (!-d $config_file)) { # if there is a problem, this subroutine will exit the program and notify the user of the error parse_config_file(); validate_config_file(); } # no config file found else { # warn user and exit the program exit_no_config_file(); } # attempt to load the Lchown module: http://search.cpan.org/dist/Lchown/ use_lchown(); # if we're just doing a configtest, exit here with the results if (1 == $do_configtest) { exit_configtest(); } # if we're just using "du" or "rsnapshot-diff" to check the disk space, do it now (and exit) # these commands are down here because they needs to know the contents of the config file if ($cmd eq 'du') { show_disk_usage(); } elsif ($cmd eq 'diff') { show_rsnapshot_diff(); } elsif ($cmd eq 'get-latest-snapshot') { show_latest_snapshot(); } # # IF WE GOT THIS FAR, PREPARE TO RUN A BACKUP # # log the beginning of this run log_startup(); # this is reported to fix some semi-obscure problems with rmtree() set_posix_locale(); # if we're using a lockfile, try to add it # (the program will bail if one exists and it's not stale) add_lockfile(); # create snapshot_root if it doesn't exist (and no_create_root != 1) create_snapshot_root(); # now chdir to the snapshot_root. # note that this is needed because in the rare case that you do this ... # sudo -u peon rsnapshot ... and are in a directory that 'peon' can't # read, then some versions of GNU rm will later fail, as they try to # lstat the cwd. It's safe to chdir because all directories etc that # we ever mention are absolute. chdir($config_vars{'snapshot_root'}); # actually run the backup job # $cmd should store the name of the interval we'll run against handle_interval($cmd); # if we have a lockfile, remove it # however, this will have already been done if use_lazy_deletes is turned # on, and there may be a lockfile from another process now in place, # so in that case don't just blindly delete! remove_lockfile() unless ($use_lazy_deletes); # if we got this far, the program is done running # write to the log and syslog with the status of the outcome # exit_with_status(); ######################################## ### SUBROUTINES ### ######################################## # concise usage information # runs when rsnapshot is called with no arguments # exits with an error condition sub show_usage { print < 1) { for (my $i = 1; $i < scalar(@ARGV); $i++) { print STDERR "Unknown option: $ARGV[$i]\n"; print STDERR "Please make sure all switches come before commands\n"; print STDERR "(e.g., 'rsnapshot -v alpha', not 'rsnapshot alpha -v')\n"; exit(1); } $result = undef; } } # alternate config file? if (defined($opts{'c'})) { $config_file = $opts{'c'}; } # test? (just show what WOULD be done) if (defined($opts{'t'})) { $test = 1; $verbose = 3; } # quiet? if (defined($opts{'q'})) { $verbose = 1; } # verbose (or extra verbose)? if (defined($opts{'v'})) { $verbose = 3; } if (defined($opts{'V'})) { $verbose = 4; } # debug if (defined($opts{'D'})) { $verbose = 5; } # one file system? (don't span partitions with rsync) if (defined($opts{'x'})) { $one_fs = 1; } } # accepts an optional argument - no arg means to parse the default file, # if an arg is present parse that file instead # returns no value # this subroutine parses the config file (rsnapshot.conf) # sub parse_config_file { # count the lines in the config file, so the user can pinpoint errors more precisely my $file_line_num = 0; my @configs = (); # open the config file my $current_config_file = shift() || $config_file; my $CONFIG; if ($current_config_file =~ /^`(.*)`$/) { open($CONFIG, "$1 |") or bail("Couldn't execute \"$1\" to get config information\n"); } else { $CONFIG = IO::File->new($current_config_file) or bail("Could not open config file \"$current_config_file\"\nAre you sure you have permission?"); } # read it line by line @configs = <$CONFIG>; while (my $line = $configs[$file_line_num]) { chomp($line); # count line numbers $file_line_num++; # Ensure the correct filename is reported in error messages. Setting it on # every iteration ensures it will be reset after recursive calls to this # function. $config_file = $current_config_file; # assume the line is formatted incorrectly my $line_syntax_ok = 0; # ignore comments if (is_comment($line)) { next; } # ignore blank lines if (is_blank($line)) { next; } # if the next line begins with space or tab and also has a non-space character, then it belongs to this line as a continuation. while (defined($configs[$file_line_num]) && $configs[$file_line_num] =~ /^[\t ]+\S/) { (my $newline = $configs[$file_line_num]) =~ s/^\s+|\s+$//g; $line = $line . "\t" . $newline; $file_line_num++; } # parse line my ($var, $value, $value2, $value3) = split(/\t+/, $line, 4); # warn about entries we don't understand, and immediately prevent the # program from running or parsing anything else if (!defined($var)) { config_err($file_line_num, "$line - could not find a first word on this line"); next; } if (!defined($value) && $var eq $line) { # No tabs found in $line. if ($line =~ /\s/) { # User put spaces in config line instead of tabs. config_err($file_line_num, "$line - missing tabs to separate words - change spaces to tabs."); next; } else { # User put only one word config_err($file_line_num, "$line - could not find second word on this line"); next; } } foreach (grep { defined($_) && index($_, ' ') == 0 } ($value, $value2, $value3)) { print_warn("$line - extra space found between tab and $_"); } # INCLUDEs if ($var eq 'include_conf') { $value =~ /^`(.*)`$/; if ( (defined($value) && -f $value && -r $value) || (defined($1) && is_valid_script($1))) { $line_syntax_ok = 1; parse_config_file($value); } else { if (defined($1)) { config_err($file_line_num, "$line - not a valid script: '$1'"); } else { config_err($file_line_num, "$line - can't find or read file '$value'"); } next; } } # CONFIG_VERSION if ($var eq 'config_version') { if (defined($value)) { # right now 1.2 is the only possible value if ('1.2' eq $value) { $config_vars{'config_version'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - config_version not recognized!"); next; } } else { config_err($file_line_num, "$line - config_version not defined!"); next; } } # SNAPSHOT_ROOT if ($var eq 'snapshot_root') { # make sure this is a full path if (0 == is_valid_local_abs_path($value)) { if (is_ssh_path($value) || is_anon_rsync_path($value) || is_cwrsync_path($value)) { config_err($file_line_num, "$line - snapshot_root must be a local path - you cannot have a remote snapshot_root"); } else { config_err($file_line_num, "$line - snapshot_root must be a full path"); } next; # if the snapshot root already exists: } elsif (-e "$value") { # if path exists already, make sure it's a directory if ((-e "$value") && (!-d "$value")) { config_err($file_line_num, "$line - snapshot_root must be a directory"); next; } # make sure it's readable if (!-r "$value") { config_err($file_line_num, "$line - snapshot_root exists but is not readable"); next; } # make sure it's writable if ($cmd ne 'du' && !-w "$value") { config_err($file_line_num, "$line - snapshot_root exists but is not writable"); next; } } # remove the trailing slash(es) if present $value = remove_trailing_slash($value); $config_vars{'snapshot_root'} = $value; $line_syntax_ok = 1; next; } # SYNC_FIRST # if this is enabled, rsnapshot syncs data to a staging directory with the "rsnapshot sync" command, # and all "interval" runs will simply rotate files. this changes the behaviour of the lowest interval. # when a sync occurs, no directories are rotated. the sync directory is kind of like a staging area for data transfers. # the files in the sync directory will be hard linked with the others in the other snapshot directories. # the sync directory lives at: //.sync/ # if ($var eq 'sync_first') { if (defined($value)) { if ('1' eq $value) { $config_vars{'sync_first'} = 1; $line_syntax_ok = 1; next; } elsif ('0' eq $value) { $config_vars{'sync_first'} = 0; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - sync_first must be set to either 1 or 0"); next; } } } # NO_CREATE_ROOT if ($var eq 'no_create_root') { if (defined($value)) { if ('1' eq $value) { $config_vars{'no_create_root'} = 1; $line_syntax_ok = 1; next; } elsif ('0' eq $value) { $config_vars{'no_create_root'} = 0; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - no_create_root must be set to either 1 or 0"); next; } } } # CHECK FOR RSYNC (required) if ($var eq 'cmd_rsync') { $value =~ s/\s+$//; if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) { $config_vars{'cmd_rsync'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not executable"); next; } } # CHECK FOR SSH (optional) if ($var eq 'cmd_ssh') { $value =~ s/\s+$//; if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) { $config_vars{'cmd_ssh'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not executable"); next; } } # CHECK FOR GNU cp (optional) if ($var eq 'cmd_cp') { $value =~ s/\s+$//; if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) { $config_vars{'cmd_cp'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not executable"); next; } } # CHECK FOR rm (optional) if ($var eq 'cmd_rm') { $value =~ s/\s+$//; if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) { $config_vars{'cmd_rm'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not executable"); next; } } # CHECK FOR LOGGER (syslog program) (optional) if ($var eq 'cmd_logger') { $value =~ s/\s+$//; if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) { $config_vars{'cmd_logger'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not executable"); next; } } # CHECK FOR du (optional) if ($var eq 'cmd_du') { $value =~ s/\s+$//; if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) { $config_vars{'cmd_du'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not executable"); next; } } # CHECK FOR lvcreate (optional) if ($var eq 'linux_lvm_cmd_lvcreate') { if (is_valid_script($value)) { $config_vars{'linux_lvm_cmd_lvcreate'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not a valid executable"); next; } } # CHECK FOR lvremove (optional) if ($var eq 'linux_lvm_cmd_lvremove') { if (is_valid_script($value)) { $config_vars{'linux_lvm_cmd_lvremove'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not a valid executable"); next; } } # CHECK FOR mount (optional) if ($var eq 'linux_lvm_cmd_mount') { if (is_valid_script($value)) { $config_vars{'linux_lvm_cmd_mount'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not a valid executable"); next; } } # CHECK FOR umount (optional) if ($var eq 'linux_lvm_cmd_umount') { if (is_valid_script($value)) { $config_vars{'linux_lvm_cmd_umount'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not a valid executable"); next; } } # CHECK FOR cmd_preexec (optional) if ($var eq 'cmd_preexec') { my $script; # script file (no args) # make sure script exists and is executable if (!is_valid_script($value, \$script)) { config_err($file_line_num, "$line - \"$script\" is not executable or can't be found." . ($script !~ m{^/} ? " Please use an absolute path." : "")); next; } $config_vars{$var} = $value; $line_syntax_ok = 1; next; } # CHECK FOR cmd_postexec (optional) if ($var eq 'cmd_postexec') { my $script; # script file (no args) # make sure script exists and is executable if (!is_valid_script($value, \$script)) { config_err($file_line_num, "$line - \"$script\" is not executable or can't be found." . ($script !~ m{^/} ? " Please use an absolute path." : "")); next; } $config_vars{$var} = $value; $line_syntax_ok = 1; next; } # CHECK FOR rsnapshot-diff (optional) if ($var eq 'cmd_rsnapshot_diff') { $value =~ s/\s+$//; if ((-f "$value") && (-x "$value") && (1 == is_real_local_abs_path($value))) { $config_vars{'cmd_rsnapshot_diff'} = $value; $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - $value is not executable"); next; } } # INTERVALS # 'retain' is the new name for this parameter, although for # Laziness reasons (plus the fact that I'm making this change # at 10 minutes to midnight and so am wary of making changes # throughout the code and getting it wrong) the code will # still call it 'interval'. Documentation and messages should # refer to 'retain'. The old 'interval' will be kept as an # alias. if ($var eq 'interval' || $var eq 'retain') { my $retain = $var; # either 'interval' or 'retain' # check if interval is blank if (!defined($value)) { config_err($file_line_num, "$line - $retain can not be blank"); } foreach my $word (@reserved_words) { if ($value eq $word) { config_err($file_line_num, "$line - \"$value\" is not a valid interval name, reserved word conflict"); next; } } # make sure interval is alpha-numeric if ($value !~ m/^[\w\d]+$/) { config_err($file_line_num, "$line - \"$value\" is not a valid $retain name, must be alphanumeric characters only"); next; } # check if number is blank if (!defined($value2)) { config_err($file_line_num, "$line - \"$value\" number can not be blank"); next; } # check if number is valid if ($value2 !~ m/^\d+$/) { config_err($file_line_num, "$line - \"$value2\" is not a legal value for a retention count"); next; } # ok, it's a number. is it positive? else { # make sure number is positive if ($value2 <= 0) { config_err($file_line_num, "$line - \"$value\" must be at least 1 or higher"); next; } } my %hash; $hash{'interval'} = $value; $hash{'number'} = $value2; push(@intervals, \%hash); $line_syntax_ok = 1; next; } # BACKUP POINTS if ($var eq 'backup') { my $src = $value; # source directory my $dest = $value2; # dest directory my $opt_str = $value3; # option string from this backup point my $opts_ref = undef; # array_ref to hold parsed opts if (!defined($config_vars{'snapshot_root'})) { config_err($file_line_num, "$line - snapshot_root needs to be defined before backup points"); next; } if (!defined($src)) { config_err($file_line_num, "$line - no source path specified for backup point"); next; } if (!defined($dest) || $dest eq "") { config_err($file_line_num, "$line - no destination path specified for backup point"); next; } # make sure we aren't traversing directories if (is_directory_traversal($src)) { config_err($file_line_num, "$line - Directory traversal attempted in $src"); next; } if (is_directory_traversal($dest)) { config_err($file_line_num, "$line - Directory traversal attempted in $dest"); next; } # validate source path # # local absolute? if (is_real_local_abs_path($src)) { $line_syntax_ok = 1; # syntactically valid remote ssh? } elsif (is_ssh_path($src)) { # if it's an ssh path, make sure we have ssh if (!defined($config_vars{'cmd_ssh'})) { config_err($file_line_num, "$line - Cannot handle $src, cmd_ssh not defined in $config_file"); next; } $line_syntax_ok = 1; # if it's anonymous rsync, we're ok } elsif (is_anon_rsync_path($src)) { $line_syntax_ok = 1; # check for cwrsync } elsif (is_cwrsync_path($src)) { $line_syntax_ok = 1; # check for lvm } elsif (is_linux_lvm_path($src)) { # if it's an lvm path, make sure we have lvm commands and arguments if (!defined($config_vars{'linux_lvm_cmd_lvcreate'})) { config_err($file_line_num, "$line - Cannot handle $src, linux_lvm_cmd_lvcreate not defined in $config_file"); next; } if (!defined($config_vars{'linux_lvm_cmd_lvremove'})) { config_err($file_line_num, "$line - Cannot handle $src, linux_lvm_cmd_lvremove not defined in $config_file"); next; } if (!defined($config_vars{'linux_lvm_cmd_mount'})) { config_err($file_line_num, "$line - Cannot handle $src, linux_lvm_cmd_mount not defined in $config_file"); next; } if (!defined($config_vars{'linux_lvm_cmd_umount'})) { config_err($file_line_num, "$line - Cannot handle $src, linux_lvm_cmd_umount not defined in $config_file"); next; } if (!defined($config_vars{'linux_lvm_snapshotsize'})) { config_err($file_line_num, "$line - Cannot handle $src, linux_lvm_snapshotsize not defined in $config_file"); next; } if (!defined($config_vars{'linux_lvm_snapshotname'})) { config_err($file_line_num, "$line - Cannot handle $src, linux_lvm_snapshotname not defined in $config_file"); next; } if (!defined($config_vars{'linux_lvm_vgpath'})) { config_err($file_line_num, "$line - Cannot handle $src, linux_lvm_vgpath not defined in $config_file"); next; } if (!defined($config_vars{'linux_lvm_mountpath'})) { config_err($file_line_num, "$line - Cannot handle $src, linux_lvm_mountpath not defined in $config_file"); next; } $line_syntax_ok = 1; } # fear the unknown else { config_err($file_line_num, "$line - Source directory \"$src\" doesn't exist"); next; } # validate destination path # # make sure we have a local NON absolute path for dest if (!is_valid_local_non_abs_path($dest)) { config_err($file_line_num, "$line - Backup destination $dest must be a local, relative path"); next; } # if we have special options specified for this backup point, remember them if (defined($opt_str) && $opt_str) { $opts_ref = parse_backup_opts($opt_str); if (!defined($opts_ref)) { config_err($file_line_num, "$line - Syntax error on line $file_line_num in extra opts: $opt_str"); next; } } # remember src/dest my %hash; $hash{'src'} = $src; $hash{'dest'} = $dest; if (defined($opts_ref)) { $hash{'opts'} = $opts_ref; } # If this backup point contains the snapshot root, add an exclude to avoid # backing up the snapshot root recursively. The exclude is anchored (by virtue # of the leading slash of $config_vars{'snapshot_root'}) and applies to absolute # paths (the "/" modifier), so it should match the snapshot root and nothing else # regardless of --relative. # # This should work in any version of rsync since 2.6.4 except for 2.6.7, due to a bug: # http://lists.samba.org/archive/rsync/2006-March/014953.html if ((is_real_local_abs_path("$src")) && ($config_vars{'snapshot_root'} =~ m/^$src/)) { $hash{'opts'}{'extra_rsync_long_args'} .= sprintf(' --filter=-/_%s', $config_vars{'snapshot_root'}); } push(@backup_points, \%hash); next; } # BACKUP SCRIPTS if ($var eq 'backup_script') { my $full_script = $value; # backup script to run (including args) my $dest = $value2; # dest directory my %hash; # tmp hash to stick in the backup points array my $script; # script file (no args) my @script_argv; # tmp array to help us separate the script from the args if (!defined($config_vars{'snapshot_root'})) { config_err($file_line_num, "$line - snapshot_root needs to be defined before backup scripts"); next; } if (!defined($dest)) { config_err($file_line_num, "$line - no destination path specified"); next; } # get the base name of the script, not counting any arguments to it @script_argv = split(/\s+/, $full_script); $script = $script_argv[0]; # make sure the destination is a relative path if (0 == is_valid_local_non_abs_path($dest)) { config_err($file_line_num, "$line - Backup destination $dest must be a local, relative path"); next; } # make sure we aren't traversing directories (exactly 2 dots can't be next to each other) if (1 == is_directory_traversal($dest)) { config_err($file_line_num, "$line - Directory traversal attempted in $dest"); next; } # make sure script exists and is executable if (((!-f "$script") or (!-x "$script")) or !is_real_local_abs_path($script)) { config_err($file_line_num, "$line - \"$script\" is not executable or can't be found." . ($script !~ m{^/} ? " Please use an absolute path." : "")); next; } $hash{'script'} = $full_script; $hash{'dest'} = $dest; $line_syntax_ok = 1; push(@backup_points, \%hash); next; } # BACKUP EXEC - just run a unix command if ($var eq 'backup_exec') { my %hash; my $cmd = $value; my $importance = $value2; if (!defined($cmd)) { config_err($file_line_num, "$line - a command to be executed must be provided"); next; } # Valid importance level options: 'optional', 'required'. # Default value if not specified: 'optional' if (!defined($importance)) { $importance = 'optional'; } elsif ($importance ne 'optional' && $importance ne 'required') { config_err($file_line_num, "$line - requirement level \"$importance\" is invalid"); next; } $hash{'cmd'} = $cmd; $hash{'importance'} = $importance; $line_syntax_ok = 1; push(@backup_points, \%hash); next; } # GLOBAL OPTIONS from the config file # ALL ARE OPTIONAL # # LINK_DEST if ($var eq 'link_dest') { if (!defined($value)) { config_err($file_line_num, "$line - link_dest can not be blank"); next; } if (!is_boolean($value)) { config_err($file_line_num, "$line - \"$value\" is not a legal value for link_dest, must be 0 or 1 only"); next; } $link_dest = $value; $line_syntax_ok = 1; next; } # ONE_FS if ($var eq 'one_fs') { if (!defined($value)) { config_err($file_line_num, "$line - one_fs can not be blank"); next; } if (!is_boolean($value)) { config_err($file_line_num, "$line - \"$value\" is not a legal value for one_fs, must be 0 or 1 only"); next; } $one_fs = $value; $line_syntax_ok = 1; next; } # LOCKFILE if ($var eq 'lockfile') { if (!defined($value)) { config_err($file_line_num, "$line - lockfile can not be blank"); } if (0 == is_valid_local_abs_path("$value")) { config_err($file_line_num, "$line - lockfile must be a full path"); next; } $config_vars{'lockfile'} = $value; $line_syntax_ok = 1; next; } #STOP_ON_STALE_LOCKFILE if ($var eq 'stop_on_stale_lockfile') { if (!defined($value)) { config_err($file_line_num, "$line - stop_on_stale_lockfile can not be blank"); next; } if (!is_boolean($value)) { config_err($file_line_num, "$line - \"$value\" is not a legal value for stop_on_stale_lockfile, must be 0 or 1 only"); next; } $stop_on_stale_lockfile = $value; $line_syntax_ok = 1; next; } # INCLUDE if ($var eq 'include') { if (!defined($rsync_include_args)) { $rsync_include_args = "--include=$value"; } else { $rsync_include_args .= " --include=$value"; } $line_syntax_ok = 1; next; } # EXCLUDE if ($var eq 'exclude') { if (!defined($rsync_include_args)) { $rsync_include_args = "--exclude=$value"; } else { $rsync_include_args .= " --exclude=$value"; } $line_syntax_ok = 1; next; } # INCLUDE FILE if ($var eq 'include_file') { if (0 == is_real_local_abs_path($value)) { config_err($file_line_num, "$line - include_file $value must be a valid absolute path"); next; } elsif (1 == is_directory_traversal($value)) { config_err($file_line_num, "$line - Directory traversal attempted in $value"); next; } elsif ((-e "$value") && (!-f "$value")) { config_err($file_line_num, "$line - include_file $value exists, but is not a file"); next; } elsif (!-r "$value") { config_err($file_line_num, "$line - include_file $value exists, but is not readable"); next; } else { if (!defined($rsync_include_file_args)) { $rsync_include_file_args = "--include-from=$value"; } else { $rsync_include_file_args .= " --include-from=$value"; } $line_syntax_ok = 1; next; } } # EXCLUDE FILE if ($var eq 'exclude_file') { if (0 == is_real_local_abs_path($value)) { config_err($file_line_num, "$line - exclude_file $value must be a valid absolute path"); next; } elsif (1 == is_directory_traversal($value)) { config_err($file_line_num, "$line - Directory traversal attempted in $value"); next; } elsif ((-e "$value") && (!-f "$value")) { config_err($file_line_num, "$line - exclude_file $value exists, but is not a file"); next; } elsif (!-r "$value") { config_err($file_line_num, "$line - exclude_file $value exists, but is not readable"); next; } else { if (!defined($rsync_include_file_args)) { $rsync_include_file_args = "--exclude-from=$value"; } else { $rsync_include_file_args .= " --exclude-from=$value"; } $line_syntax_ok = 1; next; } } # RSYNC SHORT ARGS if ($var eq 'rsync_short_args') { # must be in the format '-abcde' if (0 == is_valid_rsync_short_args($value)) { config_err($file_line_num, "$line - rsync_short_args \"$value\" not in correct format"); next; } else { $config_vars{'rsync_short_args'} = $value; $line_syntax_ok = 1; next; } } # RSYNC LONG ARGS if ($var eq 'rsync_long_args') { $config_vars{'rsync_long_args'} = $value; $line_syntax_ok = 1; next; } # SSH ARGS if ($var eq 'ssh_args') { if (!defined($default_ssh_args) && defined($config_vars{'ssh_args'})) { config_err($file_line_num, "$line - global ssh_args can only be set once, but is already set. Perhaps you wanted to use a per-backup-point ssh_args instead." ); next; } else { $config_vars{'ssh_args'} = $value; $line_syntax_ok = 1; next; } } # DU ARGS if ($var eq 'du_args') { $config_vars{'du_args'} = $value; $line_syntax_ok = 1; next; } # LVM CMDS if ($var =~ m/^linux_lvm_cmd_(lvcreate|mount)$/) { $config_vars{$var} = $value; $line_syntax_ok = 1; next; } # LVM ARGS if ($var =~ m/^linux_lvm_(vgpath|snapshotname|snapshotsize|mountpath)$/) { $config_vars{$var} = $value; $line_syntax_ok = 1; next; } # LOGFILE if ($var eq 'logfile') { if (0 == is_valid_local_abs_path($value)) { config_err($file_line_num, "$line - logfile must be a valid absolute path"); next; } elsif (1 == is_directory_traversal($value)) { config_err($file_line_num, "$line - Directory traversal attempted in $value"); next; } elsif ((-e "$value") && (!-f "$value") && (!-p "$value")) { config_err($file_line_num, "$line - logfile $value exists, but is not a file"); next; } else { $config_vars{'logfile'} = $value; $line_syntax_ok = 1; next; } } # VERBOSE if ($var eq 'verbose') { if (1 == is_valid_loglevel($value)) { if (!defined($verbose)) { $verbose = $value; } elsif($verbose < $value ) { print_warn("The verbosity-level is \"$verbose\" despite subsequent declaration at line $file_line_num."); } $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - verbose must be a value between 1 and 5"); next; } } # LOGLEVEL if ($var eq 'loglevel') { if (1 == is_valid_loglevel($value)) { if (!defined($loglevel)) { $loglevel = $value; } $line_syntax_ok = 1; next; } else { config_err($file_line_num, "$line - loglevel must be a value between 1 and 5"); next; } } # USE LAZY DELETES if ($var eq 'use_lazy_deletes') { if (!defined($value)) { config_err($file_line_num, "$line - use_lazy_deletes can not be blank"); next; } if (!is_boolean($value)) { config_err($file_line_num, "$line - \"$value\" is not a legal value for use_lazy_deletes, must be 0 or 1 only"); next; } if (1 == $value) { $use_lazy_deletes = 1; } $line_syntax_ok = 1; next; } # RSYNC NUMBER OF TRIES if ($var eq 'rsync_numtries') { if (!defined($value)) { config_err($file_line_num, "$line - rsync_numtries can not be blank"); next; } if (!is_valid_rsync_numtries($value)) { config_err($file_line_num, "$line - \"$value\" is not a legal value for rsync_numtries, must be greater than or equal to 0"); next; } $rsync_numtries = int($value); $line_syntax_ok = 1; next; } # make sure we understood this line # if not, warn the user, and prevent the program from executing # however, don't bother if the user has already been notified if (1 == $config_perfect) { if (0 == $line_syntax_ok) { config_err($file_line_num, $line); next; } } } } sub validate_config_file { #################################################################### # SET SOME SENSIBLE DEFAULTS FOR VALUES THAT MAY NOT HAVE BEEN SET # #################################################################### # if we didn't manage to get a verbose level yet, either through the config file # or the command line, use the default if (!defined($verbose)) { $verbose = $default_verbose; } # same for loglevel if (!defined($loglevel)) { $loglevel = $default_loglevel; } # assemble rsync include/exclude args if (defined($rsync_include_args)) { if (!defined($config_vars{'rsync_long_args'})) { $config_vars{'rsync_long_args'} = $default_rsync_long_args; } $config_vars{'rsync_long_args'} .= " $rsync_include_args"; } # assemble rsync include/exclude file args if (defined($rsync_include_file_args)) { if (!defined($config_vars{'rsync_long_args'})) { $config_vars{'rsync_long_args'} = $default_rsync_long_args; } $config_vars{'rsync_long_args'} .= " $rsync_include_file_args"; } ############################################### # NOW THAT THE CONFIG FILE HAS BEEN READ IN, # # DO A SANITY CHECK ON THE DATA WE PULLED OUT # ############################################### # SINS OF COMMISSION # (incorrect entries in config file) if (0 == $config_perfect) { print_err("---------------------------------------------------------------------", 1); print_err("Errors were found in $config_file,", 1); print_err("rsnapshot can not continue. If you think an entry looks right, make", 1); print_err("sure you don't have spaces where only tabs should be.", 1); # if this wasn't a test, report the error to syslog if (0 == $do_configtest) { syslog_err("Errors were found in $config_file, rsnapshot can not continue."); } # exit showing an error exit(1); } # SINS OF OMISSION # (things that should be in the config file that aren't) # # make sure config_version was set if (!defined($config_vars{'config_version'})) { print_err("config_version was not defined. rsnapshot can not continue.", 1); syslog_err("config_version was not defined. rsnapshot can not continue."); exit(1); } # make sure rsync was defined if (!defined($config_vars{'cmd_rsync'})) { print_err("cmd_rsync was not defined.", 1); syslog_err("cmd_rsync was not defined.", 1); exit(1); } # make sure we got a snapshot_root if (!defined($config_vars{'snapshot_root'})) { print_err("snapshot_root was not defined. rsnapshot can not continue.", 1); syslog_err("snapshot_root was not defined. rsnapshot can not continue."); exit(1); } # make sure we have at least one interval if (0 == scalar(@intervals)) { print_err("At least one backup level must be set. rsnapshot can not continue.", 1); syslog_err("At least one backup level must be set. rsnapshot can not continue."); exit(1); } # make sure we have at least one backup point if (0 == scalar(@backup_points)) { print_err("At least one backup point must be set. rsnapshot can not continue.", 1); syslog_err("At least one backup point must be set. rsnapshot can not continue."); exit(1); } # SINS OF CONFUSION # (various, specific, undesirable interactions) # # make sure that we don't have only one copy of the first interval, # yet expect rotations on the second interval if (scalar(@intervals) > 1) { if (defined($intervals[0]->{'number'})) { if (1 == $intervals[0]->{'number'}) { print_err( "Can not have first backup level's retention count set to 1, and have a second backup level", 1); syslog_err( "Can not have first backup level's retention count set to 1, and have a second backup level"); exit(1); } } } # make sure that the snapshot_root exists if no_create_root is set to 1 if (defined($config_vars{'no_create_root'})) { if (1 == $config_vars{'no_create_root'}) { if (!-d "$config_vars{'snapshot_root'}") { if (-e "$config_vars{'snapshot_root'}") { print_err("$config_vars{'snapshot_root'} is not a directory.", 1); } else { my $snapshot_root = $config_vars{'snapshot_root'}; # Check parent directories until we find one that exists while (!-e $snapshot_root) { print_err("$snapshot_root does not exist.", 1); $snapshot_root =~ m%(.*)/[^/]*%; if (defined($1) && $1 ne $snapshot_root) { $snapshot_root = $1; } else { last; } } if (-e $snapshot_root && !-d $snapshot_root) { print_err("$snapshot_root is not a directory.", 1); syslog_err("$snapshot_root is not a directory."); } } print_err("rsnapshot refuses to create snapshot_root when no_create_root is enabled", 1); syslog_err("rsnapshot refuses to create snapshot_root when no_create_root is enabled"); exit(1); } } } # make sure that the user didn't call "sync" if sync_first isn't enabled if (($cmd eq 'sync') && (!$config_vars{'sync_first'})) { print_err("\"sync_first\" must be enabled for \"sync\" to work", 1); syslog_err("\"sync_first\" must be enabled for \"sync\" to work"); exit(1); } # make sure that the backup_script destination paths don't nuke data copied over for backup points { my @backup_dest = (); my @backup_script_dest = (); # remember where the destination paths are... foreach my $bp_ref (@backup_points) { # skip for backup_exec since it uses no destination next if (defined($$bp_ref{'cmd'})); my $tmp_dest_path = $$bp_ref{'dest'}; # normalize multiple slashes, and strip trailing slash # FIXME: Decide whether to allow an empty destination path, and reject or handle such paths accordingly. $tmp_dest_path =~ s/\/+/\//g; $tmp_dest_path =~ s/\/$//; # backup if (defined($$bp_ref{'src'})) { push(@backup_dest, $tmp_dest_path); # backup_script } elsif (defined($$bp_ref{'script'})) { push(@backup_script_dest, $tmp_dest_path); } # something else is wrong else { print_err("logic error in parse_config_file(): a backup point has no src and no script", 1); syslog_err("logic error in parse_config_file(): a backup point has no src and no script"); exit(1); } } # loop through and check for conflicts between backup and backup_script destination paths foreach my $b_dest (@backup_dest) { foreach my $bs_dest (@backup_script_dest) { if (defined($b_dest) && defined($bs_dest)) { my $tmp_b = $b_dest; my $tmp_bs = $bs_dest; # add trailing slashes back in so similarly named directories don't match # e.g., localhost/abc/ and localhost/ab/ $tmp_b .= '/'; $tmp_bs .= '/'; if ("$tmp_b" =~ m/^$tmp_bs/) { # duplicate entries, stop here print_err( "destination conflict between \"$tmp_b\" and \"$tmp_bs\" in backup / backup_script entries", 1); syslog_err( "destination conflict between \"$tmp_b\" and \"$tmp_bs\" in backup / backup_script entries"); exit(1); } } else { print_err("logic error in parse_config_file(): unique destination check failed unexpectedly", 1); syslog_err("logic error in parse_config_file(): unique destination check failed unexpectedly"); exit(1); } } } # loop through and check for conflicts between different backup_scripts for (my $i = 0; $i < scalar(@backup_script_dest); $i++) { for (my $j = 0; $j < scalar(@backup_script_dest); $j++) { if ($i != $j) { my $path1 = $backup_script_dest[$i]; my $path2 = $backup_script_dest[$j]; # add trailing slashes back in so similarly named directories don't match # e.g., localhost/abc/ and localhost/ab/ $path1 .= '/'; $path2 .= '/'; if (("$path1" =~ m/^$path2/) or ("$path2" =~ m/^$path1/)) { print_err( "destination conflict between \"$path1\" and \"$path2\" in multiple backup_script entries", 1); syslog_err( "destination conflict between \"$path1\" and \"$path2\" in multiple backup_script entries"); exit(1); } } } } } } # accepts a string of options # returns an array_ref of parsed options # returns undef if there is an invalid option # # this is for individual backup points only sub parse_backup_opts { my $opts_str = shift(@_); my @pairs; my %parsed_opts; # pre-buffer extra rsync arguments my $rsync_include_args = undef; my $rsync_include_file_args = undef; # make sure we got something (it's quite likely that we didn't) if (!defined($opts_str)) { return (undef); } if (!$opts_str) { return (undef); } # split on commas first @pairs = split(/,/, $opts_str); # then loop through and split on equals foreach my $pair (@pairs) { my $additive; if ($pair =~ /^\+/) { $additive = 1; $pair =~ s/^.//; } else { $additive = 0; } my ($name, $value) = split(/=/, $pair, 2); if (!defined($name) or !defined($value)) { return (undef); } # parameters can't have spaces in them $name =~ s/\s+//go; # strip whitespace from both ends $value =~ s/^\s{0,}//o; $value =~ s/\s{0,}$//o; # ok, it's a name/value pair and it's ready for more validation if ($additive) { $parsed_opts{'extra_' . $name} = $value; } else { $parsed_opts{$name} = $value; } # VALIDATE ARGS # one_fs if ($name eq 'one_fs') { if (!is_boolean($parsed_opts{'one_fs'})) { return (undef); } # rsync_short_args } elsif ($name eq 'rsync_short_args') { # must be in the format '-abcde' if (0 == is_valid_rsync_short_args($value)) { print_err("rsync_short_args \"$value\" not in correct format", 2); return (undef); } # rsync_long_args } elsif ($name eq 'rsync_long_args') { # pass unchecked # ssh_args } elsif ($name eq 'ssh_args') { # pass unchecked # lvm args } elsif ($name =~ m/^linux_lvm_(vgpath|snapshotname|snapshotsize|mountpath)$/) { # pass unchecked # include } elsif ($name eq 'include') { # don't validate contents # coerce into rsync_include_args # then remove the "include" key/value pair if (!defined($rsync_include_args)) { $rsync_include_args = "--include=$parsed_opts{'include'}"; } else { $rsync_include_args .= " --include=$parsed_opts{'include'}"; } delete($parsed_opts{'include'}); # exclude } elsif ($name eq 'exclude') { # don't validate contents # coerce into rsync_include_args # then remove the "include" key/value pair if (!defined($rsync_include_args)) { $rsync_include_args = "--exclude=$parsed_opts{'exclude'}"; } else { $rsync_include_args .= " --exclude=$parsed_opts{'exclude'}"; } delete($parsed_opts{'exclude'}); # include_file } elsif ($name eq 'include_file') { # verify that this file exists and is readable if (0 == is_real_local_abs_path($value)) { print_err("include_file $value must be a valid absolute path", 2); return (undef); } elsif (1 == is_directory_traversal($value)) { print_err("Directory traversal attempted in $value", 2); return (undef); } elsif ((-e "$value") && (!-f "$value")) { print_err("include_file $value exists, but is not a file", 2); return (undef); } elsif (!-r "$value") { print_err("include_file $value exists, but is not readable", 2); return (undef); } # coerce into rsync_include_file_args # then remove the "include_file" key/value pair if (!defined($rsync_include_file_args)) { $rsync_include_file_args = "--include-from=$parsed_opts{'include_file'}"; } else { $rsync_include_file_args .= " --include-from=$parsed_opts{'include_file'}"; } delete($parsed_opts{'include_file'}); # exclude_file } elsif ($name eq 'exclude_file') { # verify that this file exists and is readable if (0 == is_real_local_abs_path($value)) { print_err("exclude_file $value must be a valid absolute path", 2); return (undef); } elsif (1 == is_directory_traversal($value)) { print_err("Directory traversal attempted in $value", 2); return (undef); } elsif ((-e "$value") && (!-f "$value")) { print_err("exclude_file $value exists, but is not a file", 2); return (undef); } elsif (!-r "$value") { print_err("exclude_file $value exists, but is not readable", 2); return (undef); } # coerce into rsync_include_file_args # then remove the "exclude_file" key/value pair if (!defined($rsync_include_file_args)) { $rsync_include_file_args = "--exclude-from=$parsed_opts{'exclude_file'}"; } else { $rsync_include_file_args .= " --exclude-from=$parsed_opts{'exclude_file'}"; } delete($parsed_opts{'exclude_file'}); # Not (yet?) implemented as per-backup-point options } elsif ($name eq 'cmd_preexec' || $name eq 'cmd_postexec' || $name eq 'cmd_ssh' || $name eq 'cmd_rsync' || $name eq 'verbose' || $name eq 'loglevel') { print_err("$name is not implemented as a per-backup-point option in this version of rsnapshot", 2); return (undef); } # if we don't know about it, it doesn't exist else { return (undef); } } # merge rsync_include_args and rsync_file_include_args in with either $default_rsync_long_args # or $parsed_opts{'rsync_long_args'} if (defined($rsync_include_args) or defined($rsync_include_file_args)) { # if we never defined rsync_long_args, populate it with the global default if (!defined($parsed_opts{'rsync_long_args'})) { if (defined($config_vars{'rsync_long_args'})) { $parsed_opts{'rsync_long_args'} = $config_vars{'rsync_long_args'}; } else { $parsed_opts{'rsync_long_args'} = $default_rsync_long_args; } } # now we have something in our local rsync_long_args # let's concatenate the include/exclude/file stuff to it if (defined($rsync_include_args)) { $parsed_opts{'rsync_long_args'} .= " $rsync_include_args"; } if (defined($rsync_include_file_args)) { $parsed_opts{'rsync_long_args'} .= " $rsync_include_file_args"; } } # if we got anything, return it as an array_ref if (%parsed_opts) { return (\%parsed_opts); } return (undef); } # accepts line number, errstr # prints a config file error # also sets global $config_perfect var off sub config_err { my $line_num = shift(@_); my $errstr = shift(@_); if (!defined($line_num)) { $line_num = -1; } if (!defined($errstr)) { $errstr = 'config_err() called without an error string!'; } # show the user the file and line number print_err("$config_file on line $line_num:", 1); # print out the offending line # don't print past 69 columns (because they all start with 'ERROR: ') # similarly, indent subsequent lines 9 spaces to get past the 'ERROR: ' message print_err(wrap_cmd($errstr, 69, 9), 1); # invalidate entire config file $config_perfect = 0; } # accepts an error string # prints to STDERR and maybe syslog. removes the lockfile if it exists. # exits the program safely and consistently sub bail { my $str = shift(@_); # print out error if ($str) { print_err($str, 1); } # write to syslog if we're running for real (and we have a message) if ((0 == $do_configtest) && (0 == $test) && defined($str) && ('' ne $str)) { syslog_err($str); } # umount LVM Snapshot if it is mounted if (1 == $traps{"linux_lvm_mountpoint"}) { $traps{"linux_lvm_mountpoint"} = 0; linux_lvm_unmount(); } # destroy snapshot created by rsnapshot if (0 ne $traps{"linux_lvm_snapshot"}) { my $tmp = $traps{"linux_lvm_snapshot"}; $traps{"linux_lvm_snapshot"} = 0; linux_lvm_snapshot_del(linux_lvm_parseurl($tmp)); } # get rid of the lockfile, if it exists if (0 == $stop_on_stale_lockfile) { remove_lockfile(); } # exit showing an error exit(1); } # accepts a string (or an array) # prints the string, but separates it across multiple lines with backslashes if necessary # also logs the command, but on a single line sub print_cmd { # take all arguments and make them into one string my $str = join(' ', @_); if (!defined($str)) { return (undef); } # remove newline and consolidate spaces chomp($str); $str =~ s/\s+/ /g; # write to log (level 3 is where we start showing commands) log_msg($str, 3); if (!defined($verbose) or ($verbose >= 3)) { print wrap_cmd($str), "\n"; } } # accepts a string # wraps the text to fit in 80 columns with backslashes at the end of each wrapping line # returns the wrapped string sub wrap_cmd { my $str = shift(@_); my $colmax = shift(@_); my $indent = shift(@_); my @tokens; my $chars = 0; # character tally my $outstr = ''; # string to return # max chars before wrap (default to 80 column terminal) if (!defined($colmax)) { $colmax = 76; } # number of spaces to indent subsequent lines if (!defined($indent)) { $indent = 4; } # break up string into individual pieces @tokens = split(/\s+/, $str); # stop here if we don't have anything if (0 == scalar(@tokens)) { return (''); } # print the first token as a special exception, since we should never start out by line wrapping if (defined($tokens[0])) { $chars = (length($tokens[0]) + 1); $outstr .= $tokens[0]; # don't forget to put the space back in if (scalar(@tokens) > 1) { $outstr .= ' '; } } # loop through the rest of the tokens and print them out, wrapping when necessary for (my $i = 1; $i < scalar(@tokens); $i++) { # keep track of where we are (plus a space) $chars += (length($tokens[$i]) + 1); # wrap if we're at the edge if ($chars > $colmax) { $outstr .= "\\\n"; $outstr .= (' ' x $indent); # 4 spaces + string length $chars = $indent + length($tokens[$i]); } # print out this token $outstr .= $tokens[$i]; # print out a space unless this is the last one if ($i < scalar(@tokens)) { $outstr .= ' '; } } return ($outstr); } # accepts string, and level # prints string if level is as high as verbose # logs string if level is as high as loglevel sub print_msg { my $str = shift(@_); my $level = shift(@_); if (!defined($str)) { return (undef); } if (!defined($level)) { $level = 0; } chomp($str); # print to STDOUT if ((!defined($verbose)) or ($verbose >= $level)) { print $str, "\n"; } # write to log log_msg($str, $level); } # accepts string, and level # prints string if level is as high as verbose # logs string if level is as high as loglevel # also raises a warning for the exit code sub print_warn { my $str = shift(@_); my $level = shift(@_); if (!defined($str)) { return (undef); } if (!defined($level)) { $level = 0; } # we can no longer say the execution of the program has been error free raise_warning(); chomp($str); # print to STDERR if ((!defined($verbose)) or ($level <= $verbose)) { print STDERR 'WARNING: ', $str, "\n"; } # write to log log_warn($str, $level); } # accepts string, and level # prints string if level is as high as verbose # logs string if level is as high as loglevel # also raises an error for the exit code sub print_err { my $str = shift(@_); my $level = shift(@_); if (!defined($str)) { return (undef); } if (!defined($level)) { $level = 0; } # we can no longer say the execution of the program has been error free raise_error(); chomp($str); # print the run string once # this way we know where the message came from if it's in an e-mail # but we can still read messages at the console if (0 == $have_printed_run_string) { if ((!defined($verbose)) or ($level <= $verbose)) { print STDERR "----------------------------------------------------------------------------\n"; print STDERR "rsnapshot encountered an error! The program was invoked with these options:\n"; print STDERR wrap_cmd($run_string), "\n"; print STDERR "----------------------------------------------------------------------------\n"; } $have_printed_run_string = 1; } # print to STDERR if ((!defined($verbose)) or ($level <= $verbose)) { #print STDERR $run_string, ": ERROR: ", $str, "\n"; print STDERR "ERROR: ", $str, "\n"; } # write to log log_err($str, $level); } # accepts string, and level # logs string if level is as high as loglevel sub log_msg { my $str = shift(@_); my $level = shift(@_); my $result = undef; if (!defined($str)) { return (undef); } if (!defined($level)) { return (undef); } chomp($str); # if this is just noise, don't log it if (defined($loglevel) && ($level > $loglevel)) { return (undef); } # open logfile, write to it, close it back up # if we fail, don't use the usual print_* functions, since they just call this again if ((0 == $test) && (0 == $do_configtest)) { if (defined($config_vars{'logfile'})) { $result = open(LOG, ">> $config_vars{'logfile'}"); if (!defined($result)) { print STDERR "Could not open logfile $config_vars{'logfile'} for writing\n"; print STDERR "Do you have write permission for this file?\n"; exit(1); } print LOG '[', get_current_date(), '] ', $str, "\n"; $result = close(LOG); if (!defined($result)) { print STDERR "Could not close logfile $config_vars{'logfile'}\n"; } } } } # accepts string, and level # logs string if level is as high as loglevel # also raises a warning for the exit code sub log_warn { my $str = shift(@_); my $level = shift(@_); if (!defined($str)) { return (undef); } if (!defined($level)) { return (undef); } # this run is no longer perfect since we have an error raise_warning(); chomp($str); $str = 'WARNING: ' . $str; log_msg($str, $level); } # accepts string, and level # logs string if level is as high as loglevel # also raises an error for the exit code sub log_err { my $str = shift(@_); my $level = shift(@_); if (!defined($str)) { return (undef); } if (!defined($level)) { return (undef); } # this run is no longer perfect since we have an error raise_error(); chomp($str); $str = "$run_string: ERROR: " . $str; log_msg($str, $level); } # log messages to syslog # accepts message, facility, level # only message is required # return 1 on success, undef on failure sub syslog_msg { my $msg = shift(@_); my $facility = shift(@_); my $level = shift(@_); my $result = undef; if (!defined($msg)) { return (undef); } if (!defined($facility)) { $facility = 'user'; } if (!defined($level)) { $level = 'info'; } if (defined($config_vars{'cmd_logger'})) { # print out our call to syslog if (defined($verbose) && ($verbose >= 4)) { print_cmd("$config_vars{'cmd_logger'} -p $facility.$level -t rsnapshot[$$] $msg"); } # log to syslog if (0 == $test) { $result = system($config_vars{'cmd_logger'}, '-p', "$facility.$level", '-t', "rsnapshot[$$]", $msg); if (0 != $result) { print_warn("Could not log to syslog:", 2); print_warn("$config_vars{'cmd_logger'} -p $facility.$level -t rsnapshot[$$] $msg", 2); } } } return (1); } # log warnings to syslog # accepts warning message # returns 1 on success, undef on failure # also raises a warning for the exit code sub syslog_warn { my $msg = shift(@_); # this run is no longer perfect since we have an error raise_warning(); return syslog_msg("WARNING: $msg", 'user', 'err'); } # log errors to syslog # accepts error message # returns 1 on success, undef on failure # also raises an error for the exit code sub syslog_err { my $msg = shift(@_); # this run is no longer perfect since we have an error raise_error(); return syslog_msg("$run_string: ERROR: $msg", 'user', 'err'); } # sets exit code for at least a warning sub raise_warning { if ($exit_code != 1) { $exit_code = 2; } } # sets exit code for error sub raise_error { $exit_code = 1; } # accepts no arguments # returns the current date (for the logfile) # # there's probably a wonderful module that can do this all for me, # but unless it comes standard with perl 5.004 and later, i'd rather do it this way :) # sub get_current_date { # localtime() gives us an array with these elements: # 0 = seconds # 1 = minutes # 2 = hours # 3 = day of month # 4 = month + 1 # 5 = year + 1900 # example date format (ISO 8601) # 2012-04-24T22:30:13 (used to be 28/Feb/2004:23:45:59, like Apache) my @fields = localtime(time()); return sprintf( "%04i-%02i-%02iT%02i:%02i:%02i", $fields[5] + 1900, $fields[4] + 1, $fields[3], $fields[2], $fields[1], $fields[0] ); } # accepts no arguments # returns nothing # simply prints out a startup message to the logs and STDOUT sub log_startup { log_msg("$run_string: started", 2); } # accepts no arguments # returns undef if lockfile isn't defined in the config file, and 1 upon success # also, it can make the program exit with 1 as the return value if it can't create the lockfile # # we don't use bail() to exit on error, because that would remove the # lockfile that may exist from another invocation # # if a lockfile exists, we try to read it (and stop if we can't) to get a PID, # then see if that PID exists. If it does, we stop, otherwise we assume it's # a stale lock and remove it first. sub add_lockfile { # if we don't have a lockfile defined, just return undef if (!defined($config_vars{'lockfile'})) { return (undef); } my $lockfile = $config_vars{'lockfile'}; # valid? if (0 == is_valid_local_abs_path($lockfile)) { print_err("Lockfile $lockfile is not a valid file name", 1); syslog_err("Lockfile $lockfile is not a valid file name"); exit(1); } # does a lockfile already exist? if (1 == is_real_local_abs_path($lockfile)) { if (!open(LOCKFILE, $lockfile)) { print_err("Lockfile $lockfile exists and can't be read, can not continue!", 1); syslog_err("Lockfile $lockfile exists and can't be read, can not continue"); exit(1); } my $pid = || ""; chomp($pid); close(LOCKFILE); if ($pid =~ m/^[0-9]+$/ && kill(0, $pid)) { print_err("Lockfile $lockfile exists and so does its process, can not continue"); syslog_err("Lockfile $lockfile exists and so does its process, can not continue"); exit(1); } else { if (1 == $stop_on_stale_lockfile) { print_err("Stale lockfile $lockfile detected. You need to remove it manually to continue", 1); syslog_err("Stale lockfile $lockfile detected. Exiting."); exit(1); } else { print_warn("Removing stale lockfile $lockfile", 1); syslog_warn("Removing stale lockfile $lockfile"); remove_lockfile(); } } } # create the lockfile print_cmd("echo $$ > $lockfile"); if (0 == $test) { # sysopen() can do exclusive opens, whereas perl open() can not my $result = sysopen(LOCKFILE, $lockfile, O_WRONLY | O_EXCL | O_CREAT, 0644); if (!defined($result) || 0 == $result) { print_err("Could not write lockfile $lockfile: $!", 1); syslog_err("Could not write lockfile $lockfile"); exit(1); } # print PID to lockfile print LOCKFILE $$; $result = close(LOCKFILE); if (!defined($result) || 0 == $result) { print_warn("Could not close lockfile $lockfile: $!", 2); } } return (1); } # accepts no arguments # # returns undef if lockfile isn't defined in the config file # return 1 upon success or if there's no lockfile to remove # warn if the PID in the lockfile is not the same as the PID of this process # exit with a value of 1 if it can't read the lockfile # exit with a value of 1 if it can't remove the lockfile # # we don't use bail() to exit on error, because that would call # this subroutine twice in the event of a failure sub remove_lockfile { # if we don't have a lockfile defined, return undef if (!defined($config_vars{'lockfile'})) { return (undef); } my $lockfile = $config_vars{'lockfile'}; my $result = undef; if (-e "$lockfile") { if (open(LOCKFILE, $lockfile)) { my $locked_pid = || ""; chomp($locked_pid); close(LOCKFILE); if ($locked_pid && $locked_pid != $$) { print_warn( "About to remove lockfile $lockfile which belongs to a different process: $locked_pid (this is OK if it's a stale lock)" ); } } else { print_err("Could not read lockfile $lockfile: $!", 0); syslog_err("Error! Could not read lockfile $lockfile: $!"); exit(1); } print_cmd("rm -f $lockfile"); if (0 == $test) { $result = unlink($lockfile); if (0 == $result) { print_err("Could not remove lockfile $lockfile", 1); syslog_err("Error! Could not remove lockfile $lockfile"); exit(1); } } } else { print_msg("No need to remove non-existent lock $lockfile", 5); } return (1); } # accepts no arguments # returns nothing # sets the locale to POSIX (C) to mitigate some problems with the rmtree() command # sub set_posix_locale { # set POSIX locale # this may fix some potential problems with rmtree() # another solution is to enable "cmd_rm" in rsnapshot.conf print_msg("Setting locale to POSIX \"C\"", 4); setlocale(POSIX::LC_ALL, 'C'); } # accepts no arguments # returns nothing # creates the snapshot_root directory (chmod 0700), if it doesn't exist and no_create_root == 0 sub create_snapshot_root { # attempt to create the directory if it doesn't exist if (!-d "$config_vars{'snapshot_root'}") { # make sure no_create_root == 0 if (defined($config_vars{'no_create_root'})) { if (1 == $config_vars{'no_create_root'}) { print_err("rsnapshot refuses to create snapshot_root when no_create_root is enabled", 1); syslog_err("rsnapshot refuses to create snapshot_root when no_create_root is enabled"); bail(); } } # actually create the directory print_cmd("mkdir -m 0700 -p $config_vars{'snapshot_root'}/"); if (0 == $test) { eval { # don't pass a trailing slash to mkpath mkpath("$config_vars{'snapshot_root'}", 0, 0700); }; if ($@) { bail( "Unable to create $config_vars{'snapshot_root'}/,\nPlease make sure you have the right permissions." ); } } } } # accepts current interval # returns a hash_ref containing information about the intervals # exits the program if we don't have good data to work with sub get_interval_data { my $cur_interval = shift(@_); # make sure we were passed an interval if (!defined($cur_interval)) { bail("cur_interval not specified in get_interval_data()\n"); } # the hash to return my %hash; # which of the intervals are we operating on? # if we defined alpha, beta, gamma ... alpha = 0, beta = 1, gamma = 2 my $interval_num; # the highest possible number for the current interval context # if we are working on alpha, and alpha is set to 6, this would be # equal to 5 (since we start at 0) my $interval_max; # this is the name of the previous interval, in relation to the one we're # working on. e.g., if we're operating on gamma, this should be "beta" my $prev_interval; # same as $interval_max, except for the previous interval. # this is used to determine which of the previous snapshots to pull from # e.g., cp -al alpha.$prev_interval_max/ beta.0/ my $prev_interval_max; # FIGURE OUT WHICH INTERVAL WE'RE RUNNING, AND HOW IT RELATES TO THE OTHERS # THEN RUN THE ACTION FOR THE CHOSEN INTERVAL # remember, in each hashref in this loop: # "interval" is something like "beta", "gamma", etc. # "number" is the number of these intervals to keep on the filesystem my $i = 0; foreach my $i_ref (@intervals) { # this is the interval we're set to run if ($$i_ref{'interval'} eq $cur_interval) { $interval_num = $i; # how many of these intervals should we keep? # we start counting from 0, so subtract one # e.g., 6 intervals == interval.0 .. interval.5 $interval_max = $$i_ref{'number'} - 1; # we found our interval, exit the foreach loop last; } # since the "last" command above breaks from this entire block, # and since we loop through the intervals in order, if we got this # far in the first place it means that we're looking at an interval # which isn't selected to run, and that there will be more intervals in the loop. # therefore, this WILL be the previous interval's information, the next time through. # $prev_interval = $$i_ref{'interval'}; # which of the previous interval's numbered directories should we pull from # for the interval we're currently set to run? # e.g., beta.0/ might get pulled from alpha.6/ # $prev_interval_max = $$i_ref{'number'} - 1; $i++; } # make sure we got something that makes sense if ($cur_interval ne 'sync') { if (!defined($interval_num)) { bail("Interval \"$cur_interval\" unknown, check $config_file"); } } # populate our hash $hash{'interval'} = $cur_interval; $hash{'interval_num'} = $interval_num; $hash{'interval_max'} = $interval_max; $hash{'prev_interval'} = $prev_interval; $hash{'prev_interval_max'} = $prev_interval_max; # and return the values return (\%hash); } # accepts no arguments # prints the most recent snapshot directory and exits # this is for use with the get-latest-snapshot command line argument sub show_latest_snapshot { # this should only be called after parse_config_file(), but just in case... if (!@intervals) { bail("Error! intervals not defined in show_latest_snapshot()"); } if (!%config_vars) { bail("Error! config_vars not defined in show_latest_snapshot()"); } # regardless of .sync, this is the latest "real" snapshot print $config_vars{'snapshot_root'} . '/' . $intervals[0]->{'interval'} . '.0/' . "\n"; exit(0); } # accepts no args # prints out status to the logs, then exits the program with the current exit code sub exit_with_status { if (0 == $exit_code) { syslog_msg("$run_string: completed successfully"); log_msg("$run_string: completed successfully", 2); exit($exit_code); } elsif (1 == $exit_code) { syslog_err("$run_string: completed, but with some errors"); log_err("$run_string: completed, but with some errors", 2); exit($exit_code); } elsif (2 == $exit_code) { syslog_warn("$run_string: completed, but with some warnings"); log_warn("$run_string: completed, but with some warnings", 2); exit($exit_code); } # this should never happen else { syslog_err("$run_string: completed, but with no definite status"); log_err("$run_string: completed, but with no definite status", 2); exit(1); } } # accepts no arguments # returns nothing # # exits the program with the status of the config file (e.g., Syntax OK). # the exit code is 0 for success, 1 for failure (although failure should never happen) sub exit_configtest { # if we're just doing a configtest, exit here with the results if (1 == $do_configtest) { if (1 == $config_perfect) { print "Syntax OK\n"; exit(0); } # this should never happen, because any errors should have killed the program before now else { print "Syntax Error\n"; exit(1); } } } # accepts no arguments # prints out error messages since we can't find the config file # exits with a return code of 1 sub exit_no_config_file { if (-d $config_file) { print STDERR "Can't read the config file: \"$config_file\" is a directory.\n"; if (0 == $do_configtest) { syslog_err("Can't read the config file: \"$config_file\" is a directory.\n"); } } else { # warn that the config file could not be found print STDERR "Config file \"$config_file\" does not exist or is not readable.\n"; if (0 == $do_configtest) { syslog_err("Config file \"$config_file\" does not exist or is not readable."); } } # if we have the default config from the install, remind the user to create the real config if ((-e "$config_file.default") && (!-e "$config_file")) { print STDERR "Did you copy $config_file.default to $config_file yet?\n"; } # exit showing an error exit(1); } # accepts a loglevel # returns 1 if it's valid, 0 otherwise sub is_valid_loglevel { my $value = shift(@_); if (!defined($value)) { return (0); } if ($value =~ m/^\d$/) { if (($value >= 1) && ($value <= 5)) { return (1); } } return (0); } # accepts a positive number formatted as string # returns 1 if it's valid, 0 otherwise sub is_valid_rsync_numtries { my $value = shift(@_); if (!defined($value)) { return (0); } if ($value =~ m/^\d+$/) { if (($value >= 0)) { return (1); } } } # accepts one argument # checks to see if that argument is set to 1 or 0 # returns 1 on success, 0 on failure sub is_boolean { my $var = shift(@_); if (!defined($var)) { return (0); } if ($var !~ m/^\d+$/) { return (0); } if (1 == $var) { return (1); } if (0 == $var) { return (1); } return (0); } # accepts string # returns 1 if it is a comment line (beginning with #) # returns 0 otherwise sub is_comment { my $str = shift(@_); if (!defined($str)) { return (undef); } if ($str =~ m/^#/) { return (1); } return (0); } # accepts string # returns 1 if it is blank, or just pure white space # returns 0 otherwise sub is_blank { my $str = shift(@_); if (!defined($str)) { return (undef); } if ($str !~ m/\S/) { return (1); } return (0); } # accepts path # returns 1 if it's a valid ssh path # returns 0 otherwise sub is_ssh_path { my $path = shift(@_); if (!defined($path)) { return (undef); } # make sure we don't have leading/trailing spaces if ($path =~ m/^\s/) { return (undef); } if ($path =~ m/\s$/) { return (undef); } # don't match paths that look like URIs (rsync://, etc.) if ($path =~ m,://,) { return (undef); } # must have [user@]host:[~.]/path syntax for ssh if ($path =~ m/^(.*?\@)?.*?:[~.]?\/.*$/) { return (1); } return (0); } # accepts path # returns 1 if it's a valid cwrsync server path (user@host::sharename) # return 0 otherwise sub is_cwrsync_path { my $path = shift(@_); if (!defined($path)) { return (undef); } if ($path =~ m/^[^\/]+::/) { return (1); } return (0); } # accepts path # returns 1 if it's a syntactically valid anonymous rsync path # returns 0 otherwise sub is_anon_rsync_path { my $path = shift(@_); if (!defined($path)) { return (undef); } if ($path =~ m/^rsync:\/\/.*$/) { return (1); } return (0); } # accepts path # returns 1 if it's a syntactically valid LVM path # returns 0 otherwise sub is_linux_lvm_path { my $path = shift(@_); if (!defined($path)) { return (undef); } if ($path =~ m|^lvm://.*$|) { return (1); } return (0); } # accepts proposed list for rsync_short_args # makes sure that rsync_short_args is in the format '-abcde' # (not '-a -b' or '-ab c', etc) # returns 1 if it's OK, or 0 otherwise sub is_valid_rsync_short_args { my $rsync_short_args = shift(@_); if (!defined($rsync_short_args)) { return (0); } # no blank space allowed if ($rsync_short_args =~ m/\s/) { return (0); } # first character must be a dash, followed by alphanumeric characters if ($rsync_short_args !~ m/^\-{1,1}\w+$/) { return (0); } return (1); } # accepts path # returns 1 if it's a real absolute path that currently exists # returns 0 otherwise sub is_real_local_abs_path { my $path = shift(@_); if (!defined($path)) { return (undef); } if (1 == is_valid_local_abs_path($path)) { # check for symlinks first, since they might not link to a real file if ((-l "$path") or (-e "$path")) { return (1); } } return (0); } # accepts path # returns 1 if it's a syntactically valid absolute path # returns 0 otherwise sub is_valid_local_abs_path { my $path = shift(@_); if (!defined($path)) { return (undef); } if ($path =~ m/^\//) { if (0 == is_directory_traversal($path)) { return (1); } } return (0); } # accepts path # returns 1 if it's a syntactically valid non-absolute (relative) path # returns 0 otherwise # does not check for directory traversal, since we want to use # a different error message if there is ".." in the path sub is_valid_local_non_abs_path { my $path = shift(@_); if (!defined($path)) { return (0); } if ($path =~ m/^\//) { return (0); # Absolute path => bad } if ($path =~ m/^\S/) { return (1); # Starts with a non-whitespace => good } else { return (0); # Empty or starts with whitespace => bad } } # accepts path # returns 1 if it's a directory traversal attempt # returns 0 if it's safe sub is_directory_traversal { my $path = shift(@_); if (!defined($path)) { return (undef); } # /.. if ($path =~ m/\/\.\./) { return (1); } # ../ if ($path =~ m/\.\.\//) { return (1); } return (0); } # accepts path # returns 1 if it's a file (doesn't have a trailing slash) # returns 0 otherwise sub is_file { my $path = shift(@_); if (!defined($path)) { return (undef); } if ($path !~ m/\/$/o) { return (1); } return (0); } # accepts path # returns 1 if it's a directory (has a trailing slash) # returns 0 otherwise sub is_directory { my $path = shift(@_); if (!defined($path)) { return (undef); } if ($path =~ m/\/$/o) { return (1); } return (0); } # accepts a string with a script file and optional arguments # returns 1 if it the script file exists, is executable and has absolute path. # returns 0 otherwise sub is_valid_script { my $full_script = shift(@_); # script to run (including args) my $script_ref = shift(@_); # reference to script file name my $script; # script file (no args) my @script_argv; # all script arguments # get the base name of the script, not counting any arguments to it @script_argv = split(/\s+/, $full_script); $script = $script_argv[0]; $$script_ref = $script; # Output $script in case caller wants it # make sure script exists and is executable if (-f "$script" && -x "$script" && is_real_local_abs_path($script)) { return 1; } return 0; } # accepts string # removes trailing slash, returns the string sub remove_trailing_slash { my $str = shift(@_); # it's not a trailing slash if it's the root filesystem if ($str eq '/') { return ($str); } # it's not a trailing slash if it's a remote root filesystem if ($str =~ m%:/$%) { return ($str); } $str =~ s/\/+$//; return ($str); } # accepts string # returns /. if passed /, returns input otherwise # this is to work around a bug in some versions of rsync sub add_slashdot_if_root { my $str = shift(@_); if ($str eq '/') { return '/.'; } return ($str); } # accepts the interval (cmd) to run against # returns nothing # calls the appropriate subroutine, depending on whether this is the lowest interval or a higher one # also calls preexec/postexec scripts if we're working on the lowest interval # sub handle_interval { my $cmd = shift(@_); if (!defined($cmd)) { bail('cmd not defined in handle_interval()'); } my $id_ref = get_interval_data($cmd); my $result = 0; # here we used to check for interval.delete directories. This was # removed when we switched to using _delete.$$ directories. This # was done so that you can run another (eg) rsnapshot alpha, while # the .delete directory from the previous alpha backup was still # going. Potentially you may have several parallel deletes going on # with the new scheme, but I'm pretty sure that you'll catch up # eventually and not hopelessly wedge the machine -- DRC # handle toggling between sync_first being enabled and disabled # link_dest is enabled if (1 == $link_dest) { # sync_first is enabled if ($config_vars{'sync_first'}) { # create the sync root if it doesn't exist (and we need it right now) if ($cmd eq 'sync') { # don't create the .sync directory, it gets created later on } } # sync_first is disabled else { # if the sync directory is still here after sync_first is disabled, delete it if (-d "$config_vars{'snapshot_root'}/.sync") { display_rm_rf("$config_vars{'snapshot_root'}/.sync/"); if (0 == $test) { $result = rm_rf("$config_vars{'snapshot_root'}/.sync/"); if (0 == $result) { bail("Error! rm_rf(\"$config_vars{'snapshot_root'}/.sync/\")"); } } } } } # link_dest is disabled else { # sync_first is enabled if ($config_vars{'sync_first'}) { # create the sync root if it doesn't exist if (!-d "$config_vars{'snapshot_root'}/.sync") { # If .sync does not exist but lowest.0 does, then copy that. # call generic cp_al() subroutine my $interval_0 = "$config_vars{'snapshot_root'}/" . $intervals[0]->{'interval'} . ".0"; my $sync_dir = "$config_vars{'snapshot_root'}/.sync"; if (-d $interval_0) { display_cp_al("$interval_0", "$sync_dir"); if (0 == $test) { $result = cp_al("$interval_0", "$sync_dir"); if (!$result) { bail("Error! cp_al(\"$interval_0\", \"$sync_dir\")"); } } } } } # sync_first is disabled else { # if the sync directory still exists, delete it if (-d "$config_vars{'snapshot_root'}/.sync") { display_rm_rf("$config_vars{'snapshot_root'}/.sync/"); if (0 == $test) { $result = rm_rf("$config_vars{'snapshot_root'}/.sync/"); if (0 == $result) { bail("Error! rm_rf(\"$config_vars{'snapshot_root'}/.sync/\")"); } } } } } # # now that the preliminaries are out of the way, the main backups happen here # # backup the lowest interval (or sync content to staging area) # we're not sure yet going in whether we'll be doing an actual backup, or just rotating snapshots for the lowest interval if ((defined($$id_ref{'interval_num'}) && (0 == $$id_ref{'interval_num'})) or ($cmd eq 'sync')) { # if we're doing a sync, run the pre/post exec scripts, and do the backup if ($cmd eq 'sync') { exec_cmd_preexec(); backup_lowest_interval($id_ref); exec_cmd_postexec(); } # if we're working on the lowest interval, either run the backup and rotate the snapshots, or just rotate them # (depending on whether sync_first is enabled else { if ($config_vars{'sync_first'}) { rotate_lowest_snapshots($$id_ref{'interval'}); } else { exec_cmd_preexec(); rotate_lowest_snapshots($$id_ref{'interval'}); backup_lowest_interval($id_ref); exec_cmd_postexec(); } } } # just rotate the higher intervals else { # this is not the most frequent unit, just rotate rotate_higher_interval($id_ref); } # if use_lazy_delete is on, delete the _delete.$$ directory if ($use_lazy_deletes) { # Besides the _delete.$$ directory, the lockfile has to be removed as well. # The reason is that the last task to do in this subroutine is to delete the _delete.$$ directory, and it can take quite a while. # we remove the lockfile here since this delete shouldn't block other rsnapshot jobs from running remove_lockfile(); # Check for the directory. It might not exist, e.g. in case of the 'sync' command. if (-d "$config_vars{'snapshot_root'}/_delete.$$") { # start the delete display_rm_rf("$config_vars{'snapshot_root'}/_delete.$$"); if (0 == $test) { my $result = rm_rf("$config_vars{'snapshot_root'}/_delete.$$"); if (0 == $result) { bail("Error! rm_rf(\"$config_vars{'snapshot_root'}/_delete.$$\")\n"); } } } else { # only spit this out if lazy deletes are turned on. # Still need to suppress this if they're turned on but we've # not done enough backups to yet need to delete anything print_msg("No directory to delete: $config_vars{'snapshot_root'}/_delete.$$", 5); } } } # accepts an interval_data_ref # acts on the interval defined as $$id_ref{'interval'} (e.g., alpha) # this should be the smallest interval (e.g., alpha, not beta) # # rotates older dirs within this interval, hard links .0 to .1, # and rsync data over to .0 # # does not return a value, it bails instantly if there's a problem sub backup_lowest_interval { my $id_ref = shift(@_); # this should never happen if (!defined($id_ref)) { bail('backup_lowest_interval() expects an argument'); } if (!defined($$id_ref{'interval'})) { bail('backup_lowest_interval() expects an interval'); } # this also should never happen if ($$id_ref{'interval'} ne 'sync') { if (!defined($$id_ref{'interval_num'}) or (0 != $$id_ref{'interval_num'})) { bail('backup_lowest_interval() can only operate on the lowest interval'); } } my $sync_dest_matches = 0; my $sync_dest_dir = undef; # if we're trying to sync only certain directories, remember the path to match if ($ARGV[1]) { $sync_dest_dir = $ARGV[1]; } # sync live filesystem data and backup script output to $interval.0 # loop through each backup point, backup exec, and backup script foreach my $bp_ref (@backup_points) { # rsync the given backup point into the snapshot root if (defined($$bp_ref{'dest'}) && (defined($$bp_ref{'src'}) or defined($$bp_ref{'script'}))) { # if we're doing a sync and we specified an parameter on the command line (for the destination path), # only sync directories matching the destination path if (($$id_ref{'interval'} eq 'sync') && (defined($sync_dest_dir))) { my $avail_path = remove_trailing_slash($$bp_ref{'dest'}); my $req_path = remove_trailing_slash($sync_dest_dir); # if we have a match, sync this entry if ($avail_path eq $req_path) { # rsync if ($$bp_ref{'src'}) { rsync_backup_point($$id_ref{'interval'}, $bp_ref); # backup_script } elsif ($$bp_ref{'script'}) { exec_backup_script($$id_ref{'interval'}, $bp_ref); } # ok, we got at least one dest match $sync_dest_matches++; } } # this is a normal operation, either a sync or a lowest interval sync/rotate else { # rsync if ($$bp_ref{'src'}) { rsync_backup_point($$id_ref{'interval'}, $bp_ref); # backup_script } elsif ($$bp_ref{'script'}) { exec_backup_script($$id_ref{'interval'}, $bp_ref); } } # run a simple command } elsif (defined($$bp_ref{'cmd'})) { my $rc = exec_cmd($$bp_ref{'cmd'}); if ($rc != 0) { if ($$bp_ref{'importance'} eq 'required') { bail("\"$$bp_ref{'cmd'}\" returned \"$rc\". Exiting."); } else { print_warn("\"$$bp_ref{'cmd'}\" returned \"$rc\"", 2); } } } # this should never happen else { bail('invalid backup point data in backup_lowest_interval()'); } } if ($$id_ref{'interval'} eq 'sync') { if (defined($sync_dest_dir) && (0 == $sync_dest_matches)) { bail("No matches found for \"$sync_dest_dir\""); } } # rollback failed backups rollback_failed_backups($$id_ref{'interval'}); # update mtime on $interval.0/ to show when the snapshot completed touch_interval_dir($$id_ref{'interval'}); } # accepts $interval # returns nothing # # operates on directories in the given interval (it should be the lowest one) # deletes the highest numbered directory in the interval, and rotates the ones below it # if link_dest is enabled, .0 gets moved to .1 # otherwise, we do cp -al .0 .1 # # if we encounter an error, this script will terminate the program with an error condition # sub rotate_lowest_snapshots { my $interval = shift(@_); if (!defined($interval)) { bail('interval not defined in rotate_lowest_snapshots()'); } my $id_ref = get_interval_data($interval); my $interval_num = $$id_ref{'interval_num'}; my $interval_max = $$id_ref{'interval_max'}; my $prev_interval = $$id_ref{'prev_interval'}; my $prev_interval_max = $$id_ref{'prev_interval_max'}; my $result; # remove oldest directory if ((-d "$config_vars{'snapshot_root'}/$interval.$interval_max") && ($interval_max > 0)) { # if use_lazy_deletes is set move the oldest directory to _delete.$$ if (1 == $use_lazy_deletes) { print_cmd( "mv", "$config_vars{'snapshot_root'}/$interval.$interval_max/", "$config_vars{'snapshot_root'}/_delete.$$/" ); if (0 == $test) { my $result = safe_rename("$config_vars{'snapshot_root'}/$interval.$interval_max", "$config_vars{'snapshot_root'}/_delete.$$"); if (0 == $result) { my $errstr = ''; $errstr .= "Error! safe_rename(\"$config_vars{'snapshot_root'}/$interval.$interval_max/\", \""; $errstr .= "$config_vars{'snapshot_root'}/_delete.$$/\")"; bail($errstr); } } } # otherwise the default is to delete the oldest directory for this interval else { display_rm_rf("$config_vars{'snapshot_root'}/$interval.$interval_max/"); if (0 == $test) { my $result = rm_rf("$config_vars{'snapshot_root'}/$interval.$interval_max/"); if (0 == $result) { bail("Error! rm_rf(\"$config_vars{'snapshot_root'}/$interval.$interval_max/\")\n"); } } } } # rotate the middle ones if ($interval_max > 0) { # Have we rotated a directory for this interval? my $dir_rotated = 0; for (my $i = ($interval_max - 1); $i > 0; $i--) { if (-d "$config_vars{'snapshot_root'}/$interval.$i") { print_cmd( "mv", "$config_vars{'snapshot_root'}/$interval.$i/ ", "$config_vars{'snapshot_root'}/$interval." . ($i + 1) . "/" ); if (0 == $test) { my $result = safe_rename( "$config_vars{'snapshot_root'}/$interval.$i", ("$config_vars{'snapshot_root'}/$interval." . ($i + 1)) ); if (0 == $result) { my $errstr = ''; $errstr .= "Error! safe_rename(\"$config_vars{'snapshot_root'}/$interval.$i/\", \""; $errstr .= "$config_vars{'snapshot_root'}/$interval." . ($i + 1) . '/' . "\")"; bail($errstr); } } $dir_rotated = 1; } elsif ($dir_rotated) { # We have rotated a directory for this interval, but $i # does not exist - that probably means a hole. print_msg("Note: $config_vars{'snapshot_root'}/$interval.$i missing, cannot rotate it", 4); } } } # .0 and .1 require more attention, especially now with link_dest and sync_first # sync_first enabled if ($config_vars{'sync_first'}) { # we move .0 to .1 no matter what (assuming it exists) if (-d "$config_vars{'snapshot_root'}/$interval.0/") { print_cmd( "mv", "$config_vars{'snapshot_root'}/$interval.0/", "$config_vars{'snapshot_root'}/$interval.1/" ); if (0 == $test) { my $result = safe_rename("$config_vars{'snapshot_root'}/$interval.0", "$config_vars{'snapshot_root'}/$interval.1"); if (0 == $result) { my $errstr = ''; $errstr .= "Error! safe_rename(\"$config_vars{'snapshot_root'}/$interval.0/\", \""; $errstr .= "$config_vars{'snapshot_root'}/$interval.1/\")"; bail($errstr); } } } # if we're using rsync --link-dest, we need to mv sync to .0 now if (1 == $link_dest) { # mv sync .0 if (-d "$config_vars{'snapshot_root'}/.sync") { print_cmd( "mv", "$config_vars{'snapshot_root'}/.sync/", "$config_vars{'snapshot_root'}/$interval.0/" ); if (0 == $test) { my $result = safe_rename("$config_vars{'snapshot_root'}/.sync", "$config_vars{'snapshot_root'}/$interval.0"); if (0 == $result) { my $errstr = ''; $errstr .= "Error! safe_rename(\"$config_vars{'snapshot_root'}/.sync/\", \""; $errstr .= "$config_vars{'snapshot_root'}/$interval.0/\")"; bail($errstr); } } } } # otherwise, we hard link (except for directories, symlinks, and special files) sync to .0 else { # cp -al .sync .0 if (-d "$config_vars{'snapshot_root'}/.sync/") { display_cp_al("$config_vars{'snapshot_root'}/.sync/", "$config_vars{'snapshot_root'}/$interval.0/"); if (0 == $test) { $result = cp_al("$config_vars{'snapshot_root'}/.sync", "$config_vars{'snapshot_root'}/$interval.0"); if (!$result) { bail( "Error! cp_al(\"$config_vars{'snapshot_root'}/.sync\", \"$config_vars{'snapshot_root'}/$interval.0\")" ); } } } } # sync_first disabled (make sure we have a .0 directory and someplace to put it) } elsif ((-d "$config_vars{'snapshot_root'}/$interval.0") && ($interval_max > 0)) { # if we're using rsync --link-dest, we need to mv .0 to .1 now if (1 == $link_dest) { # move .0 to .1 if (-d "$config_vars{'snapshot_root'}/$interval.0/") { print_cmd( "mv $config_vars{'snapshot_root'}/$interval.0/ $config_vars{'snapshot_root'}/$interval.1/"); if (0 == $test) { my $result = safe_rename("$config_vars{'snapshot_root'}/$interval.0", "$config_vars{'snapshot_root'}/$interval.1"); if (0 == $result) { my $errstr = ''; $errstr .= "Error! safe_rename(\"$config_vars{'snapshot_root'}/$interval.0/\", "; $errstr .= "\"$config_vars{'snapshot_root'}/$interval.1/\")"; bail($errstr); } } } } # otherwise, we hard link (except for directories, symlinks, and special files) .0 over to .1 else { # call generic cp_al() subroutine if (-d "$config_vars{'snapshot_root'}/$interval.0/") { display_cp_al("$config_vars{'snapshot_root'}/$interval.0", "$config_vars{'snapshot_root'}/$interval.1"); if (0 == $test) { $result = cp_al("$config_vars{'snapshot_root'}/$interval.0/", "$config_vars{'snapshot_root'}/$interval.1/"); if (!$result) { my $errstr = ''; $errstr .= "Error! cp_al(\"$config_vars{'snapshot_root'}/$interval.0/\", "; $errstr .= "\"$config_vars{'snapshot_root'}/$interval.1/\")"; bail($errstr); } } } } } } # accepts interval, backup_point_ref, ssh_rsync_args_ref # returns no args # runs rsync on the given backup point # this is only run on the lowest points, not for rotations sub rsync_backup_point { my $interval = shift(@_); my $bp_ref = shift(@_); # validate subroutine args if (!defined($interval)) { bail('interval not defined in rsync_backup_point()'); } if (!defined($bp_ref)) { bail('bp_ref not defined in rsync_backup_point()'); } if (!defined($$bp_ref{'src'})) { bail('src not defined in rsync_backup_point()'); } if (!defined($$bp_ref{'dest'})) { bail('dest not defined in rsync_backup_point()'); } # set up default args for rsync and ssh my $ssh_args = $default_ssh_args; my $rsync_short_args = $default_rsync_short_args; my $rsync_long_args = $default_rsync_long_args; # other misc variables my @cmd_stack = undef; my $src = $$bp_ref{'src'}; my $result = undef; my $linux_lvm_oldpwd = undef; my $lvm_src = undef; # if we're using link-dest later, that target depends on whether we're doing a 'sync' or a regular interval # if we're doing a "sync", then look at [lowest-interval].0 instead of [cur-interval].1 my $interval_link_dest; my $interval_num_link_dest; # start looking for link_dest targets at interval.$start_num my $start_num = 1; # if we're doing a sync, we'll start looking at [lowest-interval].0 for a link_dest target if ($interval eq 'sync') { $start_num = 0; } # look for the most recent link_dest target directory # loop through all snapshots until we find the first match foreach my $i_ref (@intervals) { if (defined($$i_ref{'number'})) { for (my $i = $start_num; $i < $$i_ref{'number'}; $i++) { my $i_check; if ($test && $interval ne 'sync') { # A real run would already have rotated the snapshots up, but this test run hasn't. # Hence, to know whether $i would exist at this point of a real run, we must check for $i - 1. $i_check = $i - 1; } else { $i_check = $i; } # once we find a valid link_dest target, the search is over if (-e "$config_vars{'snapshot_root'}/$$i_ref{'interval'}.$i_check/$$bp_ref{'dest'}") { if (!defined($interval_link_dest) && !defined($interval_num_link_dest)) { $interval_link_dest = $$i_ref{'interval'}; $interval_num_link_dest = $i; } # we'll still loop through the outer loop a few more times, but the defined() check above # will make sure the first match wins last; } } } } # check to see if this destination path has already failed # if it's set to be rolled back, skip out now foreach my $rollback_point (@rollback_points) { if (defined($rollback_point)) { my $tmp_dest = $$bp_ref{'dest'}; my $tmp_rollback_point = $rollback_point; # don't compare the slashes at the end $tmp_dest = remove_trailing_slash($tmp_dest); $tmp_rollback_point = remove_trailing_slash($tmp_rollback_point); if ("$tmp_dest" eq "$tmp_rollback_point") { print_warn("$src skipped due to rollback plan", 2); syslog_warn("$src skipped due to rollback plan"); return (undef); } } } # if the config file specified rsync or ssh args, use those instead of the hard-coded defaults in the program if (defined($config_vars{'rsync_short_args'})) { $rsync_short_args = $config_vars{'rsync_short_args'}; } if (defined($config_vars{'rsync_long_args'})) { $rsync_long_args = $config_vars{'rsync_long_args'}; } if (defined($config_vars{'ssh_args'})) { $ssh_args = $config_vars{'ssh_args'}; } # extra verbose? if ($verbose > 3) { $rsync_short_args .= 'v'; } # split up rsync long args into an array, paying attention to # quoting - ideally we'd use Text::Balanced or similar, but that's # only relatively recently gone into core my @rsync_long_args_stack = split_long_args_with_quotes('rsync_long_args', $rsync_long_args); # create $interval.0/$$bp_ref{'dest'} or .sync/$$bp_ref{'dest'} directory if it doesn't exist # (this may create the .sync dir, which is why we had to check for it above) # create_backup_point_dir($interval, $bp_ref); # check opts, first unique to this backup point, and then global # # with all these checks, we try the local option first, and if # that isn't specified, we attempt to use the global setting as # a fallback plan # # we do the rsync args first since they overwrite the rsync_* variables, # whereas the subsequent options append to them # # RSYNC SHORT ARGS if (defined($$bp_ref{'opts'}) && defined($$bp_ref{'opts'}->{'rsync_short_args'})) { $rsync_short_args = $$bp_ref{'opts'}->{'rsync_short_args'}; } if (defined($$bp_ref{'opts'}) && defined($$bp_ref{'opts'}->{'extra_rsync_short_args'})) { $rsync_short_args .= ' ' if ($rsync_short_args); $rsync_short_args .= $$bp_ref{'opts'}->{'extra_rsync_short_args'}; } # RSYNC LONG ARGS if (defined($$bp_ref{'opts'}) && defined($$bp_ref{'opts'}->{'rsync_long_args'})) { @rsync_long_args_stack = split_long_args_with_quotes('rsync_long_args (for a backup point)', $$bp_ref{'opts'}->{'rsync_long_args'}); } if (defined($$bp_ref{'opts'}) && defined($$bp_ref{'opts'}->{'extra_rsync_long_args'})) { push( @rsync_long_args_stack, split_long_args_with_quotes( 'extra_rsync_long_args (for a backup point)', $$bp_ref{'opts'}->{'extra_rsync_long_args'} ) ); } # SSH ARGS if (defined($$bp_ref{'opts'}) && defined($$bp_ref{'opts'}->{'ssh_args'})) { $ssh_args = $$bp_ref{'opts'}->{'ssh_args'}; } if (defined($$bp_ref{'opts'}) && defined($$bp_ref{'opts'}->{'extra_ssh_args'})) { $ssh_args .= ' ' . $$bp_ref{'opts'}->{'extra_ssh_args'}; } # ONE_FS if (defined($$bp_ref{'opts'}) && defined($$bp_ref{'opts'}->{'one_fs'})) { if (1 == $$bp_ref{'opts'}->{'one_fs'}) { $rsync_short_args .= 'x'; } } elsif ($one_fs) { $rsync_short_args .= 'x'; } # SEE WHAT KIND OF SOURCE WE'RE DEALING WITH # # local filesystem if (is_real_local_abs_path($src)) { # no change # if this is a user@host:/path (or ...:./path, or ...:~/...), use ssh } elsif (is_ssh_path($src)) { # if we have any args for SSH, add them if (defined($ssh_args)) { push(@rsync_long_args_stack, "--rsh=$config_vars{'cmd_ssh'} $ssh_args"); } # no arguments is the default else { push(@rsync_long_args_stack, "--rsh=$config_vars{'cmd_ssh'}"); } # anonymous rsync } elsif (is_anon_rsync_path($src)) { # make rsync quiet if we're running in quiet mode if ($verbose < 2) { $rsync_short_args .= 'q'; } # cwrsync path } elsif (is_cwrsync_path($src)) { # make rsync quiet if we're running in quiet mode if ($verbose < 2) { $rsync_short_args .= 'q'; } # LVM path } elsif (is_linux_lvm_path($src)) { # take LVM snapshot and mount, reformat src into local path unless (defined($config_vars{'linux_lvm_snapshotsize'})) { bail("Missing required argument for LVM source: linux_lvm_snapshotsize"); } unless (defined($config_vars{'linux_lvm_snapshotname'})) { bail("Missing required argument for LVM source: linux_lvm_snapshotname"); } unless (defined($config_vars{'linux_lvm_vgpath'})) { bail("Missing required argument for LVM source: linux_lvm_vgpath"); } unless (defined($config_vars{'linux_lvm_mountpath'})) { bail("Missing required argument for LVM source: linux_lvm_mountpath"); } $lvm_src = $src; linux_lvm_snapshot_create(linux_lvm_parseurl($lvm_src)); $traps{"linux_lvm_snapshot"} = $lvm_src; linux_lvm_mount(linux_lvm_parseurl($lvm_src)); $traps{"linux_lvm_mountpoint"} = 1; # rewrite src to point to mount path # - to avoid including the mountpath in the snapshot, change the working directory and use a relative source $linux_lvm_oldpwd = cwd(); print_cmd("chdir($config_vars{'linux_lvm_mountpath'})"); if (0 == $test) { $result = chdir($config_vars{'linux_lvm_mountpath'}); if (0 == $result) { bail("Could not change directory to \"$config_vars{'linux_lvm_mountpath'}\""); } } $src = './' . (linux_lvm_parseurl($lvm_src))[2]; } # this should have already been validated once, but better safe than sorry else { bail("Could not understand source \"$src\" in backup_lowest_interval()"); } # if we're using --link-dest, we'll need to specify the link-dest directory target # this varies depending on whether we're operating on the lowest interval or doing a 'sync' if (1 == $link_dest) { # bp_ref{'dest'} and snapshot_root have already been validated, but these might be blank if (defined($interval_link_dest) && defined($interval_num_link_dest)) { # push link_dest arguments onto cmd stack push(@rsync_long_args_stack, "--link-dest=$config_vars{'snapshot_root'}/$interval_link_dest.$interval_num_link_dest/$$bp_ref{'dest'}" ); } } # SPECIAL EXCEPTION: # If we're using --link-dest AND the source is a file AND we have a copy from the last time, # manually link interval.1/foo to interval.0/foo # # This is necessary because --link-dest only works on directories # if ( (1 == $link_dest) && (is_file($src)) && defined($interval_link_dest) && defined($interval_num_link_dest) && (-f "$config_vars{'snapshot_root'}/$interval_link_dest.$interval_num_link_dest/$$bp_ref{'dest'}") ) { # these are both "destination" paths, but we're moving from .1 to .0 my $srcpath; my $destpath; $srcpath = "$config_vars{'snapshot_root'}/$interval_link_dest.$interval_num_link_dest/$$bp_ref{'dest'}"; if ($interval eq 'sync') { $destpath = "$config_vars{'snapshot_root'}/.sync/$$bp_ref{'dest'}"; } else { $destpath = "$config_vars{'snapshot_root'}/$interval.0/$$bp_ref{'dest'}"; } print_cmd("ln $srcpath $destpath"); if (0 == $test) { $result = link("$srcpath", "$destpath"); if (!defined($result) or (0 == $result)) { print_err("link(\"$srcpath\", \"$destpath\") failed", 2); syslog_err("link(\"$srcpath\", \"$destpath\") failed"); } } } # put a trailing slash on the source if we know it's a directory and it doesn't have one if ((-d "$src") && ($$bp_ref{'src'} !~ /\/$/)) { $src .= '/'; } # BEGIN RSYNC COMMAND ASSEMBLY # take care not to introduce blank elements into the array, # since it can confuse rsync, which in turn causes strange errors # @cmd_stack = (); # # rsync command push(@cmd_stack, $config_vars{'cmd_rsync'}); # # rsync short args if (defined($rsync_short_args) && ($rsync_short_args ne '')) { push(@cmd_stack, $rsync_short_args); } # # rsync long args if (@rsync_long_args_stack && (scalar(@rsync_long_args_stack) > 0)) { foreach my $tmp_long_arg (@rsync_long_args_stack) { if (defined($tmp_long_arg) && ($tmp_long_arg ne '')) { push(@cmd_stack, $tmp_long_arg); } } } # # src push(@cmd_stack, "$src"); # # dest if ($interval eq 'sync') { push(@cmd_stack, "$config_vars{'snapshot_root'}/.sync/$$bp_ref{'dest'}"); } else { push(@cmd_stack, "$config_vars{'snapshot_root'}/$interval.0/$$bp_ref{'dest'}"); } # # END RSYNC COMMAND ASSEMBLY # RUN THE RSYNC COMMAND FOR THIS BACKUP POINT BASED ON THE @cmd_stack VARS print_cmd(@cmd_stack); my $tryCount = 0; $result = 1; if (0 == $test) { while ($tryCount < $rsync_numtries && $result != 0) { # open rsync and capture STDOUT and STDERR # the 3rd argument is undefined, that STDERR gets mashed into STDOUT and we # don't have to care about getting both STREAMS together without mixing up time my ($rsync_in, $rsync_out); my $pid = open3($rsync_in, $rsync_out, undef, @cmd_stack) or die "Couldn't fork rsync: $!\n"; # add autoflush to get output by time and not at the end when rsync is finished $rsync_out->autoflush(); while (<$rsync_out>) { print_msg($_, 4); } waitpid($pid, 0); $result = get_retval($?); $tryCount += 1; } # now we see if rsync ran successfully, and what to do about it if ($result != 0) { # print warnings, and set this backup point to rollback if we're using --link-dest handle_rsync_error($result, $bp_ref); } else { print_msg("rsync succeeded", 5); } } if (1 == $traps{"linux_lvm_mountpoint"} || 0 ne $traps{"linux_lvm_snapshot"}) { print_cmd("chdir($linux_lvm_oldpwd)"); if (0 == $test) { $result = chdir($linux_lvm_oldpwd); if (0 == $result) { bail("Could not change directory to \"$linux_lvm_oldpwd\""); } } } # delte the traps manually # umount LVM Snapshot if it is mounted if (1 == $traps{"linux_lvm_mountpoint"}) { undef $traps{"linux_lvm_mountpoint"}; linux_lvm_unmount(); } # destroy snapshot created by rsnapshot if (0 ne $traps{"linux_lvm_snapshot"}) { undef $traps{"linux_lvm_snapshot"}; linux_lvm_snapshot_del(linux_lvm_parseurl($lvm_src)); } } # # split a LVM backup source into vgname volname and path # # 1. parameter: full LVM source # # returns: vgname, volname, path as array sub linux_lvm_parseurl() { my $src = shift @_; # parse LVM src ('lvm://vgname/volname/path') my ($linux_lvmvgname, $linux_lvmvolname, $linux_lvmpath) = ($src =~ m|^lvm://([^/]+)/([^/]+)/(.*)$|); # lvmvolname and/or path could be the string "0", so test for 'defined': unless (defined($linux_lvmvgname) and defined($linux_lvmvolname) and defined($linux_lvmpath)) { bail("Could not understand LVM source \"$src\" in linux_lvm_parseurl()"); } return ($linux_lvmvgname, $linux_lvmvolname, $linux_lvmpath); } # # assemble and execute LVM snapshot command # # parameters: the return of linux_lvm_parseurl() # # returns: - sub linux_lvm_snapshot_create { my $result = undef; my ($linux_lvmvgname, $linux_lvmvolname, $linux_lvmpath) = @_; unless (defined($linux_lvmvgname) and defined($linux_lvmvolname) and defined($linux_lvmpath)) { bail("linux_lvm_snapshot_create needs 3 parameters!"); } my @cmd_stack = (); push(@cmd_stack, split(' ', $config_vars{'linux_lvm_cmd_lvcreate'})); push(@cmd_stack, '--snapshot'); push(@cmd_stack, '--size'); push(@cmd_stack, $config_vars{'linux_lvm_snapshotsize'}); push(@cmd_stack, '--name'); push(@cmd_stack, $config_vars{'linux_lvm_snapshotname'}); push(@cmd_stack, join('/', $config_vars{'linux_lvm_vgpath'}, $linux_lvmvgname, $linux_lvmvolname)); print_cmd(@cmd_stack); if (0 == $test) { # silence gratuitous lvcreate output #$result = system(@cmd_stack); $result = system(join " ", @cmd_stack, ">/dev/null"); if ($result != 0) { bail("Create LVM snapshot failed: $result"); } } } # # delete LVM-snapshot # # parameters: the return of linux_lvm_parseurl() # # returns: - sub linux_lvm_snapshot_del { my $result = undef; my ($linux_lvmvgname, $linux_lvmvolname, $linux_lvmpath) = @_; unless (defined($linux_lvmvgname) and defined($linux_lvmvolname) and defined($linux_lvmpath)) { bail("linux_lvm_snapshot_del needs 3 parameters!"); } my @cmd_stack = (); push(@cmd_stack, $config_vars{'linux_lvm_cmd_lvremove'}); push(@cmd_stack, '--force'); push( @cmd_stack, join('/', $config_vars{'linux_lvm_vgpath'}, $linux_lvmvgname, $config_vars{'linux_lvm_snapshotname'}) ); print_cmd(@cmd_stack); if (0 == $test) { # silence gratuitous lvremove output #$result = system(@cmd_stack); $result = system(join " ", @cmd_stack, ">/dev/null"); if ($result != 0) { bail("Removal of LVM snapshot failed: $result"); } } } # # mount a LVM-snapshot # # parameters: the return of linux_lvm_parseurl() # # returns: - sub linux_lvm_mount { my $result = undef; my ($linux_lvmvgname, $linux_lvmvolname, $linux_lvmpath) = @_; unless (defined($linux_lvmvgname) and defined($linux_lvmvolname) and defined($linux_lvmpath)) { bail("linux_lvm_mount needs 3 parameters!"); } # mount the snapshot my @cmd_stack = (); push(@cmd_stack, split(' ', $config_vars{'linux_lvm_cmd_mount'})); push( @cmd_stack, join('/', $config_vars{'linux_lvm_vgpath'}, $linux_lvmvgname, $config_vars{'linux_lvm_snapshotname'}) ); push(@cmd_stack, $config_vars{'linux_lvm_mountpath'}); print_cmd(@cmd_stack); if (0 == $test) { $result = system(@cmd_stack); if ($result != 0) { bail("Mount LVM snapshot failed: $result"); } } } # # unmount a LVM-snapshot # # parameters: - # # returns: - sub linux_lvm_unmount { my $result = undef; my @cmd_stack = (); push(@cmd_stack, split(' ', $config_vars{'linux_lvm_cmd_umount'})); push(@cmd_stack, $config_vars{'linux_lvm_mountpath'}); print_cmd(@cmd_stack); if (0 == $test) { $result = system(@cmd_stack); if ($result != 0) { bail("Unmount LVM snapshot failed: $result"); } } } # accepts the name of the argument to split, and its value # the name is used for spitting out error messages # # returns a list sub split_long_args_with_quotes { my ($argname, $argvalue) = @_; my $inquotes = ''; my @stack = (''); for (my $i = 0; $i < length($argvalue); $i++) { my $thischar = substr($argvalue, $i, 1); # got whitespace and not in quotes? end this argument, start next if ($thischar =~ /\s/ && !$inquotes) { $#stack++; next; # not in quotes and got a quote? remember that we're in quotes # NB the unnecessary \ are to appease emacs } elsif ($thischar =~ /[\'\"]/ && !$inquotes) { $inquotes = $thischar; # in quotes and got a different quote? no nesting allowed # more emacs appeasement } elsif ($thischar =~ /[\'\"]/ && $inquotes ne $thischar) { print_err("Nested quotes not allowed in $argname", 1); syslog_err("Nested quotes not allowed in $argname"); exit(1); # in quotes and got a close quote } elsif ($thischar eq $inquotes) { $inquotes = ''; } else { $stack[-1] .= $thischar; } } if ($inquotes) { print_err("Unbalanced quotes in $argname", 1); syslog_err("Unbalanced quotes in $argname"); exit(1); } return @stack; } # accepts rsync exit code, backup_point_ref # prints out an appropriate error message (and logs it) # also adds destination path to the rollback queue if link_dest is enabled sub handle_rsync_error { my $retval = shift(@_); my $bp_ref = shift(@_); # shouldn't ever happen if (!defined($retval)) { bail('retval undefined in handle_rsync_error()'); } if (0 == $retval) { bail('retval == 0 in handle_rsync_error()'); } if (!defined($bp_ref)) { bail('bp_ref undefined in handle_rsync_error()'); } # a partial list of rsync exit values (from the rsync 2.6.0 man page) # # 0 Success # 1 Syntax or usage error # 23 Partial transfer due to error # 24 Partial transfer due to vanished source files # # if we got error 1 and we were attempting --link-dest, there's # a very good chance that this version of rsync is too old. # if ((1 == $link_dest) && (1 == $retval)) { print_err( "$config_vars{'cmd_rsync'} syntax or usage error. Does this version of rsync support --link-dest?", 2 ); syslog_err( "$config_vars{'cmd_rsync'} syntax or usage error. Does this version of rsync support --link-dest?"); # 23 and 24 are treated as warnings because users might be using the filesystem during the backup # if you want perfect backups, don't allow the source to be modified while the backups are running :) } elsif (23 == $retval) { print_warn( "Some files and/or directories in $$bp_ref{'src'} only transferred partially during rsync operation", 4 ); syslog_warn( "Some files and/or directories in $$bp_ref{'src'} only transferred partially during rsync operation" ); } elsif (24 == $retval) { print_warn("Some files and/or directories in $$bp_ref{'src'} vanished during rsync operation", 4); syslog_warn("Some files and/or directories in $$bp_ref{'src'} vanished during rsync operation"); } # other error else { print_err("$config_vars{'cmd_rsync'} returned $retval while processing $$bp_ref{'src'}", 2); syslog_err("$config_vars{'cmd_rsync'} returned $retval while processing $$bp_ref{'src'}"); # set this directory to rollback if we're using link_dest # (since $interval.0/ will have been moved to $interval.1/ by now) if (1 == $link_dest) { push(@rollback_points, $$bp_ref{'dest'}); } } } # accepts interval, backup_point_ref, ssh_rsync_args_ref # returns no args # runs rsync on the given backup point sub exec_backup_script { my $interval = shift(@_); my $bp_ref = shift(@_); # validate subroutine args if (!defined($interval)) { bail('interval not defined in exec_backup_script()'); } if (!defined($bp_ref)) { bail('bp_ref not defined in exec_backup_script()'); } # other misc variables my $script = undef; my $tmpdir = undef; my $result = undef; # remember what directory we started in my $cwd = cwd(); # create $interval.0/$$bp_ref{'dest'} directory if it doesn't exist # create_backup_point_dir($interval, $bp_ref); # work in a temp dir, and make this the source for the rsync operation later # not having a trailing slash is a subtle distinction. it allows us to use # the same path if it's NOT a directory when we try to delete it. $tmpdir = "$config_vars{'snapshot_root'}/tmp"; # remove the tmp directory if it's still there for some reason # (this shouldn't happen unless the program was killed prematurely, etc) if (-e "$tmpdir") { display_rm_rf("$tmpdir/"); if (0 == $test) { $result = rm_rf("$tmpdir/"); if (0 == $result) { bail("Could not rm_rf(\"$tmpdir/\");"); } } } # create the tmp directory print_cmd("mkdir -m 0755 -p $tmpdir/"); if (0 == $test) { eval { # don't ever pass a trailing slash to mkpath mkpath("$tmpdir", 0, 0755); }; if ($@) { bail("Unable to create \"$tmpdir/\",\nPlease make sure you have the right permissions."); } } # no more calls to mkpath here. the tmp dir needs a trailing slash $tmpdir .= '/'; # change to the tmp directory print_cmd("cd $tmpdir"); if (0 == $test) { $result = chdir("$tmpdir"); if (0 == $result) { bail("Could not change directory to \"$tmpdir\""); } } # run the backup script # # the assumption here is that the backup script is written in such a way # that it creates files in its current working directory. # # the backup script should return 0 on success, anything else is # considered a failure. # print_cmd($$bp_ref{'script'}); if (0 == $test) { $result = system($$bp_ref{'script'}); if ($result != 0) { # bitmask return value my $retval = get_retval($result); print_err("backup_script $$bp_ref{'script'} returned $retval", 2); syslog_err("backup_script $$bp_ref{'script'} returned $retval"); # if the backup script failed, roll back to the last good data push(@rollback_points, $$bp_ref{'dest'}); } } # change back to the previous directory # (/ is a special case) if ('/' eq $cwd) { print_cmd("cd $cwd"); } else { print_cmd("cd $cwd/"); } if (0 == $test) { chdir($cwd); } # if we're using link_dest, pull back the previous files (as links) that were moved up if any. # this is because in this situation, .0 will always be empty, so we'll pull select things # from .1 back to .0 if possible. these will be used as a baseline for diff comparisons by # sync_if_different() down below. if (1 == $link_dest) { my $lastdir; my $curdir; if ($interval eq 'sync') { $lastdir = "$config_vars{'snapshot_root'}/" . $intervals[0]->{'interval'} . ".0/$$bp_ref{'dest'}"; $curdir = "$config_vars{'snapshot_root'}/.sync/$$bp_ref{'dest'}"; } else { $lastdir = "$config_vars{'snapshot_root'}/$interval.1/$$bp_ref{'dest'}"; $curdir = "$config_vars{'snapshot_root'}/$interval.0/$$bp_ref{'dest'}"; } # make sure we have a slash at the end if ($lastdir !~ m/\/$/) { $lastdir .= '/'; } if ($curdir !~ m/\/$/) { $curdir .= '/'; } # if we even have files from last time if (-e "$lastdir") { # and we're not somehow clobbering an existing directory (shouldn't happen) if (!-e "$curdir") { # call generic cp_al() subroutine display_cp_al("$lastdir", "$curdir"); if (0 == $test) { $result = cp_al("$lastdir", "$curdir"); if (!$result) { print_err("Warning! cp_al(\"$lastdir\", \"$curdir/\")", 2); } } } } } # sync the output of the backup script into this snapshot interval # this is using a native function since rsync doesn't quite do what we want # # rsync doesn't work here because it sees that the timestamps are different, and # insists on changing things even if the files are bit for bit identical on content. # # check to see where we're syncing to my $target_dir; if ($interval eq 'sync') { $target_dir = "$config_vars{'snapshot_root'}/.sync/$$bp_ref{'dest'}"; } else { $target_dir = "$config_vars{'snapshot_root'}/$interval.0/$$bp_ref{'dest'}"; } print_cmd("sync_if_different(\"$tmpdir\", \"$target_dir\")"); if (0 == $test) { $result = sync_if_different("$tmpdir", "$target_dir"); if (!defined($result)) { print_err("Warning! sync_if_different(\"$tmpdir\", \"$$bp_ref{'dest'}\") returned undef", 2); } } # remove the tmp directory if (-e "$tmpdir") { display_rm_rf("$tmpdir"); if (0 == $test) { $result = rm_rf("$tmpdir"); if (0 == $result) { bail("Could not rm_rf(\"$tmpdir\");"); } } } } # accepts and runs an arbitrary command string # returns the exit value of the command sub exec_cmd { my $cmd = shift(@_); my $return = 0; my $retval = 0; if (!defined($cmd) or ('' eq $cmd)) { print_err("Warning! Command \"$cmd\" not found", 2); return (undef); } print_cmd($cmd); if (0 == $test) { my $pre_systemcall_cwd = cwd(); # run $cmd from $HOME, allows unmounting of the snapshot root by # cmd_postexec config option (se Debian Bug #660372) chdir(); $return = system($cmd); # return to the directory we were in before executing $cmd chdir($pre_systemcall_cwd); if (!defined($return)) { print_err("Warning! exec_cmd(\"$cmd\") returned undef", 2); } # bitmask to get the real return value $retval = get_retval($return); } return ($retval); } # accepts no arguments # returns the exit code of the defined preexec script, or undef if the command is not found sub exec_cmd_preexec { my $retval = 0; # exec_cmd will only run if we're not in test mode if (defined($config_vars{'cmd_preexec'})) { $retval = exec_cmd("$config_vars{'cmd_preexec'}"); } if (!defined($retval)) { print_err("$config_vars{'cmd_preexec'} not found", 2); } if (0 != $retval) { bail("cmd_preexec \"$config_vars{'cmd_preexec'}\" returned $retval"); } return ($retval); } # accepts no arguments # returns the exit code of the defined preexec script, or undef if the command is not found sub exec_cmd_postexec { my $retval = 0; # exec_cmd will only run if we're not in test mode if (defined($config_vars{'cmd_postexec'})) { $retval = exec_cmd("$config_vars{'cmd_postexec'}"); } if (!defined($retval)) { print_err("$config_vars{'cmd_postexec'} not found", 2); } if (0 != $retval) { bail("cmd_postexec \"$config_vars{'cmd_postexec'}\" returned $retval"); } return ($retval); } # accepts interval, backup_point_ref # returns nothing # exits the program if it encounters a fatal error sub create_backup_point_dir { my $interval = shift(@_); my $bp_ref = shift(@_); # validate subroutine args if (!defined($interval)) { bail('interval not defined in create_interval_0()'); } if (!defined($bp_ref)) { bail('bp_ref not defined in create_interval_0()'); } # create missing parent directories inside the $interval.x directory my @dirs = split(/\//, $$bp_ref{'dest'}); pop(@dirs); # don't mkdir for dest unless we have to my $destpath; if ($interval eq 'sync') { $destpath = "$config_vars{'snapshot_root'}/.sync/" . join('/', @dirs); } else { $destpath = "$config_vars{'snapshot_root'}/$interval.0/" . join('/', @dirs); } # make sure we DON'T have a trailing slash (for mkpath) if ($destpath =~ m/\/$/) { $destpath = remove_trailing_slash($destpath); } # create the directory if it doesn't exist if (!-e "$destpath") { print_cmd("mkdir -m 0755 -p $destpath/"); if (0 == $test) { eval { mkpath("$destpath", 0, 0755); }; if ($@) { bail("Could not mkpath(\"$destpath/\", 0, 0755);"); } } } } # accepts interval we're operating on # returns nothing important # rolls back failed backups, as defined in the @rollback_points array # this is necessary if we're using link_dest, since it moves the .0 to .1 directory, # instead of recursively copying links to the files. it also helps with failed # backup scripts. # sub rollback_failed_backups { my $interval = shift(@_); if (!defined($interval)) { bail('interval not defined in rollback_failed_backups()'); } my $result; my $rsync_short_args = $default_rsync_short_args; # handle 'sync' case my $interval_src; my $interval_dest; if ($interval eq 'sync') { $interval_src = $intervals[0]->{'interval'} . '.0'; $interval_dest = '.sync'; } else { $interval_src = "$interval.1"; $interval_dest = "$interval.0"; } # extra verbose? if ($verbose > 3) { $rsync_short_args .= 'v'; } # rollback failed backups (if we're using link_dest) foreach my $rollback_point (@rollback_points) { # make sure there's something to rollback from if (!-e "$config_vars{'snapshot_root'}/$interval_src/$rollback_point") { next; } print_warn("Rolling back \"$rollback_point\"", 2); syslog_warn("Rolling back \"$rollback_point\""); # using link_dest, this probably won't happen # just in case, we may have to delete the old backup point from interval.0 / .sync if (-e "$config_vars{'snapshot_root'}/$interval_dest/$rollback_point") { display_rm_rf("$config_vars{'snapshot_root'}/$interval_dest/$rollback_point"); if (0 == $test) { $result = rm_rf("$config_vars{'snapshot_root'}/$interval_dest/$rollback_point"); if (0 == $result) { bail("Error! rm_rf(\"$config_vars{'snapshot_root'}/$interval_dest/$rollback_point\")\n"); } } } # copy hard links back from .1 to .0 # this will re-populate the .0 directory without taking up (much) additional space # # if we're doing a 'sync', then instead of .1 and .0, it's lowest.0 and .sync display_cp_al( "$config_vars{'snapshot_root'}/$interval_src/$rollback_point", "$config_vars{'snapshot_root'}/$interval_dest/$rollback_point" ); if (0 == $test) { $result = cp_al( "$config_vars{'snapshot_root'}/$interval_src/$rollback_point", "$config_vars{'snapshot_root'}/$interval_dest/$rollback_point" ); if (!$result) { my $errstr = ''; $errstr .= "Error! cp_al(\"$config_vars{'snapshot_root'}/$interval_src/$rollback_point\", "; $errstr .= "\"$config_vars{'snapshot_root'}/$interval_dest/$rollback_point\")"; bail($errstr); } } } } # accepts interval # returns nothing # updates mtime on $interval.0 sub touch_interval_dir { my $interval = shift(@_); if (!defined($interval)) { bail('interval not defined in touch_interval()'); } my $interval_dir; if ($interval eq 'sync') { $interval_dir = '.sync'; } else { $interval_dir = $interval . '.0'; } # update mtime of $interval.0 to reflect the time this snapshot was taken print_cmd("touch $config_vars{'snapshot_root'}/$interval_dir/"); if (0 == $test && -e "$config_vars{'snapshot_root'}/$interval_dir/") { my $result = utime(time(), time(), "$config_vars{'snapshot_root'}/$interval_dir/"); if (0 == $result) { bail("Could not utime(time(), time(), \"$config_vars{'snapshot_root'}/$interval_dir/\");"); } } } # accepts an interval_data_ref # looks at $$id_ref{'interval'} as the interval to act on, # and the previous interval $$id_ref{'prev_interval'} to pull up the directory from (e.g., beta, alpha) # the interval being acted upon should not be the lowest one. # # rotates older dirs within this interval, and hard links # the previous interval's highest numbered dir to this interval's .0, # # does not return a value, it bails instantly if there's a problem sub rotate_higher_interval { my $id_ref = shift(@_); # this should never happen if (!defined($id_ref)) { bail('rotate_higher_interval() expects an interval_data_ref'); } # this also should never happen if (!defined($$id_ref{'interval_num'}) or (0 == $$id_ref{'interval_num'})) { bail('rotate_higher_interval() can only operate on the higher intervals'); } # set up variables for convenience since we refer to them extensively my $interval = $$id_ref{'interval'}; my $interval_num = $$id_ref{'interval_num'}; my $interval_max = $$id_ref{'interval_max'}; my $prev_interval = $$id_ref{'prev_interval'}; my $prev_interval_max = $$id_ref{'prev_interval_max'}; # ROTATE DIRECTORIES # # delete the oldest one (if we're keeping more than one) if (-d "$config_vars{'snapshot_root'}/$interval.$interval_max") { # if use_lazy_deletes is set move the oldest directory to _delete.$$ # otherwise preform the default behavior if (1 == $use_lazy_deletes) { print_cmd( "mv ", "$config_vars{'snapshot_root'}/$interval.$interval_max/ ", "$config_vars{'snapshot_root'}/_delete.$$/" ); if (0 == $test) { my $result = safe_rename( "$config_vars{'snapshot_root'}/$interval.$interval_max", ("$config_vars{'snapshot_root'}/_delete.$$") ); if (0 == $result) { my $errstr = ''; $errstr .= "Error! safe_rename(\"$config_vars{'snapshot_root'}/$interval.$interval_max/\", \""; $errstr .= "$config_vars{'snapshot_root'}/_delete.$$/\")"; bail($errstr); } } } else { display_rm_rf("$config_vars{'snapshot_root'}/$interval.$interval_max/"); if (0 == $test) { my $result = rm_rf("$config_vars{'snapshot_root'}/$interval.$interval_max/"); if (0 == $result) { bail("Could not rm_rf(\"$config_vars{'snapshot_root'}/$interval.$interval_max/\");"); } } } } else { print_msg( "$config_vars{'snapshot_root'}/$interval.$interval_max not present (yet), nothing to delete", 4); } # rotate the middle ones for (my $i = ($interval_max - 1); $i >= 0; $i--) { if (-d "$config_vars{'snapshot_root'}/$interval.$i") { print_cmd( "mv $config_vars{'snapshot_root'}/$interval.$i/ ", "$config_vars{'snapshot_root'}/$interval." . ($i + 1) . "/" ); if (0 == $test) { my $result = safe_rename( "$config_vars{'snapshot_root'}/$interval.$i", ("$config_vars{'snapshot_root'}/$interval." . ($i + 1)) ); if (0 == $result) { my $errstr = ''; $errstr .= "Error! safe_rename(\"$config_vars{'snapshot_root'}/$interval.$i/\", \""; $errstr .= "$config_vars{'snapshot_root'}/$interval." . ($i + 1) . '/' . "\")"; bail($errstr); } } } else { print_msg("$config_vars{'snapshot_root'}/$interval.$i not present (yet), nothing to rotate", 4); } } # prev.max and interval.0 require more attention if (-d "$config_vars{'snapshot_root'}/$prev_interval.$prev_interval_max") { my $result; # if the previous interval has at least 2 snapshots, # or if the previous interval isn't the smallest one, # move the last one up a level if (($prev_interval_max >= 1) or ($interval_num >= 2)) { # mv alpha.5 to beta.0 (or whatever intervals we're using) print_cmd("mv $config_vars{'snapshot_root'}/$prev_interval.$prev_interval_max/ ", "$config_vars{'snapshot_root'}/$interval.0/"); if (0 == $test) { $result = safe_rename("$config_vars{'snapshot_root'}/$prev_interval.$prev_interval_max", "$config_vars{'snapshot_root'}/$interval.0"); if (0 == $result) { my $errstr = ''; $errstr .= "Error! safe_rename(\"$config_vars{'snapshot_root'}/$prev_interval.$prev_interval_max/\", "; $errstr .= "\"$config_vars{'snapshot_root'}/$interval.0/\")"; bail($errstr); } } } else { print_err("$prev_interval must be above 1 to keep snapshots at the $interval level", 1); exit(1); } } else { print_msg( "$config_vars{'snapshot_root'}/$prev_interval.$prev_interval_max not present (yet), nothing to copy", 2 ); } } # accepts src, dest # prints out the cp -al command that would be run, based on config file data sub display_cp_al { my $src = shift(@_); my $dest = shift(@_); # remove trailing slashes (for newer versions of GNU cp) $src = remove_trailing_slash($src); $dest = remove_trailing_slash($dest); if (!defined($src)) { bail('src not defined in display_cp_al()'); } if (!defined($dest)) { bail('dest not defined in display_cp_al()'); } if (defined($config_vars{'cmd_cp'})) { print_cmd("$config_vars{'cmd_cp'} -al $src $dest"); } else { print_cmd("native_cp_al(\"$src\", \"$dest\")"); } } # stub subroutine # calls either gnu_cp_al() or native_cp_al() # returns the value directly from whichever subroutine it calls # also prints out what's happening to the screen, if appropriate sub cp_al { my $src = shift(@_); my $dest = shift(@_); my $result = 0; # use gnu cp if we have it if (defined($config_vars{'cmd_cp'})) { $result = gnu_cp_al("$src", "$dest"); } # fall back to the built-in native perl replacement, followed by an rsync clean-up step else { # native cp -al $result = native_cp_al("$src", "$dest"); if (1 != $result) { return ($result); } # rsync clean-up $result = rsync_cleanup_after_native_cp_al("$src", "$dest"); } return ($result); } # This is to test whether cp -al seems to work in a simple case # return 0 if cp -al succeeds # return 1 if cp -al fails # return -1 if something else failed - test inconclusive sub test_cp_al { my $s = "$config_vars{'snapshot_root'}/cp_al1"; my $d = "$config_vars{'snapshot_root'}/cp_al2"; my $result; -d $s || mkdir($s) || return (-1); open(TT1, ">>$s/tt1") || return (-1); close(TT1) || return (-1); $result = system($config_vars{'cmd_cp'}, '-al', "$s", "$d"); if ($result != 0) { return (1); } unlink("$d/tt1"); unlink("$s/tt1"); rmdir($d); rmdir($s); return (0); } # this is a wrapper to call the GNU version of "cp" # it might fail in mysterious ways if you have a different version of "cp" # sub gnu_cp_al { my $src = shift(@_); my $dest = shift(@_); my $result = 0; my $status; # make sure we were passed two arguments if (!defined($src)) { return (0); } if (!defined($dest)) { return (0); } # remove trailing slashes (for newer versions of GNU cp) $src = remove_trailing_slash($src); $dest = remove_trailing_slash($dest); if (!-d "$src") { print_err("gnu_cp_al() needs a valid directory as an argument", 2); return (0); } # make the system call to GNU cp $result = system($config_vars{'cmd_cp'}, '-al', "$src", "$dest"); if ($result != 0) { $status = $result >> 8; print_err("$config_vars{'cmd_cp'} -al $src $dest failed (result $result, exit status $status).", 2); if (test_cp_al() > 0) { print_err("Perhaps your cp does not support -al options?", 2); } return (0); } return (1); } # This is a purpose built, native perl replacement for GNU "cp -al". # However, it is not quite as good. it does not copy "special" files: # block, char, fifo, or sockets. # Never the less, it does do regular files, directories, and symlinks # which should be enough for 95% of the normal cases. # If you absolutely have to have snapshots of FIFOs, etc, just get GNU # cp on your system, and specify it in the config file. # # Please note that more recently, this subroutine is followed up by # an rsync clean-up step. This combination effectively removes most of # the limitations of this technique. # # In the great perl tradition, this returns 1 on success, 0 on failure. # sub native_cp_al { my $src = shift(@_); my $dest = shift(@_); my $dh = undef; my $result = 0; # make sure we were passed two arguments if (!defined($src)) { return (0); } if (!defined($dest)) { return (0); } # make sure we have a source directory if (!-d "$src") { print_err("native_cp_al() needs a valid source directory as an argument", 2); return (0); } # strip trailing slashes off the directories, # since we'll add them back on later $src = remove_trailing_slash($src); $dest = remove_trailing_slash($dest); # LSTAT SRC my $st = lstat("$src"); if (!defined($st)) { print_err("Warning! Could not lstat source dir (\"$src\") : $!", 2); return (0); } # MKDIR DEST (AND SET MODE) if (!-d "$dest") { # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "mkdir(\"$dest\", " . get_perms($st->mode) . ")"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $result = mkdir("$dest", $st->mode); if (!$result) { print_err("Warning! Could not mkdir(\"$dest\", $st->mode) : $!", 2); return (0); } } # CHOWN DEST (if root) if (0 == $<) { # make sure destination is not a symlink if (!-l "$dest") { # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "safe_chown(" . $st->uid . ", " . $st->gid . ", \"$dest\")"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $result = safe_chown($st->uid, $st->gid, "$dest"); if (!$result) { print_err("Warning! Could not safe_chown(" . $st->uid . ", " . $st->gid . ", \"$dest\");", 2); return (0); } } } # READ DIR CONTENTS $dh = new DirHandle("$src"); if (defined($dh)) { my @nodes = $dh->read(); # loop through all nodes in this dir foreach my $node (@nodes) { # skip '.' and '..' next if ($node =~ m/^\.\.?$/o); # make sure the node we just got is valid (this is highly unlikely to fail) my $st = lstat("$src/$node"); if (!defined($st)) { print_err("Warning! Could not lstat source node (\"$src/$node\") : $!", 2); next; } # SYMLINK (must be tested for first, because it will also pass the file and dir tests) if (-l "$src/$node") { # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "copy_symlink(\"$src/$node\", \"$dest/$node\")"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $result = copy_symlink("$src/$node", "$dest/$node"); if (0 == $result) { print_err("Warning! copy_symlink(\"$src/$node\", \"$dest/$node\")", 2); next; } # FILE } elsif (-f "$src/$node") { # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "link(\"$src/$node\", \"$dest/$node\");"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } # make a hard link $result = link("$src/$node", "$dest/$node"); if (!$result) { print_err("Warning! Could not link(\"$src/$node\", \"$dest/$node\") : $!", 2); next; } # DIRECTORY } elsif (-d "$src/$node") { # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "native_cp_al(\"$src/$node\", \"$dest/$node\")"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } # call this subroutine recursively, to create the directory $result = native_cp_al("$src/$node", "$dest/$node"); if (!$result) { print_err("Warning! Recursion error in native_cp_al(\"$src/$node\", \"$dest/$node\")", 2); next; } } ## rsync_cleanup_after_native_cp_al() will take care of the files we can't handle here # ## FIFO #} elsif ( -p "$src/$node" ) { # # print_err("Warning! Ignoring FIFO $src/$node", 2); # ## SOCKET #} elsif ( -S "$src/$node" ) { # # print_err("Warning! Ignoring socket: $src/$node", 2); # ## BLOCK DEVICE #} elsif ( -b "$src/$node" ) { # # print_err("Warning! Ignoring special block file: $src/$node", 2); # ## CHAR DEVICE #} elsif ( -c "$src/$node" ) { # # print_err("Warning! Ignoring special character file: $src/$node", 2); #} } } else { print_err("Could not open \"$src\". Do you have adequate permissions?", 2); return (0); } # close open dir handle if (defined($dh)) { $dh->close(); } undef($dh); # UTIME DEST # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "utime(" . $st->atime . ", " . $st->mtime . ", \"$dest\");"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $result = utime($st->atime, $st->mtime, "$dest"); if (!$result) { print_err("Warning! Could not set utime(" . $st->atime . ", " . $st->mtime . ", \"$dest\") : $!", 2); return (0); } return (1); } # If we're using native_cp_al(), it can't transfer special files. # So, to make sure no one misses out, this subroutine gets called every time directly # after native_cp_al(), with the same source and destinations paths. # # Essentially it is running between two almost identical hard linked directory trees. # However, it will transfer over the few (if any) special files that were otherwise # missed. # # This subroutine specifies its own parameters for rsync's arguments. This is to make # sure that nothing goes wrong, since there is not much here that should be left to # interpretation. # sub rsync_cleanup_after_native_cp_al { my $src = shift(@_); my $dest = shift(@_); my $local_rsync_short_args = '-a'; # if the user asked for -E, we should use it here too. # should we check for OS X? Dunno, but for now that extra # check is in here as we know we need it there, and so # this is the smallest change for the smallest number of # people $local_rsync_short_args .= 'E' if ( defined($config_vars{'rsync_short_args'}) && $config_vars{'rsync_short_args'} =~ /E/ && $^O eq 'darwin'); my @cmd_stack = (); # make sure we were passed two arguments if (!defined($src)) { return (0); } if (!defined($dest)) { return (0); } # make sure this is directory to directory if (($src !~ m/\/$/o) or ($dest !~ m/\/$/o)) { print_err("rsync_cleanup_after_native_cp_al() only works on directories", 2); return (0); } # make sure we have a source directory if (!-d "$src") { print_err("rsync_cleanup_after_native_cp_al() needs a valid source directory as an argument", 2); return (0); } # make sure we have a destination directory if (!-d "$dest") { print_err("rsync_cleanup_after_native_cp_al() needs a valid destination directory as an argument", 2); return (0); } # check verbose settings and modify rsync's short args accordingly if ($verbose > 3) { $local_rsync_short_args .= 'v'; } # setup rsync command # # rsync push(@cmd_stack, $config_vars{'cmd_rsync'}); # # short args push(@cmd_stack, $local_rsync_short_args); # # long args (not the defaults) push(@cmd_stack, '--delete'); push(@cmd_stack, '--numeric-ids'); # # src push(@cmd_stack, "$src"); # # dest push(@cmd_stack, "$dest"); print_cmd(@cmd_stack); if (0 == $test) { my $result = system(@cmd_stack); if ($result != 0) { # bitmask return value my $retval = get_retval($result); # a partial list of rsync exit values # 0 Success # 23 Partial transfer due to error # 24 Partial transfer due to vanished source files if (23 == $retval) { print_warn( "Some files and/or directories in $src only transferred partially during rsync_cleanup_after_native_cp_al operation", 2 ); syslog_warn( "Some files and/or directories in $src only transferred partially during rsync_cleanup_after_native_cp_al operation" ); } elsif (24 == $retval) { print_warn( "Some files and/or directories in $src vanished during rsync_cleanup_after_native_cp_al operation", 2 ); syslog_warn( "Some files and/or directories in $src vanished during rsync_cleanup_after_native_cp_al operation"); } else { # other error bail("rsync returned error $retval in rsync_cleanup_after_native_cp_al()"); } } } return (1); } # accepts a path # displays the rm command according to the config file sub display_rm_rf { my $path = shift(@_); if (!defined($path)) { bail('display_rm_rf() requires an argument'); } if (defined($config_vars{'cmd_rm'})) { print_cmd("$config_vars{'cmd_rm'} -rf $path"); } else { print_cmd("rm -rf $path"); } } # stub subroutine # calls either cmd_rm_rf() or the native perl rmtree() # returns 1 on success, 0 on failure sub rm_rf { my $path = shift(@_); my $result = 0; # make sure we were passed an argument if (!defined($path)) { return (0); } # extra bonus safety feature! # confirm that whatever we're deleting must be inside the snapshot_root if (index($path, $config_vars{'snapshot_root'}) != 0) { bail("rm_rf() tried to delete something outside of $config_vars{'snapshot_root'}! Quitting now!"); } # use the rm command if we have it if (defined($config_vars{'cmd_rm'})) { $result = cmd_rm_rf("$path"); } # fall back on rmtree() else { # remove trailing slash just in case $path =~ s/\/$//; $result = rmtree("$path", 0, 0); } return ($result); } # this is a wrapper to the "rm" program, called with the "-rf" flags. sub cmd_rm_rf { my $path = shift(@_); my $result = 0; # make sure we were passed an argument if (!defined($path)) { return (0); } if (!-e "$path") { print_err("cmd_rm_rf() needs a valid file path as an argument", 2); return (0); } # make the system call to /bin/rm $result = system($config_vars{'cmd_rm'}, '-rf', "$path"); if ($result != 0) { print_err("Warning! $config_vars{'cmd_rm'} failed.", 2); return (0); } return (1); } # accepts no arguments # calls the 'du' command to show rsnapshot's disk usage # exits the program with 0 for success, 1 for failure # # this subroutine isn't like a lot of the "real" ones that write to logfiles, etc. # that's why the print_* subroutines aren't used here. # sub show_disk_usage { my @du_dirs = (); my $cmd_du = 'du'; my $du_args = $default_du_args; my $dest_path = ''; my $retval; # first, make sure we have permission to see the snapshot root if (!-r "$config_vars{'snapshot_root'}") { print STDERR ("ERROR: Permission denied\n"); exit(1); } # check for 'du' program if (defined($config_vars{'cmd_du'})) { # it was specified in the config file, use that version $cmd_du = $config_vars{'cmd_du'}; } # check for du args if (defined($config_vars{'du_args'})) { # it this was specified in the config file, use that version $du_args = $config_vars{'du_args'}; } # are we looking in subdirectories or at files? if (defined($ARGV[1])) { $dest_path = $ARGV[1]; # consolidate multiple slashes $dest_path =~ s/\/+/\//o; if (is_directory_traversal($dest_path)) { print STDERR "ERROR: Directory traversal is not allowed\n"; exit(1); } if (!is_valid_local_non_abs_path($dest_path)) { print STDERR "ERROR: Full paths are not allowed\n"; exit(1); } } # find the directories to look through, in order # only add them to the list if we have read permissions if (-r "$config_vars{'snapshot_root'}/") { # if we have a .sync directory, that will have the most recent files, and should be first if (-d "$config_vars{'snapshot_root'}/.sync") { if (-r "$config_vars{'snapshot_root'}/.sync") { push(@du_dirs, "$config_vars{'snapshot_root'}/.sync"); } } # loop through the intervals, most recent to oldest foreach my $interval_ref (@intervals) { my $interval = $$interval_ref{'interval'}; my $max_interval_num = $$interval_ref{'number'}; for (my $i = 0; $i < $max_interval_num; $i++) { if (-r "$config_vars{'snapshot_root'}/$interval.$i/$dest_path") { push(@du_dirs, "$config_vars{'snapshot_root'}/$interval.$i/$dest_path"); } } } } # if we can see any of the intervals, find out how much space they're taking up # most likely we can either see all of them or none at all if (scalar(@du_dirs) > 0) { my @cmd_stack = ($cmd_du, split_long_args_with_quotes('du_args', $du_args), @du_dirs); if (defined($verbose) && ($verbose >= 3)) { print wrap_cmd(join(' ', @cmd_stack)), "\n\n"; } if (0 == $test) { $retval = system(@cmd_stack); if (0 == $retval) { # exit showing success exit(0); } else { # exit showing error print STDERR "Error while calling $cmd_du.\n"; print STDERR "Please make sure this version of du supports the \"$du_args\" flags.\n"; print STDERR "GNU du is recommended.\n"; exit(1); } } else { # test was successful exit(0); } } else { print STDERR ("No files or directories found\n"); exit(1); } # shouldn't happen exit(1); } # accept two args from $ARGV[1] and [2], like "beta.0" "beta.1" etc. # stick the full snapshot_root path on the beginning, and call rsnapshot-diff with these args # NOTE: since this is a read-only operation, we're not concerned with directory traversals and relative paths sub show_rsnapshot_diff { my $cmd_rsnapshot_diff = 'rsnapshot-diff'; my $retval; # this will only hold two entries, no more no less # paths_in holds the incoming arguments # args will be assigned the arguments that rsnapshot-diff will use # my @paths_in = (); my @cmd_args = (); # first, make sure we have permission to see the snapshot root if (!-r "$config_vars{'snapshot_root'}") { print STDERR ("ERROR: Permission denied\n"); exit(1); } # check for rsnapshot-diff program (falling back on $PATH) if (defined($config_vars{'cmd_rsnapshot_diff'})) { $cmd_rsnapshot_diff = $config_vars{'cmd_rsnapshot_diff'}; } # see if we even got the right number of arguments (none is OK, but 1 isn't. 2 is also OK) if (defined($ARGV[1]) && !defined($ARGV[2])) { print STDERR "Usage: rsnapshot diff [backup level|dir] [backup level|dir]\n"; exit(1); } # make this automatically pick the two lowest intervals (or .sync dir) for comparison, as the default # we actually want to specify the older directory first, since rsnapshot-diff will flip them around # anyway based on mod times. doing it this way should make both programs consistent, and cause less # surprises. if (!defined($ARGV[1]) && !defined($ARGV[2])) { # sync_first is enabled, and .sync exists if ($config_vars{'sync_first'} && (-d "$config_vars{'snapshot_root'}/.sync/")) { # interval.0 if (-d ("$config_vars{'snapshot_root'}/" . $intervals[0]->{'interval'} . ".0")) { $cmd_args[0] = "$config_vars{'snapshot_root'}/" . $intervals[0]->{'interval'} . ".0"; } # .sync $cmd_args[1] = "$config_vars{'snapshot_root'}/.sync"; } # sync_first is not enabled, or .sync doesn't exist else { # interval.1 if (-d ("$config_vars{'snapshot_root'}/" . $intervals[0]->{'interval'} . ".1")) { $cmd_args[0] = "$config_vars{'snapshot_root'}/" . $intervals[0]->{'interval'} . ".1"; } # interval.0 if (-d ("$config_vars{'snapshot_root'}/" . $intervals[0]->{'interval'} . ".0")) { $cmd_args[1] = "$config_vars{'snapshot_root'}/" . $intervals[0]->{'interval'} . ".0"; } } } # if we got some command line arguments, loop through twice and figure out what they mean else { $paths_in[0] = $ARGV[1]; # the 1st path is the 2nd cmd line argument $paths_in[1] = $ARGV[2]; # the 2nd path is the 3rd cmd line argument for (my $i = 0; $i < 2; $i++) { # no interval would start with ../ if (is_directory_traversal("$paths_in[$i]")) { $cmd_args[$i] = $paths_in[$i]; # if this directory exists locally, it must be local } elsif (-e "$paths_in[$i]") { $cmd_args[$i] = $paths_in[$i]; # absolute path } elsif (is_valid_local_abs_path("$paths_in[$i]")) { $cmd_args[$i] = $paths_in[$i]; # we didn't find it locally, but it's in the snapshot root } elsif (-e "$config_vars{'snapshot_root'}/$paths_in[$i]") { $cmd_args[$i] = "$config_vars{'snapshot_root'}/$paths_in[$i]"; } } } # double check to make sure the directories exists (and are directories) if ( (!defined($cmd_args[0]) or (!defined($cmd_args[1]))) or ((!-d "$cmd_args[0]") or (!-d "$cmd_args[1]"))) { print STDERR "ERROR: Arguments must be valid backup levels or directories\n"; exit(1); } # remove trailing slashes from directories $cmd_args[0] = remove_trailing_slash($cmd_args[0]); $cmd_args[1] = remove_trailing_slash($cmd_args[1]); # increase verbosity (by possibly sticking a verbose flag in as the first argument) # # debug if ($verbose >= 5) { unshift(@cmd_args, '-V'); } elsif ($verbose >= 4) { unshift(@cmd_args, '-v'); # verbose } elsif ($verbose >= 3) { unshift(@cmd_args, '-vi'); } # run rsnapshot-diff if (defined($verbose) && ($verbose >= 3)) { print wrap_cmd(("$cmd_rsnapshot_diff " . join(' ', @cmd_args))), "\n\n"; } if (0 == $test) { $retval = system($cmd_rsnapshot_diff, @cmd_args); if (0 == $retval) { exit(0); } else { # exit showing error print STDERR "Error while calling $cmd_rsnapshot_diff\n"; exit(1); } } else { # test was successful exit(0); } # shouldn't happen exit(1); } # This subroutine works the way I hoped rsync would under certain conditions. # This is no fault of rsync, I just had something slightly different in mind :) # # This subroutine accepts two arguments, a source path and a destination path. # It traverses both recursively. # If a file is in the source, but not the destination, it is hard linked into dest # If a file is in the destination, but not the source, it is deleted # If a file is in both locations and is different, dest is unlinked and src is linked to dest # If a file is in both locations and is the same, nothing happens # # What makes this different than rsync is that it looks only at the file contents to # see if the files are different, not at the metadata such as timestamps. # I was unable to make rsync work recursively on identical files without unlinking # at the destination and using another inode for a new file with the exact same content. # # If anyone knows of a better way (that doesn't add dependencies) i'd love to hear it! # sub sync_if_different { my $src = shift(@_); my $dest = shift(@_); my $result = 0; # make sure we were passed two arguments if (!defined($src)) { return (0); } if (!defined($dest)) { return (0); } # make sure we have a source directory if (!-d "$src") { print_err("sync_if_different() needs a valid source directory as its first argument", 2); return (0); } # strip trailing slashes off the directories, # since we'll add them back on later $src = remove_trailing_slash($src); $dest = remove_trailing_slash($dest); # copy everything from src to dest # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "sync_cp_src_dest(\"$src\", \"$dest\")"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $result = sync_cp_src_dest("$src", "$dest"); if (!$result) { print_err("Warning! sync_cp_src_dest(\"$src\", \"$dest\")", 2); return (0); } # delete everything from dest that isn't in src # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "sync_rm_dest(\"$src\", \"$dest\")"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $result = sync_rm_dest("$src", "$dest"); if (!$result) { print_err("Warning! sync_rm_dest(\"$src\", \"$dest\")", 2); return (0); } return (1); } # accepts src, dest # "copies" everything from src to dest, mainly using hard links # called only from sync_if_different() # returns 1 on success, 0 if any failures occur sub sync_cp_src_dest { my $src = shift(@_); my $dest = shift(@_); my $dh = undef; my $result = 0; my $retval = 1; # return code for this subroutine # make sure we were passed two arguments if (!defined($src)) { return (0); } if (!defined($dest)) { return (0); } # make sure we have a source directory if (!-d "$src") { print_err("sync_if_different() needs a valid source directory as its first argument", 2); return (0); } # strip trailing slashes off the directories, # since we'll add them back on later $src = remove_trailing_slash($src); $dest = remove_trailing_slash($dest); # LSTAT SRC my $st = lstat("$src"); if (!defined($st)) { print_err("Could not lstat(\"$src\")", 2); return (0); } # MKDIR DEST (AND SET MODE) if (!-d "$dest") { # check to make sure we don't have something here that's not a directory if (-e "$dest") { $result = unlink("$dest"); if (0 == $result) { print_err("Warning! Could not unlink(\"$dest\")", 2); return (0); } } # create the directory $result = mkdir("$dest", $st->mode); if (!$result) { print_err("Warning! Could not mkdir(\"$dest\", $st->mode);", 2); return (0); } } # CHOWN DEST (if root) if (0 == $<) { # make sure destination is not a symlink (should never happen because of unlink() above) if (!-l "$dest") { $result = safe_chown($st->uid, $st->gid, "$dest"); if (!$result) { print_err("Warning! Could not safe_chown(" . $st->uid . ", " . $st->gid . ", \"$dest\");", 2); return (0); } } } # copy anything different from src into dest $dh = new DirHandle("$src"); if (defined($dh)) { my @nodes = $dh->read(); # loop through all nodes in this dir foreach my $node (@nodes) { # skip '.' and '..' next if ($node =~ m/^\.\.?$/o); # if it's a symlink, create the link # this check must be done before dir and file because it will # pretend to be a file or a directory as well as a symlink if (-l "$src/$node") { # nuke whatever is in the destination, since we'd have to recreate the symlink anyway # and a real file or directory will be in our way # symlinks pretend to be directories, which is why we check it the way that we do if (-e "$dest/$node") { if ((-l "$dest/$node") or (!-d "$dest/$node")) { $result = unlink("$dest/$node"); if (0 == $result) { print_err("Warning! Could not unlink(\"$dest/$node\")", 2); next; } } # nuke the destination directory else { $result = rm_rf("$dest/$node"); if (0 == $result) { print_err("Could not rm_rf(\"$dest/$node\")", 2); next; } } } $result = copy_symlink("$src/$node", "$dest/$node"); if (0 == $result) { print_err("Warning! copy_symlink(\"$src/$node\", \"$dest/$node\") failed", 2); return (0); } } # if it's a directory, recurse! elsif (-d "$src/$node") { # if the destination exists but isn't a directory, delete it if (-e "$dest/$node") { # a symlink might claim to be a directory, so check for that first if ((-l "$dest/$node") or (!-d "$dest/$node")) { $result = unlink("$dest/$node"); if (0 == $result) { print_err("Warning! unlink(\"$dest/$node\") failed", 2); next; } } } # ok, dest is a real directory or it isn't there yet, go recurse $result = sync_cp_src_dest("$src/$node", "$dest/$node"); if (!$result) { print_err("Warning! Recursion error in sync_cp_src_dest(\"$src/$node\", \"$dest/$node\")", 2); } } # if it's a file... elsif (-f "$src/$node") { # if dest is a symlink, we need to remove it first if (-l "$dest/$node") { $result = unlink("$dest/$node"); if (0 == $result) { print_err("Warning! unlink(\"$dest/$node\") failed", 2); next; } } # if dest is a directory, we need to wipe it out first if (-d "$dest/$node") { $result = rm_rf("$dest/$node"); if (0 == $result) { print_err("Could not rm_rf(\"$dest/$node\")", 2); return (0); } } # if dest (still) exists, check for differences if (-e "$dest/$node") { # if they are different, unlink dest and link src to dest if (1 == file_diff("$src/$node", "$dest/$node")) { $result = unlink("$dest/$node"); if (0 == $result) { print_err("Warning! unlink(\"$dest/$node\") failed", 2); next; } $result = link("$src/$node", "$dest/$node"); if (0 == $result) { print_err("Warning! link(\"$src/$node\", \"$dest/$node\") failed", 2); next; } } # if they are the same, just leave dest alone else { next; } } # ok, dest doesn't exist. just link src to dest else { $result = link("$src/$node", "$dest/$node"); if (0 == $result) { print_err("Warning! link(\"$src/$node\", \"$dest/$node\") failed", 2); } } } # FIFO elsif (-p "$src/$node") { print_err("Warning! Ignoring FIFO $src/$node", 2); } # SOCKET elsif (-S "$src/$node") { print_err("Warning! Ignoring socket: $src/$node", 2); } # BLOCK DEVICE elsif (-b "$src/$node") { print_err("Warning! Ignoring special block file: $src/$node", 2); } # CHAR DEVICE elsif (-c "$src/$node") { print_err("Warning! Ignoring special character file: $src/$node", 2); } } } # close open dir handle if (defined($dh)) { $dh->close(); } undef($dh); return (1); } # accepts src, dest # deletes everything from dest that isn't in src also # called only from sync_if_different() sub sync_rm_dest { my $src = shift(@_); my $dest = shift(@_); my $dh = undef; my $result = 0; # make sure we were passed two arguments if (!defined($src)) { return (0); } if (!defined($dest)) { return (0); } # make sure we have a source directory if (!-d "$src") { print_err("sync_rm_dest() needs a valid source directory as its first argument", 2); return (0); } # make sure we have a destination directory if (!-d "$dest") { print_err("sync_rm_dest() needs a valid destination directory as its second argument", 2); return (0); } # strip trailing slashes off the directories, # since we'll add them back on later $src = remove_trailing_slash($src); $dest = remove_trailing_slash($dest); # delete anything from dest that isn't found in src $dh = new DirHandle("$dest"); if (defined($dh)) { my @nodes = $dh->read(); # loop through all nodes in this dir foreach my $node (@nodes) { # skip '.' and '..' next if ($node =~ m/^\.\.?$/o); # if this node isn't present in src, delete it if (!-e "$src/$node") { # file or symlink if ((-l "$dest/$node") or (!-d "$dest/$node")) { $result = unlink("$dest/$node"); if (0 == $result) { print_err("Warning! Could not delete \"$dest/$node\"", 2); next; } } # directory else { $result = rm_rf("$dest/$node"); if (0 == $result) { print_err("Warning! Could not delete \"$dest/$node\"", 2); } } next; } # ok, this also exists in src... # theoretically, sync_cp_src_dest() should have caught this already, but better safe than sorry # also, symlinks can pretend to be directories, so we have to check for those too # if src is a file but dest is a directory, we need to recursively remove the dest dir if ((-l "$src/$node") or (!-d "$src/$node")) { if (-d "$dest/$node") { $result = rm_rf("$dest/$node"); if (0 == $result) { print_err("Warning! Could not delete \"$dest/$node\"", 2); } } # otherwise, if src is a directory, but dest is a file, remove the file in dest } elsif (-d "$src/$node") { if ((-l "$dest/$node") or (!-d "$dest/$node")) { $result = unlink("$dest/$node"); if (0 == $result) { print_err("Warning! Could not delete \"$dest/$node\"", 2); next; } } } # if it's a directory in src, let's recurse into it and compare files there if (-d "$src/$node") { $result = sync_rm_dest("$src/$node", "$dest/$node"); if (!$result) { print_err("Warning! Recursion error in sync_rm_dest(\"$src/$node\", \"$dest/$node\")", 2); } } } } # close open dir handle if (defined($dh)) { $dh->close(); } undef($dh); return (1); } # accepts src, dest # "copies" a symlink from src by recreating it in dest # returns 1 on success, 0 on failure sub copy_symlink { my $src = shift(@_); my $dest = shift(@_); my $st = undef; my $result = undef; my $link_deref_path = undef; # make sure it's actually a symlink if (!-l "$src") { print_err("Warning! \"$src\" not a symlink in copy_symlink()", 2); return (0); } # make sure we aren't clobbering the destination if (-e "$dest") { print_err("Warning! \"$dest\" exists!", 2); return (0); } # LSTAT $st = lstat("$src"); if (!defined($st)) { print_err("Warning! lstat(\"$src\") failed", 2); return (0); } # CREATE THE SYMLINK # This is done in two steps: # Reading/dereferencing the link, and creating a new one # # Why not just hard link the symlink? # see http://www.rsnapshot.org/security/2005/001.html # and also msgid <5036B23B.3000606@scubaninja.com> on # rsnapshot-discuss, on 2012-08-23 # # Step 1: READ THE LINK if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "readlink(\"$src\")\n"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $link_deref_path = readlink("$src"); if (!defined($link_deref_path)) { print_err("Warning! Could not readlink(\"$src\")", 2); return (0); } # # Step 2: RECREATE THE LINK if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "symlink(\"$link_deref_path\", \"$dest\")\n"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $result = symlink("$link_deref_path", "$dest"); if (0 == $result) { print_err("Warning! Could not symlink(\"$link_deref_path\"), \"$dest\")", 2); return (0); } # CHOWN DEST (if root) if (0 == $<) { # make sure the symlink even exists if (-e "$dest") { # print and/or log this if necessary if (($verbose > 4) or ($loglevel > 4)) { my $cmd_string = "safe_chown(" . $st->uid . ", " . $st->gid . ", \"$dest\");"; if ($verbose > 4) { print_cmd($cmd_string); } elsif ($loglevel > 4) { log_msg($cmd_string, 4); } } $result = safe_chown($st->uid, $st->gid, "$dest"); if (0 == $result) { print_err("Warning! Could not safe_chown(" . $st->uid . ", " . $st->gid . ", \"$dest\")", 2); return (0); } } } return (1); } # accepts a file permission number from $st->mode (e.g., 33188) # returns a "normal" file permission number (e.g., 644) # do the appropriate bit shifting to get a "normal" UNIX file permission mode sub get_perms { my $raw_mode = shift(@_); if (!defined($raw_mode)) { return (undef); } # a lot of voodoo for just one line # http://www.perlmonks.org/index.pl?node_id=159906 my $mode = sprintf("%04o", ($raw_mode & 07777)); return ($mode); } # accepts return value from the system() command # bitmasks it, and returns the same thing "echo $?" would from the shell sub get_retval { my $retval = shift(@_); if (!defined($retval)) { bail('get_retval() was not passed a value'); } if ($retval !~ m/^\d+$/) { bail("get_retval() was passed $retval, a number is required"); } return ($retval / 256); } # accepts two file paths # returns 0 if they're the same, 1 if they're different # returns undef if one or both of the files can't be found, opened, or closed sub file_diff { my $file1 = shift(@_); my $file2 = shift(@_); my $st1 = undef; my $st2 = undef; my $buf1 = undef; my $buf2 = undef; my $result = undef; # number of bytes to read at once my $BUFSIZE = 16384; # boolean file comparison flag. assume they're the same. my $is_different = 0; if (!-r "$file1") { return (undef); } if (!-r "$file2") { return (undef); } # CHECK FILE SIZES FIRST $st1 = lstat("$file1"); $st2 = lstat("$file2"); if (!defined($st1)) { return (undef); } if (!defined($st2)) { return (undef); } # if the files aren't even the same size, they can't possibly be the same. # don't waste time comparing them more intensively if ($st1->size != $st2->size) { return (1); } # ok, we're still here. # that means we have to compare files one chunk at a time # open both files $result = open(FILE1, "$file1"); if (!defined($result)) { return (undef); } $result = open(FILE2, "$file2"); if (!defined($result)) { close(FILE1); return (undef); } # compare files while (read(FILE1, $buf1, $BUFSIZE) && read(FILE2, $buf2, $BUFSIZE)) { # exit this loop as soon as possible if ($buf1 ne $buf2) { $is_different = 1; last; } } # close both files $result = close(FILE2); if (!defined($result)) { close(FILE1); return (undef); } $result = close(FILE1); if (!defined($result)) { return (undef); } # return our findings return ($is_different); } # accepts src, dest (file paths) # calls rename(), forcing the mtime to be correct (to work around a bug in rare versions of the Linux 2.4 kernel) # returns 1 on success, 0 on failure, just like the real rename() command sub safe_rename { my $src = shift(@_); my $dest = shift(@_); my $st; my $retval; my $result; # validate src and dest paths if (!defined($src)) { print_err("safe_rename() needs a valid source file path as an argument", 2); return (0); } if (!defined($dest)) { print_err("safe_rename() needs a valid destination file path as an argument", 2); return (0); } # stat file before rename $st = stat($src); if (!defined($st)) { print_err("Could not stat() \"$src\"", 2); return (0); } # rename the file $retval = rename("$src", "$dest"); if (1 != $retval) { print_err("Could not rename(\"$src\", \"$dest\")", 2); return (0); } # give it back the old mtime and atime values $result = utime($st->atime, $st->mtime, "$dest"); if (!defined($result)) { print_err("Could not utime( $st->atime, $st->mtime, \"$dest\")", 2); return (0); } # if we made it this far, it must have worked return (1); } # accepts no args # checks the config file for version number # prints the config version to stdout # exits the program, 0 on success, 1 on failure # this feature is "undocumented", for use with scripts, etc sub check_config_version { my $version = get_config_version(); if (!defined($version)) { print "error\n"; exit(1); } print $version, "\n"; exit(0); } # accepts no args # scans the config file for the config_version parameter # returns the config version, or undef sub get_config_version { my $result; my $version; # make sure the config file exists and we can read it if (!defined($config_file)) { return (undef); } if (!-r "$config_file") { return (undef); } # open the config file $result = open(CONFIG, "$config_file"); if (!defined($result)) { return (undef); } # scan the config file looking for the config_version parameter # if we find it, exit the loop while (my $line = ) { chomp($line); if ($line =~ m/^config_version/o) { if ($line =~ m/^config_version\t+([\d\.\-\w]+)$/o) { $version = $1; last; } else { $version = 'undefined'; } } } $result = close(CONFIG); if (!defined($result)) { return (undef); } if (!defined($version)) { $version = 'unknown'; } return ($version); } # accepts no args # exits the program, 0 on success, 1 on failure # attempts to upgrade the rsnapshot.conf file for compatibility with this version sub upgrade_config_file { my $result; my @lines; my $config_version; # check if rsync_long_args is already enabled my $rsync_long_args_enabled = 0; # first, see if the file isn't already up to date $config_version = get_config_version(); if (!defined($config_version)) { print STDERR "ERROR: Could not read config file during version check.\n"; exit(1); } # right now 1.2 is the only valid version if ('1.2' eq $config_version) { print "$config_file file is already up to date.\n"; exit(0); # config_version is set, but not to anything we know about } elsif ('unknown' eq $config_version) { # this is good, it means the config_version was not already set to anything # and is a good candidate for the upgrade } else { print STDERR "ERROR: config_version is set to unknown version: $config_version.\n"; exit(1); } # make sure config file is present and readable if (!defined($config_file)) { print STDERR "ERROR: Config file not defined.\n"; exit(1); } if (!-r "$config_file") { print STDERR "ERROR: $config_file not readable.\n"; exit(1); } # read in original config file $result = open(CONFIG, "$config_file"); if (!defined($result)) { print STDERR "ERROR: Could not open $config_file for reading.\n"; exit(1); } @lines = ; $result = close(CONFIG); if (!defined($result)) { print STDERR "ERROR: Could not close $config_file after reading.\n"; exit(1); } # see if we can find rsync_long_args, either commented out or uncommented foreach my $line (@lines) { if ($line =~ m/^rsync_long_args/o) { $rsync_long_args_enabled = 1; } } # back up old config file backup_config_file(\@lines); # found rsync_long_args enabled if ($rsync_long_args_enabled) { print "Found \"rsync_long_args\" uncommented. Attempting upgrade...\n"; write_upgraded_config_file(\@lines, 0); } # did not find rsync_long_args enabled else { print "Could not find old \"rsync_long_args\" parameter. Attempting upgrade...\n"; write_upgraded_config_file(\@lines, 1); } print "\"$config_file\" was successfully upgraded.\n"; exit(0); } # accepts array_ref of config file lines # exits 1 on errors # attempts to backup rsnapshot.conf to rsnapshot.conf.backup.(#) sub backup_config_file { my $lines_ref = shift(@_); my $result; my $backup_config_file; my $backup_exists = 0; if (!defined($lines_ref)) { print STDERR "ERROR: backup_config_file() was not passed an argument.\n"; exit(1); } if (!defined($config_file)) { print STDERR "ERROR: Could not find config file.\n"; exit(1); } $backup_config_file = "$config_file.backup"; print "Backing up \"$config_file\".\n"; # pick a unique name for the backup file if (-e "$backup_config_file") { $backup_exists = 1; for (my $i = 0; $i < 100; $i++) { if (!-e "$backup_config_file.$i") { $backup_config_file = "$backup_config_file.$i"; $backup_exists = 0; last; } } # if we couldn't write a backup file, exit with an error if (1 == $backup_exists) { print STDERR "ERROR: Refusing to overwrite $backup_config_file.\n"; print STDERR "Please move $backup_config_file out of the way and try again.\n"; print STDERR "$config_file has NOT been upgraded!\n"; exit(1); } } $result = open(OUTFILE, "> $backup_config_file"); if (!defined($result) or ($result != 1)) { print STDERR "Error opening $backup_config_file for writing.\n"; print STDERR "$config_file has NOT been upgraded!\n"; exit(1); } foreach my $line (@$lines_ref) { print OUTFILE $line; } $result = close(OUTFILE); if (!defined($result) or (1 != $result)) { print STDERR "could not cleanly close $backup_config_file.\n"; print STDERR "$config_file has NOT been upgraded!\n"; exit(1); } print "Config file was backed up to \"$backup_config_file\".\n"; } # accepts no args # exits 1 on errors # attempts to write an upgraded config file to rsnapshot.conf sub write_upgraded_config_file { my $lines_ref = shift(@_); my $add_rsync_long_args = shift(@_); my $result; my $upgrade_notice = ''; $upgrade_notice .= "#-----------------------------------------------------------------------------\n"; $upgrade_notice .= "# UPGRADE NOTICE:\n"; $upgrade_notice .= "#\n"; $upgrade_notice .= "# This file was upgraded automatically by rsnapshot.\n"; $upgrade_notice .= "#\n"; $upgrade_notice .= "# The \"config_version\" parameter was added, since it is now required.\n"; $upgrade_notice .= "#\n"; $upgrade_notice .= "# The default value for \"rsync_long_args\" has changed in this release.\n"; $upgrade_notice .= "# By explicitly setting it to the old default values, rsnapshot will still\n"; $upgrade_notice .= "# behave like it did in previous versions.\n"; $upgrade_notice .= "#\n"; if (defined($add_rsync_long_args) && (1 == $add_rsync_long_args)) { $upgrade_notice .= "# In this file, \"rsync_long_args\" was not enabled before the upgrade,\n"; $upgrade_notice .= "# so it has been set to the old default value.\n"; } else { $upgrade_notice .= "# In this file, \"rsync_long_args\" was already enabled before the upgrade,\n"; $upgrade_notice .= "# so it was not changed.\n"; } $upgrade_notice .= "#\n"; $upgrade_notice .= "# New features and improvements have been added to rsnapshot that can\n"; $upgrade_notice .= "# only be fully utilized by making some additional changes to\n"; $upgrade_notice .= "# \"rsync_long_args\" and your \"backup\" points. If you would like to get the\n"; $upgrade_notice .= "# most out of rsnapshot, please read the INSTALL file that came with this\n"; $upgrade_notice .= "# program for more information.\n"; $upgrade_notice .= "#-----------------------------------------------------------------------------\n"; if (!defined($config_file)) { print STDERR "ERROR: Config file not found.\n"; exit(1); } if (!-w "$config_file") { print STDERR "ERROR: \"$config_file\" is not writable.\n"; exit(1); } $result = open(CONFIG, "> $config_file"); if (!defined($result)) { print "ERROR: Could not open \"$config_file\" for writing.\n"; exit(1); } print CONFIG $upgrade_notice; print CONFIG "\n"; print CONFIG "config_version\t1.2\n"; print CONFIG "\n"; if (defined($add_rsync_long_args) && (1 == $add_rsync_long_args)) { print CONFIG "rsync_long_args\t--delete --numeric-ids\n"; print CONFIG "\n"; } foreach my $line (@$lines_ref) { print CONFIG "$line"; } $result = close(CONFIG); if (!defined($result)) { print STDERR "ERROR: Could not close \"$config_file\" after writing\n."; exit(1); } } # accepts no arguments # dynamically loads the CPAN Lchown module, if available # sets the global variable $have_lchown sub use_lchown { if ($verbose >= 5) { print_msg('require Lchown', 5); } eval { require Lchown; }; if ($@) { $have_lchown = 0; if ($verbose >= 5) { print_msg('Lchown module not found', 5); } return (0); } # if it loaded, see if this OS supports the lchown() system call { no strict 'subs'; if (defined(Lchown) && defined(Lchown::LCHOWN_AVAILABLE)) { if (1 == Lchown::LCHOWN_AVAILABLE()) { $have_lchown = 1; if ($verbose >= 5) { print_msg('Lchown module loaded successfully', 5); } return (1); } } } if ($verbose >= 5) { print_msg("Lchown module loaded, but operating system doesn't support lchown()", 5); } return (0); } # accepts uid, gid, filepath # uses lchown() to change ownership of the file, if possible # returns 1 upon success (or if lchown() not present) # returns 0 on failure sub safe_chown { my $uid = shift(@_); my $gid = shift(@_); my $filepath = shift(@_); my $result = undef; if (!defined($uid) or !defined($gid) or !defined($filepath)) { print_err("safe_chown() needs uid, gid, and filepath", 2); return (0); } if (!-e "$filepath") { print_err("safe_chown() needs a valid filepath (not \"$filepath\")", 2); return (0); } # if it's a symlink, use lchown() or skip it if (-l "$filepath") { # use Lchown if (1 == $have_lchown) { $result = Lchown::lchown($uid, $gid, "$filepath"); if (!defined($result)) { return (0); } } # we can't safely do anything here, skip it else { raise_warning(); if ($verbose > 2) { print_warn("Could not lchown() symlink \"$filepath\"", 2); } elsif ($loglevel > 2) { log_warn("Could not lchown() symlink \"$filepath\"", 2); } # we'll still return 1 at the bottom, because we did as well as we could # the warning raised will tell the user what happened } } # if it's not a symlink, use chown() else { $result = chown($uid, $gid, "$filepath"); if (!$result) { return (0); } } return (1); } ######################################## ### PERLDOC / POD ### ######################################## =pod =head1 NAME rsnapshot - remote filesystem snapshot utility =head1 SYNOPSIS B [B<-vtxqVD>] [B<-c> cfgfile] [command] [args] =head1 DESCRIPTION B is a filesystem snapshot utility. It can take incremental snapshots of local and remote filesystems for any number of machines. Local filesystem snapshots are handled with B. Secure remote connections are handled with rsync over B, while anonymous rsync connections simply use an rsync server. Both remote and local transfers depend on rsync. B saves much more disk space than you might imagine. The amount of space required is roughly the size of one full backup, plus a copy of each additional file that is changed. B makes extensive use of hard links, so if the file doesn't change, the next snapshot is simply a hard link to the exact same file. B will typically be invoked as root by a cron job, or series of cron jobs. It is possible, however, to run as any arbitrary user with an alternate configuration file. All important options are specified in a configuration file, which is located by default at B. An alternate file can be specified on the command line. There are also additional options which can be passed on the command line. The command line options are as follows: =over 4 B<-v> verbose, show shell commands being executed B<-t> test, show shell commands that would be executed B<-c> path to alternate config file B<-x> one filesystem, don't cross partitions within each backup point B<-q> quiet, suppress non-fatal warnings B<-V> same as -v, but with more detail B<-D> a firehose of diagnostic information =back =head1 CONFIGURATION B is the default configuration file. All parameters in this file must be separated by tabs. B can be used as a reference. It is recommended that you copy B to B, and then modify B to suit your needs. Long lines may be split over several lines. "Continuation" lines B begin with a space or a tab character. Continuation lines will have all leading and trailing whitespace stripped off, and then be appended with an intervening tab character to the previous line when the configuation file is parsed. Here is a list of allowed parameters: =over 4 B Config file version (required). Default is 1.2 B Local filesystem path to save all snapshots B Include another file in the configuration at this point. =over 4 This is recursive, but you may need to be careful about paths when specifying which file to include. We check to see if the file you have specified is readable, and will yell an error if it isn't. We recommend using a full path. As a special case, include_conf's value may be enclosed in `backticks` in which case it will be executed and whatever it spits to STDOUT will be included in the configuration. Note that shell meta-characters may be interpreted. =back B If set to 1, rsnapshot won't create snapshot_root directory B Full path to rsync (required) B Full path to ssh (optional) B Full path to cp (optional, but must be GNU version) =over 4 If you are using Linux, you should uncomment cmd_cp. If you are using a platform which does not have GNU cp, you should leave cmd_cp commented out. With GNU cp, rsnapshot can take care of both normal files and special files (such as FIFOs, sockets, and block/character devices) in one pass. If cmd_cp is disabled, rsnapshot will use its own built-in function, native_cp_al() to backup up regular files and directories. This will then be followed up by a separate call to rsync, to move the special files over (assuming there are any). =back B Full path to rm (optional) B Full path to logger (optional, for syslog support) B Full path to du (optional, for disk usage reports) B Full path to rsnapshot-diff (optional) B =over 4 Full path (plus any arguments) to preexec script (optional). This script will run immediately before each backup operation (but not any rotations). If the execution fails, rsnapshot will stop immediately. =back B =over 4 Full path (plus any arguments) to postexec script (optional). This script will run immediately after each backup operation (but not any rotations). If the execution fails, rsnapshot will stop immediately. =back B B B B =over 4 Paths to lvcreate, lvremove, mount and umount commands, for use with Linux LVMs. You may include options to the commands also. The lvcreate, lvremove, mount and umount commands are required for managing snapshots of LVM volumes and are otherwise optional. =back B [name] [number] =over 4 "name" refers to the name of this backup level (e.g., alpha, beta, so also called the 'interval'). "number" is the number of snapshots for this type of interval that will be retained. The value of "name" will be the command passed to B to perform this type of backup. A deprecated alias for 'retain' is 'interval'. Example: B [root@localhost]# B For this example, every time this is run, the following will happen: /alpha.5/ will be deleted, if it exists. /alpha.{1,2,3,4} will all be rotated +1, if they exist. /alpha.0/ will be copied to /alpha.1/ using hard links. Each backup point (explained below) will then be rsynced to the corresponding directories in /alpha.0/ Backup levels must be specified in the config file in order, from most frequent to least frequent. The first entry is the one which will be synced with the backup points. The subsequent backup levels (e.g., beta, gamma, etc) simply rotate, with each higher backup level pulling from the one below it for its .0 directory. Example: =over 4 B B B =back beta.0/ will be moved from alpha.5/, and gamma.0/ will be moved from beta.6/ alpha.0/ will be rsynced directly from the filesystem. =back B =over 4 If your version of rsync supports --link-dest (2.5.7 or newer), you can enable this to let rsync handle some things that GNU cp or the built-in subroutines would otherwise do. Enabling this makes rsnapshot take a slightly more complicated code branch, but it's the best way to support special files on non-Linux systems. =back B =over 4 sync_first changes the behaviour of rsnapshot. When this is enabled, all calls to rsnapshot with various backup levels simply rotate files. All backups are handled by calling rsnapshot with the "sync" argument. The synced files are stored in a ".sync" directory under the snapshot_root. This allows better recovery in the event that rsnapshot is interrupted in the middle of a sync operation, since the sync step and rotation steps are separated. This also means that you can easily run "rsnapshot sync" on the command line without fear of forcing all the other directories to rotate up. This benefit comes at the cost of one more snapshot worth of disk space. The default is 0 (off). =back B =over 4 The amount of information to print out when the program is run. Allowed values are 1 through 5. The default is 2. 1 Quiet Show fatal errors only 2 Default Show warnings and errors 3 Verbose Show equivalent shell commands being executed 4 Extra Verbose Same as verbose, but with more detail 5 Debug All kinds of information =back B =over 4 This number means the same thing as B above, but it determines how much data is written to the logfile, if one is being written. =back B =over 4 Full filesystem path to the rsnapshot log file. If this is defined, a log file will be written, with the amount of data being controlled by B. If this is commented out, no log file will be written. =back B =over 4 This gets passed directly to rsync using the --include directive. This parameter can be specified as many times as needed, with one pattern defined per line. See the rsync(1) man page for the syntax. =back B =over 4 This gets passed directly to rsync using the --exclude directive. This parameter can be specified as many times as needed, with one pattern defined per line. See the rsync(1) man page for the syntax. =back B =over 4 This gets passed directly to rsync using the --include-from directive. See the rsync(1) man page for the syntax. =back B =over 4 This gets passed directly to rsync using the --exclude-from directive. See the rsync(1) man page for the syntax. =back B =over 4 List of short arguments to pass to rsync. If not specified, "-a" is the default. Please note that these must be all next to each other. For example, "-az" is valid, while "-a -z" is not. "-a" is rsync's "archive mode" which tells it to copy as much of the filesystem metadata as it can for each file. This specifically does *not* include information about hard links, as that would greatly increase rsync's memory usage and slow it down. If you need to preserve hard links in your backups, then add "H" to this. =back B =over 4 List of long arguments to pass to rsync. The default values are --delete --numeric-ids --relative --delete-excluded This means that the directory structure in each backup point destination will match that in the backup point source. Quotes are permitted in rsync_long_args, eg --rsync-path="sudo /usr/bin/rsync". You may use either single (') or double (") quotes, but nested quotes (including mixed nested quotes) are not permitted. Similar quoting is also allowed in per-backup-point rsync_long_args. =back B =over 4 Arguments to be passed to ssh. If not specified, the default is none. =back B =over 4 Arguments to be passed to du. If not specified, the default is -csh. GNU du supports -csh, BSD du supports -csk, Solaris du doesn't support -c at all. The GNU version is recommended, since it offers the most features. =back B B =over 4 Lockfile to use when rsnapshot is run. This prevents a second invocation from clobbering the first one. If not specified, no lock file is used. Make sure to use a directory that is not world writeable for security reasons. Use of a lock file is strongly recommended. If a lockfile exists when rsnapshot starts, it will try to read the file and stop with an error if it can't. If it *can* read the file, it sees if a process exists with the PID noted in the file. If it does, rsnapshot stops with an error message. If there is no process with that PID, then we assume that the lockfile is stale and ignore it *unless* stop_on_stale_lockfile is set to 1 in which case we stop. stop_on_stale_lockfile defaults to 0. =back B =over 4 Prevents rsync from crossing filesystem partitions. Setting this to a value of 1 enables this feature. 0 turns it off. This parameter is optional. The default is 0 (off). =back B =over 4 Changes default behavior of rsnapshot and does not initially remove the oldest snapshot. Instead it moves that directory to _delete.[processid] and continues as normal. Once the backup has been completed, the lockfile will be removed before rsnapshot starts deleting the directory. Enabling this means that snapshots get taken sooner (since the delete doesn't come first), and any other rsnapshot processes are allowed to start while the final delete is happening. This benefit comes at the cost of using more disk space. The default is 0 (off). The details of how this works have changed in rsnapshot version 1.3.1. Originally you could only ever have one .delete directory per backup level. Now you can have many, so if your next (eg) alpha backup kicks off while the previous one is still doing a lazy delete you may temporarily have extra _delete directories hanging around. =back B =over 4 LVM snapshot(s) size (lvcreate --size option). =back B =over 4 Name to be used when creating the LVM logical volume snapshot(s) (lvcreate --name option). =back B =over 4 Path to the LVM Volume Groups. =back B =over 4 Mount point to use to temporarily mount the snapshot(s). =back B /etc/ localhost/ B root@example.com:/etc/ example.com/ B rsync://example.com/path2/ example.com/ B /var/ localhost/ one_fs=1 B lvm://vg0/home/path2/ lvm-vg0/ B /usr/local/bin/backup_pgsql.sh pgsql_backup/ =over 4 Examples: B =over 4 Backs up /etc/ to /.0/localhost/etc/ using rsync on the local filesystem =back B =over 4 Backs up /usr/local/ to /.0/localhost/usr/local/ using rsync on the local filesystem =back B =over 4 Backs up root@example.com:/etc/ to /.0/example.com/etc/ using rsync over ssh =back B =over 4 Same thing but let ssh choose the remote username (as specified in ~/.ssh/config, otherwise the same as the local username) =back B =over 4 Backs up root@example.com:/usr/local/ to /.0/example.com/usr/local/ using rsync over ssh =back B =over 4 Backs up rsync://example.com/pub/ to /.0/example.com/pub/ using an anonymous rsync server. Please note that unlike backing up local paths and using rsync over ssh, rsync servers have "modules", which are top level directories that are exported. Therefore, the module should also be specified in the destination path, as shown in the example above (the pub/ directory at the end). =back B =over 4 This is the same as the other examples, but notice the fourth column. This is how you specify per-backup-point options to over-ride global settings. This extra parameter can take several options, separated by B. It is most useful when specifying per-backup rsync excludes thus: B Note the + sign. That tells rsnapshot to I to the list of arguments to pass to rsync instead of replacing the list. =back B =over 4 Backs up the LVM logical volume called home, of volume group vg0, to /.0/lvm-vg0/. Will create, mount, backup, unmount and remove an LVM snapshot for each lvm:// entry. =back B =over 4 In this example, we specify a script or program to run. This script should simply create files and/or directories in its current working directory. rsnapshot will then take that output and move it into the directory specified in the third column. Please note that whatever is in the destination directory will be completely deleted and recreated. For this reason, rsnapshot prevents you from specifying a destination directory for a backup_script that will clobber other backups. So in this example, say the backup_database.sh script simply runs a command like: =over 4 #!/bin/sh mysqldump -uusername mydatabase > mydatabase.sql chmod u=r,go= mydatabase.sql # r-------- (0400) =back rsnapshot will take the generated "mydatabase.sql" file and move it into the /.0/db_backup/ directory. On subsequent runs, rsnapshot checks the differences between the files created against the previous files. If the backup script generates the same output on the next run, the files will be hard linked against the previous ones, and no additional disk space will be taken up. =back B B B =over 4 backup_exec simply runs the command listed. The second argument is not required and defaults to a value of 'optional'. It specifies the importance that the command return 0. Valid values are 'optional' and 'required'. If the command is specified as optional, a non-zero exit status from the command will result in a warning message being output. If the command is specified as 'required', a non-zero exit status from the command will result in an error message being output and rsnapshot itself will exit with a non-zero exit status. =back =back Remember that tabs must separate all elements, and that there must be a trailing slash on the end of every directory. A hash mark (#) on the beginning of a line is treated as a comment. Putting it all together (an example file): =over 4 # THIS IS A COMMENT, REMEMBER TABS MUST SEPARATE ALL ELEMENTS config_version 1.2 snapshot_root /.snapshots/ cmd_rsync /usr/bin/rsync cmd_ssh /usr/bin/ssh #cmd_cp /bin/cp cmd_rm /bin/rm cmd_logger /usr/bin/logger cmd_du /usr/bin/du linux_lvm_cmd_lvcreate /sbin/lvcreate linux_lvm_cmd_lvremove /sbin/lvremove linux_lvm_cmd_mount /bin/mount linux_lvm_cmd_umount /bin/umount linux_lvm_snapshotsize 2G linux_lvm_snapshotname rsnapshot linux_lvm_vgpath /dev linux_lvm_mountpath /mnt/lvm-snapshot retain alpha 6 retain beta 7 retain gamma 7 retain delta 3 backup /etc/ localhost/ backup /home/ localhost/ backup_script /usr/local/bin/backup_mysql.sh mysql_backup/ backup root@foo.com:/etc/ foo.com/ backup root@foo.com:/home/ foo.com/ backup root@mail.foo.com:/home/ mail.foo.com/ backup rsync://example.com/pub/ example.com/pub/ backup lvm://vg0/xen-home/ lvm-vg0/xen-home/ backup_exec echo "backup finished!" =back =back =head1 USAGE B can be used by any user, but for system-wide backups you will probably want to run it as root. Since backups usually get neglected if human intervention is required, the preferred way is to run it from cron. When you are first setting up your backups, you will probably also want to run it from the command line once or twice to get a feel for what it's doing. Here is an example crontab entry, assuming that backup levels B, B, B and B have been defined in B =over 4 B<0 */4 * * * /usr/local/bin/rsnapshot alpha> B<50 23 * * * /usr/local/bin/rsnapshot beta> B<40 23 * * 6 /usr/local/bin/rsnapshot gamma> B<30 23 1 * * /usr/local/bin/rsnapshot delta> =back This example will do the following: =over 4 6 alpha backups a day (once every 4 hours, at 0,4,8,12,16,20) 1 beta backup every day, at 11:50PM 1 gamma backup every week, at 11:40PM, on Saturdays (6th day of week) 1 delta backup every month, at 11:30PM on the 1st day of the month =back It is usually a good idea to schedule the larger backup levels to run a bit before the lower ones. For example, in the crontab above, notice that "beta" runs 10 minutes before "alpha". The main reason for this is that the beta rotate will pull out the oldest alpha and make that the youngest beta (which means that the next alpha rotate will not need to delete the oldest alpha), which is more efficient. A secondary reason is that it is harder to predict how long the lowest backup level will take, since it needs to actually do an rsync of the source as well as the rotate that all backups do. If rsnapshot takes longer than 10 minutes to do the "beta" rotate (which usually includes deleting the oldest beta snapshot), then you should increase the time between the backup levels. Otherwise (assuming you have set the B parameter, as is recommended) your alpha snapshot will fail sometimes because the beta still has the lock. Remember that these are just the times that the program runs. To set the number of backups stored, set the B numbers in B To check the disk space used by rsnapshot, you can call it with the "du" argument. For example: =over 4 B =back This will show you exactly how much disk space is taken up in the snapshot root. This feature requires the UNIX B command to be installed on your system, for it to support the "-csh" command line arguments, and to be in your path. You can also override your path settings and the flags passed to du using the cmd_du and du_args parameters. It is also possible to pass a relative file path as a second argument, to get a report on a particular file or subdirectory. =over 4 B =back The GNU version of "du" is preferred. The BSD version works well also, but does not support the -h flag (use -k instead, to see the totals in kilobytes). Other versions of "du", such as Solaris, may not work at all. To check the differences between two directories, call rsnapshot with the "diff" argument, followed by two backup levels or directory paths. For example: =over 4 B B B =back This will call the rsnapshot-diff program, which will scan both directories looking for differences (based on hard links). B =over 4 When B is enabled, rsnapshot must first be called with the B argument, followed by the other usual cron entries. The sync should happen as the lowest, most frequent backup level, and right before. For example: =over 4 B<0 */4 * * * /usr/local/bin/rsnapshot sync && /usr/local/bin/rsnapshot alpha> B<50 23 * * * /usr/local/bin/rsnapshot beta> B<40 23 1,8,15,22 * * /usr/local/bin/rsnapshot gamma> B<30 23 1 * * /usr/local/bin/rsnapshot delta> =back The sync operation simply runs rsync and all backup scripts. In this scenario, all calls simply rotate directories, even the lowest backup level. =back B =over 4 When B is enabled, all sync behaviour happens during an additional sync step (see above). When using the sync argument, it is also possible to specify a backup point destination as an optional parameter. If this is done, only backup points sharing that destination path will be synced. For example, let's say that example.com is a destination path shared by one or more of your backup points. =over 4 rsnapshot sync example.com =back This command will only sync the files that normally get backed up into example.com. It will NOT get any other backup points with slightly different values (like example.com/etc/, for example). In order to sync example.com/etc, you would need to run rsnapshot again, using example.com/etc as the optional parameter. =back B =over 4 Do a quick sanity check to make sure everything is ready to go. =back =head1 EXIT VALUES =over 4 B<0> All operations completed successfully B<1> A fatal error occurred B<2> Some warnings occurred, but the backup still finished =back =head1 FILES /etc/rsnapshot.conf =head1 SEE ALSO rsync(1), ssh(1), logger(1), sshd(1), ssh-keygen(1), perl(1), cp(1), du(1), crontab(1) =head1 DIAGNOSTICS Use the B<-t> flag to see what commands would have been executed. This will show you the commands rsnapshot would try to run. There are a few minor differences (for example, not showing an attempt to remove the lockfile because it wasn't really created in the test), but should give you a very good idea what will happen. Using the B<-v>, B<-V>, and B<-D> flags will print increasingly more information to STDOUT. Make sure you don't have spaces in the config file that you think are actually tabs. Much other weird behavior can probably be attributed to plain old file system permissions and ssh authentication issues. =head1 BUGS Please report bugs (and other comments) to the rsnapshot-discuss mailing list: B =head1 NOTES Make sure your /etc/rsnapshot.conf file has all elements separated by tabs. See /etc/rsnapshot.conf.default for a working example file. Make sure you put a trailing slash on the end of all directory references. If you don't, you may have extra directories created in your snapshots. For more information on how the trailing slash is handled, see the B manpage. Make sure to make the snapshot directory chmod 700 and owned by root (assuming backups are made by the root user). If the snapshot directory is readable by other users, they will be able to modify the snapshots containing their files, thus destroying the integrity of the snapshots. If you would like regular users to be able to restore their own backups, there are a number of ways this can be accomplished. One such scenario would be: Set B to B in B Set the file permissions on these directories as follows: =over 4 drwx------ /.private drwxr-xr-x /.private/.snapshots =back Export the /.private/.snapshots directory over read-only NFS, a read-only Samba share, etc. See the rsnapshot HOWTO for more information on making backups accessible to non-privileged users. For ssh to work unattended through cron, you will probably want to use public key logins. Create an ssh key with no passphrase for root, and install the public key on each machine you want to backup. If you are backing up system files from remote machines, this probably means unattended root logins. Another possibility is to create a second user on the machine just for backups. Give the user a different name such as "rsnapshot", but keep the UID and GID set to 0, to give root privileges. However, make logins more restrictive, either through ssh configuration, or using an alternate shell. BE CAREFUL! If the private key is obtained by an attacker, they will have free run of all the systems involved. If you are unclear on how to do this, see B, B, and B. Backup scripts are run as the same user that rsnapshot is running as. Typically this is root. Make sure that all of your backup scripts are only writable by root, and that they don't call any other programs that aren't owned by root. If you fail to do this, anyone who can write to the backup script or any program it calls can fully take over the machine. Of course, this is not a situation unique to rsnapshot. By default, rsync transfers are done using the --numeric-ids option. This means that user names and group names are ignored during transfers, but the UID/GID information is kept intact. The assumption is that the backups will be restored in the same environment they came from. Without this option, restoring backups for multiple heterogeneous servers would be unmanageable. If you are archiving snapshots with GNU tar, you may want to use the --numeric-owner parameter. Also, keep a copy of the archived system's /etc/passwd and /etc/group files handy for the UID/GID to name mapping. If you remove backup points in the config file, the previously archived files under those points will permanently stay in the snapshots directory unless you remove the files yourself. If you want to conserve disk space, you will need to go into the directory and manually remove the files from the smallest backup level's ".0" directory. For example, if you were previously backing up /home/ with a destination of localhost/, and alpha is your smallest backup level, you would need to do the following to reclaim that disk space: =over 4 rm -rf /alpha.0/localhost/home/ =back Please note that the other snapshots previously made of /home/ will still be using that disk space, but since the files are flushed out of alpha.0/, they will no longer be copied to the subsequent directories, and will thus be removed in due time as the rotations happen. =head1 AUTHORS Mike Rubel - B =over 4 =item - Created the original shell scripts on which this project is based =back Nathan Rosenquist (B) =over 4 =item - Primary author and original maintainer of rsnapshot. =back David Cantrell (B) =over 4 =item - Previous maintainer of rsnapshot =item - Wrote the rsnapshot-diff utility =item - Improved how use_lazy_deletes work so slow deletes don't screw up the next backup at that backup level. =back David Keegel =over 4 =item - Previous rsnapshot maintainer =item - Fixed race condition in lock file creation, improved error reporting =item - Allowed remote ssh directory paths starting with "~/" as well as "/" =item - Fixed a number of other bugs and buglets =back Benedikt Heine =over 4 =item - Current rsnapshot maintainer =back Carl Wilhelm Soderstrom B<(chrome@real-time.com)> =over 4 =item - Created the RPM .spec file which allowed the RPM package to be built, among other things. =back Ted Zlatanov (B) =over 4 =item - Added the one_fs feature, autoconf support, good advice, and much more. =back Ralf van Dooren (B) =over 4 =item - Added and maintains the rsnapshot entry in the FreeBSD ports tree. =back SlapAyoda =over 4 =item - Provided access to his computer museum for software testing. =back Carl Boe (B) =over 4 =item - Found several subtle bugs and provided fixes for them. =back Shane Leibling (B) =over 4 =item - Fixed a compatibility bug in utils/backup_smb_share.sh =back Christoph Wegscheider (B) =over 4 =item - Added (and previously maintained) the Debian rsnapshot package. =back Bharat Mediratta (B) =over 4 =item - Improved the exclusion rules to avoid backing up the snapshot root (among other things). =back Peter Palfrader (B) =over 4 =item - Enhanced error reporting to include command line options. =back Nicolas Kaiser (B) =over 4 =item - Fixed typos in program and man page =back Chris Petersen - (B) =over 4 Added cwrsync permanent-share support =back Robert Jackson (B) =over 4 Added use_lazy_deletes feature =back Justin Grote (B) =over 4 Improved rsync error reporting code =back Anthony Ettinger (B) =over 4 Wrote the utils/mysqlbackup.pl script =back Sherman Boyd =over 4 Wrote utils/random_file_verify.sh script =back William Bear (B) =over 4 Wrote the utils/rsnapreport.pl script (pretty summary of rsync stats) =back Eric Anderson (B) =over 4 Improvements to utils/rsnapreport.pl. =back Alan Batie (B) =over 4 Bug fixes for include_conf =back Dieter Bloms (B) =over 4 Multi-line configuration options =back Henning Moll (B) =over 4 stop_on_stale_lockfile =back Ben Low (B) =over 4 Linux LVM snapshot support =back =head1 COPYRIGHT Copyright (C) 2003-2005 Nathan Rosenquist Portions Copyright (C) 2002-2007 Mike Rubel, Carl Wilhelm Soderstrom, Ted Zlatanov, Carl Boe, Shane Liebling, Bharat Mediratta, Peter Palfrader, Nicolas Kaiser, David Cantrell, Chris Petersen, Robert Jackson, Justin Grote, David Keegel, Alan Batie, Dieter Bloms, Henning Moll, Ben Low, Anthony Ettinger This man page is distributed under the same license as rsnapshot: the GPL (see below). This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA =cut # more emacs-appeasement ###################################################################### ### Local Variables: ### tab-width: 4 ### End: rsnapshot-1.4.2/install-sh0000755000175000017500000003325612632661203015157 0ustar travistravis#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: rsnapshot-1.4.2/COPYING0000664000175000017500000004310612632661200014200 0ustar travistravis GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. rsnapshot-1.4.2/AUTHORS0000664000175000017500000000567612632661200014227 0ustar travistravisMike Rubel - http://www.mikerubel.org/computers/rsync_snapshots/ - Created the original shell scripts on which this project is based Nathan Rosenquist - Primary author and ex-maintainer of rsnapshot (until 2005). Benedikt Heine - current maintainer of rsnapshot (2015-) David Cantrell - ex-maintainer of rsnapshot (2005-2007) - Wrote the rsnapshot-diff utility David Keegel - ex-maintainer of rsnapshot (2008-2015) - Allowed remote ssh directory paths starting with "~/" as well as "/" - Fixed race condition in lock file creation, improved error reporting - Fixed a number of other bugs and buglets - Release management for rsnapshot 1.2.9, 1.3.0 Carl Wilhelm Soderstrom - Created the RPM .spec file which allowed the RPM package to be built, among other things. Ted Zlatanov - Added the one_fs feature, autoconf support, good advice, and much more. Ralf van Dooren - Added and maintains the rsnapshot entry in the FreeBSD ports tree. SlapAyoda - Provided access to his computer museum for software testing. Carl Boe - Found several subtle bugs and provided fixes for them. Shane Liebling - Fixed a compatibility bug in utils/backup_smb_share.sh Christoph Wegscheider - Added and maintains the Debian rsnapshot package Bharat Mediratta - Improved the exclusion rules to avoid backing up the snapshot root (among other things). Peter Palfrader - Enhanced error reporting to include command line options Nicolas Kaiser - Fixed typos in program and man page Chris Petersen - http://www.forevermore.net/ - Added cwrsync permanent-share support Robert Jackson - Added use_lazy_deletes option Justin Grote - Improved rsync error reporting code Anthony Ettinger - Wrote the utils/mysqlbackup.pl script - Wrote utils/rsnapshotdb Sherman Boyd - Wrote the utils/random_file_verify.sh script William Bear - Wrote the utils/rsnapreport.pl script (pretty summary of rsync stats) Eric Anderson - Improvements to utils/rsnapreport.pl. Alan Batie - Bug fixes for include_conf Dieter Bloms - Multi-line configuration options Henning Moll - stop_on_stale_lockfile Ben Low - Added support for Linux LVM snapshots David Grant - Added support for retrying rsync "rsync_numtries" number of times Matt McCutchen - Wrote rsnapshot-copy (to copy snapshot roots using rsync --link-dest) Imran Chaudhry - added -H to rsnapshot-diff rsnapshot-1.4.2/aclocal.m40000664000175000017500000005326512632661202015016 0ustar travistravis# generated automatically by aclocal 1.11.3 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.3], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.3])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR rsnapshot-1.4.2/Makefile.am0000664000175000017500000000501612632661200015177 0ustar travistravis# rsnapshot version VERSION = @VERSION@ doc: man html @echo "Documentation $(man_MANS) and rsnapshot.html are now up to date." @touch doc man: $(man_MANS) rsnapshot.1 : rsnapshot @# perl 5.8 for this pod2man -c 'rsnapshot-tools' -n 'rsnapshot' -r 'rsnapshot-tools' rsnapshot > rsnapshot.1 rsnapshot-diff.1 : rsnapshot-diff @# perl 5.8 for this pod2man -c 'rsnapshot-tools' -n 'rsnapshot-diff' -r 'rsnapshot-tools' rsnapshot-diff > rsnapshot-diff.1 html: rsnapshot.html rsnapshot.html: rsnapshot pod2html rsnapshot | grep -v 'link rev' > rsnapshot.html rm -f pod2htmd.* rm -f pod2htmi.* clean: rm -rf rsnapshot-$(VERSION)/ rm -f $(man_MANS) rm -rf autom4te.cache rm -f rsnapshot-$(VERSION).tar.gz rm -f $(sysconf_DATA) rm -f rsnapshot.html rm -f pod2htmd.* rm -f pod2htmi.* rm -f Makefile config.log config.status configure.lineno rsnapshot rsnapshot-diff rm -f t/*.t rm -f t/*.pm rm -f t/support/etc/*.conf rm -f t/support/files/a/{1,2} rm -rf t/support/snapshots/*.* tar: rsnapshot-$(VERSION).tar.gz @touch tar rsnapshot-$(VERSION).tar.gz: $(man_MANS) Makefile $(bin_SCRIPTS) $(sysconf_DATA) @echo building tar file mkdir rsnapshot-$(VERSION)/ @# core files cp -a AUTHORS ChangeLog COPYING INSTALL.md Makefile.am README.md \ rsnapshot.conf.default.in rsnapshot-diff.pl rsnapshot-program.pl \ rsnapshot-$(VERSION) @# autoconf files cp -a configure.ac Makefile.am \ aclocal.m4 autom4te.cache configure install-sh Makefile.in missing \ rsnapshot-$(VERSION)/ @# documentation files cp -a docs \ rsnapshot-$(VERSION)/ @# utils cp -a utils/ \ rsnapshot-$(VERSION)/ @# testsuite cp -a t/ \ rsnapshot-$(VERSION)/ @# remove git-files find rsnapshot-$(VERSION)/ -depth -name .gitignore -exec rm -rf {} \; @# change ownership to root, and delete build dir fakeroot chown -R root:root rsnapshot-$(VERSION)/ rm -f rsnapshot-$(VERSION).tar.gz tar czf rsnapshot-$(VERSION).tar.gz rsnapshot-$(VERSION)/ rm -rf rsnapshot-$(VERSION)/ @echo # If you lack GNU make, you could use "test_cases = t/*.t" as an approximation. test_cases_in := $(wildcard t/*/*.t.in) test_cases := $(test_cases_in:%.in=%) test_configs_in := $(wildcard t/*/conf/*.conf.in) test_configs := $(test_configs_in:%.in=%) test_modules_in = $(wildcard t/*.pm.in) test_modules = $(test_modules_in:%.in=%) test: rsnapshot $(test_cases) $(test_configs) $(test_modules) @PERL@ -MTest::Harness -It -e 'runtests($(test_cases:%="%",))' bin_SCRIPTS = rsnapshot rsnapshot-diff man_MANS = rsnapshot.1 rsnapshot-diff.1 sysconf_DATA = rsnapshot.conf.default