107 lines
3.3 KiB
PowerShell
107 lines
3.3 KiB
PowerShell
|
<#
|
||
|
.SYNOPSIS
|
||
|
Invoke a graphical application on X-Server.
|
||
|
.DESCRIPTION
|
||
|
Invoke a graphical application, making sure an X server connection is active, start the x-server if needed, and if the application is remote, make sure the remote session has the correct DISPLAY values set.
|
||
|
.INPUTS
|
||
|
Inputs to this cmdlet (if any)
|
||
|
.OUTPUTS
|
||
|
Output from this cmdlet (if any)
|
||
|
.NOTES
|
||
|
General notes
|
||
|
.EXAMPLE
|
||
|
Invoke-XApp xclock
|
||
|
.EXAMPLE
|
||
|
Invoke-XApp xclock -Remote remote@example.com
|
||
|
.COMPONENT
|
||
|
The component this cmdlet belongs to
|
||
|
.ROLE
|
||
|
The role this cmdlet belongs to
|
||
|
.FUNCTIONALITY
|
||
|
The functionality that best describes this cmdlet
|
||
|
#>
|
||
|
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')]
|
||
|
#[OutputType([String])]
|
||
|
|
||
|
# # Param2 help description
|
||
|
# [Parameter(ParameterSetName='Parameter Set 1')]
|
||
|
# [AllowNull()]
|
||
|
# [AllowEmptyCollection()]
|
||
|
# [AllowEmptyString()]
|
||
|
# [ValidateScript({$true})]
|
||
|
# [ValidateRange(0,5)]
|
||
|
# [int]
|
||
|
# $Param2,
|
||
|
|
||
|
# # Param3 help description
|
||
|
# [Parameter(ParameterSetName='Another Parameter Set')]
|
||
|
# [ValidatePattern("[a-z]*")]
|
||
|
# [ValidateLength(0,15)]
|
||
|
# [String]
|
||
|
# $Param3
|
||
|
Param (
|
||
|
# Param1 help description
|
||
|
[Parameter(Mandatory, Position = 0, ParameterSetName = 'Parameter Set 1')]
|
||
|
[string[]]$Command,
|
||
|
[string[]]$Remote,
|
||
|
[ValidateSet('pwsh', 'bash', 'zsh', 'sh')]
|
||
|
[string]$RemoteShell = 'pwsh',
|
||
|
[string]$PrivateKeyPath
|
||
|
)
|
||
|
|
||
|
begin {
|
||
|
$null = Get-Command 'xlaunch' -ErrorAction Stop
|
||
|
|
||
|
if ( -not $(Get-Process -ProcessName 'vcxsrv' -ErrorAction SilentlyContinue) ) {
|
||
|
|
||
|
$local:LaunchCfg = $env:XLAUNCH_CONFIG
|
||
|
if ( -not $env:XLAUNCH_CONFIG ) {
|
||
|
New-TemporaryFile | Tee-Object -Variable 'LaunchCfg' | Remove-Item
|
||
|
}
|
||
|
Write-Verbose "LaunchCfg=$LaunchCfg"
|
||
|
if ( -not (Test-Path $LaunchCfg) ) {
|
||
|
Write-Verbose "Creating missing $LaunchCfg..."
|
||
|
New-Item -ItemType File -Path $LaunchCfg -Value @(
|
||
|
'<?xml version="1.0" encoding="UTF-8"?>'
|
||
|
, '<XLaunch '
|
||
|
, ' WindowMode="MultiWindow"'
|
||
|
, ' ClientMode="NoClient"'
|
||
|
, ' LocalClient="False"'
|
||
|
, ' Display="-1"'
|
||
|
, ' LocalProgram=""'
|
||
|
, ' RemoteProgram=""'
|
||
|
, ' RemotePassword=""'
|
||
|
, ' PrivateKey=""'
|
||
|
, ' RemoteHost=""'
|
||
|
, ' RemoteUser=""'
|
||
|
, ' XDMCPHost=""'
|
||
|
, ' XDMCPBroadcast="False"'
|
||
|
, ' XDMCPIndirect="False"'
|
||
|
, ' Clipboard="True"'
|
||
|
, ' ClipboardPrimary="True"'
|
||
|
, ' ExtraParams=""'
|
||
|
, ' Wgl="True"'
|
||
|
, ' DisableAC="False"'
|
||
|
, ' XDMCPTerminate="False"'
|
||
|
, '/>' )
|
||
|
}
|
||
|
|
||
|
& xlaunch --run $LaunchCfg
|
||
|
}
|
||
|
}
|
||
|
|
||
|
process {
|
||
|
if ( -not "Command" ) {
|
||
|
Write-Warning "No command supplied, exiting."
|
||
|
return
|
||
|
}
|
||
|
if ($pscmdlet.ShouldProcess("Target", "Operation")) {
|
||
|
if ( $Remote ) {
|
||
|
$local:RemoteCommand = "bash", "-c", "'DISPLAY=`"localhost:`"`$( xauth list | awk `"{ print `$1 }`" | cut -d: -f2 | tail -1 ) $Command'"
|
||
|
& ssh -i $PrivateKeyPath $Remote $RemoteCommand
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
end {
|
||
|
}
|