-
Notifications
You must be signed in to change notification settings - Fork 0
/
rclone2bunnyCDN.ps1
136 lines (96 loc) · 3.62 KB
/
rclone2bunnyCDN.ps1
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
################################################################
# RClone to BunnyCDN Sync Script
# Checks if the source and remote locations specified are in
# sync, and performs a sync if not
################################################################
# !!! START EDITING !!!
# Configuration options
$SleepTimeSecs = 5
## example: 5
$CDNURL = ""
## example: "https://kf2.b-cdn.net/"
$LocalSource = ""
## example: "E:\hosted\kf2\"
$RemoteDest = ""
## example: "kf2:"
## You must manually configure by running 'rclone config'
## Refer to: https://rclone.org/commands/rclone_config/
$BunnyCDN_APIKey = ""
## example: 0j30j2f80823-28f392h89f32-2f32j9083f-28fj2938fj2-239f
## You can find this on your BunnyCDN Dashboard
# !!! STOP EDITING !!!
# Definitions
$LocalFilePushQueue = New-Object System.Collections.ArrayList
# Checks if BunnyCDN storage differs from local
# Returns 0 if sync, else 1
function checkIfDesync {
$IsSynced = 0
# Perform check, but only via file size, since BunnyCDN
# does not support check via hash
$script:RCloneCheckOutput = & rclone.exe check $script:LocalSource $script:RemoteDest --size-only 2>&1 | Out-String
# If output contains ERROR text, then assume its caused
# by desync
if($script:RCloneCheckOutput -clike '*ERROR :*') {
$IsSynced = 1
}
return $isSynced
}
# Assemble list with all missing files
# A file is considered missing if it differs;
# - Either exists on local ONLY
# - OR, filesize differs between local and remote version
function assembleMissingFileList {
# RClone log excerpts
$cr_errPrefix = "ERROR : "
$cr_errSuffix1 = ": File not in ftp"
$cr_errSuffix2 = ": Sizes differ"
$cr_tmpline = ""
$cr_lines = $script:RCloneCheckOutput -Split "`r`n"
foreach($line in $cr_lines) {
# IF file is marked as being missing from remote
if($line -match $cr_errPrefix + ".*" + $cr_errSuffix1) {
$cr_tmpline = $line.Substring($line.IndexOf($cr_errPrefix) + $cr_errPrefix.Length)
$script:LocalFilePushQueue.Add(
$cr_tmpline.Substring(0, $cr_tmpline.IndexOf($cr_errSuffix1)))
}
# ELSE file is marked as different (filesize mismatch) between local and remote
elseif($line -match $cr_errPrefix + ".*" + $cr_errSuffix2) {
$cr_tmpline = $line.Substring($line.IndexOf($cr_errPrefix) + $cr_errPrefix.Length)
$script:LocalFilePushQueue.Add(
$cr_tmpline.Substring(0, $cr_tmpline.IndexOf($cr_errSuffix2)))
}
}
}
# Performs a purge for the diff files - just in case variations exist in the CDN
# Refer to https://bunnycdn.docs.apiary.io/
function sanityPurge_POST {
$sp_api_URL = "https://bunnycdn.com/api/purge?url="
$sp_uri = ""
$sp_header = @{
"AccessKey"=$script:BunnyCDN_APIKey
"Accept"="application/json"
"Content-Type"="application/json"
}
foreach($file in $script:LocalFilePushQueue) {
$sp_uri = $sp_api_URL + [System.Web.HttpUtility]::UrlEncode($script:CDNURL + $file)
# Perform REST call to API Purge cmd
$PurgeResult = Invoke-RestMethod -Uri $sp_uri -Method POST -Headers $sp_header
}
}
# Performs an rclone sync
function initiateSync {
rclone.exe sync $script:LocalSource $script:RemoteDest
}
# == MAIN ==
while(1) {
# Result of desync check
$DesyncCheckResult = (checkIfDesync)
# Check if not in sync, and initiate sync
if( $DesyncCheckResult -eq 1 ) {
(assembleMissingFileList)
(sanityPurge_POST)
(initiateSync)
}
# Sleep; check again after a period of time
Start-Sleep($script:SleepTimeSecs)
}