getlog.cmd 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. @echo off
  2. setlocal EnableExtensions EnableDelayedExpansion
  3. REM =====================================================
  4. REM getlog - NetScaler Case File Downloader
  5. REM Downloads case files from sjanalysis.citrite.net
  6. REM =====================================================
  7. REM Check for pscp.exe (PuTTY SCP) or scp.exe
  8. set "SCP_TOOL="
  9. where pscp.exe >nul 2>&1
  10. if !ERRORLEVEL! EQU 0 (
  11. set "SCP_TOOL=pscp.exe"
  12. set "SCP_TYPE=PSCP"
  13. ) else (
  14. where scp.exe >nul 2>&1
  15. if !ERRORLEVEL! EQU 0 (
  16. set "SCP_TOOL=scp.exe"
  17. set "SCP_TYPE=SCP"
  18. )
  19. )
  20. if "%SCP_TOOL%"=="" (
  21. echo ERROR: Neither pscp.exe nor scp.exe found in PATH.
  22. echo.
  23. echo Please install one of the following:
  24. echo - PuTTY ^(includes pscp.exe^) - https://www.putty.org/
  25. echo - OpenSSH Client ^(includes scp.exe^) - Built into Windows 10/11
  26. echo.
  27. pause
  28. exit /b 1
  29. )
  30. REM =====================================================
  31. REM Configuration
  32. REM =====================================================
  33. set "REMOTE_SERVER=sjanalysis.citrite.net"
  34. set "REMOTE_BASE_PATH=/upload/ftp"
  35. REM Prompt for case number if not provided
  36. if "%~1"=="" (
  37. set /p CASENO=Enter Case Number:
  38. ) else (
  39. set "CASENO=%~1"
  40. )
  41. if "%CASENO%"=="" (
  42. echo ERROR: Case number cannot be empty.
  43. exit /b 1
  44. )
  45. REM Prompt for credentials if not provided
  46. if "%~2"=="" (
  47. set /p USERNAME=Enter SSH Username:
  48. ) else (
  49. set "USERNAME=%~2"
  50. )
  51. if "%USERNAME%"=="" (
  52. echo ERROR: Username cannot be empty.
  53. exit /b 1
  54. )
  55. if "%~3"=="" (
  56. echo Enter SSH Password for %USERNAME%@%REMOTE_SERVER%:
  57. set /p PASSWORD=
  58. ) else (
  59. set "PASSWORD=%~3"
  60. )
  61. REM =====================================================
  62. REM Paths
  63. REM =====================================================
  64. set "REMOTE_CASE_PATH=%REMOTE_BASE_PATH%/%CASENO%"
  65. set "DEST=%USERPROFILE%\Downloads\SJLNT\%CASENO%"
  66. set "LOGFILE=%DEST%\download_%CASENO%.log"
  67. set "TEMP_LIST=%TEMP%\caselist_%CASENO%.txt"
  68. set "TEMP_FILTERED=%TEMP%\filtered_%CASENO%.txt"
  69. set "COLLECTOR_LIST=%TEMP%\collectors_%CASENO%.txt"
  70. set "ALL_FILES_LIST=%TEMP%\allfiles_%CASENO%.txt"
  71. echo.
  72. echo =====================================================
  73. echo NetScaler Case Download Utility
  74. echo =====================================================
  75. echo Case Number : %CASENO%
  76. echo Remote Server : %REMOTE_SERVER%
  77. echo Remote Path : %REMOTE_CASE_PATH%
  78. echo Local Dest : %DEST%
  79. echo SCP Tool : %SCP_TYPE%
  80. echo User : %USERNAME%
  81. echo =====================================================
  82. echo.
  83. REM Create destination if missing
  84. if not exist "%DEST%" (
  85. mkdir "%DEST%" 2>nul || (
  86. echo ERROR: Failed to create destination folder: %DEST%
  87. exit /b 1
  88. )
  89. echo Created destination folder.
  90. )
  91. REM Create subdirectories for organization
  92. if not exist "%DEST%\configs" mkdir "%DEST%\configs"
  93. if not exist "%DEST%\captures" mkdir "%DEST%\captures"
  94. if not exist "%DEST%\media" mkdir "%DEST%\media"
  95. REM Initialize log file
  96. echo Download Log - Case: %CASENO% > "%LOGFILE%"
  97. echo Date/Time: %DATE% %TIME% >> "%LOGFILE%"
  98. echo Remote Server: %REMOTE_SERVER% >> "%LOGFILE%"
  99. echo User: %USERNAME% >> "%LOGFILE%"
  100. echo ================================================== >> "%LOGFILE%"
  101. echo. >> "%LOGFILE%"
  102. REM =====================================================
  103. REM Test SSH connection and verify case directory
  104. REM =====================================================
  105. echo [1/5] Testing SSH connection...
  106. echo Testing SSH connection... >> "%LOGFILE%"
  107. if "%SCP_TYPE%"=="PSCP" (
  108. echo y | plink.exe -batch -pw "%PASSWORD%" %USERNAME%@%REMOTE_SERVER% "test -d %REMOTE_CASE_PATH% && echo OK || echo NOTFOUND" 2>nul | findstr /V /C:"Keyboard" /C:"prompts from server" > "%TEMP_LIST%"
  109. ) else (
  110. sshpass -p "%PASSWORD%" ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=NUL %USERNAME%@%REMOTE_SERVER% "test -d %REMOTE_CASE_PATH% && echo OK || echo NOTFOUND" > "%TEMP_LIST%" 2>&1
  111. )
  112. if !ERRORLEVEL! NEQ 0 (
  113. echo ERROR: SSH connection failed. >> "%LOGFILE%"
  114. type "%TEMP_LIST%" >> "%LOGFILE%"
  115. echo ERROR: SSH connection failed.
  116. echo Check credentials and network connectivity.
  117. echo See log: %LOGFILE%
  118. del "%TEMP_LIST%" 2>nul
  119. pause
  120. exit /b 1
  121. )
  122. findstr /C:"OK" "%TEMP_LIST%" >nul
  123. if !ERRORLEVEL! NEQ 0 (
  124. echo ERROR: Case directory not found on server: %REMOTE_CASE_PATH% >> "%LOGFILE%"
  125. echo ERROR: Case directory not found on server.
  126. echo Path: %REMOTE_CASE_PATH%
  127. echo Please verify the case number.
  128. del "%TEMP_LIST%" 2>nul
  129. pause
  130. exit /b 1
  131. )
  132. echo Connection successful.
  133. echo Connection successful. >> "%LOGFILE%"
  134. REM =====================================================
  135. REM Single SSH call to get all required info
  136. REM Collectors + All files in case root
  137. REM =====================================================
  138. echo.
  139. echo [2/5] Scanning case directory...
  140. echo Scanning case directory... >> "%LOGFILE%"
  141. if "%SCP_TYPE%"=="PSCP" (
  142. plink.exe -batch -pw "%PASSWORD%" %USERNAME%@%REMOTE_SERVER% "echo '===COLLECTORS==='; find %REMOTE_CASE_PATH% -maxdepth 1 -type d -name 'collector_*' 2>/dev/null; echo '===FILES==='; find %REMOTE_CASE_PATH% -maxdepth 1 -type f \( -name '*.cap' -o -name '*.pcap' -o -name '*.pcapng' -o -name '*.sslkeys' -o -name '*.keys' -o -name '*.har' -o -name '*.xml' -o -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' -o -name '*.gif' -o -name '*.bmp' -o -name '*.webp' -o -name '*.tiff' -o -name '*.svg' -o -name '*.txt' -o -name '*.log' -o -name '*.csv' -o -name '*.json' \) 2>/dev/null" 2>nul | findstr /V /C:"Keyboard" /C:"prompts from server" > "%ALL_FILES_LIST%"
  143. ) else (
  144. sshpass -p "%PASSWORD%" ssh -o StrictHostKeyChecking=no %USERNAME%@%REMOTE_SERVER% "echo '===COLLECTORS==='; find %REMOTE_CASE_PATH% -maxdepth 1 -type d -name 'collector_*' 2>/dev/null; echo '===FILES==='; find %REMOTE_CASE_PATH% -maxdepth 1 -type f \( -name '*.cap' -o -name '*.pcap' -o -name '*.pcapng' -o -name '*.sslkeys' -o -name '*.keys' -o -name '*.har' -o -name '*.xml' -o -name '*.jpg' -o -name '*.jpeg' -o -name '*.png' -o -name '*.gif' -o -name '*.bmp' -o -name '*.webp' -o -name '*.tiff' -o -name '*.svg' -o -name '*.txt' -o -name '*.log' -o -name '*.csv' -o -name '*.json' \) 2>/dev/null" > "%ALL_FILES_LIST%"
  145. )
  146. REM Parse collectors from combined output
  147. set "IN_COLLECTORS=0"
  148. set "IN_FILES=0"
  149. echo. > "%COLLECTOR_LIST%"
  150. echo. > "%TEMP_LIST%"
  151. for /f "usebackq delims=" %%A in ("%ALL_FILES_LIST%") do (
  152. set "LINE=%%A"
  153. REM Check for section markers
  154. echo !LINE! | findstr /C:"===COLLECTORS===" >nul
  155. if !ERRORLEVEL! EQU 0 (
  156. set "IN_COLLECTORS=1"
  157. set "IN_FILES=0"
  158. ) else (
  159. echo !LINE! | findstr /C:"===FILES===" >nul
  160. if !ERRORLEVEL! EQU 0 (
  161. set "IN_COLLECTORS=0"
  162. set "IN_FILES=1"
  163. ) else (
  164. REM Skip empty lines and filter noise
  165. if not "!LINE!"=="" (
  166. echo !LINE! | findstr /C:"Keyboard" /C:"prompts" /C:"authentication" >nul
  167. if !ERRORLEVEL! NEQ 0 (
  168. if !IN_COLLECTORS! EQU 1 (
  169. echo !LINE!>> "%COLLECTOR_LIST%"
  170. )
  171. if !IN_FILES! EQU 1 (
  172. echo !LINE!>> "%TEMP_LIST%"
  173. )
  174. )
  175. )
  176. )
  177. )
  178. )
  179. REM Count collectors
  180. set "COLLECTOR_COUNT=0"
  181. for /f "usebackq delims=" %%A in ("%COLLECTOR_LIST%") do (
  182. set "LINE=%%A"
  183. if not "!LINE!"=="" (
  184. echo !LINE! | findstr /C:"collector_" >nul
  185. if !ERRORLEVEL! EQU 0 (
  186. set /a COLLECTOR_COUNT+=1
  187. for %%B in ("!LINE!") do echo Found: %%~nxB
  188. echo Found collector: !LINE! >> "%LOGFILE%"
  189. )
  190. )
  191. )
  192. if %COLLECTOR_COUNT% EQU 0 (
  193. echo No collector bundles found.
  194. echo No collector bundles found. >> "%LOGFILE%"
  195. ) else (
  196. echo Total collectors found: %COLLECTOR_COUNT%
  197. )
  198. REM =====================================================
  199. REM Download Saved Config (ns.conf from nsconfig folder)
  200. REM Inside collector bundles only
  201. REM =====================================================
  202. echo.
  203. echo [3/5] Downloading saved configurations ^(ns.conf^)...
  204. echo Downloading saved configurations... >> "%LOGFILE%"
  205. set "CONFIG_COUNT=0"
  206. for /f "usebackq delims=" %%C in ("%COLLECTOR_LIST%") do (
  207. set "COLLECTOR_PATH=%%C"
  208. REM Skip empty lines and filter noise
  209. if not "!COLLECTOR_PATH!"=="" (
  210. echo !COLLECTOR_PATH! | findstr /C:"collector_" >nul
  211. if !ERRORLEVEL! EQU 0 (
  212. for %%D in ("!COLLECTOR_PATH!") do set "COLLECTOR_NAME=%%~nxD"
  213. echo Checking !COLLECTOR_NAME! for ns.conf...
  214. set "DEST_FILENAME=ns.conf_!COLLECTOR_NAME!"
  215. if "%SCP_TYPE%"=="PSCP" (
  216. pscp.exe -batch -pw "%PASSWORD%" -q "%USERNAME%@%REMOTE_SERVER%:!COLLECTOR_PATH!/nsconfig/ns.conf" "%DEST%\configs\!DEST_FILENAME!" >nul 2>&1
  217. ) else (
  218. scp -o StrictHostKeyChecking=no -q "%USERNAME%@%REMOTE_SERVER%:!COLLECTOR_PATH!/nsconfig/ns.conf" "%DEST%\configs\!DEST_FILENAME!" 2>nul
  219. )
  220. if exist "%DEST%\configs\!DEST_FILENAME!" (
  221. echo Downloaded: !DEST_FILENAME!
  222. echo Downloaded: !DEST_FILENAME! >> "%LOGFILE%"
  223. set /a CONFIG_COUNT+=1
  224. ) else (
  225. echo ns.conf not found in !COLLECTOR_NAME!
  226. )
  227. )
  228. )
  229. )
  230. echo Saved configs downloaded: %CONFIG_COUNT%
  231. REM =====================================================
  232. REM Download Running Config (ns_running_config.conf)
  233. REM Inside collector bundles only
  234. REM =====================================================
  235. echo.
  236. echo [4/5] Downloading running configurations...
  237. echo Downloading running configurations... >> "%LOGFILE%"
  238. set "RUNNING_COUNT=0"
  239. for /f "usebackq delims=" %%C in ("%COLLECTOR_LIST%") do (
  240. set "COLLECTOR_PATH=%%C"
  241. REM Skip empty lines and filter noise
  242. if not "!COLLECTOR_PATH!"=="" (
  243. echo !COLLECTOR_PATH! | findstr /C:"collector_" >nul
  244. if !ERRORLEVEL! EQU 0 (
  245. for %%D in ("!COLLECTOR_PATH!") do set "COLLECTOR_NAME=%%~nxD"
  246. echo Checking !COLLECTOR_NAME! for running config...
  247. set "DEST_FILENAME=ns_running_config.conf_!COLLECTOR_NAME!"
  248. if "%SCP_TYPE%"=="PSCP" (
  249. pscp.exe -batch -pw "%PASSWORD%" -q "%USERNAME%@%REMOTE_SERVER%:!COLLECTOR_PATH!/shell/ns_running_config.conf" "%DEST%\configs\!DEST_FILENAME!" >nul 2>&1
  250. ) else (
  251. scp -o StrictHostKeyChecking=no -q "%USERNAME%@%REMOTE_SERVER%:!COLLECTOR_PATH!/shell/ns_running_config.conf" "%DEST%\configs\!DEST_FILENAME!" 2>nul
  252. )
  253. if exist "%DEST%\configs\!DEST_FILENAME!" (
  254. echo Downloaded: !DEST_FILENAME!
  255. echo Downloaded: !DEST_FILENAME! >> "%LOGFILE%"
  256. set /a RUNNING_COUNT+=1
  257. ) else (
  258. echo Running config not found in !COLLECTOR_NAME!
  259. )
  260. )
  261. )
  262. )
  263. echo Running configs downloaded: %RUNNING_COUNT%
  264. REM =====================================================
  265. REM Download Capture and Media Files
  266. REM OUTSIDE collector bundles only (case root level)
  267. REM Using pre-fetched file list
  268. REM =====================================================
  269. echo.
  270. echo [5/5] Downloading files from case directory...
  271. echo Downloading files from case root... >> "%LOGFILE%"
  272. set "CAPTURE_COUNT=0"
  273. set "MEDIA_COUNT=0"
  274. set "OTHER_COUNT=0"
  275. for /f "usebackq delims=" %%F in ("%TEMP_LIST%") do (
  276. set "REMOTE_FILE=%%F"
  277. REM Skip empty lines and filter noise
  278. if not "!REMOTE_FILE!"=="" (
  279. echo !REMOTE_FILE! | findstr /C:"Keyboard" /C:"prompts" /C:"authentication" >nul
  280. if !ERRORLEVEL! NEQ 0 (
  281. for %%G in ("!REMOTE_FILE!") do (
  282. set "FILENAME=%%~nxG"
  283. set "FILEEXT=%%~xG"
  284. )
  285. if not "!FILENAME!"=="" (
  286. REM Determine file type and destination
  287. set "FILE_DEST="
  288. set "FILE_TYPE="
  289. REM Check if capture file
  290. echo !FILEEXT! | findstr /I /C:".cap" /C:".pcap" /C:".pcapng" /C:".sslkeys" /C:".keys" /C:".har" >nul
  291. if !ERRORLEVEL! EQU 0 (
  292. set "FILE_DEST=%DEST%\captures\!FILENAME!"
  293. set "FILE_TYPE=capture"
  294. )
  295. REM Check if image file
  296. echo !FILEEXT! | findstr /I /C:".jpg" /C:".jpeg" /C:".png" /C:".gif" /C:".bmp" /C:".webp" /C:".tiff" /C:".svg" >nul
  297. if !ERRORLEVEL! EQU 0 (
  298. set "FILE_DEST=%DEST%\media\!FILENAME!"
  299. set "FILE_TYPE=media"
  300. )
  301. REM Check if other file (txt, log, xml, json, csv)
  302. echo !FILEEXT! | findstr /I /C:".txt" /C:".log" /C:".xml" /C:".json" /C:".csv" >nul
  303. if !ERRORLEVEL! EQU 0 (
  304. set "FILE_DEST=%DEST%\!FILENAME!"
  305. set "FILE_TYPE=other"
  306. )
  307. REM Download the file
  308. if defined FILE_DEST (
  309. echo Downloading: !FILENAME!
  310. if "%SCP_TYPE%"=="PSCP" (
  311. pscp.exe -batch -pw "%PASSWORD%" -q "%USERNAME%@%REMOTE_SERVER%:!REMOTE_FILE!" "!FILE_DEST!" >nul 2>&1
  312. ) else (
  313. scp -o StrictHostKeyChecking=no -q "%USERNAME%@%REMOTE_SERVER%:!REMOTE_FILE!" "!FILE_DEST!" 2>nul
  314. )
  315. if exist "!FILE_DEST!" (
  316. echo Downloaded: !FILENAME!
  317. echo Downloaded !FILE_TYPE!: !FILENAME! >> "%LOGFILE%"
  318. if "!FILE_TYPE!"=="capture" set /a CAPTURE_COUNT+=1
  319. if "!FILE_TYPE!"=="media" set /a MEDIA_COUNT+=1
  320. if "!FILE_TYPE!"=="other" set /a OTHER_COUNT+=1
  321. )
  322. )
  323. )
  324. )
  325. )
  326. )
  327. echo.
  328. echo Capture files downloaded: %CAPTURE_COUNT%
  329. echo Media files downloaded: %MEDIA_COUNT%
  330. echo Other files downloaded: %OTHER_COUNT%
  331. REM =====================================================
  332. REM Cleanup and Summary
  333. REM =====================================================
  334. del "%TEMP_LIST%" 2>nul
  335. del "%TEMP_FILTERED%" 2>nul
  336. del "%COLLECTOR_LIST%" 2>nul
  337. del "%ALL_FILES_LIST%" 2>nul
  338. REM Remove empty directories
  339. for %%D in (configs captures media) do (
  340. dir /b "%DEST%\%%D" 2>nul | findstr "." >nul || rmdir "%DEST%\%%D" 2>nul
  341. )
  342. echo.
  343. echo =====================================================
  344. echo Download Complete - Summary
  345. echo =====================================================
  346. echo.
  347. echo FROM COLLECTOR BUNDLES:
  348. echo Collector bundles found : %COLLECTOR_COUNT%
  349. echo Saved configs ^(ns.conf^) : %CONFIG_COUNT%
  350. echo Running configs : %RUNNING_COUNT%
  351. echo.
  352. echo FROM CASE ROOT DIRECTORY:
  353. echo Capture files ^(pcap,har^) : %CAPTURE_COUNT%
  354. echo Media files ^(images^) : %MEDIA_COUNT%
  355. echo Other files ^(xml,txt^) : %OTHER_COUNT%
  356. echo.
  357. echo Destination folder:
  358. echo %DEST%
  359. echo.
  360. echo Log file:
  361. echo %LOGFILE%
  362. echo.
  363. REM Write summary to log
  364. echo. >> "%LOGFILE%"
  365. echo ================================================== >> "%LOGFILE%"
  366. echo SUMMARY >> "%LOGFILE%"
  367. echo ================================================== >> "%LOGFILE%"
  368. echo FROM COLLECTOR BUNDLES: >> "%LOGFILE%"
  369. echo Collector bundles found : %COLLECTOR_COUNT% >> "%LOGFILE%"
  370. echo Saved configs : %CONFIG_COUNT% >> "%LOGFILE%"
  371. echo Running configs : %RUNNING_COUNT% >> "%LOGFILE%"
  372. echo. >> "%LOGFILE%"
  373. echo FROM CASE ROOT DIRECTORY: >> "%LOGFILE%"
  374. echo Capture files : %CAPTURE_COUNT% >> "%LOGFILE%"
  375. echo Media files : %MEDIA_COUNT% >> "%LOGFILE%"
  376. echo Other files : %OTHER_COUNT% >> "%LOGFILE%"
  377. echo ================================================== >> "%LOGFILE%"
  378. echo =====================================================
  379. echo.
  380. REM Open destination folder
  381. choice /C YN /M "Open destination folder now?"
  382. if !ERRORLEVEL! EQU 1 explorer "%DEST%"
  383. endlocal
  384. exit /b 0