From 060081f6358867cf4822f413900349798aa0494e Mon Sep 17 00:00:00 2001 From: Darko Poljak Date: Mon, 26 Sep 2016 18:01:01 +0200 Subject: [PATCH] Release 2.0. --- software/ccollect/documentation/ccollect.htm | 41 +- software/ccollect/documentation/ccollect.html | 1208 ++++++++++++----- software/ccollect/documentation/ccollect.text | 54 +- .../ccollect/documentation/man/ccollect.1 | 40 +- .../ccollect/documentation/man/ccollect.htm | 17 +- .../ccollect/documentation/man/ccollect.html | 603 ++++++-- .../documentation/man/ccollect_add_source.1 | 27 +- .../documentation/man/ccollect_add_source.htm | 2 +- .../man/ccollect_add_source.html | 582 ++++++-- .../documentation/man/ccollect_analyse_logs.1 | 27 +- .../man/ccollect_analyse_logs.htm | 2 +- .../man/ccollect_analyse_logs.html | 574 ++++++-- .../man/ccollect_delete_source.1 | 27 +- .../man/ccollect_delete_source.htm | 2 +- .../man/ccollect_delete_source.html | 576 ++++++-- .../man/ccollect_list_intervals.1 | 27 +- .../man/ccollect_list_intervals.htm | 2 +- .../man/ccollect_list_intervals.html | 572 ++++++-- .../documentation/man/ccollect_logwrapper.1 | 27 +- .../documentation/man/ccollect_logwrapper.htm | 2 +- .../man/ccollect_logwrapper.html | 574 ++++++-- software/ccollect/download.mdwn | 1 + .../ccollect/download/ccollect-2.0.tar.bz2 | Bin 0 -> 68032 bytes 23 files changed, 3948 insertions(+), 1039 deletions(-) create mode 100644 software/ccollect/download/ccollect-2.0.tar.bz2 diff --git a/software/ccollect/documentation/ccollect.htm b/software/ccollect/documentation/ccollect.htm index 00447397..3551246e 100644 --- a/software/ccollect/documentation/ccollect.htm +++ b/software/ccollect/documentation/ccollect.htm @@ -1,4 +1,4 @@ -ccollect - Installing, Configuring and Using

ccollect - Installing, Configuring and Using

Revision History
Revision 0.8.1for ccollect 0.8.1, Initial Version from 2006-01-13NS

(pseudo) incremental backup +ccollect - Installing, Configuring and Using

ccollect - Installing, Configuring and Using

Revision History
Revision 2.0for ccollect 2.0, Initial Version from 2006-01-13NS

(pseudo) incremental backup with different exclude lists using hardlinks and rsync

Introduction

ccollect is a backup utility written in the sh-scripting language. It does not depend on a specific shell, only /bin/sh needs to be @@ -27,7 +27,16 @@ webservers and pulls the data from of the webservers, this person will perhaps not even see your machine. If the attacker sees connections from a host to the compromised machine, she will not be able to log in on the backup machine. -All other backups are still secure.

Incompatibilities and changes

Versions 0.7 and 0.8

The argument order changed:

  • +All other backups are still secure.

Incompatibilities and changes

Versions 0.9 and 1.0

  • +Added "Error: " prefix in _exit_err() +

Versions 0.8 and 0.9

  • +Renamed script to ccollect (.sh is not needed) +
  • +Removed feature to backup to a host via ccollect, added new tool + (FIXME: insert name here) that takes care of this via tunnel +
  • +Perhaps creating subdirectory of source name (idea from Stefan Schlörholz) +

Versions 0.7 and 0.8

The argument order changed:

  • Old: "<interval name> [args] <sources to backup>"
  • New: "[args] <interval name> <sources to backup>" @@ -349,12 +358,12 @@ df -h

Detailed description of "rsync_failure_codes"

If you have the file rsync_failure_codes in your source configuration directory, it should contain a newline-separated list of numbers representing -rsync exit codes. If rsync exits with any code in this list, a marker will +rsync exit codes. If rsync exits with any code in this list, a marker will be left in the destination directory indicating failure of this backup. If you have enabled delete_incomplete, then this backup will be deleted during the next ccollect run on the same interval.

Detailed description of "mtime"

By default, ccollect.sh chooses the most recent backup directory for cloning or the oldest for deletion based on the directory’s last change time (ctime). -With this option, the sorting is done based on modification time (mtime). With +With this option, the sorting is done based on modification time (mtime). With this version of ccollect, the ctime and mtime of your backups will normally be the same and this option has no effect. However, if you, for example, move your backups to another hard disk using cp -a or rsync -a, you should use this @@ -380,7 +389,7 @@ keys on the different ports):

Host hhydrogenium
 Host bruehe
    Hostname bruehe.schottelius.org
    Port 22
-   HostKeyAlias bruehe.schottelius.org

Using source names or interval in pre_/post_exec scripts

The pre-/post_exec scripts can access some internal variables from ccollect:

  • + HostKeyAlias bruehe.schottelius.org

Using source names or interval in pre_/post_exec scripts

The pre-/post_exec scripts can access some internal variables from ccollect:

  • INTERVAL: The interval specified on the command line
  • no_sources: number of sources @@ -428,7 +437,7 @@ used sort to find the latest backup. sort. So, if you had a directory named "daily.initial", ccollect always diffed against this backup and transfered and deleted files which where deleted in previous backups. This means you simply -wasted resources, but your backup had beer complete anyway.

Using pre_/post_exec

Your pre_/post_exec script does not need to be a script, you can also +wasted resources, but your backup had beer complete anyway.

Using pre_/post_exec

Your pre_/post_exec script does not need to be a script, you can also use a link to

  • an existing program
  • @@ -460,7 +469,7 @@ comes from local harddisk or from a remote server. And it does not want to. When you backup from the local harddisk (which is perhaps not even a good idea when thinking of security), add the destination to source/exclude. (Daniel Aubry reported this problem)

Why does ccollect say "Permission denied" with my pre-/postexec script?

The most common error is that you have not given your script the correct -permissions. Try chmod 0755 /etc/ccollect/sources/'yoursource'/*_exec`.

Why does the backup job fail when part of the source is a link?

When a part of your path you specified in the source is a +permissions. Try chmod 0755 /etc/ccollect/sources/'yoursource'/*_exec`.

Why does the backup job fail when part of the source is a link?

When a part of your path you specified in the source is a (symbolic, hard links are not possible for directories) link, the backup must fail.

First of all, let us have a look at how it looks like:

==> ccollect 0.4: Beginning backup using interval taeglich <==
 [testsource] Sa Apr 29 00:01:55 CEST 2006 Beginning to backup
@@ -484,7 +493,21 @@ until rsync requests the password for the ccollect began to remove the last directory,
 you can enter your password (have a look at screen(1), especially "C-a M"
-and "C-a _", for more information).

Examples

A backup host configuration from scratch

srwali01:~# mkdir /etc/ccollect
+and "C-a _", for more information).

Backup fails, if autofs is running, but sources not reachable

If you are trying to backup a system containing paths that are managed +by autofs, you may run into this error:

2009-12-01-23:14:15: ccollect 0.8.1: Beginning backup using interval monatlich
+[ikn] 2009-12-01-23:14:15: Beginning to backup
+[ikn] 2009-12-01-23:14:15: Executing /home/users/nico/ethz/ccollect/sources/ikn/pre_exec ...
+Enter LUKS passphrase:
+[ikn] Command successful.
+[ikn] key slot 0 unlocked.
+[ikn] 2009-12-01-23:14:23: Finished /home/users/nico/ethz/ccollect/sources/ikn/pre_exec (return code 0). [ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/projects"
+[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/scratch"
+[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/sgscratch"
+[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/supp"
+[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/sysadmin"
+[ikn] rsync warning: some files vanished before they could be transferred (code 24) at main.c(1057) [sender=3.0.6]
+[ikn] 2009-12-01-23:44:23: Source / is not readable. Skipping.

Thus, if you are unsure whether autofs paths can be mounted during backup, +stop autofs in pre_exec and reenable it in post_exec.

Examples

A backup host configuration from scratch

srwali01:~# mkdir /etc/ccollect
 srwali01:~# mkdir -p /etc/ccollect/defaults/intervals/
 srwali01:~# echo 28 > /etc/ccollect/defaults/intervals/taeglich
 srwali01:~# echo 52 > /etc/ccollect/defaults/intervals/woechentlich
@@ -614,7 +637,7 @@ DDIR=/mnt/usb/backup
 
 rsync -av -H --delete /mnt/schwarzesloch/ "$DDIR/schwarzesloch/"
 
-rsync -av -H --delete /mnt/archiv/ "$DDIR/archiv/"

Processes running when doing ccollect -p

Truncated output from ps axuwwwf:

   S+   11:40   0:00  |   |   |   \_ /bin/sh /usr/local/bin/ccollect.sh daily -p ddba034 ddba045 ddba046 ddba047 ddba049 ddna010 ddna011
+rsync -av -H --delete /mnt/archiv/ "$DDIR/archiv/"

Processes running when doing ccollect -j

Truncated output from ps axuwwwf:

   S+   11:40   0:00  |   |   |   \_ /bin/sh /usr/local/bin/ccollect.sh daily -j ddba034 ddba045 ddba046 ddba047 ddba049 ddna010 ddna011
    S+   11:40   0:00  |   |   |       \_ /bin/sh /usr/local/bin/ccollect.sh daily ddba034
    S+   11:40   0:00  |   |   |       |   \_ /bin/sh /usr/local/bin/ccollect.sh daily ddba034
    R+   11:40  23:40  |   |   |       |   |   \_ rsync -a --delete --numeric-ids --relative --delete-excluded --link-dest=/home/server/backup/ddba034
diff --git a/software/ccollect/documentation/ccollect.html b/software/ccollect/documentation/ccollect.html
index 760526ea..b1858848 100644
--- a/software/ccollect/documentation/ccollect.html
+++ b/software/ccollect/documentation/ccollect.html
@@ -2,15 +2,25 @@
     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 
 
-
-
+
+
 ccollect - Installing, Configuring and Using
 
+
 
-
+
 
+

(pseudo) incremental backup with different exclude lists -using hardlinks and rsync

+using hardlinks and rsync

+

1. Introduction

-

ccollect is a backup utility written in the sh-scripting language. -It does not depend on a specific shell, only /bin/sh needs to be +

ccollect is a backup utility written in the sh-scripting language. +It does not depend on a specific shell, only /bin/sh needs to be bourne shell compatible (like dash, ksh, zsh, bash, …).

-

1.1. Supported and tested operating systems and architectures

-

ccollect was successfully tested on the following platforms:

+
+

1.1. Supported and tested operating systems and architectures

+

ccollect was successfully tested on the following platforms:

  • @@ -431,16 +783,19 @@ OpenBSD on amd64

-

It should run on any Unix that supports rsync and has a POSIX-compatible +

It should run on any Unix that supports rsync and has a POSIX-compatible bourne shell. If your platform is not listed above and you have it successfully running, please drop me a mail.

-

1.2. Why you COULD only backup from remote hosts, not to them

+
+
+

1.2. Why you COULD only backup from remote hosts, not to them

While considering the design of ccollect, I thought about enabling backup to remote hosts. Though this sounds like a nice feature ("Backup my notebook to the server now."), in my opinion it is a bad idea to backup to a remote host.

But as more and more people requested this feature, it was implemented, so you have the choice whether you want to use it or not.

+

1.2.1. Reason

If you want to backup TO a remote host, you have to loosen security on it.

Imagine the following situation: You backup your farm of webservers TO @@ -449,6 +804,8 @@ Now one of your webservers which has access to your backup host gets compromised.

Your backup server will be compromised, too.

And the attacker will have access to all data on the other webservers.

+
+

1.2.2. Doing it securely

Think of it the other way round: The backup server (now behind a firewall, not accessable from outside) connects to the @@ -457,8 +814,43 @@ of the webservers, this person will perhaps not even see your machine. If the attacker sees connections from a host to the compromised machine, she will not be able to log in on the backup machine. All other backups are still secure.

-

1.3. Incompatibilities and changes

-

1.3.1. Versions 0.7 and 0.8

+
+
+
+

1.3. Incompatibilities and changes

+
+

1.3.1. Versions 0.9 and 1.0

+
    +
  • +

    +Added "Error: " prefix in _exit_err() +

    +
  • +
+
+
+

1.3.2. Versions 0.8 and 0.9

+
    +
  • +

    +Renamed script to ccollect (.sh is not needed) +

    +
  • +
  • +

    +Removed feature to backup to a host via ccollect, added new tool + (FIXME: insert name here) that takes care of this via tunnel +

    +
  • +
  • +

    +Perhaps creating subdirectory of source name (idea from Stefan Schlörholz) +

    +
  • +
+
+
+

1.3.3. Versions 0.7 and 0.8

The argument order changed:
  • @@ -497,8 +889,10 @@ New: Options in $CCOLLECT_CONF/defaults are used as defaults (see below)

-

1.3.2. Versions 0.6 and 0.7

-
The format of destination changed:
    +
+
+

1.3.4. Versions 0.6 and 0.7

+
The format of destination changed:
  • Before 0.7 it was a (link to a) directory @@ -510,7 +904,7 @@ As of 0.7 it is a textfile containing the destination

-

You can update your configuration using tools/config-pre-0.7-to-0.7.sh.

+

You can update your configuration using tools/config-pre-0.7-to-0.7.sh.

Added remote_host
  • @@ -518,8 +912,10 @@ As of 0.7 it is possible to backup to hosts (see section remote

-

1.3.3. Versions 0.5 and 0.6

-
The format of rsync_options changed:
    +
+
+

1.3.5. Versions 0.5 and 0.6

+
The format of rsync_options changed:
  • Before 0.6 it was whitespace delimeted @@ -527,11 +923,11 @@ Before 0.6 it was whitespace delimeted

  • -As of 0.6 it is newline seperated (so you can pass whitespaces to rsync) +As of 0.6 it is newline seperated (so you can pass whitespaces to rsync)

-

You can update your configuration using tools/config-pre-0.6-to-0.6.sh.

+

You can update your configuration using tools/config-pre-0.6-to-0.6.sh.

The name of the backup directories changed:
  • @@ -546,7 +942,9 @@ As of 0.6: "date +%Y%m%d-%H%M" (better readable, date is closer together)

For the second change there is no updated needed, as XXXX- is always before XXXXX (- comes before digit).

-

1.3.4. Versions 0.4 and 0.5

+
+
+

1.3.6. Versions 0.4 and 0.5

Not a real incompatibilty, but seems to fit in this section:

0.5 does NOT require
  • @@ -561,13 +959,15 @@ bc

anymore!

-

1.3.5. Versions < 0.4 and 0.4

-

Since ccollect 0.4 there are several incompatibilities with earlier +

+
+

1.3.7. Versions < 0.4 and 0.4

+

Since ccollect 0.4 there are several incompatibilities with earlier versions:

List of incompatibilities
  • -pax (Posix) is now required, cp -al (GNU specific) is removed +pax (Posix) is now required, cp -al (GNU specific) is removed

  • @@ -592,19 +992,23 @@ ccollect now reports when postexec returns non-zero

You can convert your old configuration directory using -config-pre-0.4-to-0.4.sh, which can be found in the tools/ +config-pre-0.4-to-0.4.sh, which can be found in the tools/ subdirectory:

-
[10:05] hydrogenium:ccollect-0.4# ./tools/config-pre-0.4-to-0.4.sh /etc/ccollect
+
[10:05] hydrogenium:ccollect-0.4# ./tools/config-pre-0.4-to-0.4.sh /etc/ccollect
+
+
+
+

2. Quick start

For those who do not want to read the whole long document:

-
# get latest ccollect tarball from http://www.nico.schottelius.org/software/ccollect/
+
# get latest ccollect tarball from http://www.nico.schottelius.org/software/ccollect/
 # replace value for CCV with the current version
 export CCV=0.8.1
 
@@ -661,15 +1065,18 @@ echo "Let's see how much space we used with two backups and compare it to /bin"
 du -s ~/DASI /bin
 
 # report success
-echo "Please report success using ./tools/report_success.sh"
+echo "Please report success using ./tools/report_success.sh"

Cutting and pasting the complete section above to your shell will result in the download of ccollect, the creation of a sample configuration and the execution of some backups.

+
+

3. Requirements

+

4. Installing

Either type make install or simply copy it to a directory in your @@ -721,75 +1133,81 @@ following scripts to a directory in $PATH:

  • -tools/ccollect_add_source.sh +tools/ccollect_add_source.sh

  • -tools/ccollect_analyse_logs.sh.sh +tools/ccollect_analyse_logs.sh.sh

  • -tools/ccollect_delete_source.sh +tools/ccollect_delete_source.sh

  • -tools/ccollect_list_intervals.sh +tools/ccollect_list_intervals.sh

  • -tools/ccollect_logwrapper.sh +tools/ccollect_logwrapper.sh

After having installed and used ccollect, report success using ./tools/report_success.sh.

+
+

5. Configuring

For configuration aid have a look at the above mentioned tools, which can assist -you quite well. When you are successfully using ccollect, I would be happy if +you quite well. When you are successfully using ccollect, I would be happy if you add a link to your website, stating "I backup with ccollect", which points to the ccollect homepage. So more people now about ccollect, use it and -improve it. You can also report success using tools/report_success.sh.

-

5.1. Runtime options

-

ccollect looks for its configuration in /etc/ccollect or, if set, in +improve it. You can also report success using tools/report_success.sh.

+
+

5.1. Runtime options

+

ccollect looks for its configuration in /etc/ccollect or, if set, in the directory specified by the variable $CCOLLECT_CONF:

-
# sh-compatible (dash, zsh, mksh, ksh, bash, ...)
+
# sh-compatible (dash, zsh, mksh, ksh, bash, ...)
 $ CCOLLECT_CONF=/your/config/dir ccollect.sh ...
 
 # csh
-$ ( setenv CCOLLECT_CONF /your/config/dir ; ccollect.sh ... )
+$ ( setenv CCOLLECT_CONF /your/config/dir ; ccollect.sh ... )
-

When you start ccollect, you have to specify in which interval +

When you start ccollect, you have to specify in which interval to backup (daily, weekly, yearly; you can specify the names yourself, see below) and which sources to backup (or -a to backup all sources).

The interval specifies how many backups are kept.

There are also some self-explanatory parameters you can pass to ccollect, -simply use ccollect.sh --help for info.

-

5.2. General configuration

+simply use ccollect.sh --help for info.

+
+
+

5.2. General configuration

The general configuration can be found in $CCOLLECT_CONF/defaults or /etc/ccollect/defaults. All options specified there are generally valid for all source definitions, although the values can be overwritten in the source configuration.

All configuration entries are plain-text files (use UTF-8 for non-ascii characters).

+

5.2.1. Interval definition

The interval definition can be found in $CCOLLECT_CONF/defaults/intervals/ or /etc/ccollect/defaults/intervals. Each file in this directory specifies an interval. The name of the file is -the same as the name of the interval: intervals/'<interval name>'.

+the same as the name of the interval: intervals/'<interval name>'.

The content of this file should be a single line containing a number. This number defines how many versions of this interval are kept.

Example:

-
   [10:23] zaphodbeeblebrox:ccollect-0.2% ls -l conf/defaults/intervals/
+
   [10:23] zaphodbeeblebrox:ccollect-0.2% ls -l conf/defaults/intervals/
    insgesamt 12
    -rw-r--r--  1 nico users 3 2005-12-08 10:24 daily
    -rw-r--r--  1 nico users 3 2005-12-08 11:36 monthly
@@ -797,31 +1215,33 @@ This number defines how many versions of this interval are kept.

[10:23] zaphodbeeblebrox:ccollect-0.2% cat conf/defaults/intervals/* 28 12 - 4
+ 4

This means to keep 28 daily backups, 12 monthly backups and 4 weekly.

+
+

5.2.2. General pre- and post-execution

-

If you add $CCOLLECT_CONF/defaults/pre_exec or -/etc/ccollect/defaults/pre_exec (same with post_exec), ccollect -will start pre_exec before the whole backup process and -post_exec after backup of all sources is done.

-

If pre_exec exits with a non-zero return code, the whole backup +

If you add $CCOLLECT_CONF/defaults/pre_exec or +/etc/ccollect/defaults/pre_exec (same with post_exec), ccollect +will start pre_exec before the whole backup process and +post_exec after backup of all sources is done.

+

If pre_exec exits with a non-zero return code, the whole backup process will be aborted.

-

The pre_exec and post_exec script can access the following exported variables:

+

The pre_exec and post_exec script can access the following exported variables:

  • -INTERVAL: the interval selected (daily) +INTERVAL: the interval selected (daily)

  • -no_sources: number of sources to backup (2) +no_sources: number of sources to backup (2)

  • -source_$no: name of the source, $no starts at 0 ($source_0) +source_$no: name of the source, $no starts at 0 ($source_0)

@@ -829,14 +1249,17 @@ process will be aborted.

human readable format before and after the whole backup process:

-
[13:00] hydrogenium:~# mkdir -p /etc/ccollect/defaults/
+
[13:00] hydrogenium:~# mkdir -p /etc/ccollect/defaults/
 [13:00] hydrogenium:~# echo '#!/bin/sh' >  /etc/ccollect/defaults/pre_exec
 [13:01] hydrogenium:~# echo ''          >> /etc/ccollect/defaults/pre_exec
 [13:01] hydrogenium:~# echo 'df -h'     >> /etc/ccollect/defaults/pre_exec
 [13:01] hydrogenium:~# chmod 0755 /etc/ccollect/defaults/pre_exec
-[13:01] hydrogenium:~# ln -s /etc/ccollect/defaults/pre_exec /etc/ccollect/defaults/post_exec
+[13:01] hydrogenium:~# ln -s /etc/ccollect/defaults/pre_exec /etc/ccollect/defaults/post_exec
-

5.3. Source configuration

+
+
+
+

5.3. Source configuration

Each source configuration exists in $CCOLLECT_CONF/sources/$name or /etc/ccollect/sources/$name.

The name you choose for the subdirectory describes the source.

@@ -844,12 +1267,12 @@ human readable format before and after the whole backup process:

  • -source (a text file containing the rsync compatible path to backup) +source (a text file containing the rsync compatible path to backup)

  • -destination (a text file containing the directory we should backup to) +destination (a text file containing the directory we should backup to)

@@ -857,69 +1280,69 @@ human readable format before and after the whole backup process:

  • -pre_exec program to execute before backing up this source +pre_exec program to execute before backing up this source

  • -post_exec program to execute after backing up this source +post_exec program to execute after backing up this source

  • -verbose whether to be verbose (passes -v to rsync) +verbose whether to be verbose (passes -v to rsync)

  • -very_verbose be very verbose (mkdir -v, rm -v and rsync -vv) +very_verbose be very verbose (mkdir -v, rm -v and rsync -vv)

  • -summary create a transfer summary when rsync finished +summary create a transfer summary when rsync finished

  • -exclude exclude list for rsync. newline seperated list. +exclude exclude list for rsync. newline seperated list.

  • -rsync_options extra options for rsync. newline seperated list. +rsync_options extra options for rsync. newline seperated list.

  • -delete_incomplete delete incomplete backups +delete_incomplete delete incomplete backups

  • -remote_host host to backup to +remote_host host to backup to

  • -rsync_failure_codes list of rsync exit codes that indicate complete failure +rsync_failure_codes list of rsync exit codes that indicate complete failure

  • -mtime Sort backup directories based on their modification time +mtime Sort backup directories based on their modification time

  • -quiet_if_down Suppress error messages if source is not connectable +quiet_if_down Suppress error messages if source is not connectable

Example:

-
   [10:47] zaphodbeeblebrox:ccollect-0.2% ls -l  conf/sources/testsource2
+
   [10:47] zaphodbeeblebrox:ccollect-0.2% ls -l  conf/sources/testsource2
    insgesamt 12
    lrwxrwxrwx  1 nico users   20 2005-11-17 16:44 destination
    -rw-r--r--  1 nico users   62 2005-12-07 17:43 exclude
@@ -935,19 +1358,20 @@ human readable format before and after the whole backup process:

[10:48] zaphodbeeblebrox:ccollect-0.2% cat conf/sources/testsource2/intervals/daily 5 [10:48] zaphodbeeblebrox:ccollect-0.2% cat conf/sources/testsource2/source - /home/nico/vpn + /home/nico/vpn
+

5.3.1. Default options

-

If you add $CCOLLECT_CONF/defaults/option_name, the value will +

If you add $CCOLLECT_CONF/defaults/option_name, the value will be used in abscence of the option in a source. If you want to prevent the default value to be used in a source, you can create the file -$CCOLLECT_CONF/sources/$name/no_option_name (i.e. prefix it with +$CCOLLECT_CONF/sources/$name/no_option_name (i.e. prefix it with no_.

Example:

-
   [9:04] ikn2:ccollect% touch conf/defaults/verbose
-   [9:04] ikn2:ccollect% touch conf/sources/local/no_verbose
+
   [9:04] ikn2:ccollect% touch conf/defaults/verbose
+   [9:04] ikn2:ccollect% touch conf/sources/local/no_verbose

This enables the verbose option for all sources, but disables it for the source local.

@@ -956,86 +1380,98 @@ the source specific version overrides the default one:

Example:

-
   [9:05] ikn2:ccollect% echo "backup-host" > conf/defaults/remote_host
-   [9:05] ikn2:ccollect% echo "different-host" > conf/sources/local/remote_host
+
   [9:05] ikn2:ccollect% echo "backup-host" > conf/defaults/remote_host
+   [9:05] ikn2:ccollect% echo "different-host" > conf/sources/local/remote_host

You can use all source options as defaults, with the exception of

  • -source +source

  • -destination +destination

  • -pre_exec +pre_exec

  • -post_exec +post_exec

+
+

5.3.2. Detailed description of "source"

-

source describes a rsync compatible source (one line only).

+

source describes a rsync compatible source (one line only).

For instance backup_user@foreign_host:/home/server/video. -To use the rsync protocol without the ssh-tunnel, use +To use the rsync protocol without the ssh-tunnel, use rsync::USER@HOST/SRC. For more information have a look at the manpage -of rsync(1).

+of rsync(1).

+ +

5.3.3. Detailed description of "destination"

-

destination must be a text file containing the destination directory. -destination USED to be a link to the destination directory in +

destination must be a text file containing the destination directory. +destination USED to be a link to the destination directory in earlier versions, so do not be confused if you see such examples.

Example:

-
   [11:36] zaphodbeeblebrox:ccollect-0.2% cat conf/sources/testsource2/destination
-   /home/nico/backupdir
+
   [11:36] zaphodbeeblebrox:ccollect-0.2% cat conf/sources/testsource2/destination
+   /home/nico/backupdir
+
+

5.3.4. Detailed description of "remote_host"

-

remote_host must be a text file containing the destination host. +

remote_host must be a text file containing the destination host. If this file is existing, you are backing up your data TO this host and not to you local host.

-

Warning: You need to have ssh access to the remote host. rsync and -ccollect will connect to that host via ssh. ccollect needs the shell +

Warning: You need to have ssh access to the remote host. rsync and +ccollect will connect to that host via ssh. ccollect needs the shell access, because it needs to find out how many backups exist on the remote host and to be able to delete them.

Example:

-
   [10:17] denkbrett:ccollect-0.7.0% cat conf/sources/remote1/remote_host
-   home.schottelius.org
+
   [10:17] denkbrett:ccollect-0.7.0% cat conf/sources/remote1/remote_host
+   home.schottelius.org

It may contain all the ssh-specific values like myuser@yourhost.ch.

+
+

5.3.5. Detailed description of "verbose"

-

verbose tells ccollect that the log should contain verbose messages.

-

If this file exists in the source specification -v will be passed to rsync.

+

verbose tells ccollect that the log should contain verbose messages.

+

If this file exists in the source specification -v will be passed to rsync.

Example:

-
   [11:35] zaphodbeeblebrox:ccollect-0.2% touch conf/sources/testsource1/verbose
+
   [11:35] zaphodbeeblebrox:ccollect-0.2% touch conf/sources/testsource1/verbose
+
+

5.3.6. Detailed description of "very_verbose"

-

very_verbose tells ccollect that it should log very verbosely.

+

very_verbose tells ccollect that it should log very verbosely.

If this file exists in the source specification -v will be passed to -rsync, rm and mkdir.

+rsync, rm and mkdir.

Example:

-
   [23:67] nohost:~% touch conf/sources/testsource1/very_verbose
+
   [23:67] nohost:~% touch conf/sources/testsource1/very_verbose
+
+

5.3.7. Detailed description of "summary"

-

If you create the file summary in the source definition, -ccollect will present you a nice summary at the end.

+

If you create the file summary in the source definition, +ccollect will present you a nice summary at the end.

-
backup:~# touch /etc/ccollect/sources/root/summary
+
backup:~# touch /etc/ccollect/sources/root/summary
 backup:~# ccollect.sh werktags root
 ==> ccollect.sh: Beginning backup using interval werktags <==
 [root] Beginning to backup this source ...
@@ -1059,39 +1495,45 @@ backup:~# ccollect.sh werktags root
 [root] sent 13009119 bytes  received 2152 bytes  2891393.56 bytes/sec
 [root] total size is 26234080536  speedup is 2016.26
 [root] Successfully finished backup.
-==> Finished ccollect.sh <==
+==> Finished ccollect.sh <==
-

You could also combine it with verbose or very_verbose, but these +

You could also combine it with verbose or very_verbose, but these already print some statistics (though not all / the same as presented by -summary).

+summary).

+
+

5.3.8. Detailed description of "exclude"

-

exclude specifies a list of paths to exclude. The entries are seperated by a newline (\n).

+

exclude specifies a list of paths to exclude. The entries are seperated by a newline (\n).

Example:

-
   [11:35] zaphodbeeblebrox:ccollect-0.2% cat conf/sources/testsource2/exclude
+
   [11:35] zaphodbeeblebrox:ccollect-0.2% cat conf/sources/testsource2/exclude
    openvpn-2.0.1.tar.gz
    nicht_reinnehmen
    etwas mit leerzeichenli
-   something with spaces is not a problem
+ something with spaces is not a problem
+
+

5.3.9. Detailed description of "intervals/"

-

When you create the subdirectory intervals/ in your source configuration +

When you create the subdirectory intervals/ in your source configuration directory, you can specify individiual intervals for this specific source. Each file in this directory describes an interval.

Example:

-
   [11:37] zaphodbeeblebrox:ccollect-0.2% ls -l conf/sources/testsource2/intervals/
+
   [11:37] zaphodbeeblebrox:ccollect-0.2% ls -l conf/sources/testsource2/intervals/
    insgesamt 8
    -rw-r--r--  1 nico users 2 2005-12-07 17:38 daily
    -rw-r--r--  1 nico users 3 2005-12-14 11:33 yearly
    [11:37] zaphodbeeblebrox:ccollect-0.2% cat  conf/sources/testsource2/intervals/*
    5
-   20
+ 20
+
+

5.3.10. Detailled description of "rsync_options"

-

When you create the file rsync_options in your source configuration, +

When you create the file rsync_options in your source configuration, all the parameters in this file will be passed to rsync. This way you can pass additional options to rsync. For instance you can tell rsync to show progress ("--progress"), or which -password-file ("--password-file") @@ -1099,18 +1541,20 @@ to use for automatic backup over the rsync-protocol.

Example:

-
   [23:42] hydrogenium:ccollect-0.2% cat conf/sources/test_rsync/rsync_options
-   --password-file=/home/user/backup/protected_password_file
+
   [23:42] hydrogenium:ccollect-0.2% cat conf/sources/test_rsync/rsync_options
+   --password-file=/home/user/backup/protected_password_file
+
+

5.3.11. Detailled description of "pre_exec" and "post_exec"

-

When you create pre_exec and / or post_exec in your source -configuration, ccollect will execute this command before and +

When you create pre_exec and / or post_exec in your source +configuration, ccollect will execute this command before and respectively after doing the backup for this specific source. If you want to have pre-/post-exec before and after all backups, see above for general configuration.

-

If pre_exec exits with a non-zero return code, the backup -process of this source will be aborted (i.e. backup skipped).

-

The post_exec script can access the following exported variables from +

If pre_exec exits with a non-zero return code, the backup +process of this source will be aborted (i.e. backup skipped).

+

The post_exec script can access the following exported variables from ccollect:

  • @@ -1120,24 +1564,24 @@ ccollect:

  • -destination_name: contains the base directory name (daily.20091031-1013.24496) +destination_name: contains the base directory name (daily.20091031-1013.24496)

  • -destination_dir: full path (/tmp/ccollect/daily.20091031-1013.24496) +destination_dir: full path (/tmp/ccollect/daily.20091031-1013.24496)

  • -destination_full: like destination_dir, but prepended with the remote_host, if set (host:/tmp/ccollect/daily.20091031-1013.24496 or /tmp/ccollect/daily.20091031-1013.24496) +destination_full: like destination_dir, but prepended with the remote_host, if set (host:/tmp/ccollect/daily.20091031-1013.24496 or /tmp/ccollect/daily.20091031-1013.24496)

  • Example:

    -
    [13:09] hydrogenium:ccollect-0.3% cat conf/sources/with_exec/pre_exec
    +
    [13:09] hydrogenium:ccollect-0.3% cat conf/sources/with_exec/pre_exec
     #!/bin/sh
     
     # Show whats free before
    @@ -1146,30 +1590,38 @@ df -h
     #!/bin/sh
     
     # Show whats free after
    -df -h
    +df -h
    +
    +

    5.3.12. Detailed description of "delete_incomplete"

    -

    If you create the file delete_incomplete in a source specification directory, -ccollect will look for incomplete backups (when the whole ccollect process -was interrupted) and remove them. Without this file ccollect will only warn +

    If you create the file delete_incomplete in a source specification directory, +ccollect will look for incomplete backups (when the whole ccollect process +was interrupted) and remove them. Without this file ccollect will only warn the user.

    +
    +

    5.3.13. Detailed description of "rsync_failure_codes"

    -

    If you have the file rsync_failure_codes in your source configuration +

    If you have the file rsync_failure_codes in your source configuration directory, it should contain a newline-separated list of numbers representing -rsync exit codes. If rsync exits with any code in this list, a marker will +rsync exit codes. If rsync exits with any code in this list, a marker will be left in the destination directory indicating failure of this backup. If you have enabled delete_incomplete, then this backup will be deleted during the next ccollect run on the same interval.

    +
    +

    5.3.14. Detailed description of "mtime"

    By default, ccollect.sh chooses the most recent backup directory for cloning or the oldest for deletion based on the directory’s last change time (ctime). -With this option, the sorting is done based on modification time (mtime). With +With this option, the sorting is done based on modification time (mtime). With this version of ccollect, the ctime and mtime of your backups will normally be the same and this option has no effect. However, if you, for example, move your backups to another hard disk using cp -a or rsync -a, you should use this option because the ctimes are not preserved during such operations.

    If you have any backups in your repository made with ccollect version 0.7.1 or earlier, do not use this option.

    +
    +

    5.3.15. Detailed description of "quiet_if_down"

    By default, ccollect.sh emits a series of error messages if a source is not connectable. With this option enabled, ccollect still reports that the @@ -1177,9 +1629,14 @@ source is not connectable but the associated error messages generated by rsync or ssh are suppressed. You may want to use this option for sources, like notebook PCs, that are often disconnected.

    +
    +
    +
    +

    6. Hints

    -

    6.1. Smart logging

    +
    +

    6.1. Smart logging

    Since ccollect-0.6.1 you can use the ccollect-logwrapper.sh(1) for logging. You call it the same way you call ccollect.sh and it will create a logfile containing the output of ccollect.sh. For more information look @@ -1187,23 +1644,25 @@ at the manpage ccollect-logwrapper. The following is an example running ccollect-logwrapper.sh:

    -
    u0219 ~ # ~chdscni9/ccollect-logwrapper.sh daily u0160.nshq.ch.netstream.com
    +
    u0219 ~ # ~chdscni9/ccollect-logwrapper.sh daily u0160.nshq.ch.netstream.com
     ccollect-logwrapper.sh (11722): Starting with arguments: daily u0160.nshq.ch.netstream.com
    -ccollect-logwrapper.sh (11722): Finished.
    +ccollect-logwrapper.sh (11722): Finished.
    -

    6.2. Using a different ssh port

    +
    +
    +

    6.2. Using a different ssh port

    Mostly easy is to use your ~/.ssh/config file:

    -
    host mx2.schottelius.org
    -   Port 2342
    +
    host mx2.schottelius.org
    +   Port 2342

    If you only use that port for backup only and normally want to use another port, you can add HostName and "HostKeyAlias" (if you also have different keys on the different ports):

    -
    Host hhydrogenium
    +
    Host hhydrogenium
        Hostname bruehe.schottelius.org
        Port 666
        HostKeyAlias hydrogenium
    @@ -1211,10 +1670,12 @@ keys on the different ports):

    Host bruehe Hostname bruehe.schottelius.org Port 22 - HostKeyAlias bruehe.schottelius.org + HostKeyAlias bruehe.schottelius.org
    -

    6.3. Using source names or interval in pre_/post_exec scripts

    -

    The pre-/post_exec scripts can access some internal variables from ccollect:

    +
    +
    +

    6.3. Using source names or interval in pre_/post_exec scripts

    +

    The pre-/post_exec scripts can access some internal variables from ccollect:

    • @@ -1238,7 +1699,7 @@ Host bruehe

    -

    Only available for post_exec:

    +

    Only available for post_exec:

    • @@ -1246,28 +1707,32 @@ Host bruehe

    -

    6.4. Using rsync protocol without ssh

    +
    +
    +

    6.4. Using rsync protocol without ssh

    When you have a computer with little computing power, it may be useful to use rsync without ssh, directly using the rsync protocol -(specify user@host::share in source). You may wish to use -rsync_options to specify a password file to use for automatic backup.

    +(specify user@host::share in source). You may wish to use +rsync_options to specify a password file to use for automatic backup.

    Example:

    -
    backup:~# cat /etc/ccollect/sources/sample.backup.host.org/source
    +
    backup:~# cat /etc/ccollect/sources/sample.backup.host.org/source
     backup@webserver::backup-share
     
     backup:~# cat /etc/ccollect/sources/sample.backup.host.org/rsync_options
     --password-file=/etc/ccollect/sources/sample.backup.host.org/rsync_password
     
     backup:~# cat /etc/ccollect/sources/sample.backup.host.org/rsync_password
    -this_is_the_rsync_password
    +this_is_the_rsync_password

    This hint was reported by Daniel Aubry.

    -

    6.5. Not excluding top-level directories

    +
    +
    +

    6.5. Not excluding top-level directories

    When you exclude "/proc" or "/mnt" from your backup, you may run into trouble when you restore your backup. When you use "/proc/*" or "/mnt/\*" -instead, ccollect will backup empty directories.

    +instead, ccollect will backup empty directories.

    @@ -1281,15 +1746,17 @@ they will still be transferred!

    This hint was reported by Marcus Wagner.

    -

    6.6. Re-using already created rsync-backups

    -

    If you used rsync directly before you use ccollect, you can -use this old backup as initial backup for ccollect: You +

    +
    +

    6.6. Re-using already created rsync-backups

    +

    If you used rsync directly before you use ccollect, you can +use this old backup as initial backup for ccollect: You simply move it into a directory below the destination directory and name it "interval.0".

    Example:

    -
    backup:/home/backup/web1# ls
    +
    backup:/home/backup/web1# ls
     bin   dev  etc   initrd  lost+found  mnt  root  srv  usr  vmlinuz
     boot  doc  home  lib     media       opt  sbin  tmp  var  vmlinuz.old
     
    @@ -1299,17 +1766,17 @@ backup:/home/backup/web1# mkdir daily.0
     backup:/home/backup/web1# mv * daily.0 2>/dev/null
     
     backup:/home/backup/web1# ls
    -daily.0
    +daily.0
    -

    Now you can use /home/backup/web1 as the destination for the backup.

    +

    Now you can use /home/backup/web1 as the destination for the backup.

    Note
    -

    It does not matter anymore how you name your directory, as ccollect uses -the -c option from ls to find out which directory to clone from.

    +

    It does not matter anymore how you name your directory, as ccollect uses +the -c option from ls to find out which directory to clone from.

    @@ -1321,18 +1788,20 @@ the -c option from ls to find out which directory to clone from.

    Older versions (pre 0.6, iirc) had a problem, if you named the first backup something like "daily.initial". It was needed to use the "0" (or some -number that is lower than the current year) as extension. ccollect -used sort to find the latest backup. ccollect itself uses +number that is lower than the current year) as extension. ccollect +used sort to find the latest backup. ccollect itself uses interval.YEARMONTHDAY-HOURMINUTE.PID. This notation was always before "daily.initial", as numbers are earlier in the list -which is produced by sort. So, if you had a directory named "daily.initial", -ccollect always diffed against this backup and transfered and deleted +which is produced by sort. So, if you had a directory named "daily.initial", +ccollect always diffed against this backup and transfered and deleted files which where deleted in previous backups. This means you simply wasted resources, but your backup had beer complete anyway.

    -

    6.7. Using pre_/post_exec

    +
    +
    +

    6.7. Using pre_/post_exec

    Your pre_/post_exec script does not need to be a script, you can also use a link to

      @@ -1348,51 +1817,63 @@ an already written script

    The only requirement is that it is executable.

    -

    6.8. Using source specific interval definitions

    +
    +
    +

    6.8. Using source specific interval definitions

    When you are backing up multiple hosts via cron each night, it may be a problem that host "big_server" may only have 4 daily backups, because otherwise its backup device will be full. But for all other hosts you want to keep 20 daily backups. In this case you would create -/etc/ccollect/default/intervals/daily containing "20" and -/etc/ccollect/sources/big_server/intervals/daily containing "4".

    +/etc/ccollect/default/intervals/daily containing "20" and +/etc/ccollect/sources/big_server/intervals/daily containing "4".

    Source specific intervals always overwrite the default values. If you have to specify it individually for every host, because of different requirements, you can even omit creating -/etc/ccollect/default/intervals/daily.

    -

    6.9. Comparing backups

    +/etc/ccollect/default/intervals/daily.

    +
    +
    +

    6.9. Comparing backups

    If you want to see what changed between two backups, you can use -rsync directly:

    +rsync directly:

    -
    [12:00] u0255:ddba034.netstream.ch#  rsync -n -a --delete --stats --progress daily.20080324-0313.17841/ daily.20080325-0313.31148/
    +
    [12:00] u0255:ddba034.netstream.ch#  rsync -n -a --delete --stats --progress daily.20080324-0313.17841/ daily.20080325-0313.31148/

    This results in a listing of changes. Because we pass -n to rsync no transfer is made (i.e. report only mode).

    This hint was reported by Daniel Aubry.

    -

    6.10. Testing for host reachabilty

    +
    +
    +

    6.10. Testing for host reachabilty

    If you want to test whether the host you try to backup is reachable, you can use the following script as source specific pre-exec:

    -
    #!/bin/sh
    -# ping -c1 -q `cat "/etc/ccollect/sources/$name/source" | cut -d"@" -f2 | cut -d":" -f1`
    +
    #!/bin/sh
    +# ping -c1 -q `cat "/etc/ccollect/sources/$name/source" | cut -d"@" -f2 | cut -d":" -f1`

    This prevents the deletion of old backups, if the host is not reachable.

    This hint was reported by Daniel Aubry.

    -

    6.11. Easy check for errors

    +
    +
    +

    6.11. Easy check for errors

    If you want to see whether there have been any errors while doing the backup, -you can run ccollect together with ccollect_analyse_logs.sh:

    +you can run ccollect together with ccollect_analyse_logs.sh:

    -
    $ ccollect | ccollect_analyse_logs.sh e
    +
    $ ccollect | ccollect_analyse_logs.sh e
    + + +

    7. F.A.Q.

    -

    7.1. What happens if one backup is broken or empty?

    +
    +

    7.1. What happens if one backup is broken or empty?

    Let us assume that one backup failed (connection broke or the source hard disk had some failures). Therefore we’ve got one incomplete backup in our history.

    -

    ccollect will transfer the missing files the next time you use it. +

    ccollect will transfer the missing files the next time you use it. This leads to

    • @@ -1406,27 +1887,33 @@ much greater disk space usage, as no hardlinks can be used

    -

    If the whole ccollect process was interrupted, ccollect (since 0.6) can +

    If the whole ccollect process was interrupted, ccollect (since 0.6) can detect that and remove the incomplete backups, so you can clone from a complete backup instead

    -

    7.2. When backing up from localhost the destination is also included. Is this a bug?

    -

    No. ccollect passes your source definition directly to rsync. It +

    +
    +

    7.2. When backing up from localhost the destination is also included. Is this a bug?

    +

    No. ccollect passes your source definition directly to rsync. It does not try to analyze it. So it actually does not know if a source comes from local harddisk or from a remote server. And it does not want to. When you backup from the local harddisk (which is perhaps not -even a good idea when thinking of security), add the destination +even a good idea when thinking of security), add the destination to source/exclude. (Daniel Aubry reported this problem)

    -

    7.3. Why does ccollect say "Permission denied" with my pre-/postexec script?

    +
    +
    +

    7.3. Why does ccollect say "Permission denied" with my pre-/postexec script?

    The most common error is that you have not given your script the correct -permissions. Try chmod 0755 /etc/ccollect/sources/'yoursource'/*_exec`.

    -
    +permissions. Try chmod 0755 /etc/ccollect/sources/'yoursource'/*_exec`.

    +
    +
    +

    When a part of your path you specified in the source is a (symbolic, hard links are not possible for directories) link, the backup must fail.

    First of all, let us have a look at how it looks like:

    -
    ==> ccollect 0.4: Beginning backup using interval taeglich <==
    +
    ==> ccollect 0.4: Beginning backup using interval taeglich <==
     [testsource] Sa Apr 29 00:01:55 CEST 2006 Beginning to backup
     [testsource] Currently 0 backup(s) exist(s), total keeping 10 backup(s).
     [testsource] Beginning to backup, this may take some time...
    @@ -1434,40 +1921,69 @@ the backup must fail.

    [testsource] Sa Apr 29 00:01:55 CEST 2006 Transferring files... [testsource] rsync: recv_generator: mkdir "/etc/ccollect/sources/testsource/destination/taeglich.2006-04-29-0001.3874/home/user/nico/projekte/ccollect" failed: No such file or directory (2) [testsource] rsync: stat "/etc/ccollect/sources/testsource/destination/taeglich.2006-04-29-0001.3874/home/user/nico/projekte/ccollect" failed: No such file or directory (2) -[...] +[...]

    So what is the problem? It is very obvious when you look deeper into it:

    -
    % cat /etc/ccollect/sources/testsource/source
    +
    % cat /etc/ccollect/sources/testsource/source
     /home/user/nico/projekte/ccollect/ccollect-0.4
     % ls -l /home/user/nico/projekte
     lrwxrwxrwx 1 nico nico 29 2005-12-02 23:28 /home/user/nico/projekte -> oeffentlich/computer/projekte
     % ls -l /etc/ccollect/sources/testsource/destination/taeglich.2006-04-29-0001.3874/home/user/nico
    -lrwxrwxrwx 1 nico nico 29 2006-04-29 00:01 projekte -> oeffentlich/computer/projekte
    +lrwxrwxrwx 1 nico nico 29 2006-04-29 00:01 projekte -> oeffentlich/computer/projekte
    -

    rsync creates the directory structure before it creates the symbolic link. +

    rsync creates the directory structure before it creates the symbolic link. This link now links to something not reachable (dead link). It is impossible to create subdirectories under the broken link.

    In conclusion you cannot use paths with a linked part.

    However, you can backup directories containing symbolic links (in this case you could backup /home/user/nico, which contains /home/user/nico/projekte and oeffentlich/computer/projekte).

    -

    7.5. How can I prevent missing the right time to enter my password?

    -

    As ccollect first deletes the old backups, it may take some time -until rsync requests the password for the ssh session from you.

    -

    The easiest way not to miss that point is running ccollect in screen, +

    +
    +

    7.5. How can I prevent missing the right time to enter my password?

    +

    As ccollect first deletes the old backups, it may take some time +until rsync requests the password for the ssh session from you.

    +

    The easiest way not to miss that point is running ccollect in screen, which has the ability to monitor the output for activity. So as soon as -your screen beeps, after ccollect began to remove the last directory, +your screen beeps, after ccollect began to remove the last directory, you can enter your password (have a look at screen(1), especially "C-a M" and "C-a _", for more information).

    -

    8. Examples

    -
    -

    8.1. A backup host configuration from scratch

    +
    +

    7.6. Backup fails, if autofs is running, but sources not reachable

    +

    If you are trying to backup a system containing paths that are managed +by autofs, you may run into this error:

    -
    srwali01:~# mkdir /etc/ccollect
    +
    2009-12-01-23:14:15: ccollect 0.8.1: Beginning backup using interval monatlich
    +[ikn] 2009-12-01-23:14:15: Beginning to backup
    +[ikn] 2009-12-01-23:14:15: Executing /home/users/nico/ethz/ccollect/sources/ikn/pre_exec ...
    +Enter LUKS passphrase:
    +[ikn] Command successful.
    +[ikn] key slot 0 unlocked.
    +[ikn] 2009-12-01-23:14:23: Finished /home/users/nico/ethz/ccollect/sources/ikn/pre_exec (return code 0). [ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/projects"
    +[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/scratch"
    +[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/sgscratch"
    +[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/supp"
    +[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/sysadmin"
    +[ikn] rsync warning: some files vanished before they could be transferred (code 24) at main.c(1057) [sender=3.0.6]
    +[ikn] 2009-12-01-23:44:23: Source / is not readable. Skipping.
    +
    +

    Thus, if you are unsure whether autofs paths can be mounted during backup, +stop autofs in pre_exec and reenable it in post_exec.

    +
    +
    +
    +
    +

    8. Examples

    +
    +
    +

    8.1. A backup host configuration from scratch

    +
    +
    +
    srwali01:~# mkdir /etc/ccollect
     srwali01:~# mkdir -p /etc/ccollect/defaults/intervals/
     srwali01:~# echo 28 > /etc/ccollect/defaults/intervals/taeglich
     srwali01:~# echo 52 > /etc/ccollect/defaults/intervals/woechentlich
    @@ -1488,12 +2004,12 @@ srwali01:/etc/ccollect/sources/local-root# mkdir /mnt/hdbackup/local-root
     srwali01:/etc/ccollect/sources/local-root# ccollect.sh taeglich local-root
     /o> ccollect.sh: Beginning backup using interval taeglich
     /=> Beginning to backup "local-root" ...
    -|-> 0 backup(s) already exist, keeping 28 backup(s).
    +|-> 0 backup(s) already exist, keeping 28 backup(s).

    After that, I added some more sources:

    -
    srwali01:~# cd /etc/ccollect/sources
    +
    srwali01:~# cd /etc/ccollect/sources
     srwali01:/etc/ccollect/sources# mkdir windos-wl6
     srwali01:/etc/ccollect/sources# cd windos-wl6/
     srwali01:/etc/ccollect/sources/windos-wl6# echo /mnt/win/SYS/WL6 > source
    @@ -1517,12 +2033,14 @@ srwali01:/etc/ccollect/sources/srwali03# cat > exclude << EOF
     > EOF
     srwali01:/etc/ccollect/sources/srwali03# echo 'root@10.103.2.3:/' > source
     srwali01:/etc/ccollect/sources/srwali03# echo /mnt/hdbackup/srwali03 > destination
    -srwali01:/etc/ccollect/sources/srwali03# mkdir /mnt/hdbackup/srwali03
    +srwali01:/etc/ccollect/sources/srwali03# mkdir /mnt/hdbackup/srwali03
    -
    +
    +
    +
    -
    # du (coreutils) 5.2.1
    +
    # du (coreutils) 5.2.1
     [10:53] srsyg01:sources% du -sh ~/backupdir
     4.6M    /home/nico/backupdir
     [10:53] srsyg01:sources% du -sh ~/backupdir/*
    @@ -1537,12 +2055,12 @@ srwali01:/etc/ccollect/sources# du -sh /mnt/hdbackup/wl6/
     186M    /mnt/hdbackup/wl6/
     srwali01:/etc/ccollect/sources# du -sh /mnt/hdbackup/wl6/*
     147M    /mnt/hdbackup/wl6/taeglich.2005-12-08-14:42.312
    -147M    /mnt/hdbackup/wl6/taeglich.2005-12-08-14:45.588
    +147M /mnt/hdbackup/wl6/taeglich.2005-12-08-14:45.588

    The backup of our main fileserver:

    -
    backup:~# df -h /home/backup/srsyg01/
    +
    backup:~# df -h /home/backup/srsyg01/
     Filesystem            Size  Used Avail Use% Mounted on
     /dev/mapper/backup--01-srsyg01
                           591G  451G  111G  81% /home/backup/srsyg01
    @@ -1559,13 +2077,13 @@ backup:~# du -sh /home/backup/srsyg01/*
     439G    /home/backup/srsyg01/daily.2006-02-03-01:00.22567
     16K     /home/backup/srsyg01/lost+found
     backup:~# du --version | head -n1
    -du (coreutils) 5.2.1
    +du (coreutils) 5.2.1

    Newer versions of du also detect the hardlinks, so we can even compare the sizes directly with du:

    -
    [8:16] eiche:~# du --version | head -n 1
    +
    [8:16] eiche:~# du --version | head -n 1
     du (GNU coreutils) 5.93
     [8:17] eiche:schwarzesloch# du -slh hydrogenium/*
     19G     hydrogenium/durcheinander.0
    @@ -1576,16 +2094,18 @@ du (GNU coreutils) 5.93
     19G     hydrogenium/durcheinander.0
     12G     hydrogenium/durcheinander.2006-01-17-00:27.13820
     1.5G    hydrogenium/durcheinander.2006-01-25-23:18.31328
    -200M    hydrogenium/durcheinander.2006-01-26-00:11.3332
    +200M hydrogenium/durcheinander.2006-01-26-00:11.3332

    In the second report (without -l) the sizes include the space the inodes of the hardlinks allocate.

    -

    8.3. A collection of backups on the backup server

    +
    +
    +

    8.3. A collection of backups on the backup server

    All the data of my important hosts is backuped to eiche into /mnt/schwarzesloch/backup:

    -
    [9:24] eiche:backup# ls *
    +
    [9:24] eiche:backup# ls *
     creme:
     woechentlich.2006-01-26-22:22.4153   woechentlich.2006-02-12-11:48.2461
     woechentlich.2006-01-26-22:23.4180   woechentlich.2006-02-18-23:00.7898
    @@ -1604,13 +2124,13 @@ woechentlich.2006-02-04-10:32.13766  woechentlich.2006-02-16-23:00.6185
     woechentlich.2006-02-05-23:02.15093  woechentlich.2006-02-23-23:00.11783
     woechentlich.2006-02-06-08:22.15994  woechentlich.2006-03-02-23:00.17346
     woechentlich.2006-02-06-19:40.16321  woechentlich.2006-03-09-23:00.29317
    -woechentlich.2006-02-12-11:51.2514   woechentlich.2006-03-16-23:00.4218
    +woechentlich.2006-02-12-11:51.2514 woechentlich.2006-03-16-23:00.4218

    And this incremental backup and the archive are copied to an external usb harddisk (attention: you should really use -H to backup the backup):

    -
    [9:23] eiche:backup# df -h
    +
    [9:23] eiche:backup# df -h
     Filesystem            Size  Used Avail Use% Mounted on
     rootfs                 14G  8.2G  4.9G  63% /
     /dev/root              14G  8.2G  4.9G  63% /
    @@ -1629,13 +2149,15 @@ DDIR=/mnt/usb/backup
     
     rsync -av -H --delete /mnt/schwarzesloch/ "$DDIR/schwarzesloch/"
     
    -rsync -av -H --delete /mnt/archiv/ "$DDIR/archiv/"
    +rsync -av -H --delete /mnt/archiv/ "$DDIR/archiv/"
    -

    8.4. Processes running when doing ccollect -p

    -

    Truncated output from ps axuwwwf:

    +
    +
    +

    8.4. Processes running when doing ccollect -j

    +

    Truncated output from ps axuwwwf:

    -
       S+   11:40   0:00  |   |   |   \_ /bin/sh /usr/local/bin/ccollect.sh daily -p ddba034 ddba045 ddba046 ddba047 ddba049 ddna010 ddna011
    +
       S+   11:40   0:00  |   |   |   \_ /bin/sh /usr/local/bin/ccollect.sh daily -j ddba034 ddba045 ddba046 ddba047 ddba049 ddna010 ddna011
        S+   11:40   0:00  |   |   |       \_ /bin/sh /usr/local/bin/ccollect.sh daily ddba034
        S+   11:40   0:00  |   |   |       |   \_ /bin/sh /usr/local/bin/ccollect.sh daily ddba034
        R+   11:40  23:40  |   |   |       |   |   \_ rsync -a --delete --numeric-ids --relative --delete-excluded --link-dest=/home/server/backup/ddba034
    @@ -1672,15 +2194,19 @@ rsync -av -H --delete /mnt/archiv/ "$DDIR/archiv/"
    S+ 11:40 0:00 | | | \_ /bin/sh /usr/local/bin/ccollect.sh daily ddna011 R+ 12:08 0:00 | | | | \_ rm -rf /etc/ccollect/sources/ddna011/destination/daily.2006-10-20-1502.7824 S+ 11:40 0:00 | | | \_ /bin/sh /usr/local/bin/ccollect.sh daily ddna011 - S+ 11:40 0:00 | | | \_ sed s:^:\[ddna011\] :
    + S+ 11:40 0:00 | | | \_ sed s:^:\[ddna011\] :

    As you can see, six processes are deleting old backups, while one backup (ddba034) is already copying data.

    +
    +
    +
    +

    diff --git a/software/ccollect/documentation/ccollect.text b/software/ccollect/documentation/ccollect.text index 56e575b8..b1c7dba2 100644 --- a/software/ccollect/documentation/ccollect.text +++ b/software/ccollect/documentation/ccollect.text @@ -1,7 +1,7 @@ ccollect - Installing, Configuring and Using ============================================ Nico Schottelius -0.8.1, for ccollect 0.8.1, Initial Version from 2006-01-13 +2.0, for ccollect 2.0, Initial Version from 2006-01-13 :Author Initials: NS @@ -72,8 +72,19 @@ Incompatibilities and changes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Versions 0.9 and 1.0 +^^^^^^^^^^^^^^^^^^^^ +- Added "Error: " prefix in _exit_err() + +Versions 0.8 and 0.9 +^^^^^^^^^^^^^^^^^^^^ +- Renamed script to ccollect (.sh is not needed) +- Removed feature to backup to a host via ccollect, added new tool + (FIXME: insert name here) that takes care of this via tunnel +- Perhaps creating subdirectory of source name (idea from Stefan Schlörholz) + Versions 0.7 and 0.8 -^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^ .The argument order changed: - Old: " [args] " @@ -91,7 +102,7 @@ change for you. - New: Options in $CCOLLECT_CONF/defaults are used as defaults (see below) Versions 0.6 and 0.7 -^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^ .The format of `destination` changed: - Before 0.7 it was a (link to a) directory - As of 0.7 it is a textfile containing the destination @@ -103,7 +114,7 @@ You can update your configuration using `tools/config-pre-0.7-to-0.7.sh`. Versions 0.5 and 0.6 -^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^ .The format of `rsync_options` changed: - Before 0.6 it was whitespace delimeted - As of 0.6 it is newline seperated (so you can pass whitespaces to `rsync`) @@ -120,7 +131,7 @@ XXXXX (- comes before digit). Versions 0.4 and 0.5 -^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^ Not a real incompatibilty, but seems to fit in this section: .0.5 does *NOT* require @@ -646,7 +657,7 @@ Detailed description of "rsync_failure_codes" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you have the file `rsync_failure_codes` in your source configuration directory, it should contain a newline-separated list of numbers representing -rsync exit codes. If rsync exits with any code in this list, a marker will +rsync exit codes. If rsync exits with any code in this list, a marker will be left in the destination directory indicating failure of this backup. If you have enabled delete_incomplete, then this backup will be deleted during the next ccollect run on the same interval. @@ -656,7 +667,7 @@ Detailed description of "mtime" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ By default, ccollect.sh chooses the most recent backup directory for cloning or the oldest for deletion based on the directory's last change time (ctime). -With this option, the sorting is done based on modification time (mtime). With +With this option, the sorting is done based on modification time (mtime). With this version of ccollect, the ctime and mtime of your backups will normally be the same and this option has no effect. However, if you, for example, move your backups to another hard disk using cp -a or rsync -a, you should use this @@ -971,6 +982,31 @@ you can enter your password (have a look at screen(1), especially "C-a M" and "C-a _", for more information). +Backup fails, if autofs is running, but sources not reachable +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If you are trying to backup a system containing paths that are managed +by autofs, you may run into this error: + +------------------------------------------------------------------------------- +2009-12-01-23:14:15: ccollect 0.8.1: Beginning backup using interval monatlich +[ikn] 2009-12-01-23:14:15: Beginning to backup +[ikn] 2009-12-01-23:14:15: Executing /home/users/nico/ethz/ccollect/sources/ikn/pre_exec ... +Enter LUKS passphrase: +[ikn] Command successful. +[ikn] key slot 0 unlocked. +[ikn] 2009-12-01-23:14:23: Finished /home/users/nico/ethz/ccollect/sources/ikn/pre_exec (return code 0). [ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/projects" +[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/scratch" +[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/sgscratch" +[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/supp" +[ikn] directory has vanished: "/home/users/nico/privat/firmen/ethz/autofs/sysadmin" +[ikn] rsync warning: some files vanished before they could be transferred (code 24) at main.c(1057) [sender=3.0.6] +[ikn] 2009-12-01-23:44:23: Source / is not readable. Skipping. +------------------------------------------------------------------------------- + +Thus, if you are unsure whether autofs paths can be mounted during backup, +stop autofs in pre_exec and reenable it in post_exec. + + Examples -------- @@ -1153,12 +1189,12 @@ rsync -av -H --delete /mnt/archiv/ "$DDIR/archiv/" ------------------------------------------------------------------------- -Processes running when doing ccollect -p +Processes running when doing ccollect -j ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Truncated output from `ps axuwwwf`: ------------------------------------------------------------------------- - S+ 11:40 0:00 | | | \_ /bin/sh /usr/local/bin/ccollect.sh daily -p ddba034 ddba045 ddba046 ddba047 ddba049 ddna010 ddna011 + S+ 11:40 0:00 | | | \_ /bin/sh /usr/local/bin/ccollect.sh daily -j ddba034 ddba045 ddba046 ddba047 ddba049 ddna010 ddna011 S+ 11:40 0:00 | | | \_ /bin/sh /usr/local/bin/ccollect.sh daily ddba034 S+ 11:40 0:00 | | | | \_ /bin/sh /usr/local/bin/ccollect.sh daily ddba034 R+ 11:40 23:40 | | | | | \_ rsync -a --delete --numeric-ids --relative --delete-excluded --link-dest=/home/server/backup/ddba034 diff --git a/software/ccollect/documentation/man/ccollect.1 b/software/ccollect/documentation/man/ccollect.1 index 01a30863..259a6a64 100644 --- a/software/ccollect/documentation/man/ccollect.1 +++ b/software/ccollect/documentation/man/ccollect.1 @@ -1,13 +1,22 @@ '\" t .\" Title: ccollect -.\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.75.1 -.\" Date: 11/01/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] +.\" Author: Nico Schottelius +.\" Generator: DocBook XSL Stylesheets v1.76.1 +.\" Date: 09/26/2016 +.\" Manual: \ \& +.\" Source: \ \& .\" Language: English .\" -.TH "CCOLLECT" "1" "11/01/2009" "[FIXME: source]" "[FIXME: manual]" +.TH "CCOLLECT" "1" "09/26/2016" "\ \&" "\ \&" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -30,19 +39,24 @@ ccollect is a backup utility written in the sh\-scripting language\&. It does no For more information refer to the manual titled "ccollect \- Installing, Configuring and Using" (available as text (asciidoc), texinfo or html)\&. .SH "OPTIONS" .PP +\-a, \-\-all +.RS 4 +Backup all sources specified in /etc/ccollect/sources +.RE +.PP \-h, \-\-help .RS 4 Show the help screen .RE .PP -\-p, \-\-parallel +\-j [max], \-\-jobs [max] .RS 4 -Parallelise backup processes +Specifies the number of jobs to run simultaneously\&. If max is not specified then parallelise all jobs\&. .RE .PP -\-a, \-\-all +\-p, \-\-parallel .RS 4 -Backup all sources specified in /etc/ccollect/sources +Parallelise backup processes (deprecated from 2\&.0) .RE .PP \-v, \-\-verbose @@ -66,3 +80,9 @@ Main web site: http://www\&.nico\&.schottelius\&.org/software/ccollect/ .SH "COPYING" .sp Copyright (C) 2006\-2008 Nico Schottelius\&. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3)\&. +.SH "AUTHOR" +.PP +\fBNico Schottelius\fR <\&nico\-ccollect\-\-@\-\-schottelius\&.org\&> +.RS 4 +Author. +.RE diff --git a/software/ccollect/documentation/man/ccollect.htm b/software/ccollect/documentation/man/ccollect.htm index 91fcd0ad..00a607d4 100644 --- a/software/ccollect/documentation/man/ccollect.htm +++ b/software/ccollect/documentation/man/ccollect.htm @@ -1,19 +1,24 @@ -ccollect(1)

    NAME

    ccollect - (pseudo) incremental backup with different exclude lists using hardlinks and rsync

    SYNOPSIS

    ccollect.sh [args] <interval name> <sources to backup>

    DESCRIPTION

    ccollect is a backup utility written in the sh-scripting language. +ccollect(1)

    ccollect(1)


    NAME

    ccollect - (pseudo) incremental backup with different exclude lists using hardlinks and rsync

    SYNOPSIS

    ccollect.sh [args] <interval name> <sources to backup>

    DESCRIPTION

    ccollect is a backup utility written in the sh-scripting language. It does not depend on a specific shell, only /bin/sh needs to be bourne shell compatibel (like dash, ksh, zsh, bash, …).

    For more information refer to the manual titled "ccollect - Installing, Configuring and Using" (available as text (asciidoc), texinfo or html).

    OPTIONS

    +-a, --all +
    + Backup all sources specified in /etc/ccollect/sources +
    -h, --help
    Show the help screen
    +-j [max], --jobs [max] +
    + Specifies the number of jobs to run simultaneously. + If max is not specified then parallelise all jobs. +
    -p, --parallel
    - Parallelise backup processes -
    --a, --all -
    - Backup all sources specified in /etc/ccollect/sources + Parallelise backup processes (deprecated from 2.0)
    -v, --verbose
    diff --git a/software/ccollect/documentation/man/ccollect.html b/software/ccollect/documentation/man/ccollect.html index 4d5eaff8..79de6741 100644 --- a/software/ccollect/documentation/man/ccollect.html +++ b/software/ccollect/documentation/man/ccollect.html @@ -2,15 +2,25 @@ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> - - + + ccollect(1) + - + +
    +

    1. NAME

    ccollect - (pseudo) incremental backup with different exclude lists using hardlinks and rsync

    +
    +

    2. SYNOPSIS

    ccollect.sh [args] <interval name> <sources to backup>

    +
    +

    3. DESCRIPTION

    -

    ccollect is a backup utility written in the sh-scripting language. -It does not depend on a specific shell, only /bin/sh needs to be +

    ccollect is a backup utility written in the sh-scripting language. +It does not depend on a specific shell, only /bin/sh needs to be bourne shell compatibel (like dash, ksh, zsh, bash, …).

    For more information refer to the manual titled "ccollect - Installing, Configuring and Using" (available as text (asciidoc), texinfo or html).

    +
    +

    4. OPTIONS

    +-a, --all +
    +
    +

    + Backup all sources specified in /etc/ccollect/sources +

    +
    +
    -h, --help
    @@ -417,19 +782,20 @@ texinfo or html).

    +-j [max], --jobs [max] +
    +
    +

    + Specifies the number of jobs to run simultaneously. + If max is not specified then parallelise all jobs. +

    +
    +
    -p, --parallel

    - Parallelise backup processes -

    -
    -
    --a, --all -
    -
    -

    - Backup all sources specified in /etc/ccollect/sources + Parallelise backup processes (deprecated from 2.0)

    @@ -450,27 +816,38 @@ texinfo or html).

    +
    +

    5. SEE ALSO

    ccollect_add_source(1), ccollect_analyse_logs(1), ccollect_logwrapper(1) ccollect_delete_source(1), ccollect_list_intervals(1)

    +
    +

    6. AUTHOR

    +
    + +

    8. COPYING

    Copyright (C) 2006-2008 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3).

    +
    +
    +

    diff --git a/software/ccollect/documentation/man/ccollect_add_source.1 b/software/ccollect/documentation/man/ccollect_add_source.1 index 4f1183cd..d6a8b349 100644 --- a/software/ccollect/documentation/man/ccollect_add_source.1 +++ b/software/ccollect/documentation/man/ccollect_add_source.1 @@ -1,13 +1,22 @@ '\" t .\" Title: ccollect_add_source -.\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.75.1 -.\" Date: 11/01/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] +.\" Author: Nico Schottelius +.\" Generator: DocBook XSL Stylesheets v1.76.1 +.\" Date: 09/26/2016 +.\" Manual: \ \& +.\" Source: \ \& .\" Language: English .\" -.TH "CCOLLECT_ADD_SOURCE" "1" "11/01/2009" "[FIXME: source]" "[FIXME: manual]" +.TH "CCOLLECT_ADD_SOURCE" "1" "09/26/2016" "\ \&" "\ \&" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -76,3 +85,9 @@ Main web site: http://www\&.nico\&.schottelius\&.org/software/ccollect/ .SH "COPYING" .sp Copyright (C) 2007\-2008 Nico Schottelius\&. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3)\&. +.SH "AUTHOR" +.PP +\fBNico Schottelius\fR <\&nico\-ccollect\-\-@\-\-schottelius\&.org\&> +.RS 4 +Author. +.RE diff --git a/software/ccollect/documentation/man/ccollect_add_source.htm b/software/ccollect/documentation/man/ccollect_add_source.htm index 6208dfe9..7bb6fdc5 100644 --- a/software/ccollect/documentation/man/ccollect_add_source.htm +++ b/software/ccollect/documentation/man/ccollect_add_source.htm @@ -1,4 +1,4 @@ -ccollect_add_source(1)

    ccollect_add_source(1)


    NAME

    ccollect_add_source - create new source for ccollect(1)

    SYNOPSIS

    ccollect_add_source.sh <hostnames to create sources for>

    DESCRIPTION

    ccollect_add_source.sh creates a new backup source for use with ccollect(1). +ccollect_add_source(1)

    ccollect_add_source(1)


    NAME

    ccollect_add_source - create new source for ccollect(1)

    SYNOPSIS

    ccollect_add_source.sh <hostnames to create sources for>

    DESCRIPTION

    ccollect_add_source.sh creates a new backup source for use with ccollect(1). It copies the files from to the source directory with the hostname below $CCOLLECT_CONF/sources. It is designed to run on a backup server to create new directories for new hosts.

    FILES

    diff --git a/software/ccollect/documentation/man/ccollect_add_source.html b/software/ccollect/documentation/man/ccollect_add_source.html index dd3c2909..d7e681a5 100644 --- a/software/ccollect/documentation/man/ccollect_add_source.html +++ b/software/ccollect/documentation/man/ccollect_add_source.html @@ -2,15 +2,25 @@ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> - - + + ccollect_add_source(1) + - + +
    +

    1. NAME

    ccollect_add_source - create new source for ccollect(1)

    +
    +

    2. SYNOPSIS

    ccollect_add_source.sh <hostnames to create sources for>

    +
    +

    3. DESCRIPTION

    ccollect_add_source.sh creates a new backup source for use with ccollect(1). @@ -403,6 +758,8 @@ It copies the files from to the source directory with the hostname below $CCOLLECT_CONF/sources. It is designed to run on a backup server to create new directories for new hosts.

    +
    +

    4. FILES

    @@ -452,8 +809,8 @@ destination_base

    A link to the directory where to store the backups. Below this directory - ccollect_add_source.sh will create a directory with the hostname you - specified on the command line. A common valua for destination_base is + ccollect_add_source.sh will create a directory with the hostname you + specified on the command line. A common valua for destination_base is /home/server/backup.

    @@ -465,34 +822,45 @@ source_postfix

    - source_prefix is put before the hostname, source_postfix is appended - after it. A common value for source_prefix maybe root@ and :/ - for source_postfix. + source_prefix is put before the hostname, source_postfix is appended + after it. A common value for source_prefix maybe root@ and :/ + for source_postfix.

    +
    +

    5. SEE ALSO

    ccollect(1), ccollect_analyse_logs.sh, ccollect_delete_source(1), ccollect_list_intervals(1), ccollect_logwrapper(1),

    +
    +

    6. AUTHOR

    +
    + +

    8. COPYING

    Copyright (C) 2007-2008 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3).

    +
    +
    +

    diff --git a/software/ccollect/documentation/man/ccollect_analyse_logs.1 b/software/ccollect/documentation/man/ccollect_analyse_logs.1 index d51d16fb..bccc3721 100644 --- a/software/ccollect/documentation/man/ccollect_analyse_logs.1 +++ b/software/ccollect/documentation/man/ccollect_analyse_logs.1 @@ -1,13 +1,22 @@ '\" t .\" Title: ccollect_analyse_logs -.\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.75.1 -.\" Date: 11/01/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] +.\" Author: Nico Schottelius +.\" Generator: DocBook XSL Stylesheets v1.76.1 +.\" Date: 09/26/2016 +.\" Manual: \ \& +.\" Source: \ \& .\" Language: English .\" -.TH "CCOLLECT_ANALYSE_LOG" "1" "11/01/2009" "[FIXME: source]" "[FIXME: manual]" +.TH "CCOLLECT_ANALYSE_LOG" "1" "09/26/2016" "\ \&" "\ \&" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -55,3 +64,9 @@ Main web site: http://www\&.nico\&.schottelius\&.org/software/ccollect/ .SH "COPYING" .sp Copyright (C) 2007\-2008 Nico Schottelius\&. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3)\&. +.SH "AUTHOR" +.PP +\fBNico Schottelius\fR <\&nico\-ccollect\-\-@\-\-schottelius\&.org\&> +.RS 4 +Author. +.RE diff --git a/software/ccollect/documentation/man/ccollect_analyse_logs.htm b/software/ccollect/documentation/man/ccollect_analyse_logs.htm index 4b2e9692..cb0179d4 100644 --- a/software/ccollect/documentation/man/ccollect_analyse_logs.htm +++ b/software/ccollect/documentation/man/ccollect_analyse_logs.htm @@ -1,4 +1,4 @@ -ccollect_analyse_logs(1)

    ccollect_analyse_logs(1)


    NAME

    ccollect_analyse_logs - analyse logs produced by ccollect(1)

    SYNOPSIS

    ccollect_analyse_logs.sh [iwe]

    DESCRIPTION

    ccollect_analyse_logs.sh reads the logfiles from stdin. You have to specify +ccollect_analyse_logs(1)

    ccollect_analyse_logs(1)


    NAME

    ccollect_analyse_logs - analyse logs produced by ccollect(1)

    SYNOPSIS

    ccollect_analyse_logs.sh [iwe]

    DESCRIPTION

    ccollect_analyse_logs.sh reads the logfiles from stdin. You have to specify at least one of the three loglevels (*i*nformational, *w*arning, *e*rror). Any combination of them is allowed.

    FILES

    ccollect log files diff --git a/software/ccollect/documentation/man/ccollect_analyse_logs.html b/software/ccollect/documentation/man/ccollect_analyse_logs.html index d370e3b8..08471b19 100644 --- a/software/ccollect/documentation/man/ccollect_analyse_logs.html +++ b/software/ccollect/documentation/man/ccollect_analyse_logs.html @@ -2,15 +2,25 @@ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> - - + + ccollect_analyse_logs(1) + - + +
    +

    1. NAME

    ccollect_analyse_logs - analyse logs produced by ccollect(1)

    +
    +

    2. SYNOPSIS

    ccollect_analyse_logs.sh [iwe]

    +
    +

    3. DESCRIPTION

    ccollect_analyse_logs.sh reads the logfiles from stdin. You have to specify at least one of the three loglevels (*i*nformational, *w*arning, *e*rror). Any combination of them is allowed.

    +
    +

    4. FILES

    @@ -415,6 +772,8 @@ ccollect log files
    +
    +

    5. EXAMPLES

    @@ -436,27 +795,38 @@ ccollect_analyse_logs.sh iw < /var/log/ccollect/all_together
    +
    +

    6. SEE ALSO

    ccollect(1), ccollect_add_source.sh, ccollect_delete_source(1), ccollect_list_intervals(1), ccollect_logwrapper(1),

    +
    +

    7. AUTHOR

    +
    + +

    9. COPYING

    Copyright (C) 2007-2008 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3).

    +
    +
    +

    diff --git a/software/ccollect/documentation/man/ccollect_delete_source.1 b/software/ccollect/documentation/man/ccollect_delete_source.1 index 28180559..5f1e7df1 100644 --- a/software/ccollect/documentation/man/ccollect_delete_source.1 +++ b/software/ccollect/documentation/man/ccollect_delete_source.1 @@ -1,13 +1,22 @@ '\" t .\" Title: ccollect_delete_source -.\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.75.1 -.\" Date: 11/01/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] +.\" Author: Nico Schottelius +.\" Generator: DocBook XSL Stylesheets v1.76.1 +.\" Date: 09/26/2016 +.\" Manual: \ \& +.\" Source: \ \& .\" Language: English .\" -.TH "CCOLLECT_DELETE_SOUR" "1" "11/01/2009" "[FIXME: source]" "[FIXME: manual]" +.TH "CCOLLECT_DELETE_SOUR" "1" "09/26/2016" "\ \&" "\ \&" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -48,3 +57,9 @@ Main web site: http://www\&.nico\&.schottelius\&.org/software/ccollect/ .SH "COPYING" .sp Copyright (C) 2007\-2008 Nico Schottelius\&. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3)\&. +.SH "AUTHOR" +.PP +\fBNico Schottelius\fR <\&nico\-ccollect\-\-@\-\-schottelius\&.org\&> +.RS 4 +Author. +.RE diff --git a/software/ccollect/documentation/man/ccollect_delete_source.htm b/software/ccollect/documentation/man/ccollect_delete_source.htm index 2f5228ad..7f4ee617 100644 --- a/software/ccollect/documentation/man/ccollect_delete_source.htm +++ b/software/ccollect/documentation/man/ccollect_delete_source.htm @@ -1,4 +1,4 @@ -ccollect_delete_source(1)

    ccollect_delete_source(1)


    NAME

    ccollect_delete_source - delete sources from ccollect(1)

    SYNOPSIS

    ccollect_delete_source.sh [-d] [-f] <hostnames to create sources for>

    DESCRIPTION

    ccollect_delete_source.sh deletes backup sources from ccollect(1) and optional +ccollect_delete_source(1)

    ccollect_delete_source(1)


    NAME

    ccollect_delete_source - delete sources from ccollect(1)

    SYNOPSIS

    ccollect_delete_source.sh [-d] [-f] <hostnames to create sources for>

    DESCRIPTION

    ccollect_delete_source.sh deletes backup sources from ccollect(1) and optional also the backups created for that source.

    OPTIONS

    -d: Delete also the destination directory. add_ccollect_source.sh will change to the source/name/destination directory, get the absolute name and delete diff --git a/software/ccollect/documentation/man/ccollect_delete_source.html b/software/ccollect/documentation/man/ccollect_delete_source.html index a66b04ab..0bdfcd66 100644 --- a/software/ccollect/documentation/man/ccollect_delete_source.html +++ b/software/ccollect/documentation/man/ccollect_delete_source.html @@ -2,15 +2,25 @@ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> - - + + ccollect_delete_source(1) + - +

    +
    +

    1. NAME

    ccollect_delete_source - delete sources from ccollect(1)

    +
    +

    2. SYNOPSIS

    ccollect_delete_source.sh [-d] [-f] <hostnames to create sources for>

    +
    +

    3. DESCRIPTION

    ccollect_delete_source.sh deletes backup sources from ccollect(1) and optional also the backups created for that source.

    +
    +

    4. OPTIONS

    -d: - Delete also the destination directory. add_ccollect_source.sh will change + Delete also the destination directory. add_ccollect_source.sh will change to the source/name/destination directory, get the absolute name and delete it recursively. -f: Force deletion. Do not ask. Very handy for people who know what they do. Very dangerous for everyone else.

    +
    +

    5. FILES

    @@ -424,27 +783,38 @@ $CCOLLECT_CONF/sources
    +
    +

    6. SEE ALSO

    ccollect(1), ccollect_add_source(1), ccollect_add_source(1), ccollect_logwrapper(1), ccollect_list_intervals(1)

    +
    +

    7. AUTHOR

    +
    + +

    9. COPYING

    Copyright (C) 2007-2008 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3).

    +
    +
    +

    diff --git a/software/ccollect/documentation/man/ccollect_list_intervals.1 b/software/ccollect/documentation/man/ccollect_list_intervals.1 index 50398310..fc596588 100644 --- a/software/ccollect/documentation/man/ccollect_list_intervals.1 +++ b/software/ccollect/documentation/man/ccollect_list_intervals.1 @@ -1,13 +1,22 @@ '\" t .\" Title: ccollect_list_intervals -.\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.75.1 -.\" Date: 11/01/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] +.\" Author: Nico Schottelius +.\" Generator: DocBook XSL Stylesheets v1.76.1 +.\" Date: 09/26/2016 +.\" Manual: \ \& +.\" Source: \ \& .\" Language: English .\" -.TH "CCOLLECT_LIST_INTERV" "1" "11/01/2009" "[FIXME: source]" "[FIXME: manual]" +.TH "CCOLLECT_LIST_INTERV" "1" "09/26/2016" "\ \&" "\ \&" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -45,3 +54,9 @@ Main web site: http://www\&.nico\&.schottelius\&.org/software/ccollect/ .SH "COPYING" .sp Copyright (C) 2007\-2008 Nico Schottelius\&. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3)\&. +.SH "AUTHOR" +.PP +\fBNico Schottelius\fR <\&nico\-ccollect\-\-@\-\-schottelius\&.org\&> +.RS 4 +Author. +.RE diff --git a/software/ccollect/documentation/man/ccollect_list_intervals.htm b/software/ccollect/documentation/man/ccollect_list_intervals.htm index 28af09e5..64bea236 100644 --- a/software/ccollect/documentation/man/ccollect_list_intervals.htm +++ b/software/ccollect/documentation/man/ccollect_list_intervals.htm @@ -1,4 +1,4 @@ -ccollect_list_intervals(1)

    ccollect_list_intervals(1)


    NAME

    ccollect_list_intervals - list available intervals from ccollect(1)

    SYNOPSIS

    ccollect_list_intervals.sh

    DESCRIPTION

    ccollect_list_intervals.sh shows intervals specified in the configuration +ccollect_list_intervals(1)

    ccollect_list_intervals(1)


    NAME

    ccollect_list_intervals - list available intervals from ccollect(1)

    SYNOPSIS

    ccollect_list_intervals.sh

    DESCRIPTION

    ccollect_list_intervals.sh shows intervals specified in the configuration for ccollect(1). It displays the name of each interval, followed by a colon followed by the number backups to keep.

    FILES

    $CCOLLECT_CONF/intervals diff --git a/software/ccollect/documentation/man/ccollect_list_intervals.html b/software/ccollect/documentation/man/ccollect_list_intervals.html index 463560e5..e6a3e3e8 100644 --- a/software/ccollect/documentation/man/ccollect_list_intervals.html +++ b/software/ccollect/documentation/man/ccollect_list_intervals.html @@ -2,15 +2,25 @@ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> - - + + ccollect_list_intervals(1) + - + +
    +

    1. NAME

    ccollect_list_intervals - list available intervals from ccollect(1)

    +
    +

    2. SYNOPSIS

    ccollect_list_intervals.sh

    +
    +

    3. DESCRIPTION

    ccollect_list_intervals.sh shows intervals specified in the configuration for ccollect(1). It displays the name of each interval, followed by a colon followed by the number backups to keep.

    +
    +

    4. FILES

    @@ -415,27 +772,38 @@ $CCOLLECT_CONF/intervals
    +
    +

    5. SEE ALSO

    collect(1), ccollect_add_source(1), ccollect_analyse_logs(1), ccollect_delete_source(1), ccollect_logwrapper(1)

    +
    +

    6. AUTHOR

    +
    + +

    8. COPYING

    Copyright (C) 2007-2008 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3).

    +
    +
    +

    diff --git a/software/ccollect/documentation/man/ccollect_logwrapper.1 b/software/ccollect/documentation/man/ccollect_logwrapper.1 index cf6a8370..09e85bd8 100644 --- a/software/ccollect/documentation/man/ccollect_logwrapper.1 +++ b/software/ccollect/documentation/man/ccollect_logwrapper.1 @@ -1,13 +1,22 @@ '\" t .\" Title: ccollect_logwrapper -.\" Author: [see the "AUTHOR" section] -.\" Generator: DocBook XSL Stylesheets v1.75.1 -.\" Date: 11/01/2009 -.\" Manual: [FIXME: manual] -.\" Source: [FIXME: source] +.\" Author: Nico Schottelius +.\" Generator: DocBook XSL Stylesheets v1.76.1 +.\" Date: 09/26/2016 +.\" Manual: \ \& +.\" Source: \ \& .\" Language: English .\" -.TH "CCOLLECT_LOGWRAPPER" "1" "11/01/2009" "[FIXME: source]" "[FIXME: manual]" +.TH "CCOLLECT_LOGWRAPPER" "1" "09/26/2016" "\ \&" "\ \&" +.\" ----------------------------------------------------------------- +.\" * Define some portability stuff +.\" ----------------------------------------------------------------- +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.\" http://bugs.debian.org/507673 +.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html +.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -53,3 +62,9 @@ Main web site: http://www\&.nico\&.schottelius\&.org/software/ccollect/ .SH "COPYING" .sp Copyright (C) 2007\-2008 Nico Schottelius\&. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3)\&. +.SH "AUTHOR" +.PP +\fBNico Schottelius\fR <\&nico\-ccollect\-\-@\-\-schottelius\&.org\&> +.RS 4 +Author. +.RE diff --git a/software/ccollect/documentation/man/ccollect_logwrapper.htm b/software/ccollect/documentation/man/ccollect_logwrapper.htm index 855f0f1d..4d046a8c 100644 --- a/software/ccollect/documentation/man/ccollect_logwrapper.htm +++ b/software/ccollect/documentation/man/ccollect_logwrapper.htm @@ -1,4 +1,4 @@ -ccollect_logwrapper(1)

    ccollect_logwrapper(1)


    NAME

    ccollect_logwrapper - start ccollect(1) and create a unique logfile

    SYNOPSIS

    ccollect_logwrapper.sh <ccollect options>

    DESCRIPTION

    ccollect_logwrapper.sh creates a unique logfile below +ccollect_logwrapper(1)

    ccollect_logwrapper(1)


    NAME

    ccollect_logwrapper - start ccollect(1) and create a unique logfile

    SYNOPSIS

    ccollect_logwrapper.sh <ccollect options>

    DESCRIPTION

    ccollect_logwrapper.sh creates a unique logfile below $CCOLLECT_CONF/logwrapper and redirects ccollect(1) output (stdout and stderr) to it.

    OPTIONS

    Options are passed directly to ccollect(1).

    FILES

    $CCOLLECT_CONF/logwrapper diff --git a/software/ccollect/documentation/man/ccollect_logwrapper.html b/software/ccollect/documentation/man/ccollect_logwrapper.html index 2ad29cf1..b7fbbdb5 100644 --- a/software/ccollect/documentation/man/ccollect_logwrapper.html +++ b/software/ccollect/documentation/man/ccollect_logwrapper.html @@ -2,15 +2,25 @@ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> - - + + ccollect_logwrapper(1) + - + +
    +

    1. NAME

    ccollect_logwrapper - start ccollect(1) and create a unique logfile

    +
    +

    2. SYNOPSIS

    ccollect_logwrapper.sh <ccollect options>

    +
    +

    3. DESCRIPTION

    ccollect_logwrapper.sh creates a unique logfile below $CCOLLECT_CONF/logwrapper and redirects ccollect(1) output (stdout and stderr) to it.

    +
    +

    4. OPTIONS

    Options are passed directly to ccollect(1).

    +
    +

    5. FILES

    @@ -427,27 +786,38 @@ $CCOLLECT_CONF/logwrapper/destination
    +
    +

    6. SEE ALSO

    ccollect(1), ccollect_add_source(1), ccollect_analyse_logs(1), ccollect_delete_source(1), ccollect_list_intervals(1)

    +
    +

    7. AUTHOR

    +
    + +

    9. COPYING

    Copyright (C) 2007-2008 Nico Schottelius. Free use of this software is granted under the terms of the GNU General Public License Version 3 (GPLv3).

    +
    +
    +

    diff --git a/software/ccollect/download.mdwn b/software/ccollect/download.mdwn index 6187b558..d330a65d 100644 --- a/software/ccollect/download.mdwn +++ b/software/ccollect/download.mdwn @@ -5,6 +5,7 @@ You can get the latest (development) version via git: git clone https://github.com/telmich/ccollect.git ## Releases + * ccollect-2.0.tar.bz2 * [[ccollect-0.8.tar.bz2]] ([[RPM|ccollect-0.8-0.noarch.rpm]]) * ccollect-0.7.1.tar.bz2 * ccollect-0.7.0.tar.bz2 diff --git a/software/ccollect/download/ccollect-2.0.tar.bz2 b/software/ccollect/download/ccollect-2.0.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..277d7a886cdb3ed983bfce8f446c26652bfb8b6d GIT binary patch literal 68032 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