Fix #1260 ganeti-cleaner accepts REMOVE_AFTER as env var (#1267)
[ganeti-github.git] / daemons / ganeti-cleaner.in
1 #!/bin/bash
2 #
3
4 # Copyright (C) 2009, 2010, 2011, 2012 Google Inc.
5 # All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions are
9 # met:
10 #
11 # 1. Redistributions of source code must retain the above copyright notice,
12 # this list of conditions and the following disclaimer.
13 #
14 # 2. Redistributions in binary form must reproduce the above copyright
15 # notice, this list of conditions and the following disclaimer in the
16 # documentation and/or other materials provided with the distribution.
17 #
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
19 # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 set -e -u
31
32 @SHELL_ENV_INIT@
33
34 # Overridden by unittest
35 : ${CHECK_CERT_EXPIRED:=$PKGLIBDIR/check-cert-expired}
36
37 usage() {
38     echo "Usage: $0 node|master" 2>&1
39     exit $1
40 }
41
42 if [[ "$#" -ne 1 ]]; then
43   usage 1
44 fi
45
46 case "$1" in
47   node)
48     readonly CLEANER_LOG_DIR=$LOG_DIR/cleaner
49     ;;
50   master)
51     readonly CLEANER_LOG_DIR=$LOG_DIR/master-cleaner
52     ;;
53   --help-completion)
54     echo "choices=node,master 1 1"
55     exit 0
56     ;;
57   --help)
58     usage 0
59     ;;
60   *)
61     usage 1
62     ;;
63 esac
64
65 readonly CRYPTO_DIR=$RUN_DIR/crypto
66 readonly QUEUE_ARCHIVE_DIR=$DATA_DIR/queue/archive
67
68 in_cluster() {
69   [[ -e $DATA_DIR/ssconf_master_node ]]
70 }
71
72 cleanup_node() {
73   # Return if directory for crypto keys doesn't exist
74   [[ -d $CRYPTO_DIR ]] || return 0
75
76   find $CRYPTO_DIR -mindepth 1 -maxdepth 1 -type d | \
77   while read dir; do
78     if $CHECK_CERT_EXPIRED $dir/cert; then
79       rm -vf $dir/{cert,key}
80       rmdir -v --ignore-fail-on-non-empty $dir
81     fi
82   done
83 }
84
85 cleanup_watcher() {
86   # Return if machine is not part of a cluster
87   in_cluster || return 0
88
89   # Remove old watcher files
90   find $DATA_DIR -maxdepth 1 -type f -mtime +$REMOVE_AFTER \
91     \( -name 'watcher.*-*-*-*.data' -or \
92        -name 'watcher.*-*-*-*.instance-status' \) -print0 | \
93   xargs -r0 rm -vf
94 }
95
96 cleanup_master() {
97   # Return if machine is not part of a cluster
98   in_cluster || return 0
99
100   # Return if queue archive directory doesn't exist
101   [[ -d $QUEUE_ARCHIVE_DIR ]] || return 0
102
103   # Remove old jobs
104   find $QUEUE_ARCHIVE_DIR -mindepth 2 -type f -mtime +$REMOVE_AFTER -print0 | \
105   xargs -r0 rm -vf
106 }
107
108 # Define how many days archived jobs should be left alone
109 REMOVE_AFTER=${REMOVE_AFTER:-21}
110
111 # Define how many log files to keep around (usually one per day)
112 KEEP_LOGS=50
113
114 # Log file for this run
115 LOG_FILE=$CLEANER_LOG_DIR/cleaner-$(date +'%Y-%m-%dT%H_%M').$$.log
116
117 # Create log directory
118 mkdir -p $CLEANER_LOG_DIR
119
120 # Redirect all output to log file
121 exec >>$LOG_FILE 2>&1
122
123 echo "Cleaner started at $(date)"
124
125 # Switch to a working directory accessible to the cleaner
126 cd $CLEANER_LOG_DIR
127
128 # Remove old cleaner log files
129 find $CLEANER_LOG_DIR -maxdepth 1 -type f | sort | head -n -$KEEP_LOGS | \
130 xargs -r rm -vf
131
132 case "$1" in
133   node)
134     cleanup_node
135     cleanup_watcher
136     ;;
137   master)
138     cleanup_master
139     ;;
140 esac
141
142 exit 0