|
1
|
####--------------------------------------------------------------------------------
|
|
2
|
#### SVN Repository Backup
|
|
3
|
#### Author: James Coffman
|
|
4
|
#### Date Created: 6/16/2009
|
|
5
|
#### -------------------------------------------------------------------------------
|
|
6
|
#### Updates:
|
|
7
|
#### 2009/06/23 - modified zip function and added wait at the end to help make sure
|
|
8
|
#### compression has time to complete.
|
|
9
|
#### -------------------------------------------------------------------------------
|
|
10
|
#### Disclaimer: !!!! Use at your own risk. !!!!
|
|
11
|
####
|
|
12
|
#### This Script will use svnadmin to hotcopy every repository in your
|
|
13
|
#### repositories directory. For example I have all of my repositories
|
|
14
|
#### in the directory ..\SVN\Repositories. This script assumes each directory
|
|
15
|
#### under the main directory is a repository and will attempt to back it up.
|
|
16
|
#### It will zip the backedup dir and copy it to a directory named after the repository
|
|
17
|
#### under the backup path. If the directory doesnt exist will be created for you.
|
|
18
|
#### If you set the DaysToKeepBackups variable to something > 0 then this script
|
|
19
|
#### will delete the backup zipfiles older that the # of days you set.
|
|
20
|
#### 1) You need to have svnadmin.exe accessible.
|
|
21
|
#### 2) Set your paths in the global vars below
|
|
22
|
####--------------------------------------------------------------------------------
|
|
23
|
|
|
24
|
|
|
25
|
# Set up Global variables needed by script
|
|
26
|
$mySqlDatabaseName = "databasename"
|
|
27
|
$mySqlUser = "user"
|
|
28
|
$mySqlPassword = "password"
|
|
29
|
$redmineFileFolderPath = "D:\Program Files\Redmine\files"
|
|
30
|
$backupPath = "d:\dump"
|
|
31
|
$mySqlDumpExe = "D:\Program Files\MySQL\MySQL Server 5.0\bin\mysqldump.exe"
|
|
32
|
$DaysToKeepBackups = 60
|
|
33
|
$sz = "$env:ProgramFiles\7-Zip\7z.exe"
|
|
34
|
|
|
35
|
#*************************************************************************
|
|
36
|
# F U N C T I O N S
|
|
37
|
#*************************************************************************
|
|
38
|
|
|
39
|
#------------------------------------------------------------------------#
|
|
40
|
# Create a new temp Directory
|
|
41
|
#------------------------------------------------------------------------#
|
|
42
|
function CreateTempDir ([string]$name)
|
|
43
|
{
|
|
44
|
#create a dir in the system temp dir for svn to copy the repository into
|
|
45
|
#before zipping it
|
|
46
|
|
|
47
|
$newDir = "Not Found"
|
|
48
|
|
|
49
|
$tempCopyPath = [System.IO.Path]::GetTempPath().ToString() + $name
|
|
50
|
|
|
51
|
#delete it first if it exists
|
|
52
|
if ( [System.IO.Directory]::Exists($tempCopyPath) )
|
|
53
|
{
|
|
54
|
Remove-Item -path $tempCopyPath -recurse -force
|
|
55
|
##[System.IO.Directory]::Delete($repoTempCopyPath, $true)
|
|
56
|
}
|
|
57
|
|
|
58
|
#then create it
|
|
59
|
if( ![System.IO.Directory]::Exists($tempCopyPath))
|
|
60
|
{
|
|
61
|
$newDir = [System.IO.Directory]::CreateDirectory($tempCopyPath)
|
|
62
|
}
|
|
63
|
|
|
64
|
$newDir.FullName
|
|
65
|
}
|
|
66
|
|
|
67
|
#------------------------------------------------------------------------#
|
|
68
|
# Run SVN Backup
|
|
69
|
#------------------------------------------------------------------------#
|
|
70
|
function RunMySqlDump ([string]$user, [string]$password, [string]$databaseName, [string]$sqlName)
|
|
71
|
{
|
|
72
|
$currentOutputEncoding = [Console]::OutputEncoding
|
|
73
|
[Console]::OutputEncoding = [Text.Encoding]::UTF8
|
|
74
|
|
|
75
|
& $mySqlDumpExe --user=$user --password=$password $databaseName | Out-File "$sqlName" -encoding UTF8
|
|
76
|
|
|
77
|
[Console]::OutputEncoding = $currentOutputEncoding
|
|
78
|
}
|
|
79
|
|
|
80
|
#------------------------------------------------------------------------#
|
|
81
|
# Zip a whole Directory
|
|
82
|
#------------------------------------------------------------------------#
|
|
83
|
function ZipDir ([string]$_dirToZip, [object]$_zipName)
|
|
84
|
{
|
|
85
|
#add zip extension if not present
|
|
86
|
if (-not $_zipName.EndsWith(".zip")) {$_zipName += ".zip"}
|
|
87
|
|
|
88
|
#make sure directory to zip exists
|
|
89
|
if (test-path $_dirToZip)
|
|
90
|
{
|
|
91
|
#make sure zip file doesnt already exist
|
|
92
|
if (-not (test-path $_zipName))
|
|
93
|
{
|
|
94
|
& $sz a -tzip "$_zipName" "$_dirToZip"
|
|
95
|
}
|
|
96
|
}
|
|
97
|
else
|
|
98
|
{
|
|
99
|
"ERROR: Path does not exist -- $_dirToZip"
|
|
100
|
}
|
|
101
|
}
|
|
102
|
|
|
103
|
#------------------------------------------------------------------------#
|
|
104
|
# Clean Backup Dirs
|
|
105
|
#------------------------------------------------------------------------#
|
|
106
|
function CleanBackupDirs ([string]$backupPathtoClean, [int]$daysToKeep)
|
|
107
|
{
|
|
108
|
" ... cleaning $backupPathtoClean"
|
|
109
|
foreach ($backupFile in Get-ChildItem -Path $backupPathtoClean)
|
|
110
|
{
|
|
111
|
if ( Test-Path $backupFile.FullName )
|
|
112
|
{
|
|
113
|
$y = ((Get-Date) - $backupFile.CreationTime).Days
|
|
114
|
if ($y -gt $daysToKeep -and $backupFile.PsISContainer -ne $True)
|
|
115
|
{
|
|
116
|
" ...... Deleting $backupFile : " + $backupFile.CreationTime
|
|
117
|
$backupFile.Delete()
|
|
118
|
}
|
|
119
|
else
|
|
120
|
{
|
|
121
|
" ...... Keeping $backupFile : " + $backupFile.CreationTime
|
|
122
|
}
|
|
123
|
}
|
|
124
|
}
|
|
125
|
}
|
|
126
|
|
|
127
|
#*************************************************************************
|
|
128
|
# MAIN LOGIC BEGINS HERE
|
|
129
|
#*************************************************************************
|
|
130
|
|
|
131
|
|
|
132
|
if (-not (test-path "$sz"))
|
|
133
|
{
|
|
134
|
"7z est manquant"
|
|
135
|
exit(-1)
|
|
136
|
}
|
|
137
|
|
|
138
|
|
|
139
|
"*******************************************************"
|
|
140
|
"* BEGIN: Backing Up Redmine"
|
|
141
|
"*******************************************************"
|
|
142
|
"* Params: "
|
|
143
|
"* The Database Name is: $mySqlDatabaseName"
|
|
144
|
"* The Redmine File Folder is: $redmineFileFolderPath"
|
|
145
|
"* The Backup Path is: $backupPath"
|
|
146
|
$temp = [System.IO.Path]::GetTempPath().ToString()
|
|
147
|
"* The Temp Directory is: $temp"
|
|
148
|
"* "
|
|
149
|
"*------------------------------------------------------"
|
|
150
|
|
|
151
|
""
|
|
152
|
" Processing backup for: $mySqlDatabase"
|
|
153
|
$tempDir = ""
|
|
154
|
" ... Creating Temp Directory"
|
|
155
|
$tempDir = CreateTempDir $mySqlDatabaseName
|
|
156
|
" ... Running MySqlDump"
|
|
157
|
$tempFileName = $tempDir + "\" + $mySqlDatabaseName + ".sql"
|
|
158
|
RunMySqlDump $mySqlUser $mySqlPassword $mySqlDatabaseName $tempFileName
|
|
159
|
|
|
160
|
" ... Copying Redmine files"
|
|
161
|
Copy-Item $redmineFileFolderPath $tempDir -recurse
|
|
162
|
|
|
163
|
|
|
164
|
$newBackupPath = ""
|
|
165
|
# Create a Folder in the backup path for each repository if needed
|
|
166
|
if($backupPath.EndsWith("\"))
|
|
167
|
{
|
|
168
|
$newBackupPath = $backupPath + $mySqlDatabaseName
|
|
169
|
}
|
|
170
|
else
|
|
171
|
{
|
|
172
|
$newBackupPath = $backupPath + "\" + $mySqlDatabaseName
|
|
173
|
}
|
|
174
|
if( ![System.IO.Directory]::Exists($newBackupPath))
|
|
175
|
{
|
|
176
|
" ... Creating Backup Directory $newBackupPath"
|
|
177
|
[System.IO.Directory]::CreateDirectory($newBackupPath)
|
|
178
|
}
|
|
179
|
if(!$newBackupPath.EndsWith("\")){$newBackupPath = $newBackupPath + "\"}
|
|
180
|
|
|
181
|
# Zip the the backup into a zip file with datetime stamp
|
|
182
|
$timeStamp = Get-Date -uformat "%Y_%m_%d_%H%M%S"
|
|
183
|
$zipNamePath = $newBackupPath + $mySqlDatabaseName + "_" + $timeStamp + ".zip"
|
|
184
|
" ... Zipping Repository Backup to $zipNamePath"
|
|
185
|
ZipDir $tempDir $zipNamePath
|
|
186
|
|
|
187
|
# next step is to clean old zipped backups
|
|
188
|
if ($DaysToKeepBackups -gt 0)
|
|
189
|
{
|
|
190
|
CleanBackupDirs $newBackupPath $DaysToKeepBackups
|
|
191
|
}
|
|
192
|
|
|
193
|
|
|
194
|
|
|
195
|
"*******************************************************"
|
|
196
|
"* END: Redmine Archived"
|
|
197
|
"*******************************************************"
|
|
198
|
|
|
199
|
Exit(0)
|