ganeti-cleaner.in 2.9 KB
Newer Older
1
2
3
#!/bin/bash
#

4
# Copyright (C) 2009, 2010, 2011, 2012 Google Inc.
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

21
22
23
24
25
26
27
set -e -u

@SHELL_ENV_INIT@

# Overridden by unittest
: ${CHECK_CERT_EXPIRED:=$PKGLIBDIR/check-cert-expired}

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
usage() {
    echo "Usage: $0 node|master" 2>&1
    exit $1
}

if [[ "$#" -ne 1 ]]; then
  usage 1
fi

case "$1" in
  node)
    readonly CLEANER_LOG_DIR=$LOG_DIR/cleaner
    ;;
  master)
    readonly CLEANER_LOG_DIR=$LOG_DIR/master-cleaner
    ;;
  --help-completion)
    echo "choices=node,master 1 1"
    exit 0
    ;;
  --help)
    usage 0
    ;;
  *)
    usage 1
    ;;
esac

56
readonly CRYPTO_DIR=$RUN_DIR/crypto
57
readonly QUEUE_ARCHIVE_DIR=$DATA_DIR/queue/archive
58

59
60
61
62
in_cluster() {
  [[ -e $DATA_DIR/ssconf_master_node ]]
}

63
64
65
66
67
68
69
70
71
72
73
74
75
cleanup_node() {
  # Return if directory for crypto keys doesn't exist
  [[ -d $CRYPTO_DIR ]] || return 0

  find $CRYPTO_DIR -mindepth 1 -maxdepth 1 -type d | \
  while read dir; do
    if $CHECK_CERT_EXPIRED $dir/cert; then
      rm -vf $dir/{cert,key}
      rmdir -v --ignore-fail-on-non-empty $dir
    fi
  done
}

76
77
78
79
80
81
cleanup_watcher() {
  # Return if machine is not part of a cluster
  in_cluster || return 0

  # Remove old watcher files
  find $DATA_DIR -maxdepth 1 -type f -mtime +$REMOVE_AFTER \
82
83
    \( -name 'watcher.*-*-*-*.data' -or \
       -name 'watcher.*-*-*-*.instance-status' \) -print0 | \
84
85
86
  xargs -r0 rm -vf
}

87
88
89
90
91
92
93
94
95
96
97
98
cleanup_master() {
  # Return if machine is not part of a cluster
  in_cluster || return 0

  # Return if queue archive directory doesn't exist
  [[ -d $QUEUE_ARCHIVE_DIR ]] || return 0

  # Remove old jobs
  find $QUEUE_ARCHIVE_DIR -mindepth 2 -type f -mtime +$REMOVE_AFTER -print0 | \
  xargs -r0 rm -vf
}

99
100
101
# Define how many days archived jobs should be left alone
REMOVE_AFTER=21

102
103
104
105
106
107
108
109
110
111
112
113
114
# Define how many log files to keep around (usually one per day)
KEEP_LOGS=50

# Log file for this run
LOG_FILE=$CLEANER_LOG_DIR/cleaner-$(date +'%Y-%m-%dT%H_%M').$$.log

# Create log directory
mkdir -p $CLEANER_LOG_DIR

# Redirect all output to log file
exec >>$LOG_FILE 2>&1

echo "Cleaner started at $(date)"
115

116
117
118
# Remove old cleaner log files
find $CLEANER_LOG_DIR -maxdepth 1 -type f | sort | head -n -$KEEP_LOGS | \
xargs -r rm -vf
119

120
121
122
123
124
125
126
127
128
case "$1" in
  node)
    cleanup_node
    cleanup_watcher
    ;;
  master)
    cleanup_master
    ;;
esac
129
130

exit 0