| #!/bin/bash |
| # |
| |
| # Copyright (C) 2009, 2010, 2011, 2012 Google Inc. |
| # |
| # 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. |
| |
| set -e -u |
| |
| @SHELL_ENV_INIT@ |
| |
| # Overridden by unittest |
| : ${CHECK_CERT_EXPIRED:=$PKGLIBDIR/check-cert-expired} |
| |
| 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 |
| |
| readonly CRYPTO_DIR=$RUN_DIR/crypto |
| readonly QUEUE_ARCHIVE_DIR=$DATA_DIR/queue/archive |
| |
| in_cluster() { |
| [[ -e $DATA_DIR/ssconf_master_node ]] |
| } |
| |
| 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 |
| } |
| |
| 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 \ |
| \( -name 'watcher.*-*-*-*.data' -or \ |
| -name 'watcher.*-*-*-*.instance-status' \) -print0 | \ |
| xargs -r0 rm -vf |
| } |
| |
| 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 |
| } |
| |
| # Define how many days archived jobs should be left alone |
| REMOVE_AFTER=21 |
| |
| # 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)" |
| |
| # Switch to a working directory accessible to the cleaner |
| cd $CLEANER_LOG_DIR |
| |
| # Remove old cleaner log files |
| find $CLEANER_LOG_DIR -maxdepth 1 -type f | sort | head -n -$KEEP_LOGS | \ |
| xargs -r rm -vf |
| |
| case "$1" in |
| node) |
| cleanup_node |
| cleanup_watcher |
| ;; |
| master) |
| cleanup_master |
| ;; |
| esac |
| |
| exit 0 |