$Script:Version = "FS Admin Panel v0.8 (extern)"
#Ersteller: Florian Späth
#Diese Software soll helfen die verschiedensten Anwendungen und Scripte der FG HDS zu administrieren.
Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName System.Windows.Forms
[System.Reflection.Assembly]::LoadWithPartialName('System.Drawing') | Out-Null
### Variablen Definition ###
# array = Settings ,
$script:array=@($false,$true)
function getValues($formTitle, $textTitle){
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = $formTitle
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$objForm.Close()}})
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$Script:userInput=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)
$CANCELButton = New-Object System.Windows.Forms.Button
$CANCELButton.Location = New-Object System.Drawing.Size(150,120)
$CANCELButton.Size = New-Object System.Drawing.Size(75,23)
$CANCELButton.Text = "CANCEL"
$CANCELButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CANCELButton)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20)
$objLabel.Size = New-Object System.Drawing.Size(280,30)
$objLabel.Text = $textTitle
$objForm.Controls.Add($objLabel)
$objTextBox = New-Object System.Windows.Forms.TextBox
$objTextBox.Location = New-Object System.Drawing.Size(10,50)
$objTextBox.Size = New-Object System.Drawing.Size(260,20)
$objForm.Controls.Add($objTextBox)
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
return $userInput
}
Function Select-FolderDialog{
param([string]$Description="RACADM Speicherort wählen",[string]$RootFolder="Desktop")
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |Out-Null
$objForm = New-Object System.Windows.Forms.FolderBrowserDialog
$objForm.Rootfolder = $RootFolder
$objForm.Description = $Description
$Show = $objForm.ShowDialog()
If ($Show -eq "OK"){
Return $objForm.SelectedPath
}else{
Return $false
}
}
### $schema = getValues "Database Schema" "Enter database schema"
#### Lädt Scripte ####
function Load_info {
[XML]$Form = @"
"@
# Lädt das Fenster
$window=[Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Form))
$NR=(New-Object System.Xml.XmlNodeReader $Form)
$window=[Windows.Markup.XamlReader]::Load($NR)
# Objekt - Variablen Verknüpfung
$text = $window.FindName("text")
$Script:infook = $window.findName("btnok")
# Verknüpft feste Elemente
$window.Title = $Script:Version
$window.icon="C:\FSAP/Source/Logo.png"
$text.Text = "Das Admin Panel wurde geschaffen um Skripte welche von dem einzig waren Florian Spaeth entwickelt wurden in einer grafischen Oberfläche zu steuern.
Die Anwendung wurde so entworfen das diese maximale Wartungsfreundlichkeit bietet und auch Usern mit wenig Powershell Erfahrung die Möglichkeit gibt, neue Fenster hinzu zu fügen.
Im GitLab unter `"AllgemeineSkripte/examples`" kann Beispiel Code entnommen werden, wenn man sind in den BR hacken kann (: `n`nBugs in der GUI werden nicht aktiv verfolgt!`n`n$Script:Version `nCopyright bei Leiter (2024)`nAutor: Florian Spaeth `nDSGVO-Konform"
return $window
}
function Load_confirm {
[XML]$Form = @"
"@
# Lädt das Fenster
$window=[Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Form))
$NR=(New-Object System.Xml.XmlNodeReader $Form)
$window=[Windows.Markup.XamlReader]::Load($NR)
# Objekt - Variablen Verknüpfung
$Script:confirmtext = $window.FindName("text")
$Script:confirmok = $window.findName("btngo")
$Script:confirmstop = $window.findName("btnstop")
# Verknüpft feste Elemente
$window.Title = $Script:Version
$window.icon="C:\FSAP/Source/Logo.png"
return $window
}
function Load_main {
[XML]$Form = @"
"@
# Lädt das Fenster
$window=[Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $Form))
# Objekt - Variablen Verknüpfung
#Main
$Script:menu1 = $window.findName("menu1")
$Script:menu2 = $window.findName("menu2")
$Script:menu3 = $window.findName("menu3")
$Script:menu4 = $window.findName("menu4")
$Script:menu5 = $window.findName("menu5")
$Script:menu6 = $window.findName("menu6")
$Script:img1 = $window.findName("img1")
$Script:img2 = $window.findName("img2")
$Script:img3 = $window.findName("img3")
$Script:img4 = $window.findName("img4")
$Script:img5 = $window.findName("img5")
$Script:img6 = $window.findName("img6")
$Script:btn_info = $window.findName("btninfo")
$Script:settings = $window.findName("btnsettings")
$Script:imginfo = $window.findName("imginfo")
$Script:imgsettings = $window.findName("imgsettings")
$Script:l1 = $window.findName("l1")
$Script:log = $window.findName("log")
$Script:work = $window.findName("work")
$Script:btn_standby = $window.findName("btn_standby")
$Script:btn_shutdown = $window.findName("btn_shutdown")
$Script:btn_settings = $window.findName("btn_settings")
$Script:btn_close = $window.findName("btn_close")
#Dashboard
$Script:Dashboard = $window.findName("Dashboard")
#R710
$Script:btn_r710_stop = $window.findName("btn_r710_stop")
$Script:btn_r710_start = $window.findName("btn_r710_start")
$Script:btn_r710_info = $window.findName("btn_r710_info")
$Script:btn_r710_m1 = $window.findname("btn_r710_m1")
$Script:btn_r710_m2 = $window.findname("btn_r710_m2")
$Script:tb_r710_power = $window.findname("tb_r710_power")
$Script:tb_r710_mac = $window.findname("tb_r710_mac")
$Script:tb_r710_ip = $window.findname("tb_r710_ip")
$Script:tb_r710_bios = $window.findname("tb_r710_bios")
$Script:tb_r710_name = $window.findname("tb_r710_name")
$Script:l1_r710 = $window.findname("l1_R710")
$Script:l2_r710 = $window.findname("l2_R710")
$Script:l3_r710 = $window.findname("l3_R710")
$Script:l4_r710 = $window.findname("l4_R710")
$Script:l5_r710 = $window.findname("l5_R710")
# Fensterwahl
#if (condition) {
#$window.Height="912"
#$window.Width="1370"
#$window.WindowStyle="None"
#$window.WindowState="Maximized"
#$window.Height="912"
#$window.Width="1370"
#$window.WindowStyle="SingleBorderWindow"
#$window.WindowState="Normal"
#}
# Verknüpft feste Elemente
$window.Title = $Script:Version
$window.icon="C:\FSAP\Source\Logo.png"
$imginfo.Source = "C:\FSAP\Source\info.png"
$imgsettings.Source = "C:\FSAP/Source/Konfig.png"
$img1.Source = "C:\FSAP/Source/Dash.png"
$img2.Source = "C:\FSAP/Source/Server.png"
$img3.Source = "C:\FSAP/Source/center.png"
return $window
}
$Script:main = Load_main # Variable: $main
$Script:confirm = Load_confirm # Variable: $confirm
$Script:info = Load_info # Variable: $info
#### Definition globaler Variablen ####
## Die GO variable kann nach aufruf der confirm funktion abgefragt werden, um eine 2. Bestätigung der eingabe zu erhalten. (Aufruf: confirm $text)
[boolean]$Script:GO = $false
$Script:ScriptRoot = "C:\FSAP"
$Script:iconpath = "C:\FSAP\icons"
$Script:config = Import-CSV -Path "C:\FSAP\config.csv"
$Script:RACpath = ($config | where{$_.ID -eq "racadm_path"}).value
$Script:plinkpath = ($config | where{$_.ID -eq "plink_path"}).value
$Script:idracuser = ($config | where{$_.ID -eq "idracuser"}).value
$Script:idracpass = ($config | where{$_.ID -eq "idracpass"}).value
$Script:remoteuser = ($config | where{$_.ID -eq "remoteuser"}).value
$Script:remotepass = ($config | where{$_.ID -eq "remotepass"}).value
$idracpassenc = "$Script:idracpass"|ConvertTo-SecureString
$Script:idracpass = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($idracpassenc))
$remotepassenc = "$Script:remotepass"|ConvertTo-SecureString
$Script:remotepass = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($remotepassenc))
#$Script:cert_path = ($config | where{$_.ID -eq "some"}).value
#$Script:defudbu_path = ($config | where{$_.ID -eq "some"}).value
$logfile = "C:\FSAP\log.txt"
### Farb Variablen ###
$Script:Standardbtncolor = "#00b8d4"
$Script:Delcolor = "#d50000"
$Script:BackgroundMovecolor = "#FFFFEB9C"
$Script:ForegroundMovecolor = "#FF9C6500"
$Script:Foregroundgrey = "#FF7A7A7A"
$Script:Backgroundgrey = "#FFC5C5C5"
#### Funktionen ####
### Global ###
function Write-Admin-Log{
Param($text)
"$(get-date -format "yyyy-MM-dd HH:mm:ss"): $($text)" | out-file $logfile -Append
$Script:log.text += "$text `n"
}
function Resolve-DnsName {
param (
[Parameter(Mandatory)][string]$ComputerName
)
try {
[System.Net.Dns]::GetHostAddresses($ComputerName).IPAddressToString
return ([System.Net.Dns]::GetHostAddresses($ComputerName).IPAddressToString)
}
catch {
Write-Log "IP not found for $ComputerName!"
}
}
function working {
param (
$status
)
if ($status) {
$Script:work.Background="Darkred"
}else {
$Script:work.Background="Darkgreen"
}
}
function confirm {
param (
[String]$text
)
Write-Admin-Log "Confirm funkction triggered"
if ($null -ne $text) {
$Script:Confirmtext.text = $text
$confirm.ShowDialog() | Out-Null
if ($Script:GO) {
return $true
}
}
}
$confirmok.Add_Click({
Write-Admin-Log "Confirm success"
$Script:GO = $true
$confirm.Hide()
})
$confirm.Add_MouseLeftButtonDown({
$confirm.DragMove()
})
$confirmstop.Add_Click({
Write-Admin-Log "Confirm denial"
$Script:GO = $false
$confirm.Hide()
})
#### Startet die Anwendung ####
### Initialisieren ###
$Script:btn_info.Add_Click({
$Script:info.ShowDialog()
})
### Settings ###
$settings.Add_Click({
if ($Script:array[0]) {
$Script:btn_settings.Visibility = "Hidden"
$Script:btn_standby.Visibility = "Hidden"
$Script:btn_shutdown.Visibility = "Hidden"
$Script:btn_close.Visibility = "Hidden"
$Script:array[0]=$false
}else {
$Script:btn_settings.Visibility = "Visible"
$Script:btn_standby.Visibility = "Visible"
$Script:btn_shutdown.Visibility = "Visible"
$Script:btn_close.Visibility = "Visible"
$Script:array[0]=$true
}
})
$Script:btn_settings.Add_Click({
$return = Select-FolderDialog
if($return){
$Script:racpath = $return
$NewLine = "racadm_path, $racpath" -f
$NewLine | add-content -path "C:\FSAP\config.csv"
}
$Script:idracuser = getValues "IDRAC Configurator" "Enter idrac user"
$Script:idracpass = getValues "IDRAC Configurator" "Enter idrac password"
$Script:remoteuser = getValues "IDRAC Configurator" "Enter remote user"
$Script:remotepass = getValues "IDRAC Configurator" "Enter remote password"
$NewLine = "idracuser, $idracuser" -f
$NewLine | add-content -path "C:\FSAP\config.csv"
$secidracpass = "$idracpass" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString
$NewLine = "idracpass, $secidracpass" -f
$NewLine | add-content -path "C:\FSAP\config.csv"
$NewLine = "remoteuser, $remoteuser" -f
$NewLine | add-content -path "C:\FSAP\config.csv"
$secremotepass = "$remotepass" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString
$NewLine = "remotepass, $secremotepass" -f
$NewLine | add-content -path "C:\FSAP\config.csv"
write-host $Script:remoteuser
Write-host $Script:remotepass
})
$Script:btn_standby.Add_Click({
if (confirm "Wanna SUSPEND the System?") {
$PowerState = [System.Windows.Forms.PowerState]::Suspend
$Force = $false
$DisableWake = $false
[System.Windows.Forms.Application]::SetSuspendState($PowerState, $Force, $DisableWake)
}
})
$Script:btn_shutdown.Add_Click({
if (confirm "Wanna SHUTDOWN the System?") {
$PowerState = [System.Windows.Forms.PowerState]::Shutdown
$Force = $false
$DisableWake = $false
[System.Windows.Forms.Application]::SetSuspendState($PowerState, $Force, $DisableWake)
}
})
$Script:btn_close.Add_Click({
$main.Hide()
})
$info.Add_MouseLeftButtonDown({
$info.DragMove()
})
$infook.Add_Click({
$Script:info.Hide()
})
### Menu ###
function clearGUI {
#R710
$Script:btn_r710_stop.Visibility = "Hidden"
$Script:btn_r710_start.Visibility = "Hidden"
$Script:btn_r710_info.Visibility = "Hidden"
$Script:btn_r710_m1.Visibility = "Hidden"
$Script:btn_r710_m2.Visibility = "Hidden"
$Script:tb_r710_power.Visibility = "Hidden"
$Script:tb_r710_mac.Visibility = "Hidden"
$Script:tb_r710_ip.Visibility = "Hidden"
$Script:tb_r710_bios.Visibility = "Hidden"
$Script:tb_r710_name.Visibility = "Hidden"
$Script:l1_r710.Visibility = "Hidden"
$Script:l2_r710.Visibility = "Hidden"
$Script:l3_r710.Visibility = "Hidden"
$Script:l4_r710.Visibility = "Hidden"
$Script:l5_r710.Visibility = "Hidden"
}
function SwitchGUI {
param (
$menu
)
if ($menu -match "m1") {
clearGUI
}elseif ($menu -match "m2") {
clearGUI
$Script:btn_r710_stop.Visibility = "Visible"
$Script:btn_r710_start.Visibility = "Visible"
$Script:btn_r710_info.Visibility = "Visible"
$Script:btn_r710_m1.Visibility = "Visible"
$Script:btn_r710_m2.Visibility = "Visible"
$Script:tb_r710_power.Visibility = "Visible"
$Script:tb_r710_mac.Visibility = "Visible"
$Script:tb_r710_ip.Visibility = "Visible"
$Script:tb_r710_bios.Visibility = "Visible"
$Script:tb_r710_name.Visibility = "Visible"
$Script:l1_r710.Visibility = "Visible"
$Script:l2_r710.Visibility = "Visible"
$Script:l3_r710.Visibility = "Visible"
$Script:l4_r710.Visibility = "Visible"
$Script:l5_r710.Visibility = "Visible"
}elseif ($menu -match "m3") {
clearGUI
}elseif ($menu -match "m4") {
clearGUI
}elseif ($menu -match "m5") {
clearGUI
}elseif ($menu -match "m6") {
clearGUI
}
}
$Script:menu1.Add_Click({
switchGUI -menu "m1"
$Script:l1.Content = "Dashboard"
})
$Script:menu2.Add_Click({
switchGUI -menu "m2"
$Script:l1.Content = "R710 Control"
})
$Script:menu3.Add_Click({
switchGUI -menu "m3"
$Script:l1.Content = "Gaming Control"
})
$Script:menu4.Add_Click({
switchGUI -menu "m4"
})
$Script:menu5.Add_Click({
switchGUI -menu "m5"
})
$Script:menu6.Add_Click({
switchGUI -menu "m6"
})
### R710 ###
function get_r710_stats {
working $true
cd $Script:racpath
$collection = $(.\racadm.exe -r spaeth-bayern.de:5005 -u $Script:idracuser -p $Script:idracpass getsysinfo)
foreach ($item in $collection) {
if ($null -ne $item) {
$log.Text += "$item`n"
if($item -match "DNS RAC Name"){
$index = ($item.IndexOf("="))
$Script:tb_r710_name.Text = $item.Substring($index+1)
}
if($item -match "Firmware Version"){
$index = ($item.IndexOf("="))
$Script:tb_r710_bios.Text = $item.Substring($index+1)
}
if($item -match "Power Status"){
$index = ($item.IndexOf("="))
$Script:tb_r710_power.Text = $item.Substring($index+1)
}
if($item -match "MAC Address"){
$index = ($item.IndexOf("="))
$Script:tb_r710_mac.Text = $item.Substring($index+1)
}
if($item -match "Power Status"){
$index = ($item.IndexOf("="))
$Script:tb_r710_power.Text = $item.Substring($index+1)
}
}
}
cd C:\FSAP
working $false
}
$btn_r710_start.Add_Click({
Write-Admin-Log "BTN r710 start pressed"
if (confirm "Server R710 wird durch erneute betätigung gestartet") {
cd $racpath
$r710_log.Text += $(.\racadm.exe -r spaeth-bayern.de:5005 -u $Script:idracuser -p $Script:idracpass serveraction powerup)
}
})
$btn_r710_stop.Add_Click({
Write-Admin-Log "BTN r710 stop pressed"
if (confirm "Server R710 wird durch erneute betätigung gestopt`n`nIST DER SERVER HERUNTERGEFAHREN (/STOP IN DIE MINECRAFT CONSOLE)?") {
$command = './stop_proxmox.sh'
#Execute SSH command
echo y | &($plinkpath + "\plink.exe") -pw "$Script:remotepass" "$Script:remoteuser@spaeth-bayern.de" $command
#cd $Script:racpath
#$r710_log.Text += $(.\racadm.exe -r spaeth-bayern.de:5005 -u $Script:idracuser -p $Script:idracpass serveraction powerdown)
}
})
$btn_r710_info.Add_Click({
Write-Admin-Log "BTN r710 inspect pressed"
if (confirm "Server R710 wird nach grundlegenden Infromationen abgefragt.`n`nDie Abfrage kann bis zu 2 min. dauern.") {
get_r710_stats
}
})
### Öffnet erstes Fenster ###
Write-Admin-Log "##### OPEN MAIN WINDOW #####"
clearGUI
switchGUI "m1"
Write-Host $remotepass
$main.ShowDialog() | Out-Null