# GSP Windows Agent Configuration Script # This script processes Cfg/*.default files and creates proper Perl configs param( [string]$AgentPath = "C:\GSP\Agent", [string]$InstallPath = "C:\GSP" ) $Script:CfgDir = Join-Path $AgentPath "OGP64\OGP\Cfg" $Script:LogsDir = Join-Path $InstallPath "logs" $Script:ConfigLogFile = Join-Path $Script:LogsDir "config.log" function Log-Message { param([string]$Message, [switch]$IsError = $false) $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" $logLine = "[$timestamp] $Message" if ($IsError) { Write-Host $logLine -ForegroundColor Red } else { Write-Host $logLine } Add-Content -Path $Script:ConfigLogFile -Value $logLine -Force } function Read-ConfigDefaults { param([string]$FilePath) if (-not (Test-Path $FilePath)) { return @{} } $content = Get-Content $FilePath -Raw $config = @{} # Parse Perl hash syntax: key => 'value', if ($content -match '%Cfg::\w+\s*=\s*\((.*)\);') { $hashContent = $matches[1] # Match key => 'value' or key => value patterns $regex = "(\w+)\s*=>\s*['\"]?([^'\"]*)['\"]?(?:,|$)" [regex]::Matches($hashContent, $regex) | ForEach-Object { $key = $_.Groups[1].Value $value = $_.Groups[2].Value.Trim() $config[$key] = $value } } return $config } function Ask-ConfigValue { param( [string]$Key, [string]$DefaultValue, [string]$Description = "" ) $prompt = $Key if ($DefaultValue) { $prompt += " [default: $DefaultValue]" } $prompt += ": " if ($Description) { Write-Host $Description -ForegroundColor Cyan } $value = Read-Host $prompt if ([string]::IsNullOrEmpty($value)) { return $DefaultValue } return $value } function Configure-ConfigPm { Log-Message "Configuring Config.pm..." $defaultFile = Join-Path $Script:CfgDir "Config.pm.default" $configFile = Join-Path $Script:CfgDir "Config.pm" if (-not (Test-Path $defaultFile)) { Log-Message "ERROR: Config.pm.default not found" -IsError $true return $false } # If config already exists, preserve it if (Test-Path $configFile) { Log-Message "Config.pm already exists, preserving it" return $true } Write-Host "" Write-Host "=== Configuring Config.pm ===" -ForegroundColor Green Write-Host "This file contains critical settings for agent communication" Write-Host "" # Read defaults $defaults = Read-ConfigDefaults $defaultFile # Ask for key values $configs = @{} $configs["listen_ip"] = Ask-ConfigValue "listen_ip" ($defaults["listen_ip"] ?? "0.0.0.0") "Agent listen IP address (0.0.0.0 = all interfaces)" $configs["listen_port"] = Ask-ConfigValue "listen_port" ($defaults["listen_port"] ?? "12679") "Agent listen port" $configs["key"] = Ask-ConfigValue "key" ($defaults["key"] ?? "CHANGE_ME_PANEL_AGENT_KEY") "Encryption key (must match Panel configuration)" # Optional settings $configs["logfile"] = "/OGP/ogp_agent.log" $configs["version"] = $defaults["version"] ?? "v1.4" $configs["steam_license"] = $defaults["steam_license"] ?? "Accept" $configs["sudo_password"] = "" $configs["web_admin_api_key"] = "" $configs["web_api_url"] = "" $configs["steam_dl_limit"] = $defaults["steam_dl_limit"] ?? "0" # Write config file try { $content = "`%Cfg::Config = (`n" foreach ($key in $configs.Keys | Sort-Object) { $value = $configs[$key] if ($key -eq "key") { # Key is especially important - always show with quotes $content += "`t$key => '$value',`n" } else { $content += "`t$key => '$value',`n" } } $content += ");`n`n1;`n" Set-Content -Path $configFile -Value $content -Encoding UTF8 Log-Message "Config.pm created successfully" return $true } catch { Log-Message "ERROR creating Config.pm: $_" -IsError $true return $false } } function Configure-PreferencesPm { Log-Message "Configuring Preferences.pm..." $defaultFile = Join-Path $Script:CfgDir "Preferences.pm.default" $configFile = Join-Path $Script:CfgDir "Preferences.pm" if (-not (Test-Path $defaultFile)) { Log-Message "WARNING: Preferences.pm.default not found" return $false } # If preferences already exist, preserve them if (Test-Path $configFile) { Log-Message "Preferences.pm already exists, preserving it" return $true } Write-Host "" Write-Host "=== Configuring Preferences.pm ===" -ForegroundColor Green Write-Host "This file contains optional agent preferences" Write-Host "" try { Copy-Item -Path $defaultFile -Destination $configFile -Force Log-Message "Preferences.pm created from defaults" return $true } catch { Log-Message "ERROR creating Preferences.pm: $_" -IsError $true return $false } } function Configure-BashPrefs { Log-Message "Configuring bash_prefs.cfg..." $defaultFile = Join-Path $Script:CfgDir "bash_prefs.cfg.default" $configFile = Join-Path $Script:CfgDir "bash_prefs.cfg" if (-not (Test-Path $defaultFile)) { Log-Message "WARNING: bash_prefs.cfg.default not found" return $false } # If bash prefs already exist, preserve them if (Test-Path $configFile) { Log-Message "bash_prefs.cfg already exists, preserving it" return $true } try { Copy-Item -Path $defaultFile -Destination $configFile -Force Log-Message "bash_prefs.cfg created from defaults" return $true } catch { Log-Message "ERROR creating bash_prefs.cfg: $_" -IsError $true return $false } } function Main { Log-Message "=========================================" Log-Message "GSP Windows Agent Configuration" Log-Message "=========================================" Log-Message "Agent Path: $AgentPath" Log-Message "Config Directory: $Script:CfgDir" Log-Message "" if (-not (Test-Path $Script:CfgDir)) { Log-Message "ERROR: Configuration directory not found: $Script:CfgDir" -IsError $true exit 1 } # Check for necessary permissions try { $testFile = Join-Path $Script:CfgDir ".write_test" "test" | Out-File $testFile Remove-Item $testFile -Force } catch { Log-Message "ERROR: No write permission to config directory" -IsError $true exit 1 } # Configure each file $configResults = @{ "Config.pm" = Configure-ConfigPm "Preferences.pm" = Configure-PreferencesPm "bash_prefs.cfg" = Configure-BashPrefs } # Summary Log-Message "" Log-Message "=========================================" Log-Message "Configuration Complete" Log-Message "=========================================" $successCount = ($configResults.Values | Where-Object { $_ -eq $true }).Count Write-Host "Successfully configured: $successCount/$($configResults.Count) files" foreach ($file in $configResults.Keys) { $status = $configResults[$file] ? "✓" : "✗" Write-Host " $status $file" } Log-Message "" Log-Message "Configuration log: $Script:ConfigLogFile" } Main