/
index.php
124 lines (100 loc) · 3.45 KB
/
index.php
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
<?PHP
$SynoGitSync_Profile = [];
$cfgFN = md5($_Server['SCRIPT_NAME'] );
include_once('../configs/' . $cfgFN);
$payloadRaw = file_get_contents('php://input');
$payload = json_decode($payloadRaw , true);
$PushKey = $_SERVER['HTTP_X_HUB_SIGNATURE'];
function CheckProfileFits($payload, $profileTrigger, $hash)
{
$failOn = [];
if (!isset($profileTrigger))
return false;
if (!isset($payload))
return false;
list($algo, $verify) = explode('=', $hash);
foreach ($profileTrigger as $k=>$v)
{
$flag = true;
if ('Master-KEY' == $k) $flag = $verify === hash_hmac($algo, $payloadRaw, $v); // Doesn't work. at all :(
if ('branch' == $k) $flag = 'refs/heads/' .$v === $payload['ref'];
if ('repo_full_name' == $k) $flag = $v === $payload['repository']['full_name'];
if ('authors' == $k) $flag = in_array($payload['head_commit']['author']['username'], $v);
if (!$flag) $failOn[] = $k;
}
return $failOn;
}
foreach ($SynoGitSync_Profile as $profName => $prof)
{
$checkRes = CheckProfileFits($payload, $prof['On'], $PushKey);
if (!is_array($checkRes))
{
echo 'profile '.$profName.' is skipped by ['.$checkRes.'].'."\n";
continue;
}
if (is_array($checkRes) && (count($checkRes) > 0))
{
echo 'profile '.$profName.' is skipped by ['.implode(', ', $checkRes).'].'."\n";
continue;
}
echo "Profile Fits: ".$profName."\n";
$tempFN = md5(time());
$tempZip = $tempFN.'.zip';
$projName = $payload['repository']['name'];
$aBranch = $prof['On']['branch'] ; //$payload['repository']['master_branch'];
$GitUrl = $payload['repository']['url'] . '/archive/' . $aBranch . '.zip';
if (copy($GitUrl, $tempZip))
{
echo "Branch ".$GitUrl." downloaded..."."\n";
echo "ZIP: ".$tempZip."\n";
$zip = new ZipArchive;
if ($zip->open('./'.$tempZip))
{
echo 'Doing update '.$profName ."\n";
$zip->extractTo($tempFN.'/');
$zip->close();
$target = $prof['TargetFolder'];
$TargetDir = $prof['TargetBase'] . $target;
$rnTo = false;
if (file_exists($TargetDir))
{
$rnTo = './' . $target . '-' . time();
if (isset($prof['Backup']) && is_string($prof['Backup']))
$rnTo = $prof['Backup'] . $target.'-'. time();
@mkdir($rnTo);
echo 'renaming to: '.$rnTo ."\n";
echo 'from: '.$TargetDir ."\n";
echo rename($TargetDir, $rnTo) ."\n";
}
echo 'Replacing '.$tempFN ."\n";
recurse_copy($tempFN.'/'.$projName.'-'.$aBranch, $TargetDir);
exec('chmod -R -v 755 '.$TargetDir);
//rmdir('./'.$fn);
exec(sprintf("rm -rf %s", './'.$tempFN));
echo 'Temporary zip removed '.$tempFN ."\n";
if (isset($prof['Backup']) && is_bool($prof['Backup']) and (!$prof['Backup']) && (false !== $rnTo))
{
exec(sprintf("rm -rf %s", $rnTo));
echo 'Temporary folder removed '.$rnTo ."\n";
}
}
unlink($tempZip);
}
}
function recurse_copy($src,$dst)
{
$dir = opendir($src);
@mkdir($dst);
while(false !== ( $file = readdir($dir)) )
{
if (( $file != '.' ) && ( $file != '..' ))
{
if ( is_dir($src . '/' . $file) )
recurse_copy($src . '/' . $file,$dst . '/' . $file);
else
copy($src . '/' . $file,$dst . '/' . $file);
}
}
closedir($dir);
}
?>