Jump to content
Ketarin forum


  • Posts

  • Joined

  • Last visited


About shawn

Profile Information

  • Gender

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

shawn's Achievements

  1. You can configure your setup instructions to interact with the user or request input or perform pretty much any other activity that your user account has the rights to do, including prompting for elevation should the installation require that. There are efforts here to use Ketarin as a website monitoring system and as a task manager. These aren't its intended purpose, but it has great potential to be able to automate most daily tasks.
  2. Ketarin, by default, only performs the download functionality. If you want it to perform the actual updates then you will need to add Setup Instructions and select the option to Install instead of merely Update.
  3. Hi, @WrongCode ! There are actually a lot of tips available here on the forum. Whenever I find a novel solution to a problem I try to post about it there. Ultimately you'll want to figure out what details you actually want to keep and how aggressive to be with that data collection. It's insanely easy to get just the download and not think about everything else, but I always want to capture the changelog and any other relevant details as well (bits, OS, vendor, website and so on). Guidance for creating and using custom columns, changelogs, PowerShell variable access, and lots more at the Tips section. The Templates section also has some demonstrations of how to do common tasks, including the use of Templates, which are pretty awesome if you download a lot of things from the same sites (like GitHub or Source Forge or NirSoft): creating a template allows you to do the major work only once, then plug in a few values when you load another app from the template. Finally, get Kuppet. Kuppet is a Ketarin accessory that allows you to bypass a lot of the newer HTML5 JavaScript-rendered page problems by rendering the page for you first and allowing you to capture the content from that instead of the unusable JavaScript calls alone. I'm using Kuppet in about 20-25% of my apps now.
  4. It was crashing for me most of the time as long as I had the 'keep x' option enabled on one or more of the apps, too. In order to make it work reliably I had to remove every single app then recreate each of the apps using the Ketarin interface (not copy & pasted from the XML). While this worked, with over a thousand apps I decided it was more work than I was prepared for, especially since my external monitoring relies heavily on the guids from Ketarin within the logging and my external database. It wouldn't be a matter of simply recreating 1000+ apps, but I would then have to munge tens or even hundreds of thousands of database entries externally, too, so I have the logs going back over the years from monitoring each app. It would also result in orphaning the entries in the online database that i synced up there, since changes I made to the apps would no longer be uploaded.
  5. Glad you got it sorted so quickly, @WrongCode. However, I would recommend you change from the home page to the changelog to parse for version and download URLs. In my experience it's usually more reliable and consistent since the devs may not have the home page hooked into whatever release process they use so one or more values may fail to be updated as part of their manual process. The reason you saw it failing to download was because the last version was the same file that downloaded last time -- -- so even though the version number changed on the homepage the binary link did not. The pattern you used for your url variable (which you used for the download URL) failed because that text didn't actually appear on the page so it couldn't parse for it, so it failed to update. You can use the ifemptythenerror function to perform validation on your variables to troubleshoot situations like this one. You can also get around that problem (here) by switching from parsing for the URL (which you clearly know is going to match that pattern anyway) to just fabricating the URL yourself as a Textual variable as so: https://dist.mountainduck.io/Mountain%20Duck%20Installer-{version:ifemptythenerror}.exe Change the variable type from "Content from URL (regular expression)" to "Textual content" and use that pattern and it will solve both of your big issues here. Even so, it's possible they might change the download URL format/pattern at any time, so be careful if you do. Ketarin natively monitors eTags and dates as well so won't re-download the same binary unless you use the "force" option or the server doesn't actually report these values (rare). Later, when they discover their error and update the URL on the homepage then it doesn't solve the Ketarin side of the problem since you're using version as the "variable as indicator for changes" and your app has already detected the new version number (even if it didn't download because the url variable was defective!) so it won't download unless you resolve the underlying URL parsing problem. If you install the one that you did download you'll find that it is, in fact, the older installation package from a couple weeks ago. The changelog page also adds a few other things you might be interested in, including the hash and other related packages. Finally, I also recommend you parse for the actual download URL and not rely on injecting the version number in the URL of the pattern they've used prior to get the file. Way too often sites will randomly include additional values (like cache busters or language flags) or change portions of the path that they did not do before (download vs dist). To help detect these situations I use a pre-download command that checks for an empty version number, and a post-download command that writes out all errors and relevant update data from each update to a log file and push it all to a web-accessible database. This allows me to monitor all of my Ketarin activity without having to rely exclusively on the Ketarin interface.
  6. This is a known issue. It will be resolved as time permits.
  7. It should still be two steps -- download with Ketarin and install with WSUS. Store files you download with Ketarin directly in your file share using the same name (use the "save to file" option to select where it is stored and with an unversioned name so it can be installed using the same WSUS profile. Then in WSUS you just write up the update the same as you would normally, using the share name and path that you used in Ketarin for the source.
  8. Hi, all, I've been meaning to rewrite several of my apps for quite a while because there just aren't ways to collect the version number and I hate to have to have a bunch of commands on individual apps just because maintenance becomes a chore. So I came up with a global after-update script to process stuff like that. It's controlled through a new variable assigned to the app called "todo". The idea is that instead of leaving the file details unfilled, let's parse it after it's downloaded from the file itself or perform other post-download actions (extraction, uploading to an FTP server, download from MEGA, copy to another folder and so on). These are now all handled centrally for me with the global after-updating an application script and this new variable. This uses a couple functions based on @Ambimind's code posted here and elsewhere on this forum. #### Support function PKV { Param( $svName ) #### identify variable type and collect stored content $svType = $app.variables.$svName.VariableType; if( $svType -eq "Textual" ){ #### stored text content $svContent = $app.variables.$svName.TextualContent; #### process all child variables if( $svContent -like '*{*' ){ $svContent2 = $app.variables.ReplaceAllInString( "{$svName}", $sfiletime, $sfilename, $true, $false ); if ( $svContent2 -ne '' ){ $svContent = $svContent2; } } }else{ #### other types of variables must be parsed $svContent = $app.variables.ReplaceAllInString( "{$svName}", $sfiletime, $sfilename, $true, $false ); } #### parse version for psversion if it exists if( $svName -eq "version" ){ if( $app.variables."psversion".TextualContent -ne "" ){ $svContent = $app.variables.ReplaceAllInString( "{$svName}", $sfiletime, $sfilename, $true, $false ); } } #### sanitize $svContent = ($svContent -Replace 'http://localhost:48080/', '' | Out-String).Trim() if( $svContent -eq "{$svName}" ){ $svContent = ''; } #### return Write-Information $svName':'$svContent; ($svContent | Out-String).Trim() } #### function NewAppVariable { Param( [Parameter(Mandatory)] $sVarName, [ValidateSet("RegularExpression", "StartEnd", "Textual")] $sVarType = "Textual", $sVarValue = "" ) # Derived access property, ie. app.variables.$sVarName.$varcnt $varcnt = if($sVarType -eq "Textual"){"TextualContent"}Else{"CachedContent"} # If it doesn't exist, then create a new one if(-Not $app.variables.$sVarName){ ECHO "=== $sVarName NOT FOUND, ADDING IT ===" # Add var to job/app $newvar = New-Object -TypeName Ketarin.UrlVariable -ArgumentList $sVarName,$app.variables $newvar.VariableType = $sVarType $app.variables.Add($sVarName, $newvar) $app.Save() } # If it was passed a specific value, assign it if( $sVarValue -ne "" ){ $app.variables.$sVarName.$varcnt = $sVarValue } } #### #### Parse cached variable values $sname = $($App.Name); $sfilename = $($App.CurrentLocation); write-host "Filename:`t$sfilename"; $todo = PKV ( 'todo' ); write-host "ToDo:`t$todo"; Switch ($todo) { { @('fileversion', 'fv') -contains $_ } { $sversion = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($sfilename).FileVersion.toString(); $app.variables.version.TextualContent = $sversion; break; } { @('upload') -contains $_ } { Start-Process -FilePath "Uploader.bat" -ArgumentList $sfilename -Wait -NoNewWindow; break; } { @('extract','extractx','x') -contains $_ } { PUSHD $app.Variables.ReplaceAllInString("{file:directory}"); Start-Process -FilePath "7z.exe" -ArgumentList 'x','-y','-r',$sfilename -Wait -NoNewWindow; POPD; break; } { @('extracte','e') -contains $_ } { PUSHD $app.Variables.ReplaceAllInString("{file:directory}"); Start-Process -FilePath "7z.exe" -ArgumentList 'e','-y','-r',$sfilename -Wait -NoNewWindow; POPD; break; } { @('mega','megaget') -contains $_ } { $sdownload = PKV ( 'sdownload' ); $sdownloadpath = PKV ( 'sdownloadpath' ); if( $sdownloadpath -ieq "" ){ $sdownloadpath = $app.Variables.ReplaceAllInString("{startuppath:directory}"); } Start-Process -FilePath "%localappdata%\MEGAcmd\mega-get.bat" -ArgumentList $sdownload,$sdownloadpath -Wait -NoNewWindow; break; } { @('copy','copyx') -contains $_ } { $copyx = $app.variables.copyx.TextualContent; Switch ($copyx) { { @('tools','gd') -contains $_ } { Copy-Item $sfilename -Destination "G:\Google Drive\Tools" -Force; break; } { @('downloads') -contains $_ } { Copy-Item $sfilename -Destination "C:\Downloads" -Force; break; } default { Copy-Item $sfilename -Destination $copyx -Force; break; } } break } { @('diagnostics','dx') -contains $_ } { $app | Select-Object * | Out-File c:\downloads\ketarin-app.txt -width 400; $app.Variables | Select-Object * | Out-File c:\downloads\ketarin-app-var.txt -width 400; $app.Variables.Keys | Select-Object * | Out-File c:\downloads\ketarin-app-var-keys.txt -width 400; $app.Variables.Values | Select-Object * | Out-File c:\downloads\ketarin-app-var-values.txt -width 400; break; } default { break; } } That's all. I thought some of you might be interested.
  9. Hi, all! Yesterday I had a need to download offline Chrome installers for new builds of v109 which will still be supported until October for Windows Server 2012 and 2012r2. Unfortunately, the only downloads I could find from Google were all for the current release (v111+). After some digging I found a way to collect the exe installers for Chrome for v109 by sending the update query to Google servers. It works quite well and I rolled it into a PowerShell script so it could easily be reused by others. You can get the script here. Here's the usage for v109/Server 2012: .\ChromeDownloader.ps1 win 64 -os 2012 This will download the current release of the offline Chrome installer for Windows Server 2012 x64. The downloaded file (right now) is 109.0.5414.129_chrome_installer.exe and would be installed using the following switches: 109.0.5414.129_chrome_installer.exe --do-not-launch-chrome --channel=stable --system-level Additional optional switches are: --create-shortcuts=2 --install-level=1 If you want to see the actual (pretty-printed) XML returned by Google you can use: .\ChromeDownloader.ps1 win 64 -os 2012 -do xml You can also use -do info to collect the permalink for the individual package. .\ChromeDownloader.ps1 win 64 -os 2012 -do info As of right now that returns: Version: 109.0.5414.129 Url: https://www.google.com/dl/release2/chrome/juzaykgd5e6nyvk27fwtbrjgoa_109.0.5414.129/109.0.5414.129_chrome_installer.exe File: 109.0.5414.129_chrome_installer.exe Hash: 4441c778f7f4b91df40350dff2b37fd4afb81a0165239ec1dd5f750834f1b54a Size: 93127208
  10. @thelimpIn response to the question, "why doesn't just replacing the version number work", I suspect the reason is that in two of the version replacements it uses the version number and "major.minor.patch.build" and in one of them it uses only "major.minor.patch". You could try to anticipate this and fiddle with the version number in the download URL, but in these cases I find it is better to just collect the real download URL directly from the site as @necrox did in the previous comment. You never know when the author will change link behavior and use the full version number or an abbreviated number in one or another place.
  11. I wonder if the problem might be something else. I finally read the actual error message (my German is not great) and it looks like it's actually failing to extract an icon from the downloaded file. Since there's no drive letter in your download path, and the call is calling a resource from the Windows drive and not the USB drive, I suspect this might be the cause. Please change the download paths to use either the explicit drive letter (d:\) or {root}. {root} will be automatically replaced by the drive letter that Ketarin is running on, so it should have the same effect while downloading but the Icon extraction and other path-related commands will have the drive letter in addition to the path, and it'll be more portable, just in case it's a USB drive. That is, change this: \Software\Windows10_Starterkit\7-Zip_{version}_{date_HP}\ To this: {root}Software\Windows10_Starterkit\7-Zip_{version}_{date_HP}\ And please let me know if that solves it for you.
  12. Please run a chkdsk, just to be sure. There might be another security product that's interfering even though it's not an antivirus, like MBAM. Deactivating Windows Defender/Security doesn't necessarily disable all features. Turn it back on then open the settings and go to Virus Protection, Manage ransomware protection, then turn off Controlled Folder Access. Then (and this is important!) close and reopen Ketarin and try again.
  13. The Everything apps are both written well and should work fine. I wouldn't recommend installing both the 32-bit and 64-bit versions on a device though. Have you tried these one by one to see if it's an issue specific to a given application? Have you watched the log as it's running to see if there's an error that may account for the issue? (CTRL+L) Have you checked the removable drive to make sure that it's not an issue with the filesystem? ("chkdsk N: /f /r /x" from an elevated prompt where N: is the drive letter) Is your antivirus/security software configured to intercept or whitelist applications on the removable drive? Note that the recent changes in default behavior to Windows Defender will prevent applications from running from untrusted locations (like USB) unless you either turn off Ransomware Protection or whitelist the location. Have you checked your antivirus logs?
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.