TisaneOnprem.psm1
#Region '.\Public\Check-ServiceCpu.ps1' 0 function Check-ServiceCpu { param ( [Parameter(Mandatory=$true)][string]$service ) $NUMBER_OF_CORES = 1 $procId = (Get-CimInstance Win32_Service | ?{$_.Name -like $service} | SELECT ProcessId).ProcessId $procPath = (Get-Counter "\Process(*)\ID Process" -ErrorAction SilentlyContinue).CounterSamples | Where-Object {$_.CookedValue -eq $procId} | Select-Object -ExpandProperty Path $procCpuUsage = [Math]::Round(((Get-Counter ($procPath -replace "\\id process$","\% Processor Time")).CounterSamples.CookedValue) / $NUMBER_OF_CORES) return $procCpuUsage } #EndRegion '.\Public\Check-ServiceCpu.ps1' 11 #Region '.\Public\Check-ServiceStatus.ps1' 0 function Check-ServiceStatus { param ( [Parameter(Mandatory=$true)][string]$hostIp ) $uri = $hostIp+"parse" $response = Invoke-WebRequest -Uri $uri -Method POST -Headers $headers -ContentType 'application/json' -Body '{"language": "en", "content": "this is a test sentence to test the testing of tisane", "settings": {"parses":true,"debug":true}}' -TimeoutSec 2 -ErrorAction SilentlyContinue if ($response.StatusCode -eq 200) { return $true } else { return $false } } # Check-IfServiceDown "http://94.237.73.126:80/" #EndRegion '.\Public\Check-ServiceStatus.ps1' 14 #Region '.\Public\Download-TisaneFromFTP.ps1' 0 function Download-TisaneFromFTP{ [CmdletBinding()] Param( [Parameter(Mandatory = $true, valueFromPipeline=$true, HelpMessage="FTP user: ")][String] $user, [Parameter(Mandatory = $true, HelpMessage="FTP password: ")][String] $password, [Parameter(Mandatory = $true, HelpMessage="FTP host: ")][String] $ftp ) $DOWNLOAD_FOLDER = "C:\Users\Administrator\Downloads\Tisane" $TISANE_ROOT = "C:\Tisane" $webclient = New-Object System.Net.WebClient if(-not(Test-Path($DOWNLOAD_FOLDER))) { # file with path $path doesn't exist mkdir $DOWNLOAD_FOLDER } $webclient.Credentials = New-Object System.Net.NetworkCredential("$user@$ftp", $password) $uri = New-Object System.Uri("ftp://ftp.$ftp/tisane_db.zip") Write-Host "Downloading Tisane data to $DOWNLOAD_FOLDER..." -ForegroundColor Green $webclient.DownloadFile($uri, "$DOWNLOAD_FOLDER\tisane_db.zip") Write-Host "Downloading Tisane Web Service to $DOWNLOAD_FOLDER..." -ForegroundColor Green $uri = New-Object System.Uri("ftp://ftp.$ftp/tisane_ws.zip") $webclient.DownloadFile($uri, "$DOWNLOAD_FOLDER\tisane_ws.zip") if(Test-Path($TISANE_ROOT)) { #mkdir $TISANE_ROOT #Remove-Item -Path "$TISANE_ROOT\" -Recurse # dir $TISANE_ROOT -Recurse | Where-Object { $_.FullName -imatch '^C:\\tisane\\([^\\]+)\\.+[.]sst' } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue } #Add-Type -AssemblyName System.IO.Compression.FileSystem #Add-Type -Assembly "System.IO.Compression.Filesystem" Add-Type -Assembly "System.Io.Compression.FileSystem" [System.IO.Compression.ZipFile]::ExtractToDirectory("$DOWNLOAD_FOLDER\tisane_db.zip", "$DOWNLOAD_FOLDER\db") } #EndRegion '.\Public\Download-TisaneFromFTP.ps1' 42 #Region '.\Public\Install-TisaneFromFTP.ps1' 0 function Install-TisaneFromFTP{ [CmdletBinding()] Param( [Parameter(Mandatory = $true, valueFromPipeline=$true, HelpMessage="FTP user: ")][String] $user, [Parameter(Mandatory = $true, HelpMessage="FTP password: ")][String] $password, [Parameter(Mandatory = $true, HelpMessage="FTP host: ")][String] $ftp, [Parameter(Mandatory = $false, HelpMessage="Install .NET? ")][boolean] $dotnet, [Parameter(Mandatory = $true, HelpMessage="Instance count: ")][int] $instances, [Parameter(Mandatory = $false, HelpMessage="Windows user: ")][String] $winuser ) if (-not($winuser)) { $winuser = 'Administrator' } $DOWNLOAD_FOLDER = "C:\Users\$winuser\Downloads\Tisane" $dotNETInstallerUrl = "https://go.microsoft.com/fwlink/?linkid=2088631" $TISANE_ROOT = "C:\Tisane" $webclient = New-Object System.Net.WebClient if(-not(Test-Path($DOWNLOAD_FOLDER))) { # file with path $path doesn't exist mkdir $DOWNLOAD_FOLDER } if ($dotnet) { Write-Host "Downloading .NET installer to $DOWNLOAD_FOLDER..." -ForegroundColor Green $webclient.DownloadFile($dotNETInstallerUrl, "$DOWNLOAD_FOLDER\dotnetinstaller.exe") Write-Host "Installing .NET..." -ForegroundColor Green Start-Process -FilePath $DOWNLOAD_FOLDER\dotnetinstaller.exe -ArgumentList "/q","/norestart" -Wait } $webclient.Credentials = New-Object System.Net.NetworkCredential("$user@tisane.ai", $password) $uri = New-Object System.Uri("ftp://$ftp/tisane_db.zip") Write-Host "Downloading Tisane data to $DOWNLOAD_FOLDER..." -ForegroundColor Green $webclient.DownloadFile($uri, "$DOWNLOAD_FOLDER\tisane_db.zip") Write-Host "Downloading Tisane Web Service to $DOWNLOAD_FOLDER..." -ForegroundColor Green $uri = New-Object System.Uri("ftp://$ftp/tisane_ws.zip") $webclient.DownloadFile($uri, "$DOWNLOAD_FOLDER\tisane_ws.zip") $uri = New-Object System.Uri("ftp://$ftp/Tisane.Runtime.Service.exe.config") $webclient.DownloadFile($uri, "$DOWNLOAD_FOLDER\Tisane.Runtime.Service.exe.config") if(Test-Path($TISANE_ROOT)) { #mkdir $TISANE_ROOT #Remove-Item -Path $TISANE_ROOT -Recurse } #Add-Type -AssemblyName System.IO.Compression.FileSystem #[System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath) Write-Host "Extracting Tisane data to $TISANE_ROOT..." -ForegroundColor Green # WE HAVE TO USE Ionic Zip because the standard compression libraries crash with very large archives [System.Reflection.Assembly]::LoadFrom("$DOWNLOAD_FOLDER\Ionic.Zip.dll") $zipFile = New-Object Ionic.Zip.ZipFile("$DOWNLOAD_FOLDER\tisane_db.zip") #Expand-Archive -LiteralPath "$DOWNLOAD_FOLDER\tisane_db.zip" -DestinationPath $TISANE_ROOT $zipFile.ExtractAll($TISANE_ROOT, 1) $portNumber = 81 For ($i=1; $i -le $instances; $i++) { $formattedI = $i | % tostring 00 $portNumber = 79 + $i Write-Host "Creating instance under $TISANE_ROOT\instance$formattedI" -ForegroundColor Green Expand-Archive -LiteralPath "$DOWNLOAD_FOLDER\tisane_ws.zip" -DestinationPath "$TISANE_ROOT\instance$formattedI" -Force $webclient.DownloadFile($uri, "$TISANE_ROOT\instance$formattedI\Tisane.Runtime.Service.exe.config") ((Get-Content -path "$TISANE_ROOT\instance$formattedI\Tisane.Runtime.Service.exe.config" -Raw) -replace 'localhost:80',"localhost:$portNumber") | Set-Content -Path "$TISANE_ROOT\instance$formattedI\Tisane.Runtime.Service.exe.config" Start-Process -FilePath "$TISANE_ROOT\instance$formattedI\Tisane.Runtime.Service.exe" -ArgumentList "-i" -Wait } # now open firewall ports netsh advfirewall firewall add rule name='Tisane ports' dir=in protocol=tcp localport="80-$portNumber" action=allow profile=any # create a quarterly update task SchTasks /Create /sc monthly /mo 3 /TN "Tisane update" /TR "$DOWNLOAD_FOLDER\UpdateTisaneFromFTP.ps1 -user $user -password $password -ftp $ftp" /ST 23:00 # start the services Start-Service "Tisane Runtime *" } #EndRegion '.\Public\Install-TisaneFromFTP.ps1' 83 #Region '.\Public\Monitor-Tisane.ps1' 0 function Monitor-Tisane { [CmdletBinding()] param ( [Parameter(Mandatory=$true, HelpMessage="Service names to monitor: ")][string[]]$services, [Parameter(Mandatory=$false, HelpMessage="Timeout for monitor (Default 120s)")][int]$monitorIntervel = 120, [Parameter(Mandatory=$false, HelpMessage="Threshold for CPU consuption (Default 100)")][int]$thresholdCpu = 100 ) $Results = @{} # $serviceUsage = @{} $servicesOriginal = $services Write-Host $services $services = $servicesOriginal -replace '\[','?' -replace '\]','?' foreach ($service in $services) { $oneService = Get-CimInstance Win32_Service | ?{$_.Name -like $service} | SELECT Name , PathName Write-Host "os" $oneService $serviceName = $oneService.Name $configFile = $oneService.PathName -replace "\.exe", ".exe.config" -replace '\"', '' if (Test-Path $configFile) { $config = [xml](Get-Content $configFile) $AddNode = Select-Xml -Xml $config -XPath "//services/service/host/baseAddresses" $Value = $AddNode.Node.add.baseAddress $Results[$service] = $Value } } $hostIpS = $Results.Values $services = $Results.Keys Write-Host "Starting monitor for the following folders" Write-Host $services Write-Host "on these corresponding ports: " Write-Host $hostIpS $restarting =@{} while ($true) { foreach ($service in $services) { $hostIp = $Results[$service] if ($restarting.ContainsKey($service)) { Write-Host "$service is being restarted" if (Check-ServiceStatus $hostIp) { Write-Host "Service on $service has restared" $restarting.Remove($service) } continue } $cpuUsage = Check-ServiceCpu $service if ((Check-ServiceStatus $hostIp) -and ( $cpuUsage -le $thresholdCpu)) { Write-Host "$service is running, consuming $cpuUsage% cpu" } else { Write-Host "$service is not running, Restarting" $restarting[$service]=$hostIp Stop-Service -Name $service Start-Service -Name $service Write-Host "sending mail" Send-Email -service $service -hostIp -$hostIp } } # Sleep for 120 seconds Start-Sleep -Seconds $monitorIntervel } } # Monitor "C:\tisane\testmonitor" #EndRegion '.\Public\Monitor-Tisane.ps1' 63 #Region '.\Public\Send-Email.ps1' 0 Function Send-Email() { Param( [Parameter(Mandatory = $false, HelpMessage="TO email: ")][String[]] $To, [Parameter(Mandatory=$false, HelpMessage="Name of the tisane service (used to create body of the email)")][String] $service = "TEST", [Parameter(Mandatory=$false, HelpMessage="Host of the tisane service (used to create body of the email)")][String] $hostIp = "TEST", [Parameter(Mandatory = $false, HelpMessage="SMTPServer (default: mail.tisane.ai): ")][String] $smtpServer, [Parameter(Mandatory = $false, HelpMessage="SMTP port (default: 587): ")][String] $smtpPort ) if (-not [string]::IsNullOrEmpty($To)) { Save-LampSetting -settingName 'emailTo' -settingValue $To }else { $To = Get-LampSetting -settingName 'emailTo' -defaultValue '' $To = $To.Split(" ") } if (-not [string]::IsNullOrEmpty($smtpServer)) { Save-LampSetting -settingName 'smtpServer' -settingValue $smtpServer } else{ $smtpServer = Get-LampSetting -settingName 'smtpServer' -defaultValue 'mail.tisane.ai' } if (-not [string]::IsNullOrEmpty($smtpPort)) { Save-LampSetting -settingName 'smtpPort' -settingValue $smtpPort }else{ $smtpPort = Get-LampSetting -settingName 'smtpPort' -defaultValue '587' } $emailUsername = Get-LampSetting -settingName 'emailUsername' -defaultValue '' $encryptedEmailPassword = Get-LampSetting -settingName 'emailPassword' -defaultValue '' if ([string]::IsNullOrEmpty($emailUsername)){ # Write-Host "in if" $credential = Get-Credential -Message "Enter your email credentials" $emailUsername = $credential.UserName $secureEmailPassword = $credential.Password $encryptedEmailPassword = ConvertFrom-SecureString -SecureString $secureEmailPassword Save-LampSetting -settingName 'emailUsername' -settingValue $emailUsername Save-LampSetting -settingName 'emailPassword' -settingValue $encryptedEmailPassword }else{ # Write-Host "in else" $secureEmailPassword = ConvertTo-SecureString -String $encryptedEmailPassword } # $emailPassword = [System.Net.NetworkCredential]::new("", $secureEmailPassword).Password $emailCredential = New-Object System.Management.Automation.PSCredential($emailUsername, $secureEmailPassword) $date = Get-Date $subject = "Tisane admin alert [ $hostIp ]" $body = "Tisane [ $service ] went down on [ $date ] and was restarted" # $To = "chiragrade111@gmail.com" Send-MailMessage -To $To -From $emailUsername -Subject $Subject -Body $Body -Credential $emailCredential -SmtpServer $SmtpServer -Port $SmtpPort Write-Host "Email sent" } # Send-Email -service "Tisane Runtime[insatnce1]" -hostIp "http://localhost:80" -To "chiragrade111@gmail.com", "chiraggyandeep@gmail.com" #EndRegion '.\Public\Send-Email.ps1' 51 #Region '.\Public\Update-TisaneFromFTP.ps1' 0 function Update-TisaneFromFTP{ [CmdletBinding()] Param( [Parameter(Mandatory = $true, valueFromPipeline=$true, HelpMessage="FTP user: ")][String] $user, [Parameter(Mandatory = $true, HelpMessage="FTP password: ")][String] $password, [Parameter(Mandatory = $true, HelpMessage="FTP host: ")][String] $ftp, [Parameter(Mandatory = $false, HelpMessage="Copy only, no need to reregister the service: ")][Boolean] $copyOnly ) $DOWNLOAD_FOLDER = "C:\Users\Administrator\Downloads\Tisane" $TISANE_ROOT = "C:\Tisane" $webclient = New-Object System.Net.WebClient if(-not(Test-Path($DOWNLOAD_FOLDER))) { # file with path $path doesn't exist mkdir $DOWNLOAD_FOLDER } $webclient.Credentials = New-Object System.Net.NetworkCredential("$user@$ftp", $password) $uri = New-Object System.Uri("ftp://ftp.$ftp/tisane_db.zip") Write-Host "Downloading Tisane data to $DOWNLOAD_FOLDER..." -ForegroundColor Green $webclient.DownloadFile($uri, "$DOWNLOAD_FOLDER\tisane_db.zip") Stop-Service "Tisane Runtime *" Write-Host "Downloading Tisane Web Service to $DOWNLOAD_FOLDER..." -ForegroundColor Green $uri = New-Object System.Uri("ftp://ftp.$ftp/tisane_ws.zip") $webclient.DownloadFile($uri, "$DOWNLOAD_FOLDER\tisane_ws.zip") if(Test-Path($TISANE_ROOT)) { #mkdir $TISANE_ROOT #Remove-Item -Path "$TISANE_ROOT\" -Recurse # dir $TISANE_ROOT -Recurse | Where-Object { $_.FullName -imatch '^C:\\tisane\\([^\\]+)\\.+[.]sst' } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue } #Add-Type -AssemblyName System.IO.Compression.FileSystem #Add-Type -Assembly "System.IO.Compression.Filesystem" # WE HAVE TO USE Ionic Zip because the standard compression libraries crash with very large archives [System.Reflection.Assembly]::LoadFrom("$DOWNLOAD_FOLDER\Ionic.Zip.dll") $zipFile = New-Object Ionic.Zip.ZipFile("$DOWNLOAD_FOLDER\tisane_db.zip") #[System.IO.Compression.ZipFile]::ExtractToDirectory("$DOWNLOAD_FOLDER\tisane_db.zip", $TISANE_ROOT, $true) Write-Host "Extracting Tisane data to $TISANE_ROOT..." -ForegroundColor Green #Expand-Archive -LiteralPath "$DOWNLOAD_FOLDER\tisane_db.zip" -DestinationPath $TISANE_ROOT -Force (Get-Service "Tisane *").WaitForStatus('Stopped') $zipFile.ExtractAll($TISANE_ROOT, 1) # dir $TISANE_ROOT -Recurse | Where-Object { $_.FullName -imatch '^C:\\tisane\\([^\\]+)\\LOG[.]old.+' } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $services = Get-Service "Tisane Runtime *" $instances = $services.length For ($i=1; $i -le $instances; $i++) { $formattedI = $i | % tostring 00 Write-Host "Updating instance under $TISANE_ROOT\instance$formattedI" -ForegroundColor Green Expand-Archive -LiteralPath "$DOWNLOAD_FOLDER\tisane_ws.zip" -DestinationPath "$TISANE_ROOT\instance$formattedI" -Force if (-not $copyOnly) { Start-Process -FilePath "$TISANE_ROOT\instance$formattedI\Tisane.Runtime.Service.exe" -ArgumentList "-r" -Wait } } Start-Service "Tisane Runtime *" } #EndRegion '.\Public\Update-TisaneFromFTP.ps1' 69 #Region '.\Public\Update-TisaneFromLocalZips.ps1' 0 function Update-TisaneFromLocalZips{ Stop-Service "Tisane Runtime *" $DOWNLOAD_FOLDER = "C:\Users\Administrator\Downloads\Tisane" $TISANE_ROOT = "C:\Tisane" #Add-Type -AssemblyName System.IO.Compression.FileSystem #Add-Type -Assembly "System.IO.Compression.Filesystem" # WE HAVE TO USE Ionic Zip because the standard compression libraries crash with very large archives [System.Reflection.Assembly]::LoadFrom("$DOWNLOAD_FOLDER\Ionic.Zip.dll") $zipFile = New-Object Ionic.Zip.ZipFile("$DOWNLOAD_FOLDER\tisane_db.zip") #[System.IO.Compression.ZipFile]::ExtractToDirectory("$DOWNLOAD_FOLDER\tisane_db.zip", $TISANE_ROOT, $true) Write-Host "Extracting Tisane data to $TISANE_ROOT..." -ForegroundColor Green #Expand-Archive -LiteralPath "$DOWNLOAD_FOLDER\tisane_db.zip" -DestinationPath $TISANE_ROOT -Force $zipFile.ExtractAll($TISANE_ROOT, 1) # dir $TISANE_ROOT -Recurse | Where-Object { $_.FullName -imatch '^C:\\tisane\\([^\\]+)\\LOG[.]old.+' } | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue $services = Get-Service "Tisane Runtime *" $instances = $services.length For ($i=1; $i -le $instances; $i++) { $formattedI = $i | % tostring 00 Write-Host "Updating instance under $TISANE_ROOT\instance$formattedI" -ForegroundColor Green Expand-Archive -LiteralPath "$DOWNLOAD_FOLDER\tisane_ws.zip" -DestinationPath "$TISANE_ROOT\instance$formattedI" -Force Start-Process -FilePath "$TISANE_ROOT\instance$formattedI\Tisane.Runtime.Service.exe" -ArgumentList "-r" -Wait } Start-Service "Tisane Runtime *" } #EndRegion '.\Public\Update-TisaneFromLocalZips.ps1' 37 |