Skip to content
Snippets Groups Projects
borg.in 4.21 KiB
Newer Older
  • Learn to ignore specific revisions
  • # -*- mode: sh; sh-basic-offset: 3; indent-tabs-mode: nil; -*-
    # vim: set filetype=sh sw=3 sts=3 expandtab autoindent:
    #
    # borg handler script for backupninja
    # requires borgbackup
    #
    
    # Guillaume Subiron, Sysnove, 2016
    #
    # Copyright 2016 Guillaume Subiron <guillaume@sysnove.fr>
    #
    # This work is free. You can redistribute it and/or modify it under the
    # terms of the Do What The Fuck You Want To Public License, Version 2,
    # as published by Sam Hocevar. See the http://www.wtfpl.net/ file for more details.
    #
    
    #
    
    export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
    
    export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
    
    
    ### GET CONFIG ###
    
    getconf testconnect yes
    getconf nicelevel 0
    
    getconf excludecaches no
    getconf excludenodump no
    
    getconf prune yes
    getconf keep 30d
    getconf prune_options
    
    
    setsection dest
    getconf user
    getconf host
    getconf directory
    # strip trailing /
    directory=${directory%/}
    
    getconf archive {now:%Y-%m-%dT%H:%M:%S}
    
    getconf encryption none
    
    export BORG_PASSPHRASE="$passphrase"
    
    
    ### CHECK CONFIG ###
    
    # destination specific checks
    [ "$directory" != "" ] || fatal "Destination directory not set"
    if [ "$host" != "localhost" ]; then
      execstr_repository="$user@$host:$directory"
    else
      execstr_repository="$directory"
    fi
    execstr_archive="$archive"
    
    
    # check the connection at the source and destination
    [ -n "$test" ] || test=0
    if [ "$host" != "localhost" ] && ([ "$testconnect" = "yes" ] || [ "${test}" -eq 1 ]); then
       debug "ssh -o PasswordAuthentication=no $host -l $user 'echo -n 1'"
       local ret=`ssh -o PasswordAuthentication=no $host -l $user 'echo -n 1'`
       if [ "$ret" = 1 ]; then
          debug "Connected to $host as $user successfully"
       else
          teststr="borg list --show-rc -v $execstr_repository"
          debug "$teststr"
          output=`su -c "$teststr" 2>&1`
          if echo "$output" | grep "terminating with success status" ; then
             debug "Connected to $host as $user successfully (forced command)"
          else
             if echo "$output" | grep -E "Repository.+does not exist" ; then
                debug "Connected to $host as $user successfully (forced command)"
             else
                fatal "Can't connect to $host as $user."
             fi
          fi
       fi
    fi
    
    
    if [ "$init" == "yes" ]; then
       initstr="borg init --encryption=$encryption $execstr_repository"
       debug "$initstr"
       if [ $test = 0 ]; then
          output="`su -c "$initstr" 2>&1`"
          if [ $? = 2 ]; then
             debug $output
             info "Repository was already initialized"
          else
             warning $output
             warning "Repository has been initialized"
          fi
    
    fi
    
    ### EXECUTE ###
    
    execstr="borg create --stats --compression $compression"
    
    set -o noglob
    
    # includes
    SAVEIFS=$IFS
    IFS=$(echo -en "\n\b")
    for i in $include; do
       includes="${includes} '$i'"
    done
    IFS=$SAVEIFS
    
    # excludes
    SAVEIFS=$IFS
    IFS=$(echo -en "\n\b")
    for i in $exclude; do
       excludes="${excludes} --exclude '$i'"
    done
    IFS=$SAVEIFS
    
    set +o noglob
    
    
    if [ ! -z $bwlimit ]; then
       execstr="${execstr} --remote-ratelimit=${bwlimit}"
    fi
    
    
    if [ "$excludecaches" == "yes" ]; then
       execstr="${execstr} --exclude-caches"
    fi
    
    if [ "$excludenodump" == "yes" ]; then
       execstr="${execstr} --exclude-nodump"
    fi
    
    
    # include client-part and server-part
    execstr="${execstr} ${excludes} $execstr_repository::$execstr_archive ${includes}"
    debug "$execstr"
    
    if [ $test = 0 ]; then
       output=`nice -n $nicelevel su -c "$execstr" 2>&1`
       if [ $? = 0 ]; then
          debug $output
          info "Successfully finished backing up source $label"
       else
          error $output
          fatal "Failed backuping up source $label"
       fi
    fi
    
    ### REMOVE OLD BACKUPS ###
    
    # borg prune
    
    if [ "$prune" == "yes" ]; then
    
       if [ ! -z $keep ] && [ ! "$keep" == "0" ]; then
          prune_options="${prune_options} --keep-within=${keep}"
       fi
       prunestr="borg prune $prune_options $execstr_repository"
       debug "$prunestr"
    
       if [ $test = 0 ]; then
          output="`su -c "$prunestr" 2>&1`"
          if [ $? = 0 ]; then
             debug $output
             info "Removing old backups succeeded."
          else
             warning $output
             warning "Failed removing old backups."
          fi