Advertisement
E-werd

get-pkg.bat

Feb 3rd, 2021
2,415
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Winbatch 13.42 KB | None | 0 0
  1. @echo off
  2.  
  3. SETLOCAL EnableDelayedExpansion
  4.  
  5. set SERVER=http://webserver:8000/files
  6. set SERVERIP=webserver
  7.  
  8. set WGET=bin\wget
  9. set PAEXT=bin\paext
  10. set UNIQ=bin\uniq
  11. set FINALPKGCT=0
  12. set INSTPKGS=0
  13. set IGNPKGS=0
  14. set CT=0
  15. set PKGS_TBI=
  16. set PKGS_IGN=
  17. set MISSINGLISTCT=
  18. set MISSINGPKGCT=
  19. set DOWNLOAD=
  20. set OFFLINE=
  21. set ONLINE=
  22. set FILESUP=
  23. set LOCALDBUP=
  24.  
  25. :: ------------------------------------
  26. :: ----------- Main Section -----------
  27. :: ------------------------------------
  28.  
  29. cls
  30.  
  31. call :prepare
  32.  
  33. call :checkFiles
  34. if !FILESUP!==FALSE call :error NoBin&&goto :end
  35.  
  36. :paramLoop
  37. call :handleParam %1 PARAM
  38. shift
  39. if not "%1"=="" goto :paramLoop
  40.  
  41. if !DOWNLOAD!==TRUE (
  42.     if !OFFLINE!==TRUE (
  43.         call :error DownloadOffline&&goto :end
  44.     )
  45. )
  46. if "!DOWNLOAD!"=="" set DOWNLOAD=FALSE
  47.  
  48. if "!OFFLINE!"=="" set OFFLINE=FALSE
  49. if !OFFLINE!==FALSE (
  50.     call :checkServer
  51. )
  52. if !OFFLINE!==TRUE (
  53.     set ONLINE=FALSE
  54. )
  55.  
  56. call :loadPKGArray db\packages.list PKG TPKGS
  57. call :loadPKGArray db\meta.list METAPKG MPKGS
  58. call :checkLocalDB
  59.  
  60. if !ONLINE!==FALSE (
  61.     if !MISSINGPKGCT!==!TPKGS! call :error NoLocalPkgs&&goto :end
  62. )
  63.  
  64. if !LOCALDBUP!==FALSE (
  65.     if !ONLINE!==TRUE (
  66.         call :downloadDB
  67.     )
  68.     if !ONLINE!==FALSE (
  69.         if !OFFLINE!==TRUE (
  70.             call :error NoDBNoNetworkOffline&&goto :end
  71.         )
  72.         if !OFFLINE!==FALSE (
  73.             call :error NoDBNoNetwork&&goto :end
  74.         )
  75.     )
  76. )
  77. if !LOCALDBUP!==TRUE (
  78.     if !ONLINE!==TRUE (
  79.         call :downloadDB
  80.     )
  81. )
  82.  
  83. for /L %%a in (1, 1, !CT!) do (
  84.     call :checkParam !PARAM%%a! PKG TPKGS INSTPKGS PKGS_IGN IGNPKGS METAPKG MPKGS temp\temp1.list
  85. )
  86.  
  87. call :loadPKGArray temp\temp1.list IPKG IPKGS
  88. call :sortPKG temp\temp2.list PKG IPKG TPKGS INSTPKGS
  89. call :reduceReassign temp\temp2.list temp\install.list FINALPKG FINALPKGCT PKGS_TBI
  90.  
  91. cls
  92. call :reportPKGS IGNPKGS FINALPKGCT PKGS_IGN PKGS_TBI
  93.  
  94. if !FINALPKGCT!==0 call :cleanUp&&call :error NoPkgs&&goto :end
  95.  
  96. if !ONLINE!==FALSE (
  97.     if !MISSINGPKGCT! GTR 0 (
  98.         echo WARNING: Some packages are missing^^!  The following
  99.         echo packages will fail to install:!MISSINGPKGSTR!
  100.         echo.
  101.     )
  102. )
  103.  
  104. echo   Press any key to continue, or press CTRL-C to exit.
  105. echo.
  106. pause>NUL
  107.  
  108. if !DOWNLOAD!==TRUE (
  109.     if !ONLINE!==TRUE (
  110.         echo Downloading packages for local database.
  111.         call :downloadPKGS FINALPKGCT FINALPKG
  112.         call :cleanUp
  113.         echo All packages downloaded^^!
  114.         goto :end
  115.     )
  116.     if !ONLINE!==FALSE call :error NoDownload&&goto :end
  117. )
  118.  
  119. if !ONLINE!==TRUE (
  120.     call :downloadPKGS FINALPKGCT FINALPKG
  121.     call :extractPKGS FINALPKGCT FINALPKG
  122. )
  123. if !ONLINE!==FALSE (
  124.     call :extractPKGS FINALPKGCT FINALPKG
  125. )
  126. call :installPKGS FINALPKGCT FINALPKG
  127. call :cleanUp
  128. echo Finished^^!
  129. goto :end
  130.  
  131. :end
  132. echo.
  133. echo Exiting.
  134. endlocal
  135. exit /B
  136.  
  137. :: ----------------------------------------
  138. :: ----------- Function Section -----------
  139. :: ----------------------------------------
  140.  
  141. ::
  142. ::          :checkServer
  143. ::
  144. :: Procedure to check for a server connection
  145. ::
  146. :checkServer
  147. echo Checking for a connection to the server at: !SERVERIP!
  148. echo.
  149. ping !SERVERIP! -n 1 > nul
  150. if ERRORLEVEL 1 (
  151.     echo Failed to reach the server.  Going to OFFLINE mode.
  152.     echo.
  153.     set ONLINE=FALSE
  154.     goto :eof
  155. )
  156. echo Server is online, using ONLINE mode.
  157. echo.
  158. set ONLINE=TRUE
  159. goto :eof
  160.  
  161. ::
  162. ::          :checkFiles
  163. ::
  164. :: Procedure to check for required files
  165. ::
  166. :checkFiles
  167. if not exist bin\libiconv2.dll (
  168.     set /a MISSINGFILECT+=1
  169.     set MISSINGFILESTR=!MISSINGFILESTR! bin\libiconv2.dll
  170. )
  171. if not exist bin\libintl3.dll (
  172.     set /a MISSINGFILECT+=1
  173.     set MISSINGFILESTR=!MISSINGFILESTR! bin\libintl3.dll
  174. )
  175. if not exist bin\uniq.exe (
  176.     set /a MISSINGFILECT+=1
  177.     set MISSINGFILESTR=!MISSINGFILESTR! bin\uniq.exe
  178. )
  179.  
  180. if not exist bin\libeay32.dll (
  181.     set /a MISSINGFILECT+=1
  182.     set MISSINGFILESTR=!MISSINGFILESTR! bin\libeay32.dll
  183. )
  184. if not exist bin\libssl32.dll (
  185.     set /a MISSINGFILECT+=1
  186.     set MISSINGFILESTR=!MISSINGFILESTR! bin\libssl32.dll
  187. )
  188. if not exist bin\wget.exe (
  189.     set /a MISSINGFILECT+=1
  190.     set MISSINGFILESTR=!MISSINGFILESTR! bin\wget.exe
  191. )
  192.  
  193. if not exist bin\PAUNRAR3.dll (
  194.     set /a MISSINGFILECT+=1
  195.     set MISSINGFILESTR=!MISSINGFILESTR! bin\PAUNRAR3.dll
  196. )
  197. if not exist bin\PACLIB.dll (
  198.     set /a MISSINGFILECT+=1
  199.     set MISSINGFILESTR=!MISSINGFILESTR! bin\PACLIB.dll
  200. )
  201. if not exist bin\paext.exe (
  202.     set /a MISSINGFILECT+=1
  203.     set MISSINGFILESTR=!MISSINGFILESTR! bin\paext.exe
  204. )
  205.  
  206. if !MISSINGFILECT! GTR 0 (
  207.     set FILESUP=FALSE
  208. ) else (
  209.     set FILESUP=TRUE
  210. )
  211. goto :eof
  212.  
  213. ::
  214. ::          :checkLocalDB
  215. ::
  216. :: Procedure to check for local database
  217. ::
  218. :checkLocalDB
  219. if not exist db\packages.list (
  220.     set /a MISSINGLISTCT+=1
  221.     set MISSINGLISTSTR=!MISSINGLISTSTR! db\packages.list
  222. )
  223. if not exist db\meta.list (
  224.     set /a MISSINGLISTCT+=1
  225.     set MISSINGLISTSTR=!MISSINGLISTSTR! db\meta.list
  226. )
  227.  
  228. for /L %%a in (1, 1, !MPKGS!) do (
  229.     if not exist db\!METAPKG%%a!.list (
  230.         echo Could not find db\!METAPKG%%a!.list^^!
  231.         set /a MISSINGLISTCT+=1
  232.         set MISSINGLISTSTR=!MISSINGLISTSTR! db\!METAPKG%%a!.list
  233.     )
  234. )
  235.  
  236. for /L %%b in (1, 1, !TPKGS!) do (
  237.     if not exist packages\!PKG%%b!.zip (
  238.         echo Could not find packages\!PKG%%b!.zip^^!
  239.         set /a MISSINGPKGCT+=1
  240.         set MISSINGPKGSTR=!MISSINGPKGSTR! !PKG%%b!
  241.     )
  242. )
  243.  
  244. if "!MISSINGLISTCT!"=="" set MISSINGLISTCT=0
  245. if "!MISSINGPKGCT!"=="" set MISSINGPKGCT=0
  246.  
  247. if !MISSINGLISTCT! GTR 0 (
  248.     set LOCALDBUP=FALSE
  249. )
  250. if !MISSINGLISTCT!==0 (
  251.     set LOCALDBUP=TRUE
  252. )
  253.  
  254. goto :eof
  255.  
  256. ::
  257. ::
  258. ::
  259. ::
  260. ::
  261. :downloadDB
  262. rmdir db /s /q
  263. %WGET% %SERVER%/db/packages.list --directory-prefix="db"
  264. %WGET% %SERVER%/db/meta.list --directory-prefix="db"
  265. call :loadPKGArray db\packages.list PKG TPKGS
  266. call :loadPKGArray db\meta.list METAPKG MPKGS
  267.  
  268. for /L %%a in (1, 1, !MPKGS!) do (
  269.     %WGET% %SERVER%/db/!METAPKG%%a!.list --directory-prefix="db"
  270. )
  271. goto :eof
  272.  
  273. ::
  274. ::          :prepare
  275. ::
  276. :: Simple preparation procedure
  277. ::
  278. :prepare
  279. if exist temp\install.list del temp\install.list
  280. if exist temp\temp1.list del temp\temp1.list
  281. if exist temp\temp2.list del temp\temp2.list
  282. if not exist temp\NUL mkdir temp
  283.  
  284. goto :eof
  285.  
  286. ::
  287. ::          :loadPKGArray
  288. ::
  289. :: Creates array from list in a file or set
  290. :: %1 is the file or set to be loaded
  291. :: %2 is the array variable to be created
  292. :: %3 is the count variable to be created
  293. ::
  294. :loadPKGArray
  295. set NUM=1
  296. for /f "tokens=*" %%a in (%1) do (
  297.     set %2!NUM!=%%a
  298.     set /a NUM+=1
  299. )
  300. set /a %3=!NUM!-1
  301. goto :eof
  302.  
  303. ::
  304. ::          :handleParam
  305. ::
  306. :: Takes the parameters and does something with them before
  307. :: processing them.
  308. :: %1 is the parameter
  309. :: %2 is the array variable
  310. ::
  311. :handleParam
  312. if "%1"=="" goto :eof
  313. if "%1"=="download" (
  314.     set DOWNLOAD=TRUE
  315.     goto :eof
  316. )
  317. if  "%1"=="-offline" (
  318.     set OFFLINE=TRUE
  319.     goto :eof
  320. )
  321.  
  322. set /a CT+=1
  323. set %2!CT!=%1
  324. goto :eof
  325.  
  326. ::
  327. ::          :checkParam
  328. ::
  329. :: Verifies and writes parameters passed to script to file
  330. :: %1 is the parameter
  331. :: %2 is the array variable used in loadPKGArray
  332. :: %3 is the count returned from loadPKGArray
  333. :: %4 success count variable
  334. :: %5 failure string variable
  335. :: %6 failure count variable
  336. :: %7 is the array variable used in loadPKGArray
  337. :: %8 is the count returned from loadPKGArray
  338. :: %9 file to write to
  339. ::
  340. :checkParam
  341. for /L %%b in (1, 1, !%8!) do (
  342.     if !%7%%b!==%1 (
  343.         call :loadPKGArray db\!%7%%b!.list %7PKG %7PKGCT
  344.         for /L %%c in (1, 1, !%7PKGCT!) do (
  345.             echo !%7PKG%%c!>> %9
  346.             set /a %4+=1
  347.         )
  348.         goto :eof
  349.     )
  350. )
  351. for /L %%a in (1, 1, !%3!) do (
  352.     if !%2%%a!==%1 (
  353.         echo !%2%%a!>> %9
  354.         set /a %4+=1
  355.         goto :eof
  356.     )
  357. )
  358. set /a %6+=1
  359. set %5=!%5! %1
  360. goto :eof
  361.  
  362. ::
  363. ::          :sortPKG
  364. ::
  365. :: Sort packages according to order from previous array variable
  366. :: %1 is the file to write
  367. :: %2 is the basis array variable
  368. :: %3 is the array variable to compare
  369. :: %4 is the total number of values in the basis array
  370. :: %5 is the total number of values in the compare array
  371. ::
  372. :sortPKG
  373. for /L %%a in (1, 1, !%4!) do (
  374.     for /L %%b in (1, 1, !%5!) do (
  375.         if !%2%%a!==!%3%%b! (
  376.             echo !%2%%a!>>%1
  377.         )
  378.     )
  379. )
  380. goto :eof
  381.  
  382. ::
  383. ::          :reduceReassign
  384. ::
  385. :: Remove duplicate packages from temp list to final list
  386. :: %1 is the input list file
  387. :: %2 is the output list file
  388. :: %3 is the array variable to be created
  389. :: %4 is the count variable to be created
  390. :: %5 is the output string
  391. ::
  392. :reduceReassign
  393. %UNIQ% %1 %2
  394. set NUM=1
  395. for /f "tokens=*" %%a in (%2) do (
  396.     set %3!NUM!=%%a
  397.     set /a NUM+=1
  398.     set %5=!%5! %%a
  399. )
  400. set /a %4=!NUM!-1
  401. goto :eof
  402.  
  403. ::
  404. ::          :reportPKGS
  405. ::
  406. :: Displays a report about packages
  407. :: %1 is count of unrecognized packages
  408. :: %2 is count of packages to be installed
  409. :: %3 is the ignored packages string
  410. :: %4 is the packages to be installed string
  411. ::
  412. :reportPKGS
  413. echo -----------------------------------------------------
  414. echo -
  415. if !ONLINE!==TRUE echo - Using ONLINE mode, packages will be downloaded.
  416. if !ONLINE!==FALSE echo - Using OFFLINE mode, local packages will be used.
  417. echo -
  418. if !%1!==0 (
  419.     echo - !%1! unrecognized packages.
  420. )
  421. if !%1!==1 (
  422.     echo - !%1! unrecognized package:!%3!
  423. )
  424. if !%1! GTR 1 (
  425.     echo - !%1! unrecognized packages:!%3!
  426. )
  427.  
  428. if !DOWNLOAD!==TRUE (
  429.     if !%2!==0 (
  430.         echo - !%2! packages to be downloaded.
  431.     )
  432.     if !%2!==1 (
  433.         echo - !%2! package to be downloaded:!%4!
  434.     )
  435.     if !%2! GTR 1 (
  436.         echo - !%2! packages to be downloaded:!%4!
  437.     )
  438. ) else if !DOWNLOAD!==FALSE (
  439.     if !%2!==0 (
  440.         echo - !%2! packages to be installed.
  441.     )
  442.     if !%2!==1 (
  443.         echo - !%2! package to be installed:!%4!
  444.     )
  445.     if !%2! GTR 1 (
  446.         echo - !%2! packages to be installed:!%4!
  447.     )
  448. )
  449. echo -
  450. echo -----------------------------------------------------
  451. echo.
  452. goto :eof
  453.  
  454. ::
  455. ::          :downloadPKGS
  456. ::
  457. :: Downloads the packages
  458. :: %1 is the count of packages
  459. :: %2 is the array of packages to be installed
  460. ::
  461. :downloadPKGS
  462. rmdir packages /s /q
  463. echo -----------------------------------------------------
  464. for /L %%a in (1, 1, !%1!) do (
  465.    echo -
  466.    echo - Downloading !%2%%a!.zip...
  467.    %WGET% %SERVER%/!%2%%a!.zip --directory-prefix="packages"
  468.    echo -
  469.    echo - Done^^!
  470.    echo -
  471.    echo -----------------------------------------------------
  472. )
  473. goto :eof
  474.  
  475. ::
  476. ::          :extractPKGS
  477. ::
  478. :: Extracts the packages
  479. :: %1 is the count of packages
  480. :: %2 is the array of packages to be installed
  481. ::
  482. :extractPKGS
  483. echo -----------------------------------------------------
  484. for /L %%a in (1, 1, !%1!) do (
  485.    echo -
  486.    echo - Extracting !%2%%a!.zip to packages...
  487.    %PAEXT% -d -o+ -ptemp packages\!%2%%a!.zip
  488.    echo -
  489.    echo - Done^^!
  490.    echo -
  491.    echo -----------------------------------------------------
  492. )
  493. goto :eof
  494.  
  495. ::
  496. ::          :installPKGS
  497. ::
  498. :: Installs packages after download extraction per an array
  499. :: %1 is the count of packages
  500. :: %2 is the array of packages to be installed
  501. ::
  502. :installPKGS
  503. for /L %%a in (1, 1, !%1!) do (
  504.     set NUM=1
  505.  
  506.     for /f "tokens=*" %%b in (temp\!%2%%a!\!%2%%a!.plug) do (
  507.         set LINE!NUM!=%%b
  508.         set /a NUM+=1  
  509.     )
  510.  
  511.     :: Create friendly variables
  512.     set APP=!LINE1!
  513.     set VER=!LINE2!
  514.     set TYPE=!LINE3!
  515.  
  516.     :: We're using 4 instead of 3, it counts a dead line at the end.
  517.     set /a FILES=NUM-4
  518.  
  519.     :: Show what we're going to install
  520.     echo -
  521.     echo - Installing package: !APP!, version !VER!
  522.     echo - Source files are "!TYPE!" files.
  523.     echo - !FILES! files to install.
  524.     echo -
  525.  
  526.     set /a END=3+!FILES!
  527.     for /L %%c in (4, 1, !END!) do (
  528.         if "!TYPE!"=="exe" (
  529.             echo - Running !LINE%%c!...
  530.             temp\!%2%%a!\!LINE%%c!
  531.             echo - Done^^!
  532.         )
  533.         if "!TYPE!"=="msi" (
  534.             echo - Installing !LINE%%c! /passive /norestart...
  535.             temp\!%2%%a!\!LINE%%c! /passive /norestart
  536.             echo - Done^^!
  537.         )
  538.         if "!TYPE!"=="reg" (
  539.             echo - Importing !LINE%%c!...
  540.             reg import temp\!%2%%a!\!LINE%%c!
  541.             echo - Done^^!
  542.         )
  543.         if "!TYPE!"=="other" (
  544.             echo - Running !LINE%%c!...
  545.             temp\!%2%%a!\!LINE%%c!
  546.             echo - Done^^!
  547.         )
  548.     )
  549.     echo -
  550.     echo -----------------------------------------------------
  551. )
  552. goto :eof
  553.  
  554. ::
  555. ::          :cleanUp
  556. ::
  557. :: Simple cleanup procedure
  558. ::
  559. :cleanUp
  560. if exist temp\install.list del temp\install.list
  561. if exist temp\temp1.list del temp\temp1.list
  562. if exist temp\temp2.list del temp\temp2.list
  563. if exist temp\NUL rmdir temp /s /q
  564. goto :eof
  565.  
  566. ::
  567. ::          :error
  568. ::
  569. :: Handles error messages in the script
  570. :: %1 is the error code
  571. ::
  572. :error
  573. set CODE=%1
  574.  
  575. echo.
  576. echo ERROR:
  577.  
  578. if "!CODE!"=="NoBin" (
  579.     echo Local files are not in place to continue.  Repopulate the bin directory
  580.     echo and try again.
  581.     echo.
  582.     echo !MISSINGFILECT! files are missing:!MISSINGFILESTR!
  583. )
  584. if "!CODE!"=="NoDBNoNetwork" (
  585.     echo A connection to the server cannot be made and the local database is
  586.     echo either incomplete or missing.  Repopulate the db directory and try
  587.     echo again.
  588.     echo.
  589.     echo At least !MISSINGLISTCT! database files are missing:!MISSINGLISTSTR!
  590. )
  591. if "!CODE!"=="NoDBNoNetworkOffline" (
  592.     echo A connection to the server cannot be made and the local database is
  593.     echo either incomplete or missing.  Try not using the "-offline" switch to
  594.     echo download the databasee.
  595. )
  596. if "!CODE!"=="NoDownload" (
  597.     echo Cannot download packages without being able to contact the server^^!
  598. )
  599. if "!CODE!"=="NoPkgs" (
  600.     echo There are no packages to install^^!
  601. )
  602. if "!CODE!"=="NoLocalPkgs" (
  603.     echo There are no local packages for offline install^^!  To download
  604.     echo packages, use the "download" switch.
  605.     echo.
  606.     echo e.g. get-pkg download package1 package2
  607. )
  608. if "!CODE!"=="DownloadOffline" (
  609.     echo You cannot use the "-download" and "-offline" switches together^^!
  610. )
  611. if "!CODE!"=="" (
  612.     echo An unspecified error has occured, cannot continue.
  613. )
  614.  
  615. goto :eof
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement