Dsrestic.cmd a windows batch file

Here is my initial attempt at Windows to S3 with restic.

Problem: Open files on the Windows Server 2012 are access denied.

Create dsrestic.conf.cmd to specify which drives and folders you want to backup. The dsrestic.cmd batch file generates a diskshadow script, creates a shadow copy then runs restic on the shadowcopy.

Probably looks like a nightmare but it works! Please give it a try.

Opinions and suggestions welcome.

dsrestic.cmd (diskshadow restic)

@echo off

rem Sumo https://forum.restic.net/
rem v0.1 Feb 8 2020

rem - dsrestic.cmd
rem - A batch file to create a volume shadow copy snapshot
rem - and then backup that snapshot to an S3 repository
rem - using restic
rem - Public Domain - use at your own risk

setlocal

set CMD_NAME=%~n0%.cmd

if %RESTIC_PASSWORD%.==. (call :diskshadow) else (call :restic)
goto end

:diskshadow
if not exist dsrestic.conf.cmd echo dsrestic.conf.cmd not found & exit /b 0 
call dsrestic.conf.cmd

rem ================================================
rem dsrestic.conf.cmd example 
rem ================================================
rem set AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
rem set AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY
rem set RESTIC_REPOSITORY=s3:http://freenas:9000/your-repository
rem set RESTIC_PASSWORD=YOUR_RESTIC_PASSWORD
rem set MNT_POINT=c:\mnt
rem set SRC_DRIVES=d,f,h
rem set SRC_DIRS=apps,docs,photo,install,video
rem ================================================

echo set context persistent nowriters> %TEMP%\_diskshadow_.dss
echo set metadata %MNT_POINT%\metadata\restic.cab>> %TEMP%\_diskshadow_.dss
echo set verbose on>> %TEMP%\_diskshadow_.dss
echo begin backup>> %TEMP%\_diskshadow_.dss

mkdir %MNT_POINT%
mkdir %MNT_POINT%\metadata

echo metadata> %TEMP%\_includefiles_.src

FOR %%G IN (%SRC_DRIVES%) DO (
  echo add volume %%G: alias %%G>> %TEMP%\_diskshadow_.dss
  mkdir %MNT_POINT%\%%G
  FOR %%H IN (%SRC_DIRS%) DO (
    if exist %%G:\%%H\. echo %%G\%%H>> %TEMP%\_includefiles_.src
  )
)

echo create>> %TEMP%\_diskshadow_.dss 

FOR %%G IN (%SRC_DRIVES%) DO (
  echo expose %%%%G%% %MNT_POINT%\%%G>> %TEMP%\_diskshadow_.dss
)

echo exec %CMD_NAME% >> %TEMP%\_diskshadow_.dss 

FOR %%G IN (%SRC_DRIVES%) DO (
  echo delete shadows exposed %MNT_POINT%\%%G>> %TEMP%\_diskshadow_.dss
)

echo end backup>> %TEMP%\_diskshadow_.dss 
echo reset>> %TEMP%\_diskshadow_.dss 

diskshadow /s %TEMP%\_diskshadow_.dss
del %TEMP%\_diskshadow_.dss
del %TEMP%\_includefiles_.src

FOR %%G IN (%SRC_DRIVES%) DO (
  rmdir %MNT_POINT%\%%G
)
rmdir %MNT_POINT%\metadata /S /Q && rmdir %MNT_POINT%
exit /b 0

:restic
chdir /d %MNT_POINT%
restic backup --files-from "%TEMP%\_includefiles_.src"
exit /b 0

:end
endlocal

Instructions:

***** RUN AS ADMINISTRATOR ****** (right click, run as administrator)

Create a DSRESTIC folder on your desktop. Save the file as dsrestic.cmd in that folder. Create dsrestic.conf.cmd in that same folder.

dsrestic.conf.cmd

set AWS_ACCESS_KEY_ID=YOUR_AWS_ACCESS_KEY_ID
set AWS_SECRET_ACCESS_KEY=YOUR_AWS_SECRET_ACCESS_KEY
set RESTIC_REPOSITORY=s3:http://freenas:9000/your-repository
set RESTIC_PASSWORD=YOUR_RESTIC_PASSWORD
set MNT_POINT=c:\mnt
set SRC_DRIVES=d,f,h
set SRC_DIRS=apps,docs,photo,install,video

What happens?

These directories are created
c:\mnt
c:\mnt\d
c:\mnt\f
c:\mnt\h
c:\mnt\metadata

Shadowcopies are taken for local drives d: f: h:

The shadowcopies are mounted in the c:\mnt folder

Shadowcopy d: is mounted at c:\mnt\d
Shadowcopy f: is mounted at c:\mnt\f
Shadowcopy h: is mounted at c:\mnt\h

c:
cd \mnt
c:\mnt> restic backup metadata d\apps d\docs f\photo h\install h\video

Note: To be clear, my current directory is c:\mnt so d\apps and f\photo are are c:\mnt\d\apps and c:\mnt\f\photo. metadata is c:\mnt\metadata

After the backup the snapshots are deleted and the c:\mnt directory is removed

Diskshadow creates a CAB file which is needed for doing a diskshadow restore??? Not sure what that is about but I put that file into c:\mnt\metadata and had restic back that up too.