(pseudo) incremental backup with different exclude lists using hardlinks and rsync
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

250 lines
7.0 KiB

#
# 2006-2008 Nico Schottelius (nico-ccollect at schottelius.org)
#
# This file is part of ccollect.
#
# ccollect is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ccollect is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ccollect. If not, see <http://www.gnu.org/licenses/>.
#
# Initially written on Fri Jan 13 12:13:08 CET 2006
#
# FIXME: add prefix-support?
#
INSTALL=install
CCOLLECT_SOURCE=ccollect
CCOLLECT_DEST=ccollect
LN=ln -sf
ASCIIDOC=asciidoc
DOCBOOKTOTEXI=docbook2x-texi
DOCBOOKTOMAN=docbook2x-man
XSLTPROC=xsltproc
XSL=/usr/local/share/xsl/docbook/html/docbook.xsl
A2X=a2x
prefix=/usr/packages/ccollect-git
bindir=${prefix}/bin
destination=${bindir}/${CCOLLECT_DEST}
mandest=${prefix}/man/man1
manlink=/usr/local/man/man1
path_dir=/usr/local/bin
path_destination=${path_dir}/${CCOLLECT_DEST}
docs_archive_name=docs.tar
#
# Asciidoc will be used to generate other formats later
#
MANDOCS = doc/man/ccollect.text \
doc/man/ccollect_add_source.text \
doc/man/ccollect_analyse_logs.text \
doc/man/ccollect_delete_source.text \
doc/man/ccollect_logwrapper.text \
doc/man/ccollect_list_intervals.text
DOCS = ${MANDOCS} doc/ccollect.text
#
# Doku
#
HTMLDOCS = ${DOCS:.text=.html}
DBHTMLDOCS = ${DOCS:.text=.htm}
# texi is broken currently, don't know why xslt things complain yet
TEXIDOCS = ${DOCS:.text=.texi}
TEXIDOCS =
# fop fails here, so disable it for now
PDFDOCS = ${DOCS:.text=.pdf}
PDFDOCS =
MANPDOCS = ${MANDOCS:.text=.1}
DOCBDOCS = ${DOCS:.text=.docbook}
DOC_ALL = ${HTMLDOCS} ${DBHTMLDOCS} ${TEXIDOCS} ${MANPDOCS} ${PDFDOCS}
TEST_LOG_FILE = /tmp/ccollect/ccollect.log
#
# End user targets
#
all:
@echo "----------- ccollect make targets --------------"
@echo "documentation: generate HTMl, Texinfo and manpage"
@echo "html: only generate HTML"
@echo "info: only generate Texinfo"
@echo "man: only generate manpage{s}"
@echo "install: install ccollect to ${prefix}"
@echo "shellcheck: shellcheck ccollect script"
@echo "test: run unit tests"
html: ${HTMLDOCS}
htm: ${DBHTMLDOCS}
info: ${TEXIDOCS}
man: ${MANPDOCS}
pdf: ${PDFDOCS}
documentation: ${DOC_ALL}
install: install-link install-manlink
install-link: install-script
${LN} ${destination} ${path_destination}
install-script:
${INSTALL} -D -m 0755 ${CCOLLECT_SOURCE} ${destination}
install-man: man
${INSTALL} -d -m 0755 ${mandest}
${INSTALL} -D -m 0644 doc/man/*.1 ${mandest}
install-manlink: install-man
${INSTALL} -d -m 0755 ${manlink}
for man in ${mandest}/*; do ${LN} $$man ${manlink}; done
#
# Tools
#
TOOLS2=ccollect_add_source
TOOLS2 += ccollect_analyse_logs
TOOLS=ccollect_add_source \
ccollect_analyse_logs \
ccollect_delete_source \
ccollect_list_intervals \
ccollect_logwrapper \
ccollect_list_intervals
# Stick to posix
TOOLSMAN1 = $(TOOLS:ccollect=doc/man/ccollect)
TOOLSMAN = $(TOOLSMAN1:=.text)
TOOLSFP = $(subst ccollect,tools/ccollect,$(TOOLS))
## FIXME: posix make: shell? =>
t2:
echo $(TOOLS) - $(TOOLSFP)
echo $(TOOLSMAN)
echo $(TOOLSFP)
# docbook gets .htm, asciidoc directly .html
%.htm: %.docbook
${XSLTPROC} -o $@ ${XSL} $<
%.html: %.text %.docbook
${ASCIIDOC} -n -o $@ $<
%.html: %.text
${ASCIIDOC} -n -o $@ $<
%.docbook: %.text
${ASCIIDOC} -n -b docbook -o $@ $<
%.texi: %.docbook
${DOCBOOKTOTEXI} --to-stdout $< > $@
#%.mandocbook: %.text
# ${ASCIIDOC} -b docbook -d manpage -o $@ $<
#%.man: %.mandocbook
# ${DOCBOOKTOMAN} --to-stdout $< > $@
#%.man: %.text
%.1: %.text
${A2X} -f manpage $<
%.pdf: %.text
${A2X} -f pdf $<
#
# Developer targets
#
pub:
git push
publish-doc: documentation
@chmod a+r ${DOCS} ${DOC_ALL}
@tar cf ${docs_archive_name} ${DOCS} ${DOC_ALL}
@echo "Documentation files are in ${docs_archive_name}"
#
# Distribution
#
clean:
rm -f ${DOC_ALL}
rm -f doc/man/*.[0-9] doc/man/*.xml doc/*.fo doc/man/*.fo
distclean: clean
rm -f ${DOCBDOCS}
#
# Be nice with the users and generate documentation for them
#
dist: distclean documentation
/tmp/ccollect:
mkdir -p /tmp/ccollect
shellcheck: ./ccollect
shellcheck -s sh -f gcc -x ./ccollect
test-nico: $(CCOLLECT_SOURCE) /tmp/ccollect
cd ./conf/sources/; for s in *; do CCOLLECT_CONF=../ ../../ccollect daily "$$s"; done
touch /tmp/ccollect/$$(ls /tmp/ccollect | head -n1).ccollect-marker
CCOLLECT_CONF=./conf ./ccollect -a daily
touch /tmp/ccollect/$$(ls /tmp/ccollect | head -n1).ccollect-marker
CCOLLECT_CONF=./conf ./ccollect -a -p daily
test-dir-source:
mkdir -p /tmp/ccollect/source
cp -R -f ./* /tmp/ccollect/source
test-dir-destination:
mkdir -p /tmp/ccollect/backup
test-dir-destination-chint:
mkdir -p /tmp/ccollect/backup-chint
test-fixed-intervals: $(CCOLLECT_SOURCE) test-dir-source test-dir-destination test-dir-destination-chint
for s in ./test/conf/sources/*; do \
CCOLLECT_CONF=./test/conf ./ccollect -l ${TEST_LOG_FILE} daily "$$(basename "$$s")"; \
test "$$(ls -1 /tmp/ccollect/backup | wc -l)" -gt "0" || { cat ${TEST_LOG_FILE}; exit 1; }; \
done
CCOLLECT_CONF=./test/conf ./ccollect -l ${TEST_LOG_FILE} -a -v daily
test "$$(ls -1 /tmp/ccollect/backup | wc -l)" -gt "0" || { cat ${TEST_LOG_FILE}; exit 1; }
CCOLLECT_CONF=./test/conf ./ccollect -l ${TEST_LOG_FILE} -a -p daily
test "$$(ls -1 /tmp/ccollect/backup | wc -l)" -gt "0" || { cat ${TEST_LOG_FILE}; exit 1; }
@printf "\nFixed intervals test ended successfully\n"
test-interval-changing: $(CCOLLECT_SOURCE) test-dir-source test-dir-destination-chint
rm -rf /tmp/ccollect/backup-chint/*
test "$$(ls -1 /tmp/ccollect/backup-chint | wc -l)" -eq "0" || { cat ${TEST_LOG_FILE}; exit 1; }
printf "3" > ./test/conf/sources/local-with-interval/intervals/daily
for x in 1 2 3 4 5; do CCOLLECT_CONF=./test/conf ./ccollect -l ${TEST_LOG_FILE} daily local-with-interval; done
test "$$(ls -1 /tmp/ccollect/backup-chint | wc -l)" -eq "4" || { cat ${TEST_LOG_FILE}; exit 1; }
printf "5" > ./test/conf/sources/local-with-interval/intervals/daily
for x in 1 2 3 4 5 6 7; do CCOLLECT_CONF=./test/conf ./ccollect -l ${TEST_LOG_FILE} daily local-with-interval; done
test "$$(ls -1 /tmp/ccollect/backup-chint | wc -l)" -eq "6" || { cat ${TEST_LOG_FILE}; exit 1; }
printf "4" > ./test/conf/sources/local-with-interval/intervals/daily
for x in 1 2 3 4 5 6; do CCOLLECT_CONF=./test/conf ./ccollect -l ${TEST_LOG_FILE} daily local-with-interval; done
test "$$(ls -1 /tmp/ccollect/backup-chint | wc -l)" -eq "5" || { cat ${TEST_LOG_FILE}; exit 1; }
printf "3" > ./test/conf/sources/local-with-interval/intervals/daily
@printf "\nInterval changing test ended successfully\n"
test: test-fixed-intervals test-interval-changing
test -f "${TEST_LOG_FILE}"
@printf "\nTests ended successfully\n"