summaryrefslogtreecommitdiff
path: root/scripts/dump-tool
blob: 6fc501f6a890ad086f877d0063def4ccb0aab04d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env bash

LEVEL='0'
PROG_NAME="$(basename $0)"
XFSDUMP='/usr/bin/xfsdump'
DESTINATION="/backup"
SESSION_LABEL="weekly"
MEDIA_LABEL="root-fs"
FILESYSTEM="/"
ONE_SHOT=""

usage() {
    printf "Usage: %s [--one-shot] (--weekly | --daily | --hourly) [--file-system=fs] [--help]\n" $PROG_NAME > /dev/stderr
}

one_shot_weekly() {
    FOUND=""
    TIME=$(date +'%F')
    if [[ "$(date +'%a')" == 'Sat' ]];
    then
        for FILE in $DESTINATION/backup-*.0.dump;
        do
            if [[ $(stat -c '%w' $FILE | awk '{print $1}') == $TIME ]];
            then
                FOUND=$FILE
                break
            fi
        done

        if [[ -z $FOUND ]];
        then
            LEVEL='0'
            SESSION_LABEL="weekly"
            dump
        fi
    fi
}

one_shot_daily() {
    FOUND=""
    TIME=$(date +'%F')

    for FILE in $DESTINATION/backup-*.1.dump;
    do
        if [[ $(stat -c '%w' $FILE | awk '{print $1}') == $TIME ]];
        then
            FOUND=$FILE
            break
        fi
    done

    if [[ -z $FOUND ]];
    then
        LEVEL='1'
        SESSION_LABEL="daily"
        dump
    fi
}

dump() {
    DESTINATION_FILE="$DESTINATION/backup-$(date +'%Y-%m-%d-%H_%M_%S').$LEVEL.dump"
    $XFSDUMP -l $LEVEL -L $SESSION_LABEL  -M $MEDIA_LABEL -f $DESTINATION_FILE $FILESYSTEM
}

while [[ $# -gt 0 ]]; do
    case $1 in
        --weekly)
            LEVEL='0'
            SESSION_LABEL="weekly"
            ;;
        --daily)
            LEVEL='1'
            SESSION_LABEL="daily"
            ;;
        --hourly)
            LEVEL='2'
            SESSION_LABEL="hourly"
            ;;
        --file-system=*)
            FILESYSTEM=$(echo $1 | sed "s|--file-system=||g")
            ;;
        --one-shot)
            ONE_SHOT='1'
            ;;
        --help)
            usage
            exit 1
            ;;
        *)
            printf "Error: Unknown flag '%s'\n" $1 > /dev/stderr
            usage
            exit 1
            ;;
    esac

    shift
done

if [[ -z $ONE_SHOT ]];
then
    dump
else
    one_shot_weekly
    one_shot_daily
fi