Initial commit

This commit is contained in:
mkuba50
2019-04-12 15:40:27 +02:00
commit c9a741eaed
14 changed files with 578 additions and 0 deletions

177
shared/genpack.php Normal file
View File

@ -0,0 +1,177 @@
<?php
require_once dirname(__FILE__).'/../api/get.php';
require_once dirname(__FILE__).'/main.php';
function get7ZipLocation() {
if(PHP_OS == 'WINNT') {
$z7z = realpath(dirname(__FILE__)).'/../../7za.exe';
if(!file_exists($z7z)) return false;
} else {
exec('command -v 7z', $out, $errCode);
if($errCode != 0) {
return false;
}
$z7z = '7z';
}
return $z7z;
}
function generatePack($updateId) {
$z7z = get7ZipLocation();
$tmp = 'uuptmp';
if(!file_exists($tmp)) mkdir($tmp);
if(file_exists('packs/'.$updateId.'.json.gz')) {
return 2;
}
consoleLogger('Generating packs for '.$updateId.'...');
$files = uupGetFiles($updateId, 0, 0);
if(isset($files['error'])) {
throwError($files['error']);
}
$files = $files['files'];
$filesKeys = array_keys($files);
$filesToRead = array();
$aggregatedMetadata = preg_grep('/AggregatedMetadata/i', $filesKeys);
if(!empty($aggregatedMetadata)) {
sort($aggregatedMetadata);
$checkFile = $aggregatedMetadata[0];
$url = $files[$checkFile]['url'];
$loc = "$tmp/$checkFile";
consoleLogger('Downloading aggregated metadata: '.$checkFile);
downloadFile($url, $loc);
if(!file_exists($loc)) {
throwError('INFO_DOWNLOAD_ERROR');
}
consoleLogger('Unpacking aggregated metadata: '.$checkFile);
exec("$z7z l -slt \"$loc\"", $out, $errCode);
if($errCode != 0) {
unlink($loc);
throwError('7ZIP_ERROR');
}
$files = preg_grep('/Path = /', $out);
$files = preg_replace('/Path = /', '', $files);
$dataFiles = preg_grep('/DesktopTargetCompDB_.*_.*\./i', $files);
unset($out);
exec("$z7z x -o\"$tmp\" \"$loc\" -y", $out, $errCode);
if($errCode != 0) {
unlink($loc);
throwError('7ZIP_ERROR');
}
unset($out);
foreach($dataFiles as $val) {
consoleLogger('Unpacking info file: '.$val);
if(preg_match('/.cab$/i', $val)) {
exec("$z7z x -bb2 -o\"$tmp\" \"$tmp/$val\" -y", $out, $errCode);
if($errCode != 0) {
unlink($loc);
throwError('7ZIP_ERROR');
}
$temp = preg_grep('/^-.*DesktopTargetCompDB_.*_.*\./i', $out);
sort($temp);
$temp = preg_replace('/^- /', '', $temp[0]);
$filesToRead[] = preg_replace('/.cab$/i', '', $temp);
unlink("$tmp/$val");
unset($temp, $out);
} else {
$filesToRead[] = $val;
}
}
unlink($loc);
unset($loc, $checkFile, $checkEd, $dataFiles);
} else {
$dataFiles = preg_grep('/DesktopTargetCompDB_.*_.*\./i', $filesKeys);
foreach($dataFiles as $val) {
$url = $files[$val]['url'];
$loc = "$tmp/$val";
consoleLogger('Downloading info file: '.$val);
downloadFile($url, $loc);
if(!file_exists($loc)) {
throwError('INFO_DOWNLOAD_ERROR');
}
if(preg_match('/.cab$/i', $val)) {
exec("$z7z x -bb2 -o\"$tmp\" \"$tmp/$val\" -y", $out, $errCode);
if($errCode != 0) {
unlink($loc);
throwError('7ZIP_ERROR');
}
$temp = preg_grep('/^-.*DesktopTargetCompDB_.*_.*\./i', $out);
sort($temp);
$temp = preg_replace('/^- /', '', $temp[0]);
$filesToRead[] = preg_replace('/.cab$/i', '', $temp);
unlink("$tmp/$val");
unset($temp, $out);
} else {
$filesToRead[] = $val;
}
}
unset($loc, $checkEd, $dataFiles);
}
$langsEditions = array();
$packages = array();
foreach($filesToRead as $val) {
$filNam = preg_replace('/\.xml.*/', '', $val);
$file = $tmp.'/'.$val;
$xml = simplexml_load_file($file);
$lang = preg_replace('/.*DesktopTargetCompDB_.*_/', '', $filNam);
$edition = preg_replace('/.*DesktopTargetCompDB_|_'.$lang.'/', '', $filNam);
$lang = strtolower($lang);
$edition = strtoupper($edition);
foreach($xml->Packages->Package as $val) {
foreach($val->Payload->PayloadItem as $PayloadItem) {
$name = $PayloadItem['Path'];
$name = preg_replace('/.*\\\/', '', $name);
$packages[$lang][$edition][] = $name;
}
}
$packages[$lang][$edition] = array_unique($packages[$lang][$edition]);
sort($packages[$lang][$edition]);
unlink($file);
unset($file, $xml, $name, $newName, $lang, $edition);
}
$removeFiles = scandir($tmp);
foreach($removeFiles as $val) {
if($val == '.' || $val == '..') continue;
unlink($tmp.'/'.$val);
}
if(!file_exists('packs')) mkdir('packs');
$success = file_put_contents(
'packs/'.$updateId.'.json.gz',
gzencode(json_encode($packages)."\n")
);
if($success) {
consoleLogger('Successfully written generated packs.');
} else {
consoleLogger('An error has occured while writing generated packs to the disk.');
return 0;
}
return 1;
}

118
shared/main.php Normal file
View File

@ -0,0 +1,118 @@
<?php
require_once dirname(__FILE__).'/../api/shared/main.php';
function brand($script) {
$projVersion = '1.0.0';
return 'UUP dump standalone v'.$projVersion;
}
function downloadFile($url, $location) {
$file = fopen($location, 'w+');
$req = curl_init($url);
curl_setopt($req, CURLOPT_HEADER, 0);
curl_setopt($req, CURLOPT_FILE, $file);
curl_setopt($req, CURLOPT_ENCODING, '');
curl_setopt($req, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($req, CURLOPT_SSL_VERIFYPEER, 0);
curl_exec($req);
curl_close($req);
fclose($file);
}
function throwError($errorCode) {
switch ($errorCode) {
case 'ERROR':
$errorFancy = 'Generic error.';
break;
case '7ZIP_ERROR':
$errorFancy = '7-Zip has returned an error.';
break;
case 'INFO_DOWNLOAD_ERROR':
$errorFancy = 'Failed to retrieve information.';
break;
case 'UNSUPPORTED_API':
$errorFancy = 'Installed API version is not compatible with this version of UUP dump.';
break;
case 'NO_FILEINFO_DIR':
$errorFancy = 'The fileinfo directory does not exist.';
break;
case 'NO_BUILDS_IN_FILEINFO':
$errorFancy = 'The fileinfo database does not contain any build.';
break;
case 'SEARCH_NO_RESULTS':
$errorFancy = 'No items could be found for specified query.';
break;
case 'UNKNOWN_ARCH':
$errorFancy = 'Unknown processor architecture.';
break;
case 'UNKNOWN_RING':
$errorFancy = 'Unknown ring.';
break;
case 'UNKNOWN_FLIGHT':
$errorFancy = 'Unknown flight.';
break;
case 'UNKNOWN_COMBINATION':
$errorFancy = 'The flight and ring combination is not correct. Skip ahead is only supported for Insider Fast ring.';
break;
case 'ILLEGAL_BUILD':
$errorFancy = 'Specified build number is less than 9841 or larger than '. (PHP_INT_MAX-1) .'.';
break;
case 'ILLEGAL_MINOR':
$errorFancy = 'Specified build minor is incorrect.';
break;
case 'NO_UPDATE_FOUND':
$errorFancy = 'Server did not return any updates.';
break;
case 'XML_PARSE_ERROR':
$errorFancy = 'Parsing of response XML has failed. This may indicate a temporary problem with Microsoft servers. Try again later.';
break;
case 'EMPTY_FILELIST':
$errorFancy = 'Server has returned an empty list of files.';
break;
case 'NO_FILES':
$errorFancy = 'There are no files available for your selection.';
break;
case 'NO_METADATA_ESD':
$errorFancy = 'There are no metadata ESD files available for your selection.';
break;
case 'UNSUPPORTED_LANG':
$errorFancy = 'Specified language is not supported.';
break;
case 'UNSPECIFIED_LANG':
$errorFancy = 'Language was not specified.';
break;
case 'UNSUPPORTED_EDITION':
$errorFancy = 'Specified edition is not supported.';
break;
case 'UNSUPPORTED_COMBINATION':
$errorFancy = 'The language and edition combination is not correct.';
break;
case 'NOT_CUMULATIVE_UPDATE':
$errorFancy = 'Selected update does not contain Cumulative Update.';
break;
case 'UPDATE_INFORMATION_NOT_EXISTS':
$errorFancy = 'Information about specified update doest not exist in database.';
break;
case 'KEY_NOT_EXISTS':
$errorFancy = 'Specified key does not exist in update information';
break;
case 'UNSPECIFIED_UPDATE':
$errorFancy = 'Update ID was not specified.';
break;
case 'NO_7ZIP':
$errorFancy = '7-Zip cannot be found.';
break;
case 'PACKS_FAILED':
$errorFancy = 'No generated packs.';
break;
default:
$errorFancy = $errorCode;
break;
}
consoleLogger('ERROR: '.$errorFancy);
die(E_ERROR);
}
?>