contrib/get.php
2023-11-21 15:48:30 +01:00

557 lines
17 KiB
PHP

<?php
// Copyright (C) 2023 UUP dump authors. All rights reserved.
/*
* Changing anything in this file is a really painful experience.
* Please don't do this to yourself.
*/
//Create aria2 download package with conversion script
function createUupConvertPackage(
$url,
$archiveName,
$virtualEditions = 0,
$desiredVE = array('Enterprise'),
$moreOptions = [],
$app = null
) {
$updates = isset($moreOptions['updates']) ? $moreOptions['updates'] : 0;
$cleanup = isset($moreOptions['cleanup']) ? $moreOptions['cleanup'] : 0;
$netfx = isset($moreOptions['netfx']) ? $moreOptions['netfx'] : 0;
$esd = isset($moreOptions['esd']) ? $moreOptions['esd'] : 0;
$type = $esd ? 'esd' : 'wim';
$currDir = dirname(__FILE__).'/..';
$time = gmdate("Y-m-d H:i:s T", time());
$downloadapp = "";
if(!empty($app)) {
$downloadapp = <<<TEXT
:DOWNLOAD_APPS
echo Retrieving aria2 script for Microsoft Store Apps...
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -o"%aria2Script%" --allow-overwrite=true --auto-file-renaming=false "$app"
if %ERRORLEVEL% GTR 0 call :DOWNLOAD_ERROR & exit /b 1
echo.
for /F "tokens=2 delims=:" %%i in ('findstr #UUPDUMP_ERROR: "%aria2Script%"') do set DETECTED_ERROR=%%i
if NOT [%DETECTED_ERROR%] == [] (
echo Unable to retrieve data from Windows Update servers. Reason: %DETECTED_ERROR%
echo If this problem persists, most likely the set you are attempting to download was removed from Windows Update servers.
echo.
pause
goto :EOF
)
echo Downloading Microsoft Store Apps...
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j25 -c -R -d"%destDir%" -i"%aria2Script%"
if %ERRORLEVEL% GTR 0 goto :DOWNLOAD_APPS
echo.
TEXT;
}
$cmdScript = <<<SCRIPT
@echo off
:: Generated on $time
:: Proxy configuration
:: If you need to configure a proxy to be able to connect to the internet,
:: then you can do this by configuring the all_proxy environment variable.
:: By default this variable is commented out, configuring aria2c to use
:: the proxy settings specified by the system.
::
:: Usage: set "all_proxy=proxy_address"
:: For example: set "all_proxy=127.0.0.1:8888"
::
:: More information how to use this can be found at:
:: https://aria2.github.io/manual/en/html/aria2c.html#cmdoption-all-proxy
:: https://aria2.github.io/manual/en/html/aria2c.html#environment
:: Uncomment the following line to override the proxy settings specified
:: by the system.
::
:: set "all_proxy="
:: End of proxy configuration
cd /d "%~dp0"
if NOT "%cd%"=="%cd: =%" (
echo Current directory contains spaces in its path.
echo Please move or rename the directory to one not containing spaces.
echo.
pause
goto :EOF
)
if "[%1]" == "[49127c4b-02dc-482e-ac4f-ec4d659b7547]" goto :START_PROCESS
REG QUERY HKU\S-1-5-19\Environment >NUL 2>&1 && goto :START_PROCESS
set command="""%~f0""" 49127c4b-02dc-482e-ac4f-ec4d659b7547
SETLOCAL ENABLEDELAYEDEXPANSION
set "command=!command:'=''!"
powershell -NoProfile Start-Process -FilePath '%COMSPEC%' ^
-ArgumentList '/c """!command!"""' -Verb RunAs 2>NUL
IF %ERRORLEVEL% GTR 0 (
echo =====================================================
echo This script needs to be executed as an administrator.
echo =====================================================
echo.
pause
)
SETLOCAL DISABLEDELAYEDEXPANSION
goto :EOF
:START_PROCESS
title {$archiveName} download
set "aria2=files\\aria2c.exe"
set "a7z=files\\7zr.exe"
set "uupConv=files\\uup-converter-wimlib.7z"
set "aria2Script=files\\aria2_script.%random%.txt"
set "destDir=UUPs"
powershell -NoProfile -ExecutionPolicy Unrestricted .\\files\\get_aria2.ps1 || (pause & exit /b 1)
echo.
echo Downloading the UUP converter...
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j2 -c -R -d"files" -i"files\\converter_windows"
if %ERRORLEVEL% GTR 0 call :DOWNLOAD_CONVERTER_ERROR & exit /b 1
echo.
if NOT EXIST ConvertConfig.ini goto :NO_FILE_ERROR
if NOT EXIST %a7z% goto :NO_FILE_ERROR
if NOT EXIST %uupConv% goto :NO_FILE_ERROR
echo Extracting UUP converter...
"%a7z%" -x!ConvertConfig.ini -y x "%uupConv%" >NUL
echo.
$downloadapp
:DOWNLOAD_UUPS
echo Retrieving aria2 script for the UUP set...
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -o"%aria2Script%" --allow-overwrite=true --auto-file-renaming=false "$url"
if %ERRORLEVEL% GTR 0 call :DOWNLOAD_ERROR & exit /b 1
echo.
for /F "tokens=2 delims=:" %%i in ('findstr #UUPDUMP_ERROR: "%aria2Script%"') do set DETECTED_ERROR=%%i
if NOT [%DETECTED_ERROR%] == [] (
echo Unable to retrieve data from Windows Update servers. Reason: %DETECTED_ERROR%
echo If this problem persists, most likely the set you are attempting to download was removed from Windows Update servers.
echo.
pause
goto :EOF
)
echo Downloading the UUP set...
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j5 -c -R -d"%destDir%" -i"%aria2Script%"
if %ERRORLEVEL% GTR 0 goto :DOWNLOAD_UUPS & exit /b 1
if EXIST convert-UUP.cmd goto :START_CONVERT
pause
goto :EOF
:START_CONVERT
call convert-UUP.cmd
goto :EOF
:NO_FILE_ERROR
echo We couldn't find one of needed files for this script.
pause
goto :EOF
:DOWNLOAD_CONVERTER_ERROR
echo.
echo An error has occurred while downloading the UUP converter.
pause
goto :EOF
:DOWNLOAD_ERROR
echo.
echo We have encountered an error while downloading files.
pause
goto :EOF
:EOF
SCRIPT;
$shellScript = <<<SCRIPT
#!/bin/bash
#Generated on $time
# Proxy configuration
# If you need to configure a proxy to be able to connect to the internet,
# then you can do this by configuring the all_proxy environment variable.
# By default this variable is empty, configuring aria2c to not use any proxy.
#
# Usage: export all_proxy="proxy_address"
# For example: export all_proxy="127.0.0.1:8888"
#
# More information how to use this can be found at:
# https://aria2.github.io/manual/en/html/aria2c.html#cmdoption-all-proxy
# https://aria2.github.io/manual/en/html/aria2c.html#environment
export all_proxy=""
# End of proxy configuration
for prog in aria2c cabextract wimlib-imagex chntpw; do
which \$prog &>/dev/null 2>&1 && continue;
echo "\$prog does not seem to be installed"
echo "Check the readme.unix.md for details"
exit 1
done
mkiso_present=0
which genisoimage &>/dev/null && mkiso_present=1
which mkisofs &>/dev/null && mkiso_present=1
if [ \$mkiso_present -eq 0 ]; then
echo "genisoimage nor mkisofs does seem to be installed"
echo "Check the readme.unix.md for details"
exit 1
fi
destDir="UUPs"
tempScript="aria2_script.\$RANDOM.txt"
echo "Downloading converters..."
aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j2 --allow-overwrite=true --auto-file-renaming=false -d"files" -i"files/converter_multi"
if [ $? != 0 ]; then
echo "We have encountered an error while downloading files."
exit 1
fi
echo ""
echo "Retrieving aria2 script for the UUP set..."
aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -o"\$tempScript" --allow-overwrite=true --auto-file-renaming=false "$url"
if [ $? != 0 ]; then
echo "Failed to retrieve aria2 script"
exit 1
fi
detectedError=`grep '#UUPDUMP_ERROR:' "\$tempScript" | sed 's/#UUPDUMP_ERROR://g'`
if [ ! -z \$detectedError ]; then
echo "Unable to retrieve data from Windows Update servers. Reason: \$detectedError"
echo "If this problem persists, most likely the set you are attempting to download was removed from Windows Update servers."
exit 1
fi
echo ""
echo "Downloading the UUP set..."
aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j5 -c -R -d"\$destDir" -i"\$tempScript"
if [ $? != 0 ]; then
echo "We have encountered an error while downloading files."
exit 1
fi
echo ""
if [ -e ./files/convert.sh ]; then
chmod +x ./files/convert.sh
./files/convert.sh $type "\$destDir" $virtualEditions
fi
SCRIPT;
$desiredVirtualEditions = '';
$desiredVirtualEditionsLinux = '';
$index = 0;
foreach($desiredVE as $edition) {
if($index > 0) {
$desiredVirtualEditions .= ',';
$desiredVirtualEditionsLinux .= ' ';
}
$desiredVirtualEditions .= $edition;
$desiredVirtualEditionsLinux .= $edition;
$index++;
}
$convertConfig = <<<CONFIG
[convert-UUP]
AutoStart =1
AddUpdates =$updates
Cleanup =$cleanup
ResetBase =0
NetFx3 =$netfx
StartVirtual =$virtualEditions
wim2esd =$esd
wim2swm =0
SkipISO =0
SkipWinRE =0
LCUwinre =0
UpdtBootFiles=0
ForceDism =0
RefESD =0
SkipLCUmsu =0
SkipEdge =0
AutoExit =0
DisableUpdatingUpgrade=0
[Store_Apps]
SkipApps =0
AppsLevel =0
StubAppsFull =0
CustomList =0
[create_virtual_editions]
vAutoStart =1
vDeleteSource=0
vPreserve =0
vwim2esd =$esd
vwim2swm =0
vSkipISO =0
vAutoEditions=$desiredVirtualEditions
CONFIG;
$convertConfigLinux = <<<CONFIG
VIRTUAL_EDITIONS_LIST='$desiredVirtualEditionsLinux'
CONFIG;
$cmdScript = str_replace(["\r\n", "\r"], "\n", $cmdScript);
$convertConfig = str_replace(["\r\n", "\r"], "\n", $convertConfig);
$shellScript = str_replace(["\r\n", "\r"], "\n", $shellScript);
$convertConfigLinux = str_replace(["\r\n", "\r"], "\n", $convertConfigLinux);
$cmdScript = str_replace("\n", "\r\n", $cmdScript);
$convertConfig = str_replace("\n", "\r\n", $convertConfig);
$zip = new ZipArchive;
$archive = @tempnam($currDir.'/tmp', 'zip');
$open = $zip->open($archive, ZipArchive::CREATE+ZipArchive::OVERWRITE);
if($open !== TRUE) {
echo 'Failed to create archive.';
die();
}
$zip->addFromString('uup_download_windows.cmd', $cmdScript);
$zip->addFromString('uup_download_linux.sh', $shellScript);
$zip->addFromString('uup_download_macos.sh', $shellScript);
$zip->addFromString('ConvertConfig.ini', $convertConfig);
$zip->addFromString('files/convert_config_linux', $convertConfigLinux);
$zip->addFromString('files/convert_config_macos', $convertConfigLinux);
$zip->addFile($currDir.'/misc/autodl_files/readme.unix.md', 'readme.unix.md');
$zip->addFile($currDir.'/misc/autodl_files/converter_multi', 'files/converter_multi');
$zip->addFile($currDir.'/misc/autodl_files/converter_windows', 'files/converter_windows');
$zip->addFile($currDir.'/misc/autodl_files/get_aria2.ps1', 'files/get_aria2.ps1');
$zip->close();
if($virtualEditions) {
$suffix = '_virtual';
} else {
$suffix = '';
}
header('Content-Type: archive/zip');
header('Content-Disposition: attachment; filename="'.$archiveName."_convert$suffix.zip\"");
header('Content-Length: '.filesize($archive));
$content = file_get_contents($archive);
unlink($archive);
echo $content;
}
//Create aria2 download package only
function createAria2Package($url, $archiveName, $app = null) {
$currDir = dirname(__FILE__).'/..';
$time = gmdate("Y-m-d H:i:s T", time());
$ariacmd = <<<TEXT
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j5 -c -R -d"%destDir%" -i"%aria2Script%"
TEXT;
$ariabash = <<<TEXT
aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j5 -c -R -d"\$destDir" -i"\$tempScript"
TEXT;
if(strpos($archiveName, "_app")) {
$ariacmd = <<<TEXT
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j25 -c -R -d"%destDir%" -i"%aria2Script%"
TEXT;
$ariabash = <<<TEXT
aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j25 -c -R -d"\$destDir" -i"\$tempScript"
TEXT;
}
$downloadapp = "";
if(!empty($app)) {
$downloadapp = <<<TEXT
:DOWNLOAD_APPS
echo Retrieving aria2 script for Microsoft Store Apps...
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -o"%aria2Script%" --allow-overwrite=true --auto-file-renaming=false "$app"
if %ERRORLEVEL% GTR 0 call :DOWNLOAD_ERROR & exit /b 1
echo.
for /F "tokens=2 delims=:" %%i in ('findstr #UUPDUMP_ERROR: "%aria2Script%"') do set DETECTED_ERROR=%%i
if NOT [%DETECTED_ERROR%] == [] (
echo Unable to retrieve data from Windows Update servers. Reason: %DETECTED_ERROR%
echo If this problem persists, most likely the set you are attempting to download was removed from Windows Update servers.
echo.
pause
goto :EOF
)
echo Downloading Microsoft Store Apps...
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -x16 -s16 -j25 -c -R -d"%destDir%" -i"%aria2Script%"
if %ERRORLEVEL% GTR 0 goto :DOWNLOAD_APPS
echo.
TEXT;
}
$cmdScript = <<<SCRIPT
@echo off
:: Generated on $time
:: Proxy configuration
:: If you need to configure a proxy to be able to connect to the internet,
:: then you can do this by configuring the all_proxy environment variable.
:: By default this variable is empty, configuring aria2c to not use any proxy.
::
:: Usage: set "all_proxy=proxy_address"
:: For example: set "all_proxy=127.0.0.1:8888"
::
:: More information how to use this can be found at:
:: https://aria2.github.io/manual/en/html/aria2c.html#cmdoption-all-proxy
:: https://aria2.github.io/manual/en/html/aria2c.html#environment
set "all_proxy="
:: End of proxy configuration
title {$archiveName} download
set "aria2=files\\aria2c.exe"
set "aria2Script=files\\aria2_script.%random%.txt"
set "destDir=UUPs"
cd /d "%~dp0"
powershell -NoProfile -ExecutionPolicy Unrestricted .\\files\\get_aria2.ps1 || (pause & exit /b 1)
echo.
$downloadapp
:DOWNLOAD_UUPS
echo Retrieving aria2 script for the UUP set...
"%aria2%" --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -o"%aria2Script%" --allow-overwrite=true --auto-file-renaming=false "$url"
if %ERRORLEVEL% GTR 0 call :DOWNLOAD_ERROR & exit /b 1
echo.
for /F "tokens=2 delims=:" %%i in ('findstr #UUPDUMP_ERROR: "%aria2Script%"') do set DETECTED_ERROR=%%i
if NOT [%DETECTED_ERROR%] == [] (
echo Unable to retrieve data from Windows Update servers. Reason: %DETECTED_ERROR%
echo If this problem persists, most likely the set you are attempting to download was removed from Windows Update servers.
echo.
pause
goto :EOF
)
echo Downloading the UUP set...
$ariacmd
if %ERRORLEVEL% GTR 0 goto :DOWNLOAD_UUPS & exit /b 1
pause
goto EOF
:DOWNLOAD_ERROR
echo.
echo We have encountered an error while downloading files.
pause
goto EOF
:EOF
SCRIPT;
$shellScript = <<<SCRIPT
#!/bin/bash
#Generated on $time
# Proxy configuration
# If you need to configure a proxy to be able to connect to the internet,
# then you can do this by configuring the all_proxy environment variable.
# By default this variable is empty, configuring aria2c to not use any proxy.
#
# Usage: export all_proxy="proxy_address"
# For example: export all_proxy="127.0.0.1:8888"
#
# More information how to use this can be found at:
# https://aria2.github.io/manual/en/html/aria2c.html#cmdoption-all-proxy
# https://aria2.github.io/manual/en/html/aria2c.html#environment
export all_proxy=""
# End of proxy configuration
which aria2c &>/dev/null || {
echo "aria2c does not seem to be installed"
echo "Check the readme.unix.md for details"
exit 1
}
destDir="UUPs"
tempScript="aria2_script.\$RANDOM.txt"
echo "Retrieving aria2 script for the UUP set..."
aria2c --no-conf --console-log-level=warn --log-level=info --log="aria2_download.log" -o"\$tempScript" --allow-overwrite=true --auto-file-renaming=false "$url"
if [ $? != 0 ]; then
echo "Failed to retrieve aria2 script"
exit 1
fi
detectedError=`grep '#UUPDUMP_ERROR:' "\$tempScript" | sed 's/#UUPDUMP_ERROR://g'`
if [ ! -z \$detectedError ]; then
echo "Unable to retrieve data from Windows Update servers. Reason: \$detectedError"
echo "If this problem persists, most likely the set you are attempting to download was removed from Windows Update servers."
exit 1
fi
echo ""
echo "Downloading the UUP set..."
$ariabash
if [ $? != 0 ]; then
echo "We have encountered an error while downloading files."
exit 1
fi
SCRIPT;
$cmdScript = str_replace(["\r\n", "\r"], "\n", $cmdScript);
$shellScript = str_replace(["\r\n", "\r"], "\n", $shellScript);
$cmdScript = str_replace("\n", "\r\n", $cmdScript);
$zip = new ZipArchive;
$archive = @tempnam($currDir.'/tmp', 'zip');
$open = $zip->open($archive, ZipArchive::CREATE+ZipArchive::OVERWRITE);
if($open === TRUE) {
$zip->addFromString('uup_download_windows.cmd', $cmdScript);
$zip->addFromString('uup_download_linux.sh', $shellScript);
$zip->addFromString('uup_download_macos.sh', $shellScript);
$zip->addFile($currDir.'/misc/autodl_files/readme.unix.md', 'readme.unix.md');
$zip->addFile($currDir.'/misc/autodl_files/get_aria2.ps1', 'files/get_aria2.ps1');
$zip->close();
} else {
echo 'Failed to create archive.';
die();
}
header('Content-Type: archive/zip');
header('Content-Disposition: attachment; filename="'.$archiveName.'.zip"');
header('Content-Length: '.filesize($archive));
$content = file_get_contents($archive);
unlink($archive);
echo $content;
}