source: scripts/usr/local/lib/7dtd/commands/backup.sh @ 353

Last change on this file since 353 was 353, checked in by alloc, 4 months ago

Scripts 112

File size: 3.8 KB
Line 
1#!/bin/bash
2
3#   Copyright 2016 Christian 'Alloc' Illy
4#
5#   Licensed under the Apache License, Version 2.0 (the "License");
6#   you may not use this file except in compliance with the License.
7#   You may obtain a copy of the License at
8#
9#       http://www.apache.org/licenses/LICENSE-2.0
10#
11#   Unless required by applicable law or agreed to in writing, software
12#   distributed under the License is distributed on an "AS IS" BASIS,
13#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14#   See the License for the specific language governing permissions and
15#   limitations under the License.
16
17
18# Backups game data files.
19
20sdtdCommandBackup() {
21        local DT=`date "+%Y-%m-%d_%H-%M"`
22        local NewBackup=$SDTD_BACKUP_ROOT/$DT
23       
24        if [ ! -d "$SDTD_BASE/instances" ]; then
25                return
26        fi
27
28        if [ "$SDTD_BACKUP_SAVEWORLD" == "true" ]; then
29                for I in $(getInstanceList); do
30                        if [ $(isRunning $I) -eq 1 ]; then
31                                telnetCommand $I saveworld 2 > /dev/null
32                        fi
33                done
34        fi
35
36        # Check for backup folder existence
37        if [ -e $SDTD_BACKUP_ROOT ]; then
38                # Exists, copy(link) latest backup
39                unset -v LatestBackup
40                local fileI
41                for fileI in $(find "$SDTD_BACKUP_ROOT" -mindepth 1 -maxdepth 1 -type d); do
42                        if [ "$fileI" -nt "$LatestBackup" ]; then
43                                LatestBackup=$fileI
44                        fi
45                done
46                if [ -d "$LatestBackup" ]; then
47                        cp -al "$LatestBackup" "$NewBackup"
48                fi
49        fi
50
51        if [ ! -d $SDTD_BACKUP_ROOT ]; then
52                # Create new backup dir
53                mkdir $SDTD_BACKUP_ROOT
54        fi
55
56        for H in $(getHooksFor serverPreBackup); do
57                $H
58        done
59
60        $RSYNC -a --delete --numeric-ids --delete-excluded $SDTD_BASE/instances/./ $NewBackup
61        touch $NewBackup
62       
63        ## Compress if enabled
64        case ${SDTD_BACKUP_COMPRESS:-none} in
65                all)
66                        local dfname=$(basename $NewBackup)
67                        cd $SDTD_BACKUP_ROOT
68                        tar -czf $dfname.tar.gz $dfname
69                        touch -r $dfname $dfname.tar.gz
70                        rm -Rf $dfname
71                        ;;
72                old)
73                        if [ -d $LatestBackup ]; then
74                                local dfname=$(basename $LatestBackup)
75                                cd $SDTD_BACKUP_ROOT
76                                tar -czf $dfname.tar.gz $dfname
77                                touch -r $dfname $dfname.tar.gz
78                                rm -Rf $dfname
79                        fi
80                        ;;
81                none)
82                        ;;
83        esac
84       
85        cd $SDTD_BACKUP_ROOT
86       
87        ## Purge old/too many backups
88        local keepMin=${SDTD_BACKUP_MIN_BACKUPS_KEEP:-0}
89        if [ $(isANumber $SDTD_BACKUP_MAX_BACKUPS) -eq 1 ]; then
90                local removeBut=$SDTD_BACKUP_MAX_BACKUPS
91                if [ $SDTD_BACKUP_MAX_BACKUPS -lt $keepMin ]; then
92                        removeBut=$keepMin
93                fi
94                local num=0
95                local F
96                for F in $(ls -t1 $SDTD_BACKUP_ROOT); do
97                        (( num++ ))
98                        if [ $num -gt $removeBut ]; then
99                                rm -Rf $F
100                        fi
101                done
102        fi
103        if [ $(isANumber $SDTD_BACKUP_MAX_AGE) -eq 1 ]; then
104                local FINDBASE="find $SDTD_BACKUP_ROOT -mindepth 1 -maxdepth 1"
105                # Only continue if there are more than MIN_BACKUPS_KEEP backups at all
106                if [ $($FINDBASE | wc -l) -gt $keepMin ]; then
107                        local minutes=$(( $SDTD_BACKUP_MAX_AGE*60 ))
108                        while [ $($FINDBASE -mmin -$minutes | wc -l) -lt $keepMin ]; do
109                                minutes=$(( minutes+60 ))
110                        done
111                        $FINDBASE -mmin +$minutes -exec rm -Rf {} \;
112                fi
113        fi
114        if [ $(isANumber $SDTD_BACKUP_MAX_STORAGE) -eq 1 ]; then
115                local maxKBytes=$(( $SDTD_BACKUP_MAX_STORAGE*1024 ))
116                local curNumFiles=$(ls -t1 $SDTD_BACKUP_ROOT | wc -l)
117                while [ $(du -sk $SDTD_BACKUP_ROOT | tr '[:blank:]' ' ' | cut -d\  -f1) -gt $maxKBytes -a $curNumFiles -gt $keepMin ]; do
118                        local toDel=$(ls -tr1 | head -n 1)
119                        rm -Rf $toDel
120                        (( curNumFiles-- ))
121                done
122        fi
123
124        for H in $(getHooksFor backup); do
125                if [ "$SDTD_BACKUP_COMPRESS" = "all" ]; then
126                        $H $NewBackup.tar.gz
127                else
128                        $H $NewBackup
129                fi
130        done
131        for H in $(getHooksFor serverPostBackup); do
132                if [ "$SDTD_BACKUP_COMPRESS" = "all" ]; then
133                        $H $NewBackup.tar.gz
134                else
135                        $H $NewBackup
136                fi
137        done
138}
139
140sdtdCommandBackupHelp() {
141        echo "Usage: $(basename $0) backup"
142        echo
143        echo "Backups all data files (instance configurations, save data, logs)."
144}
145
146sdtdCommandBackupDescription() {
147        echo "Backup game data files"
148}
Note: See TracBrowser for help on using the repository browser.