-
Notifications
You must be signed in to change notification settings - Fork 0
/
backup.sh
268 lines (221 loc) · 9.72 KB
/
backup.sh
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
#!/bin/bash
menu=0
directory=ERROR:noInput
LOG=ERROR:noLogFileInput
menu1 () #Menu 1 - do a backup now
{
clear
printf "%b\n\n\nMenu 1"
printf "%b\n\n\n\tPath of the directory you want to backup: "
read -r dir
directoryName=$( basename "$dir" ) #getting basename
filename="$directoryName-$(date "+%y%m%d").tar.gz" #setting filename dynamically
if [ -d $dir ]; then #checking if directory exists
if [ -L $dir ]; then #Checking if directory is a symbolic link
temp=$(readlink -f $dir)
printf "%b\nThe directory is a symbolic link. Do you want to backup the origial folder "; readlink -f $dir; printf " (Y/N)?" #Getting full directory
read -r answer
if [ $answer == "y" ] || [ $answer = "Y" ]; then
printf "%b\nDoing backup of $filename, stored at $directory"
tar -chpzf $directory/$filename $directoryName #compressing a making backup file
logFunc "LOGGING" "Done a backup of a symbolic links original folder at $temp, stored at $directory"
fi
else
temp=$(readlink -f $dir)
printf "%b\n\n\nDo you want to backup "; readlink -f $dir; printf " (Y/N)?" #Getting full directory
read -r answer
if [ $answer = "y" -o $answer = "Y" ]; then
printf "%b\nDoing backup of $filename, stored at $directory"
tar -cpzf $directory/$filename $directoryName #compressing a making backup file
logFunc "LOGGING" "Done a backup of $temp, stored at $directory"
fi
fi
else
printf "%b\n\nCould not fin specified directory"
temp=$(readlink -f $dir) #Getting full directory
logFunc "ERROR" "Tried to backup $temp, but could not find directory and not backup was made"
sleep 2
fi
}
menu2 () #Menu 2 - plan backups with cron
{
clear
printf "%b\nMenu 2 - Plan a backup later today"
printf "%b\n\nPath of the directory you want to backup: "
read -r dir
if [ -d $dir ]; then #checking if directory exists
printf "%b\nTime of the planned backup (00:00-23:59): "
read -r Time
while :; do #making sure that the time is entered within it limits and on the right format
if [[ $Time =~ ^([0-9]{2}):([0-9]{2})$ ]]; then
if (( BASH_REMATCH[2] < 60 ))\
&& (( BASH_REMATCH[1] < 24 )); then
break
fi
fi
printf "%b\nWrong format. Please use the HH:MM format: "
read -r Time
logFunc "ERROR" "User entered an invalid time of or the wrong format, asked user to reenter time"
done
hour=${Time%:*};
minute=${Time#*:};
if [ -L $dir ]; then #checking if directory is a symbolic link
printf "%b\n\tThe directory is a symbolic link. Do you want to backup the origial folder readlink -f $dir (Y/N)?"
read -r answer
if [ $answer == "y" ] || [ $answer = "Y" ]; then
printf "%b\n\nThe backup will run at $Time. Do you want to add the planned backup (Y/N)?"
if [ "$answer" == "y" ] || [ $answer = "Y" ]; then
homeDir="$( realpath $HOME )";
cronLine="$hour $minute" #setting together the line that will be entered into cron
cronLine="$cronLine * * * "
cronLine="$cronLine $home"
cronFile="backupPlanned$hour$minute.sh"
baseName=$( basename "$dir" ) #getting basename
directoryName=$HOME/$baseName
filename="\$directoryName-dateOfBackup.tar.gz"
printf "%b\nAdding backup of $filename, stored at $directory to cron with execution time $Time"
printf "#!/bin/bash%b\n" >> $directory/$cronFile #making .sh for cron to execute at a later time
printf filename="$baseName-\$(date \"+%%y%%m%%d\".tar.gz)" >> $directory/$cronFile
printf "%b\ntar -cpzf $directory/\$filename $directoryName" >> $directory/$cronFile
chmod 711 $directory/$cronFile #setting execution rights to .sh
(crontab -l 2>/dev/null printf "$cronLine") #adding task to crontab
logFunc "LOGGING" "User added a planned backup of a symbolic link at $hour:$minute of $directoryName stored at $directory"
fi
fi
else
printf "%b\n\nThe backup will run at $Time. Do you want to add the planned backup (Y/N)?"
read -r answer
if [ "$answer" == "y" ] || [ $answer = "Y" ]; then
cronFile="backupPlanned$hour$minute.sh"
cronLine="$hour $minute" #setting together the line that will be entered into cron
cronLine="$cronLine * * * "
cronLine="$cronLine $directory/$cronFile"
user=$(id -un)
baseName=$( basename "$dir" ) #getting basename
directoryName=$HOME/$baseName
filename="\$directoryName-dateOfBackup.tar.gz"
printf "%b\nAdding backup of $filename, stored at $directory to cron with execution time $Time"
printf "#!/bin/bash%b\n" >> $directory/$cronFile #making .sh for cron to execute at a later time
printf filename="$baseName-\$(date \"+%%y%%m%%d\".tar.gz)" >> $directory/$cronFile
printf "%b\ntar -cpzf $directory/\$filename $directoryName" >> $directory/$cronFile
chmod 711 $directory/$cronFile #setting execution rights to .sh
echo -e "\n\n$cronLine\n\n"
(crontab -u $user -l; echo "$cronLine") | crontab -u $user -
#(crontab -l 2>/dev/null printf "$cronLine") | #adding task to crontab
logFunc "LOGGING" "User added a planned backup at $hour:$minute of $directoryName stored at $directory"
fi
fi
else
printf "%b\n\nDirectory not found. Please enter an actual directory"
logFunc "ERROR" "User entered a non-existent directory"
sleep 2
fi
}
menu3 () #Menu 3 - restore a previous backup
{
if [ "$(ls -A $directory)" ]; then #checks if it exists any backups in the backup folder
printf "%b\n\n"
ls -1 $directory #displays the contents of the backup directory
printf "%b\n\nChoose backup you want to restore: "
read -r backup
fileDirectory="$directory/$backup"
currentDirectory=$( pwd )
if [ -f $fileDirectory ]; then #if specified directory is found extraction is done
tar zxvf "$fileDirectory" -C "$currentDirectory"
logFunc "LOGGING" "Extracting $fileDirectory to $currentDirectory"
else
printf "%b\n\nCould NOT find the backup you specified"
logFunc "ERROR" "Could not find $fileDirectory"
sleep 2
fi
else
printf "%b\n\nCould not find any backups in the backup folder $directory"
logFunc "ERROR" "Could not find any backups in $directory"
sleep 2
fi
}
if [ -f "$HOME/.backup.conf" ]; then
directory=$( head -1 $HOME/.backup.conf)
printf "%b\n\n\n\nReading from file"
elif [ -d "$HOME/backups" ]; then
directory=$HOME/backups
printf "$HOME/backups" >> $directory/.backup.conf
printf "%b\n\n\n\nReading from file"
logFunc "LOGGING" "Found backup folder at $HOME/backups and made a backup.conf"
elif [ -d "/backups" ]; then
directory="/backups"
printf "backups" >> $directory/.backup.conf
printf "%b\n\n\n\nReading from file"
logFunc "LOGGING" "Found backup folder at /backups and made a backup.conf"
else
haveDirectory=false
printf "%b\n\n\nCould not find an existing backup folder.
\nPlease choose either
\n\t(1) /backups (NEED ROOT PRIVILEGES, will NOT run unless you ran the script as SU or SUDO) or
\n\t(2) $HOME/backups or
\n\tchoose your own directory.
\n\nDirectory: "
while [ $haveDirectory == false ]; do
read -r directory
case $directory in
1) mkdir /backups
printf "/backups" >> $directory/.backup.conf
haveDirectory=true
logFunc "LOGGING" "Did not find a previous backup folder or config, user chose a new backup folder at /backups and created the backup.conf at $directory/.backup.conf" ;;
2) mkdir $HOME/backups
printf "$HOME/backups" >> $directory/.backup.conf
haveDirectory=true
logFunc "LOGGING" "Did not find a previous backup folder or config, user chose a new backup folder at $HOME/backups and created the backup.conf at $directory/.backup.conf" ;;
*) haveDirectory=false
if [ -d "$directory" ]; then
mkdir $directory
printf "$directory" >> $directory/.backup.conf
haveDirectory=true
logFunc "LOGGING" "Did not find a previous backup folder or config, user chose a new backup folder at $directory and created the backup.conf at $directory/.backup.conf"
else
directory="$( readlink -f $directory )"
printf "%b\nCould not find the directory, make a new one (Y/N)?"
read -r answer
if [ $answer = "y" -o $answer = "Y" ]; then
mkdir $directory
printf "$directory" >> $directory/.backup.conf
haveDirectory=true
logFunc "LOGGING" "Could not find the directory the user provided, a new directory was made at $directory"
else
printf "%b\n\n\nDid not make a new directory. \nPlease enter directory again: "
logFunc "ERROR" "Could not find provided directory, user choose to not create a new directory"
fi
fi ;;
esac
done
fi
logFunc () {
DATE=$(date "+%F \t %T %z")
printf "%b\n$DATE \t $1 \t $2" >> $LOG
}
LOG=$directory/backup.log
logFunc "LOGGING" "Backup and config directory set at initial load at $directory"
clear
sleep 1
clear
printf "ASO 2017-2018"
printf "%b\nMartin Kvalvag"
printf "%b\nBackup tool for directiories"
printf "%b\n----------------------------"
until [ $menu == 4 ] ; do
printf "%b\n\n Menu"
printf "%b\n\t1) Immediate backup"
printf "%b\n\t2) Program a backup with cron"
printf "%b\n\t3) Restore content of a backup"
printf "%b\n\t4) Exit"
printf "%b\n\n Option: "
read -r menu
case $menu in
1) menu1 ; sleep 1;;
2) menu2 ; sleep 1;;
3) menu3 ; sleep 1;;
4) printf "%b\nExiting" ;;
esac
sleep 1
clear
done