| #!/bin/bash |
| # |
| |
| # Copyright (C) 2009, 2010, 2011, 2012 Google Inc. |
| # All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: |
| # |
| # 1. Redistributions of source code must retain the above copyright notice, |
| # this list of conditions and the following disclaimer. |
| # |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
| # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
| # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
| # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| 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 |