From c306bada20676c069327296916b645a81225ec3b Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 23 Jul 2009 20:36:08 +0200 Subject: [PATCH 01/14] blog: ccollect 0.8 soon Signed-off-by: Nico Schottelius --- blog/ccollect-0.8-to-be-released-soon.mdwn | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 blog/ccollect-0.8-to-be-released-soon.mdwn diff --git a/blog/ccollect-0.8-to-be-released-soon.mdwn b/blog/ccollect-0.8-to-be-released-soon.mdwn new file mode 100644 index 00000000..3e47532a --- /dev/null +++ b/blog/ccollect-0.8-to-be-released-soon.mdwn @@ -0,0 +1,14 @@ +[[!meta title="ccollect 0.8 will soon be released"]] + +I'm just pretty impressed by a +[great discussion on the ccollect mailinglist](http://l.schottelius.org/pipermail/ccollect/2009-July/000003.html), in which the automatic selection of the right interval was +discussed. + +Just some hours before I started to do +[some cleanups](http://git.schottelius.org/?p=cLinux/ccollect.git;a=summary) on +[[ccollect|software/ccollect]] and now I'm pretty motivated to finish +those changes and to include the proposed one. + +So stay tuned and expect ccollect-0.8 to be available soon! + +[[!tag backup unix]] From 3c251203a88132b4daccca326b756effe4f452b4 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 23 Jul 2009 21:53:09 +0200 Subject: [PATCH 02/14] add link to linux user Signed-off-by: Nico Schottelius --- software/ccollect.mdwn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/software/ccollect.mdwn b/software/ccollect.mdwn index d5635416..2b3d7df5 100644 --- a/software/ccollect.mdwn +++ b/software/ccollect.mdwn @@ -165,5 +165,8 @@ After adding one of the above sources.list entries do * [German report about ccollect including a description of reverse ssh tunnels](http://muasch.ch/article/show/ccollect-backup-software) by Benedikt Köppel, + * The German magazine [Linux User](http://www.linuxuser.de/) + writes about ccollect in the + [2009/08 edition](http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2009/08). [[!tag unix backup]] From 8bb5d6b57f0f29059f07f78b9e98cadc4aef4bcf Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 23 Jul 2009 22:08:55 +0200 Subject: [PATCH 03/14] Debian archives are outdated Signed-off-by: Nico Schottelius --- software/ccollect.mdwn | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/software/ccollect.mdwn b/software/ccollect.mdwn index 2b3d7df5..36591055 100644 --- a/software/ccollect.mdwn +++ b/software/ccollect.mdwn @@ -137,20 +137,17 @@ Additionally, the following other git ressources are available: (browse source) #### Gentoo -

ccollect is included into gentoo portage. Thanks to René Nussbaumer. +ccollect is included into gentoo portage. +Thanks to René Nussbaumer. ### Debian -

Marcus Wagner makes ccollect available as Debian packages. -
To get ccollect insert the following line into your /etc/apt/sources.list: - deb http://deb.notestc.de/ clinux/ -


-Daniel Aubry also created a Debian package containing ccollect. -To use his archive, add the following line into your /etc/apt/sources.list: - deb http://debian.syhosting.ch/ software/ +The Debian archives provided by +Marcus Wagner (deb http://deb.notestc.de/ clinux/) and +Daniel Aubry (deb http://debian.syhosting.ch/ software/) +are currently outdated. -After adding one of the above sources.list entries do - - apt-get update && apt-get install ccollect +Feel free to use their work to create recent debs or +even include it into Debian. ## Support * There is a general From 5d038c367284110d71b8bb1a29ee6ff4701c0f9f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 24 Jul 2009 08:30:05 +0200 Subject: [PATCH 04/14] move press article into central location Signed-off-by: Nico Schottelius --- about/press.mdwn | 29 +++++++++++++++++++++-------- software/ccollect.mdwn | 3 +-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/about/press.mdwn b/about/press.mdwn index c5ea84ee..2da18080 100644 --- a/about/press.mdwn +++ b/about/press.mdwn @@ -2,18 +2,31 @@ The following is an incomplete list of news and articles about my projects and those I wrote: -* February 2005: [[Linux-Magazin about monotone and gnu arch (tla)|dokumentationen/linux-magazin-monotone-gnu-arch-tla/]] +* August 2009: + The German magazine [Linux User](http://www.linuxuser.de/) + writes about [[ccollect|software/ccollect]] in the + [2009/08 edition](http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2009/08). +* February 2005: The German magazine + [Linux-Magazin](http://www.linux-magazin.de/) contains my article + [[about monotone and gnu arch (tla)|dokumentationen/linux-magazin-monotone-gnu-arch-tla/]]. * 26\. August 2004: - [OpenNET (russia)](http://www.opennet.ru/opennews/art.shtml?num=4285) - about the [[!unixso blacksheep]] project -* 9\. July 2004: [Pro-Linux](http://www.pro-linux.de/news/2004/7019.html) - about the [LinuxDistributionen Wiki](https://wiki.schottelius.org/usemod/cgi-bin/wiki.pl?LinuxDistributionen) -* 14\. April 2004: [The Linux Documentation Project](http://www.tldp.org/ldpwn/20040414.html) + The Russian newssite [OpenNET](http://www.opennet.ru) + [writes about](http://www.opennet.ru/opennews/art.shtml?num=4285) + the [[!unixso blacksheep]] project. +* 9\. July 2004: + The German newssite [Pro-Linux](http://www.pro-linux.de) writes about the + [LinuxDistributionen Wiki](http://www.pro-linux.de/news/2004/7019.html) + (which was located at + https://wiki.schottelius.org/usemod/cgi-bin/wiki.pl?LinuxDistributionen). +* 14\. April 2004: + [The Linux Documentation Project](http://www.tldp.org/ldpwn/20040414.html) about the document explaining [why cryptoloops offer only partial security](http://nico.schotteli.us/papers/linux/cryptoloop-partial-security) -* 22\. August 2003: [Newsforge](http://newsvac.newsforge.com/newsvac/03/08/22/134259.shtml) +* 22\. August 2003: + [Newsforge](http://newsvac.newsforge.com/newsvac/03/08/22/134259.shtml) about the [[!unixso blacksheep]] project -* 31\. July 2003: [Pro-Linux](http://www.pro-linux.de/news/2003/5794.html) +* 31\. July 2003: + [Pro-Linux](http://www.pro-linux.de/news/2003/5794.html) about the [[!unixso blacksheep]] project diff --git a/software/ccollect.mdwn b/software/ccollect.mdwn index 36591055..db020659 100644 --- a/software/ccollect.mdwn +++ b/software/ccollect.mdwn @@ -163,7 +163,6 @@ even include it into Debian. of reverse ssh tunnels](http://muasch.ch/article/show/ccollect-backup-software) by Benedikt Köppel, * The German magazine [Linux User](http://www.linuxuser.de/) - writes about ccollect in the - [2009/08 edition](http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2009/08). + [[writes about ccollect in the 2009/08 edition|about/press]]. [[!tag unix backup]] From a1e96baf4c9f6ecca09048fa353d5bf83a48555d Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 28 Jul 2009 18:35:40 +0200 Subject: [PATCH 05/14] blogentry: ccollect-0.8-many-changes-quiet-if-down.mdwn Signed-off-by: Nico Schottelius --- about.mdwn | 3 +- about/projects.mdwn | 40 +++++++++++++++++++ ...ollect-0.8-many-changes-quiet-if-down.mdwn | 25 ++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 about/projects.mdwn create mode 100644 blog/ccollect-0.8-many-changes-quiet-if-down.mdwn diff --git a/about.mdwn b/about.mdwn index 704594b5..a5e8761c 100644 --- a/about.mdwn +++ b/about.mdwn @@ -11,7 +11,8 @@ I personally do not think it's wise to publish detailled personal information in the internet, because they are personal (versus public). To get an impression of what I do and who I am, you can have a look at -[[some press articles|press]] or some of my [[websites|websites]]. +[[some press articles|press]], my +[[project list|projects]] or some of my [[websites|websites]]. If you want to know more about me, there are [many](http://www.google.com/search?q=%22nico+schottelius%22) diff --git a/about/projects.mdwn b/about/projects.mdwn new file mode 100644 index 00000000..03a79dbe --- /dev/null +++ b/about/projects.mdwn @@ -0,0 +1,40 @@ +[[!meta title="Projects"]] + +The following is an incomplete list of projects I'm working on: + + * carbon + * cconf / chamelon: autoconf replacements + * ccollaborate + * cinit: fast and intelligent init system + * cLinux: communities Linux distribution + * cnp: create new project (assistant for new FOSS projects) + * ccollect: + * corein: Complete remote, automatic installation and configuration + * cvoktrainer + * cvpn: manage vpns + * crassh: Encrypted, easy-to-use user authentification for Unix systems + * decr-f: packet description format + * dmp3find + * easyC / shcl + * ecml / saml + * EOF / ceof / ceofhack + * fsdb: filesystem database + * gpm: general purpose mouse + * id3tagger + * intsize: reliable print intsizes + * mini-pld + * nsdocuments + * nsfortunes + * rlmanager + * schwanz3 + * smtp_logger + * ssa2: server side admin + * tcpserver_blocker + * unix_installer + * [[u2u|net/u2u]] + * urm: unix raid monitor + +A lot of those projects are just ideas, most of them have some code +or documentation and some are even implemented and working. + +[[!tag net schottelius unix]] diff --git a/blog/ccollect-0.8-many-changes-quiet-if-down.mdwn b/blog/ccollect-0.8-many-changes-quiet-if-down.mdwn new file mode 100644 index 00000000..c9e3143d --- /dev/null +++ b/blog/ccollect-0.8-many-changes-quiet-if-down.mdwn @@ -0,0 +1,25 @@ +[[!meta title="ccollect 0.8 includes many changes like quiet_if_down"]] + +I'm currently updating the changes file (**doc/changes/next**) of +[[ccollect|software/ccollect]] and realised that version 0.8 will be +one of the greatest releases of ccollect: + +Months ago, when I went through my [[projects list|about/projects]], +I thought that there will not be many changes for ccollect anymore: + +It is running stable, has a lot of features and is still very short +(around 600 lines of code). + +Now I have a list of more than 10 big changes +for the upcoming 0.8 release of ccollect! + +## Be quiet! + +One of the new features is "***quiet_if_down***": If you enable this +option, ccollect will be much more quiet, if the source is not +reachable. Very useful for backing up mobile devices +(cell phones, notebooks, watches, etc.)! + +Thanks to John, who implemented this feature! + +[[!tag backup unix]] From 326c553b098582813188989ca332a5016a976432 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Tue, 28 Jul 2009 19:11:20 +0200 Subject: [PATCH 06/14] update projects list Signed-off-by: Nico Schottelius --- about/projects.mdwn | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/about/projects.mdwn b/about/projects.mdwn index 03a79dbe..1fd2b7fa 100644 --- a/about/projects.mdwn +++ b/about/projects.mdwn @@ -2,31 +2,31 @@ The following is an incomplete list of projects I'm working on: - * carbon - * cconf / chamelon: autoconf replacements - * ccollaborate - * cinit: fast and intelligent init system + * [carbon / corpus](http://git.schottelius.org/?p=cLinux/carbon.git): Package management + * [cconf / chamelon](http://unix.schottelius.org/cconf/): autoconf replacements + * [ccollaborate](http://unix.schottelius.org/ccollaborate/): web application framework + * [cinit](http://unix.schottelius.org/cinit/): a fast, small and simple init with support for profiles. * cLinux: communities Linux distribution * cnp: create new project (assistant for new FOSS projects) - * ccollect: - * corein: Complete remote, automatic installation and configuration - * cvoktrainer + * [[ccollect|software/ccollect]]: (pseudo) incremental backup with different exclude lists using hardlinks and rsync + * [corein](http://git.schottelius.org/?p=cLinux/corein): Complete remote, automatic installation and configuration + * cvoktrainer: vocabulary trainer * cvpn: manage vpns * crassh: Encrypted, easy-to-use user authentification for Unix systems * decr-f: packet description format - * dmp3find + * [dmp3find](http://unix.schottelius.org/dmp3find/): find doubled mp3s * easyC / shcl * ecml / saml * EOF / ceof / ceofhack * fsdb: filesystem database - * gpm: general purpose mouse - * id3tagger + * [gpm](http://unix.schottelius.org/gpm): general purpose mouse + * id3tagger: tag mp3s with ID3 tags * intsize: reliable print intsizes - * mini-pld + * mini-lpd * nsdocuments * nsfortunes * rlmanager - * schwanz3 + * [schwanz3](http://home.schottelius.org/~nico/schwanz3/) * smtp_logger * ssa2: server side admin * tcpserver_blocker From 5d75edf0e2958123eba278067a2ac20ead851c98 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 30 Jul 2009 16:29:20 +0200 Subject: [PATCH 07/14] cleanup projects list Signed-off-by: Nico Schottelius --- about/projects.mdwn | 19 +- software/ccollect/doc/ccollect.htm | 235 ++++++++------- software/ccollect/doc/ccollect.html | 428 +++++++++++++++------------- software/ccollect/doc/ccollect.text | 53 +++- 4 files changed, 419 insertions(+), 316 deletions(-) diff --git a/about/projects.mdwn b/about/projects.mdwn index 1fd2b7fa..176ca637 100644 --- a/about/projects.mdwn +++ b/about/projects.mdwn @@ -5,18 +5,20 @@ The following is an incomplete list of projects I'm working on: * [carbon / corpus](http://git.schottelius.org/?p=cLinux/carbon.git): Package management * [cconf / chamelon](http://unix.schottelius.org/cconf/): autoconf replacements * [ccollaborate](http://unix.schottelius.org/ccollaborate/): web application framework - * [cinit](http://unix.schottelius.org/cinit/): a fast, small and simple init with support for profiles. + * [cinit](http://unix.schottelius.org/cinit/): + a fast, small and simple init with support for profiles. * cLinux: communities Linux distribution * cnp: create new project (assistant for new FOSS projects) - * [[ccollect|software/ccollect]]: (pseudo) incremental backup with different exclude lists using hardlinks and rsync - * [corein](http://git.schottelius.org/?p=cLinux/corein): Complete remote, automatic installation and configuration + * [[ccollect|software/ccollect]]: + (pseudo) incremental backup with different exclude lists using hardlinks and rsync + * [corein](http://git.schottelius.org/?p=cLinux/corein): + Complete remote, automatic installation and configuration * cvoktrainer: vocabulary trainer * cvpn: manage vpns * crassh: Encrypted, easy-to-use user authentification for Unix systems * decr-f: packet description format * [dmp3find](http://unix.schottelius.org/dmp3find/): find doubled mp3s - * easyC / shcl - * ecml / saml + * ecml: Encrypted mailinglist * EOF / ceof / ceofhack * fsdb: filesystem database * [gpm](http://unix.schottelius.org/gpm): general purpose mouse @@ -27,7 +29,9 @@ The following is an incomplete list of projects I'm working on: * nsfortunes * rlmanager * [schwanz3](http://home.schottelius.org/~nico/schwanz3/) - * smtp_logger + * shcl: Small helper c library + * [smtp_logger](http://git.schottelius.org/?p=smtp_logger): + Logs smtp sessions * ssa2: server side admin * tcpserver_blocker * unix_installer @@ -37,4 +41,7 @@ The following is an incomplete list of projects I'm working on: A lot of those projects are just ideas, most of them have some code or documentation and some are even implemented and working. +Most of the projects, which have code or documentation, can be found on +[git.schottelius.org](http://git.schottelius.org/). + [[!tag net schottelius unix]] diff --git a/software/ccollect/doc/ccollect.htm b/software/ccollect/doc/ccollect.htm index 0a6c7f43..17840f3d 100644 --- a/software/ccollect/doc/ccollect.htm +++ b/software/ccollect/doc/ccollect.htm @@ -1,65 +1,72 @@ -ccollect - Installing, Configuring and Using

ccollect - Installing, Configuring and Using

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

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

ccollect - Installing, Configuring and Using

Revision History
Revision 0.7.1for ccollect 0.7.1, 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. +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 -bourne shell compatible (like dash, ksh, zsh, bash, …).

Supported and tested operating systems and architectures

ccollect was successfully tested on the following platforms:

  • -GNU/Linux on amd64/hppa/i386/ppc -
  • +bourne shell compatible (like dash, ksh, zsh, bash, …).

    Supported and tested operating systems and architectures

    ccollect was successfully tested on the following platforms:

    • +GNU/Linux on amd64/hppa/i386/ppc/ARM +
    • FreeBSD on amd64/i386 -
    • +
    • Mac OS X 10.5 -
    • +
    • NetBSD on alpha/amd64/i386/sparc/sparc64 -
    • +
    • OpenBSD on amd64

    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.

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

    While considering the design of ccollect, I thought about enabling +running, please drop me a mail.

    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.

    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 +so you have the choice whether you want to use it or not.

    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 a backup host somewhere else. 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.

    Doing it securely

    Think of it the other way round: The backup server (now behind a +compromised.

    Your backup server will be compromised, too.

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

    Doing it securely

    Think of it the other way round: The backup server (now behind a firewall, not accessable from outside) connects to the webservers and pulls the data from them. If someone gets access to one 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

    Versions 0.6 and 0.7

    The format of destination changed:

    • +All other backups are still secure.

    Incompatibilities and changes

    Versions 0.7 and 0.8

    1. +The argument order changed: +

      • +Old: "<interval name> [args] <sources to backup>" +
      • +New: "[args] <interval name> <sources to backup>" +

    If you did not use arguments (most people do not), nothing will +change for you.

    .

    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 -

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

    Added remote_host

    • +

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

    Added remote_host

    • As of 0.7 it is possible to backup to hosts (see section remote_host below). -

    Versions 0.5 and 0.6

    The format of rsync_options changed:

    • +

    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) -

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

    The name of the backup directories changed:

    • +

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

    The name of the backup directories changed:

    • Before 0.6: "date +%Y-%m-%d-%H%M" -
    • +
    • 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).

    Versions 0.4 and 0.5

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

    0.5 does NOT require

    • +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

    • PaX -
    • +
    • bc -

    anymore!

    Versions < 0.4 and 0.4

    Since ccollect 0.4 there are several incompatibilities with earlier -versions:

    List of incompatibilities

    • +

    anymore!

    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 -
    • +
    • "interval" was written with two l (ell), which is wrong in English -
    • +
    • Changed the name of backup directories, removed the colon in the interval -
    • +
    • ccollect will now exit when preexec returns non-zero -
    • +
    • 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/ -subdirectory:

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

    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/
    +subdirectory:

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

    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/
     # replace value for CCV with the current version
     export CCV=0.7.1
     
    @@ -118,37 +125,37 @@ du -s ~/DASI /bin
     # report success
     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.

    Requirements

    Installing ccollect

    For the installation you need at least

    • +execution of some backups.

    Requirements

    Installing ccollect

    For the installation you need at least

    Using ccollect

    Running ccollect requires the following tools to be installed:

    • +

    Using ccollect

    Running ccollect requires the following tools to be installed:

    • date -
    • +
    • rsync -
    • +
    • ssh (if you want to use rsync over ssh, which is recommened for security) -

    Installing

    Either type make install or simply copy it to a directory in your +

Installing

Either type make install or simply copy it to a directory in your $PATH and execute chmod 0755 /path/to/ccollect.sh. If you would like to use the new management scripts (available since 0.6), copy -the following scripts to a directory in $PATH:

  • +the following scripts to a directory in $PATH:

    • tools/ccollect_add_source.sh -
    • +
    • tools/ccollect_analyse_logs.sh.sh -
    • +
    • tools/ccollect_delete_source.sh -
    • +
    • tools/ccollect_list_intervals.sh -
    • +
    • tools/ccollect_logwrapper.sh

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

Configuring

For configuration aid have a look at the above mentioned tools, which can assist +./tools/report_success.sh.

Configuring

For configuration aid have a look at the above mentioned tools, which can assist you quite well. When you are successfully using ccollect, report success using -tools/report_success.sh.

Runtime options

ccollect looks for its configuration in /etc/ccollect or, if set, in +tools/report_success.sh.

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, ...)
 $ CCOLLECT_CONF=/your/config/dir ccollect.sh ...
 
@@ -156,13 +163,13 @@ $ 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 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.

General configuration

The general configuration can be found in $CCOLLECT_CONF/defaults or +simply use ccollect.sh —help for info.

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).

Interval definition

The interval definition can be found in +configuration.

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

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 content of this file should be a single line containing a number. +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/
    insgesamt 12
    -rw-r--r--  1 nico users 3 2005-12-08 10:24 daily
@@ -171,7 +178,7 @@ This number defines how many versions of this interval are kept.

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

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

General pre- and post-execution

If you add $CCOLLECT_CONF/defaults/pre_exec or + 4

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

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.

The following example describes how to report free disk space in @@ -180,31 +187,37 @@ human readable format before and after the whole backup process:

General delete_incomplete

If you add $CCOLLECT_CONF/defaults/delete_incomplete, this +[13:01] hydrogenium:~# ln -s /etc/ccollect/defaults/pre_exec /etc/ccollect/defaults/post_exec

General delete_incomplete

If you add $CCOLLECT_CONF/defaults/delete_incomplete, this option applies for all sources. See below for a longer -explanation.

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.

Each source contains at least the following files:

  • +explanation.

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.

Each source contains at least the following files:

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

Additionally a source may have the following files:

  • +

Additionally a source may have the following files:

  • verbose whether to be verbose (passes -v to rsync) -
  • +
  • very_verbose be very verbose (mkdir -v, rm -v and rsync -vv) -
  • +
  • summary create a transfer summary when rsync finished -
  • +
  • exclude exclude list for rsync. newline seperated list. -
  • +
  • rsync_options extra options for rsync. newline seperated list. -
  • +
  • pre_exec program to execute before backing up this source -
  • +
  • post_exec program to execute after backing up this source -
  • +
  • delete_incomplete delete incomplete backups -
  • +
  • remote_host host to backup to +
  • +rsync_failure_codes list of rsync exit codes that indicate complete failure +
  • +mtime Sort backup directories based on their modification time +
  • +quiet_if_down Suppress error messages if source is not connectable

Example:

   [10:47] zaphodbeeblebrox:ccollect-0.2% ls -l  conf/sources/testsource2
    insgesamt 12
    lrwxrwxrwx  1 nico users   20 2005-11-17 16:44 destination
@@ -221,21 +234,21 @@ explanation.

Detailed description of "source"

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

For instance backup_user@foreign_host:/home/server/video. + /home/nico/vpn

Detailed description of "source"

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 rsync::USER@HOST/SRC. For more information have a look at the manpage -of rsync(1).

Detailed description of "destination"

destination must be a text file containing the destination directory. +of rsync(1).

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 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

Detailed description of "remote_host"

remote_host must be a text file containing the destination host. + /home/nico/backupdir

Detailed description of "remote_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 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

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

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.

` -Example:

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

Detailed description of "very_verbose"

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.

Example:

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

Detailed description of "summary"

If you create the file summary in the source definition, + home.schottelius.org

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

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.

` +Example:

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

Detailed description of "very_verbose"

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.

Example:

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

Detailed description of "summary"

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:~# ccollect.sh werktags root
 ==> ccollect.sh: Beginning backup using interval werktags <==
@@ -262,11 +275,11 @@ backup:~# ccollect.sh werktags root
 [root] Successfully finished backup.
 ==> Finished ccollect.sh <==

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).

Detailed description of "exclude"

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
+summary).

Detailed description of "exclude"

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
    openvpn-2.0.1.tar.gz
    nicht_reinnehmen
    etwas mit leerzeichenli
-   something with spaces is not a problem

Detailed description of "intervals/"

When you create the subdirectory intervals/ in your source configuration + something with spaces is not a problem

Detailed description of "intervals/"

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/
    insgesamt 8
@@ -274,12 +287,12 @@ Each file in this directory describes an interval.

Example:

Detailled description of "rsync_options"

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

Detailled description of "rsync_options"

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") +to show progress ("—progress"), or which -password-file ("—password-file") 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

Detailled description of "pre_exec" and "post_exec"

When you create pre_exec and / or post_exec in your source + --password-file=/home/user/backup/protected_password_file

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 respectively after doing the backup for this specific source. If you want to have pre-/post-exec before and after all @@ -292,16 +305,32 @@ df -h #!/bin/sh # Show whats free after -df -h

Detailed description of "delete_incomplete"

If you create the file delete_incomplete in a source specification directory, +df -h

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 -the user.

Hints

Smart logging

Since ccollect-0.6.1 you can use the ccollect-logwrapper.sh(1) for logging. +the user.

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 +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 +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.

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 +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.

Hints

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 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
 ccollect-logwrapper.sh (11722): Starting with arguments: daily u0160.nshq.ch.netstream.com
-ccollect-logwrapper.sh (11722): Finished.

Using a different ssh port

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

host mx2.schottelius.org
+ccollect-logwrapper.sh (11722): Finished.

Using a different ssh port

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

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
@@ -312,16 +341,16 @@ 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 -
  • +
  • source_$NUM: the name of the source -
  • +
  • name: the name of the currently being backuped source (not available for generic pre_exec script) -

Using rsync protocol without ssh

When you have a computer with little computing power, it may be useful to use +

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.

Example:

backup:~# cat /etc/ccollect/sources/sample.backup.host.org/source
@@ -331,11 +360,11 @@ 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 hint was reported by Daniel Aubry.

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.

Note

When those directories contain hidden files +this_is_the_rsync_password

This hint was reported by Daniel Aubry.

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.

Note

When those directories contain hidden files (those beginning with a dot (.)), -they will still be transferred!

This hint was reported by Marcus Wagner.

Re-using already created rsync-backups

If you used rsync directly before you use ccollect, you can +they will still be transferred!

This hint was reported by Marcus Wagner.

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
@@ -348,8 +377,8 @@ backup:/home/backup/web1# mkdir daily.0
 backup:/home/backup/web1# mv * daily.0 2>/dev/null
 
 backup:/home/backup/web1# ls
-daily.0

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.

Note

Older versions (pre 0.6, iirc) had a problem, if you named the first backup +daily.0

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.

Note

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 @@ -358,12 +387,12 @@ 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 -use a link to

  • +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 -
  • +
  • an already written script -

The only requirement is that it is executable.

Using source specific interval definitions

When you are backing up multiple hosts via cron each night, it may be +

The only requirement is that it is executable.

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 @@ -371,26 +400,26 @@ you want to keep 20 daily backups. In this case you would create /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.

Comparing backups

If you want to see what changed between two backups, you can use +/etc/ccollect/default/intervals/daily.

Comparing backups

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

[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.

Testing for host reachabilty

If you want to test whether the host you try to backup is reachable, you can use +is made (i.e. report only mode)"

This hint was reported by Daniel Aubry.

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`

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

This hint was reported by Daniel Aubry.

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:

$ ccollect | ccollect_analyse_logs.sh e

F.A.Q.

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. -This leads to

  • +# 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.

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:

$ ccollect | ccollect_analyse_logs.sh e

F.A.Q.

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. +This leads to

  • more transferred files -
  • +
  • much greater disk space usage, as no hardlinks can be used

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

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

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

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 -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 +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 (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
@@ -409,12 +438,12 @@ lrwxrwxrwx 1 nico nico 29 2006-04-29 00:01 projekte -> oeffentlich/computer/p
 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).

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

As ccollect first deletes the old backups, it may take some time +/home/user/nico/projekte and oeffentlich/computer/projekte).

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, 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).

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
@@ -459,7 +488,7 @@ 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

Using hard-links requires less disk space

# du (coreutils) 5.2.1
+srwali01:/etc/ccollect/sources/srwali03# mkdir /mnt/hdbackup/srwali03

Using hard-links requires less disk space

# du (coreutils) 5.2.1
 [10:53] srsyg01:sources% du -sh ~/backupdir
 4.6M    /home/nico/backupdir
 [10:53] srsyg01:sources% du -sh ~/backupdir/*
@@ -504,7 +533,7 @@ du (GNU coreutils) 5.93
 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

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

A collection of backups on the backup server

All the data of my important hosts is backuped to eiche into +the hardlinks allocate.

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 *
 creme:
 woechentlich.2006-01-26-22:22.4153   woechentlich.2006-02-12-11:48.2461
@@ -544,7 +573,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 -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
    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/doc/ccollect.html b/software/ccollect/doc/ccollect.html
index 79fb5c7b..16270350 100644
--- a/software/ccollect/doc/ccollect.html
+++ b/software/ccollect/doc/ccollect.html
@@ -3,8 +3,7 @@
 
 
 
-
-ccollect - Installing, Configuring and Using
+
 
+ccollect - Installing, Configuring and Using
 
 
 
 
-

(pseudo) incremental backup +

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

1. Introduction

-

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

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:

-
    +

    ccollect was successfully tested on the following platforms:

    +
    • -GNU/Linux on amd64/hppa/i386/ppc +GNU/Linux on amd64/hppa/i386/ppc/ARM

    • @@ -431,35 +390,58 @@ 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

    -

    While considering the design of ccollect, I thought about enabling +

    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, +

    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 +

    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 a backup host somewhere else. 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.

    +

    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 +

    Think of it the other way round: The backup server (now behind a firewall, not accessable from outside) connects to the webservers and pulls the data from them. If someone gets access to one 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

    -

    1.3.1. Versions 0.6 and 0.7

    -
    The format of destination changed:
      +

      1.3. Incompatibilities and changes

      +

      1.3.1. Versions 0.7 and 0.8

      +
        +
      1. +

        +The argument order changed: +

        +
          +
        • +

          +Old: "<interval name> [args] <sources to backup>" +

          +
        • +
        • +

          +New: "[args] <interval name> <sources to backup>" +

          +
        • +
        +
      2. +
      +

      If you did not use arguments (most people do not), nothing will +change for you.

      +

      .

      +

      1.3.2. Versions 0.6 and 0.7

      +
      The format of destination changed:
      • Before 0.7 it was a (link to a) directory @@ -471,16 +453,16 @@ 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.

      -
      Added remote_host
        +

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

        +
        Added remote_host
        • As of 0.7 it is possible to backup to hosts (see section remote_host below).

        -

        1.3.2. Versions 0.5 and 0.6

        -
        The format of rsync_options changed:
          +

          1.3.3. Versions 0.5 and 0.6

          +
          The format of rsync_options changed:
          • Before 0.6 it was whitespace delimeted @@ -492,8 +474,8 @@ 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.

          -
          The name of the backup directories changed:
            +

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

            +
            The name of the backup directories changed:
            • Before 0.6: "date +%Y-%m-%d-%H%M" @@ -505,11 +487,11 @@ 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 +

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

            -

            1.3.3. Versions 0.4 and 0.5

            -

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

            -
            0.5 does NOT require
              +

              1.3.4. Versions 0.4 and 0.5

              +

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

              +
              0.5 does NOT require
              • PaX @@ -521,11 +503,11 @@ bc

              -

              anymore!

              -

              1.3.4. Versions < 0.4 and 0.4

              -

              Since ccollect 0.4 there are several incompatibilities with earlier +

              anymore!

              +

              1.3.5. Versions < 0.4 and 0.4

              +

              Since ccollect 0.4 there are several incompatibilities with earlier versions:

              -
              List of incompatibilities
                +
                List of incompatibilities
                • pax (Posix) is now required, cp -al (GNU specific) is removed @@ -552,7 +534,7 @@ ccollect now reports when postexec returns non-zero

                -

                You can convert your old configuration directory using +

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

                @@ -562,7 +544,7 @@ subdirectory:

                2. Quick start

                -

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

                +

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

                # get latest ccollect tarball from http://www.nico.schottelius.org/software/ccollect/
                @@ -624,15 +606,15 @@ du -s ~/DASI /bin
                 # report success
                 echo "Please report success using ./tools/report_success.sh"
                -

                Cutting and pasting the complete section above to your shell will result in +

                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

                3.1. Installing ccollect

                -

                For the installation you need at least

                -
                  +

                  For the installation you need at least

                  +

                  3.2. Using ccollect

                  -
                  Running ccollect requires the following tools to be installed:
                    +
                    Running ccollect requires the following tools to be installed:
                    • date @@ -675,11 +657,11 @@ for rebuilding the generated documentation: additionally asciidoc

                    4. Installing

                    -

                    Either type make install or simply copy it to a directory in your +

                    Either type make install or simply copy it to a directory in your $PATH and execute chmod 0755 /path/to/ccollect.sh. If you would like to use the new management scripts (available since 0.6), copy the following scripts to a directory in $PATH:

                    -
                      +
                      • tools/ccollect_add_source.sh @@ -706,16 +688,16 @@ the following scripts to a directory in $PATH:

                    -

                    After having installed and used ccollect, report success using +

                    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 +

                    For configuration aid have a look at the above mentioned tools, which can assist you quite well. When you are successfully using ccollect, report success using tools/report_success.sh.

                    5.1. Runtime options

                    -

                    ccollect looks for its configuration in /etc/ccollect or, if set, in +

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

                    @@ -725,26 +707,26 @@ $ CCOLLECT_CONF=/your/config/dir ccollect.sh ... # csh $ ( 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.

+

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

-

The general configuration can be found in $CCOLLECT_CONF/defaults or +

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).

+

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 +

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 content of this file should be a single line containing a number. +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:

+

Example:

   [10:23] zaphodbeeblebrox:ccollect-0.2% ls -l conf/defaults/intervals/
@@ -757,13 +739,13 @@ This number defines how many versions of this interval are kept.

12 4
-

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

+

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 +

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.

-

The following example describes how to report free disk space in +

The following example describes how to report free disk space in human readable format before and after the whole backup process:

@@ -775,15 +757,15 @@ human readable format before and after the whole backup process:

[13:01] hydrogenium:~# ln -s /etc/ccollect/defaults/pre_exec /etc/ccollect/defaults/post_exec

5.2.3. General delete_incomplete

-

If you add $CCOLLECT_CONF/defaults/delete_incomplete, this +

If you add $CCOLLECT_CONF/defaults/delete_incomplete, this option applies for all sources. See below for a longer explanation.

5.3. Source configuration

-

Each source configuration exists in $CCOLLECT_CONF/sources/$name or +

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

-

The name you choose for the subdirectory describes the source.

-

Each source contains at least the following files:

-
    +

    The name you choose for the subdirectory describes the source.

    +

    Each source contains at least the following files:

    +
    • source (a text file containing the rsync compatible path to backup) @@ -795,8 +777,8 @@ explanation.

-

Additionally a source may have the following files:

-
    +

    Additionally a source may have the following files:

    +
    • verbose whether to be verbose (passes -v to rsync) @@ -842,8 +824,23 @@ explanation.

    remote_host host to backup to

    +
  • +

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

    +
  • +
  • +

    +mtime Sort backup directories based on their modification time +

    +
  • +
  • +

    +quiet_if_down Suppress error messages if source is not connectable +

    +
-

Example:

+

Example:

   [10:47] zaphodbeeblebrox:ccollect-0.2% ls -l  conf/sources/testsource2
@@ -865,56 +862,56 @@ explanation.

/home/nico/vpn

5.3.1. Detailed description of "source"

-

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

-

For instance backup_user@foreign_host:/home/server/video. +

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 rsync::USER@HOST/SRC. For more information have a look at the manpage of rsync(1).

5.3.2. Detailed description of "destination"

-

destination must be a text file containing the destination directory. +

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:

+

Example:

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

5.3.3. 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 +

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:

+

Example:

   [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.

+

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

5.3.4. 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

5.3.5. Detailed description of "very_verbose"

-

very_verbose tells ccollect that it should log very verbosely.

-

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

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.

-

Example:

+

Example:

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

5.3.6. Detailed description of "summary"

-

If you create the file summary in the source definition, +

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

@@ -944,12 +941,12 @@ backup:~# ccollect.sh werktags root [root] Successfully finished backup. ==> 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).

5.3.7. Detailed description of "exclude"

-

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

-

Example:

+

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
@@ -959,10 +956,10 @@ already print some statistics (though not all / the same as presented by
    something with spaces is not a problem

5.3.8. 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:

+

Example:

   [11:37] zaphodbeeblebrox:ccollect-0.2% ls -l conf/sources/testsource2/intervals/
@@ -974,24 +971,24 @@ Each file in this directory describes an interval.

20

5.3.9. 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") +to show progress ("—progress"), or which -password-file ("—password-file") to use for automatic backup over the rsync-protocol.

-

Example:

+

Example:

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

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

-

When you create pre_exec and / or post_exec in your source +

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.

-

Example:

+

Example:

[13:09] hydrogenium:ccollect-0.3% cat conf/sources/with_exec/pre_exec
@@ -1006,15 +1003,38 @@ df -h
 df -h

5.3.11. Detailed description of "delete_incomplete"

-

If you create the file delete_incomplete in a source specification directory, +

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.12. 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 +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.13. 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 +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.14. 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 +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

-

Since ccollect-0.6.1 you can use the ccollect-logwrapper.sh(1) for 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 at the manpage ccollect-logwrapper. The following is an example running @@ -1026,13 +1046,13 @@ ccollect-logwrapper.sh (11722): Starting with arguments: daily u0160.nshq.ch.net ccollect-logwrapper.sh (11722): Finished.

6.2. Using a different ssh port

-

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

+

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

host mx2.schottelius.org
    Port 2342
-

If you only use that port for backup only and normally want to use another port, +

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):

@@ -1048,8 +1068,8 @@ Host bruehe 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:

-
    +

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

    +
    • INTERVAL: The interval specified on the command line @@ -1073,11 +1093,11 @@ name: the name of the currently being backuped source (not available for

    6.4. Using rsync protocol without ssh

    -

    When you have a computer with little computing power, it may be useful to use +

    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.

    -

    Example:

    +

    Example:

    backup:~# cat /etc/ccollect/sources/sample.backup.host.org/source
    @@ -1089,10 +1109,10 @@ backup:~# cat /etc/ccollect/sources/sample.backup.host.org/rsync_options
     backup:~# cat /etc/ccollect/sources/sample.backup.host.org/rsync_password
     this_is_the_rsync_password
    -

    This hint was reported by Daniel Aubry.

    +

    This hint was reported by Daniel Aubry.

    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/\*" +

    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.

    @@ -1100,19 +1120,19 @@ instead, ccollect will backup empty directories.

    Note
    -

    When those directories contain hidden files +

    When those directories contain hidden files (those beginning with a dot (.)), they will still be transferred!

    -

    This hint was reported by Marcus Wagner.

    +

    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 +

    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:

    +

    Example:

    backup:/home/backup/web1# ls
    @@ -1127,14 +1147,14 @@ backup:/home/backup/web1# mv * daily.0 2>/dev/null
     backup:/home/backup/web1# ls
     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 +

    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.

    @@ -1145,7 +1165,7 @@ the -c option from ls to find out which directory to clone from.

    Note
    -

    Older versions (pre 0.6, iirc) had a problem, if you named the first backup +

    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 @@ -1159,9 +1179,9 @@ wasted resources, but your backup had beer complete anyway.

    6.7. Using pre_/post_exec

    -

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

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

    -
      +
      • an existing program @@ -1173,40 +1193,40 @@ an already written script

      -

      The only requirement is that it is executable.

      +

      The only requirement is that it is executable.

      6.8. Using source specific interval definitions

      -

      When you are backing up multiple hosts via cron each night, it may be +

      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".

      -

      Source specific intervals always overwrite the default values. +

      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

      -

      If you want to see what changed between two backups, you can use +

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

      [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 +

      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.

      +

      This hint was reported by Daniel Aubry.

      6.10. Testing for host reachabilty

      -

      If you want to test whether the host you try to backup is reachable, you can use +

      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`
      -

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

      -

      This hint was reported by Daniel Aubry.

      +

      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

      -

      If you want to see whether there have been any errors while doing the backup, +

      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:

      @@ -1216,11 +1236,11 @@ you can run ccollect together with ccollect_analyse_logs.sh:7. F.A.Q.

      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. +

      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. This leads to

      -
        +
        • more transferred files @@ -1232,24 +1252,24 @@ 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 +

        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 to source/exclude. (Daniel Aubry reported this problem)

        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`.

        +

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

        -

        When a part of your path you specified in the source is a +

        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:

        +

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

        ==> ccollect 0.4: Beginning backup using interval taeglich <==
        @@ -1262,7 +1282,7 @@ the backup must fail.

        [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:

        +

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

        % cat /etc/ccollect/sources/testsource/source
        @@ -1272,17 +1292,17 @@ lrwxrwxrwx 1 nico nico 29 2005-12-02 23:28 /home/user/nico/projekte -> oeffen
         % 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
        -

        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 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 +

        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, +

        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, you can enter your password (have a look at screen(1), especially "C-a M" @@ -1316,7 +1336,7 @@ srwali01:/etc/ccollect/sources/local-root# ccollect.sh taeglich local-root /=> Beginning to backup "local-root" ... |-> 0 backup(s) already exist, keeping 28 backup(s).

        -

        After that, I added some more sources:

        +

        After that, I added some more sources:

        srwali01:~# cd /etc/ccollect/sources
        @@ -1365,7 +1385,7 @@ 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
        -

        The backup of our main fileserver:

        +

        The backup of our main fileserver:

        backup:~# df -h /home/backup/srsyg01/
        @@ -1387,7 +1407,7 @@ backup:~# du -sh /home/backup/srsyg01/*
         backup:~# du --version | head -n1
         du (coreutils) 5.2.1
        -

        Newer versions of du also detect the hardlinks, so we can even compare +

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

        @@ -1404,10 +1424,10 @@ du (GNU coreutils) 5.93 1.5G hydrogenium/durcheinander.2006-01-25-23:18.31328 200M hydrogenium/durcheinander.2006-01-26-00:11.3332
        -

        In the second report (without -l) the sizes include the space the inodes of +

        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

        -

        All the data of my important hosts is backuped to eiche into +

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

        @@ -1432,7 +1452,7 @@ 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
        -

        And this incremental backup and the archive are copied to an external +

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

        @@ -1458,7 +1478,7 @@ rsync -av -H --delete /mnt/schwarzesloch/ "$DDIR/schwarzesloch/" rsync -av -H --delete /mnt/archiv/ "$DDIR/archiv/"

        8.4. Processes running when doing ccollect -p

        -

        Truncated output from ps axuwwwf:

        +

        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
        @@ -1500,13 +1520,13 @@ rsync -av -H --delete /mnt/archiv/ "$DDIR/archiv/"
        S+ 11:40 0:00 | | | \_ /bin/sh /usr/local/bin/ccollect.sh daily ddna011 S+ 11:40 0:00 | | | \_ sed s:^:\[ddna011\] :
        -

        As you can see, six processes are deleting old backups, while one backup +

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

        diff --git a/software/ccollect/doc/ccollect.text b/software/ccollect/doc/ccollect.text index 984cdcf8..b762ecf3 100644 --- a/software/ccollect/doc/ccollect.text +++ b/software/ccollect/doc/ccollect.text @@ -21,7 +21,7 @@ Supported and tested operating systems and architectures ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `ccollect` was successfully tested on the following platforms: -- GNU/Linux on amd64/hppa/i386/ppc +- GNU/Linux on amd64/hppa/i386/ppc/ARM - FreeBSD on amd64/i386 - Mac OS X 10.5 - NetBSD on alpha/amd64/i386/sparc/sparc64 @@ -68,8 +68,22 @@ machine, she will not be able to log in on the backup machine. All other backups are still secure. -Incompatibilities -~~~~~~~~~~~~~~~~~ +Incompatibilities and changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +Versions 0.7 and 0.8 +^^^^^^^^^^^^^^^^^^^^^ + +. The argument order changed: +- Old: " [args] " +- New: "[args] " + +If you did not use arguments (most people do not), nothing will +change for you. + +. + Versions 0.6 and 0.7 @@ -359,6 +373,9 @@ Additionally a source may have the following files: - `delete_incomplete` delete incomplete backups - `remote_host` host to backup to + - `rsync_failure_codes` list of rsync exit codes that indicate complete failure + - `mtime` Sort backup directories based on their modification time + - `quiet_if_down` Suppress error messages if source is not connectable Example: @@ -574,6 +591,36 @@ If you create the file `delete_incomplete` in a source specification directory, was interrupted) and remove them. Without this file `ccollect` will only warn the user. +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 +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 +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. + +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 +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. + Hints ----- From e554ae08c99bdc3f0508aa3c0472272336631c69 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 30 Jul 2009 17:06:22 +0200 Subject: [PATCH 08/14] New blogentry: published projects list Signed-off-by: Nico Schottelius --- blog/published-list-of-projects.mdwn | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 blog/published-list-of-projects.mdwn diff --git a/blog/published-list-of-projects.mdwn b/blog/published-list-of-projects.mdwn new file mode 100644 index 00000000..cbd9872e --- /dev/null +++ b/blog/published-list-of-projects.mdwn @@ -0,0 +1,25 @@ +[[!meta title="Published list of projects"]] + +The day before yesterday I was hacking on [[ccollect|software/ccollect]] +and finished a lot of things to be done for version 0.8. + +When I was done, I was sitting in the train and thought: + + Which project to hack on, after this release? + +There are a lot of projects I started, many of them not nearly finished. +And even more ideas, what I **could** work on +(a lot of my ideas can be found in the +[nsdocuments](http://git.schottelius.org/?p=nsdocuments) repository). + +A listing of my project directory shows over 30 different projects. +To get an overview of what I am working on already, I used the listing +as a base to create the new [[projects listing page|about/projects]]. + +I'm now cleaning up the projects directory and may also publish some +(already finished) projects, which never made it to the public. + +And until **ccollect** 0.8 is released, I will continue to think about +the next interesting project to work on. + +[[!tag schottelius net]] From e413acd9ea0aef42c9826f283d1ff1c06f8e8bad Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Thu, 30 Jul 2009 17:11:44 +0200 Subject: [PATCH 09/14] correct wording Signed-off-by: Nico Schottelius --- blog/published-list-of-projects.mdwn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blog/published-list-of-projects.mdwn b/blog/published-list-of-projects.mdwn index cbd9872e..22cbfabd 100644 --- a/blog/published-list-of-projects.mdwn +++ b/blog/published-list-of-projects.mdwn @@ -14,7 +14,7 @@ And even more ideas, what I **could** work on A listing of my project directory shows over 30 different projects. To get an overview of what I am working on already, I used the listing -as a base to create the new [[projects listing page|about/projects]]. +as a base to create the new [[project list page|about/projects]]. I'm now cleaning up the projects directory and may also publish some (already finished) projects, which never made it to the public. From 37460346924926c79a1adb9ffff48ae75066422c Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 31 Jul 2009 09:19:36 +0200 Subject: [PATCH 10/14] news/blog/neuigkeiten on the first page Signed-off-by: Nico Schottelius --- index.mdwn | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/index.mdwn b/index.mdwn index bb6bef20..bde1903b 100644 --- a/index.mdwn +++ b/index.mdwn @@ -9,15 +9,29 @@ Dies ist [[Nico_Schottelius'|about]] ***neue*** mehrsprachige Netzseite. ## English (global) All topics that are of global interest are written in English. +The English news can be found in the [[blog]]. Alle weltweit interessanten Seiten sind auf Englisch geschrieben. +Die englischen Neuigkeiten befinden sich im "[[Blog|blog]]". ## Deutsch (lokal) All other topics, which are only of local interest, are written -in German. +in German. The German news can be found in the [[neuigkeiten area|neuigkeiten]]. Die regional interessanten Seiten sind auf Deutsch geschrieben. +Auch auf Deutsch gibt es +[[Neuigkeiten und kurze Berichte|neuigkeiten]], die erstaunlicherweise +im [[Neuigkeiten-Bereich|neuigkeiten]] zuhause sind. + +## Updates / Aktualisierungen + +If you want to track both, the [[English|blog]] and the [[German|neuigkeiten]] +news, you can subscribe to both in the [[general news area|news]]. + +Um Neuigkeiten aus [[beiden|blog]] [[Bereichen|neuigkeiten]] +zu bekommen, können Sie sich vom [[Archiv|news]] benachrichtigen lassen. + ## Why multilingual? Warum mehrsprachig? From 8ee2935266d614d6c4a414ee455990ecf44a3a8f Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 31 Jul 2009 09:19:47 +0200 Subject: [PATCH 11/14] news == archiv Signed-off-by: Nico Schottelius --- news.mdwn | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/news.mdwn b/news.mdwn index 6204917c..3e155937 100644 --- a/news.mdwn +++ b/news.mdwn @@ -1,7 +1,10 @@ -[[!meta title="News archive"]] +[[!meta title="News archive / Neuigkeitenarchiv"]] This archive contains news from both the [[blog]] and [[neuigkeiten]]. +Dieses Archiv enthält die +[[Englischen|blog]] und [[Deutschen|neuigkeiten]] Neuigkeiten. + ## 2009 [[!inline pages="(blog/* or neuigkeiten/*) and creation_year(2009)" archive="yes" show=0]] From 2aedf000d1de97e9013f1adbd725a03c5fc820b2 Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Fri, 31 Jul 2009 09:19:56 +0200 Subject: [PATCH 12/14] add commits mailinglist Signed-off-by: Nico Schottelius --- about/projects.mdwn | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/about/projects.mdwn b/about/projects.mdwn index 176ca637..82e32fd5 100644 --- a/about/projects.mdwn +++ b/about/projects.mdwn @@ -44,4 +44,8 @@ or documentation and some are even implemented and working. Most of the projects, which have code or documentation, can be found on [git.schottelius.org](http://git.schottelius.org/). +You can see on which projects I am currently working on +in the [archive](http://l.schottelius.org/pipermail/commits/) +of the [commits mailing list](http://l.schottelius.org/mailman/listinfo/commits). + [[!tag net schottelius unix]] From 706d08742c9a64b082d111e6d2ef069bc1b042ab Mon Sep 17 00:00:00 2001 From: Nico Schottelius Date: Mon, 3 Aug 2009 16:50:38 +0200 Subject: [PATCH 13/14] add software: smtp_logger On the train to sissach Signed-off-by: Nico Schottelius --- software/smtp_logger.mdwn | 67 ++++++++++++++++++ software/smtp_logger/smtp_logger-0.1.tar | Bin 0 -> 71680 bytes software/smtp_logger/smtp_logger-0.1.tar.bz2 | Bin 0 -> 16722 bytes software/smtp_logger/smtp_logger-0.1.tar.gz | Bin 0 -> 18197 bytes software/smtp_logger/smtp_logger-0.1.tar.lzma | Bin 0 -> 16824 bytes 5 files changed, 67 insertions(+) create mode 100644 software/smtp_logger.mdwn create mode 100644 software/smtp_logger/smtp_logger-0.1.tar create mode 100644 software/smtp_logger/smtp_logger-0.1.tar.bz2 create mode 100644 software/smtp_logger/smtp_logger-0.1.tar.gz create mode 100644 software/smtp_logger/smtp_logger-0.1.tar.lzma diff --git a/software/smtp_logger.mdwn b/software/smtp_logger.mdwn new file mode 100644 index 00000000..293116a7 --- /dev/null +++ b/software/smtp_logger.mdwn @@ -0,0 +1,67 @@ +## Introduction + +smtp_logger is a logging smtp proxy. It is designed to aid mail server +administrators debugging their smtp connections. + +Have a look at the README file for further instructions. + +## How does it work? + + ------------------ + | SMTP Client(s) | + ------------------ + | + | want to connect to smtp-real.example.org + | + ------------------ + | Router/firewall| + ------------------ + | + | redirects data to loghost + | + ------------------ + | loghost | + ------------------ + | + | Saves connection data and forwards them + | + ------------------ + | smtp-real | processes the mail + ------------------ + +## How to get smtp_logger + +### Releases + + * smtp_logger-0.1: the first public release + ([[tar|smtp_logger-0.1.tar]] + [[lzma|smtp_logger-0.1.tar.lzma]] + [[gz|smtp_logger-0.1.tar.gz]] + [[bz2|smtp_logger-0.1.tar.bz2]]) + +### Development + +The latest development code can be found in git. +You can view latest changes in +[gitweb](http://git.schottelius.org/?p=smtp_logger) +or clone the latest sources using + + git clone git://git.schottelius.org/smtp_logger + +To submit changes, simply follow the instructions +on [how to setup a public git repo](http://book.git-scm.com/4_setting_up_a_public_repository.html). + +There are also some +[CIA bot statistics](http://cia.vc/stats/project/smtp_logger) available. + +## Support + +### IRC + + * [#cLinux](irc://irc.freenode.org/#cLinux) - Multi language (German/English) + +### Mail + +You can also [[contact me directly|about]]. + +[[!tag unix]] diff --git a/software/smtp_logger/smtp_logger-0.1.tar b/software/smtp_logger/smtp_logger-0.1.tar new file mode 100644 index 0000000000000000000000000000000000000000..776534053e193c73f5c8d1eb9c9398e05a76b3d3 GIT binary patch literal 71680 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

        r;Er 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 literal 0 HcmV?d00001 diff --git a/software/smtp_logger/smtp_logger-0.1.tar.bz2 b/software/smtp_logger/smtp_logger-0.1.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6c07b368e0846513e70d32480f7fcb518d023c09 GIT binary patch literal 16722 zcmV()K;OSYT4*^jL0KkKSv^nRv;b39fB*mgXh47e|NsC0|Nj5~|Na6L03ZY~AP5K` zhyVa600>}HUVQsbKGNq8sI%&?Hv{SPIRga>s6i5>1V9ohkSPEtqMmHociq1FxF37C zN}2;}WAAsq+9mhZR{9PkH`#XS^V**8x7+RYHv4W-ds}_;-AZ}&glM5=CtrL30rYvW zc-31Xb&kX1+f-3@$xhumW?Q?()F};WZM}x}dGC8V@~;%pDmKaO&f?@Cl}eLf03Fyy z?CRSuz5ow>^X*oBdiRIG0(Hv^cOI{A9k?nkns{k|(?kMj1ke*eAT$9P2-9g#)izH> zH1zcev`kM^(rJhofB~RskRXB~H8M3#pr@(nrj1NNw1=b*QKQNL(DeWS000091qgy< zDe9-G_@1fdC+eHkKU8f^8%V-o88C(*113Wznhcs@GHIro0Va|}AZQ_!WXhhNs63~s zqerQ3K7W+q0V>SmKqNZB5# zp_3p0WDz7FARrSWdP79TC%sZ;(x0k&VxFO+C#Y$Wnj=5~pay^gM+kxU8K)1E%P~Os zw0x7tW|oxuiN-aW1yPU*1vruc`+m;6 zb?){pe9`hzd)bmt#nkQgbA0or@OEr{#9qX<+N3&0D2wklYI6PeyKRLQ2;x;lL_vye z4bTbRkUgjfGN+*ZS6Br|L7rrvP2h_lm0yOgZxQ`dKDy8h*RnjfJQu*I63Rn$qx>_; z6Ik2&yV$}(H%e7Pfv4rje|LbYL`EYklxiEX}K|PgaZ_0w(G>;`iA?vu18Tc)WYO zy%!D)*yREbi16u4TewonN~HG~c{T{g&9;_g+ESZBGj}U9WcDeWvX@k5N;@$%bcXv? zbc$UoMUvvFkRdaLsR;p$mK9CSOR>=D9LZDOk#5CrCilaQ3IZ#9bYp5x9qvxgB*pb) zIFQA!%(u2(IXKDP{%?AWQ<@Ulz3bi{@43wMOjQsPNCbd{l1NZVAQC`1c{=gLU3Q}u z+X++e5V@~6) zZG+yoIq_M3=qz0OoX^77JjHz{UaNRnfo(N-o;6L_tIGT_6eQ{tI(s)fnr{5Q_kkFp!XljDQhh1^s$) zpDuRMKEDq?Zsf~avz$?VVmbJ4!!+n_ULQ{P*)BvC`mZ~*iz!J^Uw-c<{a4N!M}u9Ke=SU|=s$^d?2_cm+^?(tyklUgfTG5Lq;a2fz! z2viXMiv3+YiN{i*J6R<`yL?>oq9v^!Efa&|136~c!JXpS!`!88Rnz8_avwqH0RR{f zmV_84gUaMU=wc(6Mh@uZ&7x*kW0lABR^SMX$ATa~4e4u#bfcY#?@mdm5Cy_8AOz5m zRvmt=dZIDIkLXTb-^m5D1mA!gHe?T+Kn-M&ic?8TnM1b;ybQo3Am^)Vb(k^@jh#pA zjNc1Q2F53w^pU}s=Z{P0-&#!xlZ{v{N;!aBh}~X7zFmBw$*2MV@Q|QjCKw<=knpQY zkS`Pk2r}rJIj$*u+v%0AP%^PNZ`;T@c_r!~3qT)qr`p+BIRFHq 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 literal 0 HcmV?d00001 diff --git a/software/smtp_logger/smtp_logger-0.1.tar.gz b/software/smtp_logger/smtp_logger-0.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b547865d269bca89897044a7c5cf96a4c29f789c GIT binary patch literal 18197 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�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 Date: Mon, 3 Aug 2009 16:53:43 +0200 Subject: [PATCH 14/14] cleanup in smtp_logger Signed-off-by: Nico Schottelius --- software/smtp_logger.mdwn | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/software/smtp_logger.mdwn b/software/smtp_logger.mdwn index 293116a7..47167722 100644 --- a/software/smtp_logger.mdwn +++ b/software/smtp_logger.mdwn @@ -3,8 +3,6 @@ smtp_logger is a logging smtp proxy. It is designed to aid mail server administrators debugging their smtp connections. -Have a look at the README file for further instructions. - ## How does it work? ------------------ @@ -29,11 +27,13 @@ Have a look at the README file for further instructions. | smtp-real | processes the mail ------------------ +Have a look at the README file for further instructions. + ## How to get smtp_logger ### Releases - * smtp_logger-0.1: the first public release + * **smtp_logger-0.1**: the first public release ([[tar|smtp_logger-0.1.tar]] [[lzma|smtp_logger-0.1.tar.lzma]] [[gz|smtp_logger-0.1.tar.gz]]