Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
S
SnipeIt
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
OskarStenberg
SnipeIt
Commits
efb76dbd
Commit
efb76dbd
authored
4 years ago
by
Oskar Stenberg
Browse files
Options
Downloads
Patches
Plain Diff
Added an incremental backup script
parent
797b04d2
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
backup.sh
+178
-0
178 additions, 0 deletions
backup.sh
with
178 additions
and
0 deletions
backup.sh
0 → 100755
+
178
−
0
View file @
efb76dbd
#!/bin/bash
snipeitDirectory
=
"/var/www/html/snipeit"
backupDirectory
=
"
$snipeitDirectory
/storage/app/backups"
dbDumpFile
=
"
$snipeitDirectory
/vendor/spatie/db-dumper/src/Databases/MySql.php"
destinationDir
=
"/export/home/snipeit/backups"
#/ Usage: backup.sh [-dbmof]
#/
#/ Create an incremental backup of a snipeit-instance
#/
#/ OPTIONS:
#/ -d | --snipeit-directory Set the directory of the instance to be backed up
#/ -b | --backup-directory Set the directory where SnipeIT places the internal backups
#/ -m | --mysql-dump-settings Set the location of the database dump settings file
#/ -o | --output-directory Set the output directory for where to place the backups
#/ -f | --full-backup Make a new, full, backup instead of an incremental one
#/ -h | --help Show this message.
print_usage
()
{
grep
'^#/'
<
"
$0
"
|
cut
-c
4-
exit
1
}
#Parse arguments
while
[[
$#
>
0
]]
;
do
case
"
$1
"
in
-d
|
--snipeit-directory
)
shift
if
test
$#
-gt
0
;
then
snipeitDirectory
=
$(
echo
"
$1
"
|
sed
"s,/
$,
,"
)
else
echo
"No SnipeIT directory specified"
exit
1
fi
shift
;;
-b
|
--backup-directory
)
shift
if
test
$#
-gt
0
;
then
backupDirectory
=
$(
echo
"
$1
"
|
sed
"s,/
$,
,"
)
else
echo
"No backup directory specified"
exit
1
fi
shift
;;
-m
|
--mysql-dump-settings
)
if
test
$#
-gt
0
;
then
dbDumpFile
=
$1
else
echo
"No database dump settings specified"
exit
1
fi
shift
;;
-o
|
--output-directory
)
if
test
$#
-gt
0
;
then
destinationDir
=
$(
echo
"
$1
"
|
sed
"s,/
$,
,"
)
else
echo
"No output directory specified"
exit
1
fi
shift
;;
-f
|
--full-backup
)
echo
"Creating full backup"
mkdir
"
$destinationDir
/
$(
date
+%s
)
"
shift
;;
-h
|
--help
)
print_usage
exit
1
;;
-
*
)
echo
"Error: invalid argument: '
$1
'"
1>&2
print_usage
exit
1
;;
esac
done
if
!
[
-d
"
$destinationDir
/"
]
;
then
echo
"Output directory not found:
$destinationDir
"
exit
0
fi
if
!
[
-d
"
$snipeitDirectory
/"
]
;
then
echo
"SnipeIT directory not found:
$snipeitDirectory
"
exit
0
fi
if
!
[
-d
"
$backupDirectory
/"
]
;
then
echo
"Backup directory not found:
$backupDirectory
"
exit
0
fi
if
!
[
-f
"
$dbDumpFile
"
]
;
then
echo
"Database dump settings file not found:
$dbDumpFile
"
exit
0
fi
#Update value in config file to get correct format
sed
-i
's/protected $useExtendedInserts = true;/protected $useExtendedInserts = false;/'
$dbDumpFile
#Generate the internal backup
cd
$snipeitDirectory
php artisan backup:run
backupFile
=
$(
ls
-lt
$backupDirectory
|
head
-3
|
tail
-1
|
awk
'{print $9}'
)
extractDir
=
$(
echo
$backupFile
|
cut
-f
1
-d
'.'
)
echo
"Current backup:
$extractDir
"
#Create the workdir and copy all the important files to it
workdir
=
$(
mktemp
-d
)
cd
$workdir
echo
"Tmp dir:
$workdir
"
mkdir
new
unzip
-qq
"
$backupDirectory
/
$backupFile
"
-d
"./
$extractDir
"
>
/dev/null 2>&1
cd
$extractDir
echo
"Copied:"
find
.
-path
".
$snipeitDirectory
/public/uploads/barcodes"
-prune
-o
-print
| egrep
'(*\.png|*\.jpg|*\.webp|*\.gif|*\.svg|\.env)$'
| cpio
-pdmu
../new/
cd
../
cp
-r
$extractDir
/db-dumps new/
now
=
$(
date
+%s
)
#If there are no previous full backups, then create one
if
[
-z
"
$(
ls
-A
"
$destinationDir
/"
)
"
]
;
then
mkdir
"
$destinationDir
/
$now
"
fi
lastBackup
=
$(
ls
-lt
$destinationDir
|
head
-2
|
tail
-1
|
awk
'{print $9}'
)
#If there are no patches, create a folder for them
if
!
[
-d
"
$destinationDir
/
$lastBackup
/patches"
]
;
then
mkdir
"
$destinationDir
/
$lastBackup
/patches"
fi
#Check and copy all files (images, .env) that are either new or changed.
cd
new
files
=
$(
find
".
$snipeitDirectory
"
-type
f
)
echo
"Files to check:"
echo
"
$files
"
echo
"Trying to copy:"
while
IFS
=
read
-r
file
;
do
if
!
[
-f
"
$destinationDir
/
$lastBackup
/
$(
echo
$file
|
cut
-c
3-
)
"
]
||
[
"
$destinationDir
/
$lastBackup
/
$(
echo
$file
|
cut
-c
3-
)
"
-ot
"
$file
"
]
;
then
cp
-u
--parents
"
$file
"
"
$destinationDir
/
$lastBackup
/"
echo
"Copied
$file
$destinationDir
/
$lastBackup
/
$(
echo
$file
|
cut
-c
3-
)
"
else
echo
"File already exists:
$destinationDir
/
$lastBackup
/
$(
echo
$file
|
cut
-c
3-
)
"
fi
done
<<<
"
$files
"
#Try to make a patch of the database dump
file
=
"db-dumps/mysql-snipeit.sql"
if
[
-z
"
$(
ls
-A
"
$destinationDir
/
$lastBackup
/patches"
)
"
]
;
then
diff
-urN
null
$file
>
patch.patch
cp
"patch.patch"
"
$destinationDir
/
$lastBackup
/patches/
$now
.patch"
echo
"Copied patch to
$destinationDir
/
$lastBackup
/patches/
$now
.patch"
else
for
p
in
"
$destinationDir
/
$lastBackup
/patches/*.patch"
;
do
(
patch
--quiet
-p1
)
<
$p
done
result
=
$(
diff
"mysql-snipeit.sql"
"
$file
"
>
"
$now
.patch"
&&
echo
$?
||
echo
$?
)
#Only save non-empty patches
if
[
$result
!=
0
-a
$result
!=
1
]
;
then
echo
"Nothing to patch"
exit
1
fi
if
[
-s
"
$now
.patch"
]
;
then
cp
"
$now
.patch"
"
$destinationDir
/
$lastBackup
/patches/"
echo
"Copied patch to
$destinationDir
/
$lastBackup
/patches/
$now
.patch"
else
echo
"Nothing to patch"
fi
fi
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment