completions/systemctl.ps1

<#
 # systemctl completion
 #>

Import-Module NativeCommandCompleter.psm -ErrorAction SilentlyContinue

$msg = data { ConvertFrom-StringData @'
    systemctl = Control the systemd system and service manager
    list_units = List units that systemd currently has in memory
    list_sockets = List socket units currently in memory
    list_timers = List timer units currently in memory
    list_unit_files = List unit files installed on the system
    list_jobs = List jobs that are in progress
    list_machines = List local containers and VMs
    list_dependencies = Show unit dependency tree
    start = Start (activate) one or more units
    stop = Stop (deactivate) one or more units
    reload = Reload one or more units
    restart = Restart one or more units
    try_restart = Restart one or more units if active
    reload_or_restart = Reload one or more units if possible, otherwise restart
    try_reload_or_restart = Reload one or more units if possible and active, otherwise restart
    isolate = Start one unit and stop all others
    kill = Send signal to processes of a unit
    clean = Remove configuration, state, cache, logs or runtime data of units
    freeze = Freeze execution of unit processes
    thaw = Resume execution of a frozen unit
    is_active = Check whether units are active
    is_failed = Check whether units are failed
    status = Show runtime status of one or more units
    show = Show properties of one or more units/jobs/manager
    cat = Show files provided by units
    help = Show man page for one or more units
    reset_failed = Reset failed state for all, one, or more units
    enable = Enable one or more unit files
    disable = Disable one or more unit files
    reenable = Reenable one or more unit files
    preset = Enable/disable one or more unit files based on preset configuration
    preset_all = Enable/disable all unit files based on preset configuration
    is_enabled = Check whether unit files are enabled
    mask = Mask one or more units
    unmask = Unmask one or more units
    link = Link a unit file into the search path
    revert = Revert one or more unit files to vendor version
    add_wants = Add Wants= dependency for target
    add_requires = Add Requires= dependency for target
    edit = Edit one or more unit files
    get_default = Get the default target
    set_default = Set the default target
    daemon_reload = Reload systemd manager configuration
    daemon_reexec = Reexecute systemd manager
    show_environment = Show environment variables
    set_environment = Set one or more environment variables
    unset_environment = Unset one or more environment variables
    import_environment = Import environment variables
    service_watchdogs = Enable/disable service watchdogs
    log_level = Get/set manager log level
    log_target = Get/set manager log target
    is_system_running = Check if system is running
    default = Enter default mode
    rescue = Enter rescue mode
    emergency = Enter emergency mode
    halt = Shut down and halt the system
    poweroff = Shut down and power off the system
    reboot = Shut down and reboot the system
    kexec = Shut down and reboot via kexec
    exit = Ask systemd manager to quit
    switch_root = Change root directory
    suspend = Suspend the system
    hibernate = Hibernate the system
    hybrid_sleep = Hibernate and suspend the system
    suspend_then_hibernate = Suspend the system, wake up after period and hibernate
    cancel = Cancel all, one, or more jobs
    
    type = List units of specified type
    state = List units in specified state
    property = Show only specified properties
    all = Show all properties/units/jobs
    recursive = Show dependencies recursively
    reverse = Show reverse dependencies
    after = Show units ordered before specified unit
    before = Show units ordered after specified unit
    jobs = Additionally show jobs after status
    failed = Show only failed units
    full = Do not ellipsize unit names and truncate output
    value = Show only values when showing properties
    show_types = Show socket types when listing sockets
    job_mode = Specify how to deal with queued jobs
    fail = If operation on one unit fails, fail entire operation
    ignore_dependencies = Ignore dependencies
    ignore_inhibitors = Ignore inhibitor locks
    skip_redirect = Do not honour symlinks
    kill_mode = Send signal to which process(es)
    kill_value = Which value to set for sd_notify EXTEND_TIMEOUT_USEC
    signal = Which signal to send
    what = Select what type of per-unit resources to remove
    now = Start/stop/isolate unit after enabling/disabling/masking it
    dry_run = Only print what would be done
    quiet = Suppress output
    force = Override safety checks
    message = Reason for halt/reboot/etc
    no_wall = Do not send wall message before halt/reboot/etc
    no_reload = Do not reload daemon after enable/disable
    no_legend = Do not print column headers
    no_pager = Do not pipe output into a pager
    no_ask_password = Do not prompt for passwords
    system = Connect to system manager
    user = Connect to user service manager
    global = Enable/disable/mask unit files globally
    runtime = Enable/disable/mask unit files temporarily
    lines = Show number of journal entries
    output = Change journal output mode
    firmware_setup = Reboot into firmware setup
    boot_loader_menu = Reboot into boot loader menu
    boot_loader_entry = Reboot into specific boot loader entry
    plain = When used with list-dependencies, list as flat list
    timestamp = Change format of printed timestamps
    read_only = Create read-only bind mount
    mkdir = Create directory before bind mounting
    marked = Operate only on marked units
    when = When to perform action
    preset_mode = Apply only enable or only disable presets
    root = Operate on files below specified directory
    image = Operate on files in specified image
    image_policy = Specify image dissection policy
    host = Execute operation on remote host
    machine = Execute operation on local container
    wait = Wait until operation finished
    version = Show package version
    help_cmd = Show help
'@
 }
Import-LocalizedData -BindingVariable localizedMessages -ErrorAction SilentlyContinue;
foreach ($key in $localizedMessages.Keys) { $msg[$key] = $localizedMessages[$key] }

$unitCompleter = {
    systemctl list-units --all --no-legend --no-pager --plain | 
        ForEach-Object {
            if ($_ -match '^(\S+)\s+\S+\s+\S+\s+\S+\s+(.*)$') {
                $unit = $Matches[1]
                $desc = $Matches[2]
                if ($unit -like "$wordToComplete*") {
                    "{0}`t{1}" -f $unit, $desc
                }
            }
        }
}

$unitFileCompleter = {
    systemctl list-unit-files --no-legend --no-pager --plain |
        ForEach-Object {
            if ($_ -match '^(\S+)\s+(.*)$') {
                $unit = $Matches[1]
                $state = $Matches[2]
                if ($unit -like "$wordToComplete*") {
                    "{0}`t{1}" -f $unit, $state
                }
            }
        }
}

$typeValues = "service", "socket", "target", "device", "mount", "automount", "swap", "timer", "path", "slice", "scope"
$stateValues = "loaded", "not-found", "bad-setting", "error", "merged", "masked", "active", "inactive", "failed", "activating", "deactivating"
$outputModeValues = "short","short-full","short-iso","short-iso-precise","short-precise","short-monotonic","short-unix","verbose","export","json","json-pretty","json-sse","json-seq","cat","with-unit"
$jobModeValues = "fail","replace","replace-irreversibly","isolate","ignore-dependencies","ignore-requirements"

Register-NativeCompleter -Name systemctl -Description $msg.systemctl -SubCommands @(
    # Unit commands
    New-CommandCompleter -Name list-units -Description $msg.list_units -NoFileCompletions
    New-CommandCompleter -Name list-sockets -Description $msg.list_sockets -NoFileCompletions
    New-CommandCompleter -Name list-timers -Description $msg.list_timers -NoFileCompletions
    New-CommandCompleter -Name list-unit-files -Description $msg.list_unit_files -NoFileCompletions
    New-CommandCompleter -Name list-jobs -Description $msg.list_jobs -NoFileCompletions
    New-CommandCompleter -Name list-machines -Description $msg.list_machines -NoFileCompletions
    New-CommandCompleter -Name list-dependencies -Description $msg.list_dependencies -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name start -Description $msg.start -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name stop -Description $msg.stop -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name reload -Description $msg.reload -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name restart -Description $msg.restart -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name try-restart -Description $msg.try_restart -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name reload-or-restart -Description $msg.reload_or_restart -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name try-reload-or-restart -Description $msg.try_reload_or_restart -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name isolate -Description $msg.isolate -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name kill -Description $msg.kill -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name clean -Description $msg.clean -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name freeze -Description $msg.freeze -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name thaw -Description $msg.thaw -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name is-active -Description $msg.is_active -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name is-failed -Description $msg.is_failed -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name status -Description $msg.status -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name show -Description $msg.show -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name cat -Description $msg.cat -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name help -Description $msg.help -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name reset-failed -Description $msg.reset_failed -ArgumentCompleter $unitCompleter
    
    # Unit file commands
    New-CommandCompleter -Name enable -Description $msg.enable -ArgumentCompleter $unitFileCompleter
    New-CommandCompleter -Name disable -Description $msg.disable -ArgumentCompleter $unitFileCompleter
    New-CommandCompleter -Name reenable -Description $msg.reenable -ArgumentCompleter $unitFileCompleter
    New-CommandCompleter -Name preset -Description $msg.preset -ArgumentCompleter $unitFileCompleter
    New-CommandCompleter -Name preset-all -Description $msg.preset_all -NoFileCompletions
    New-CommandCompleter -Name is-enabled -Description $msg.is_enabled -ArgumentCompleter $unitFileCompleter
    New-CommandCompleter -Name mask -Description $msg.mask -ArgumentCompleter $unitFileCompleter
    New-CommandCompleter -Name unmask -Description $msg.unmask -ArgumentCompleter $unitFileCompleter
    New-CommandCompleter -Name link -Description $msg.link
    New-CommandCompleter -Name revert -Description $msg.revert -ArgumentCompleter $unitFileCompleter
    New-CommandCompleter -Name add-wants -Description $msg.add_wants -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name add-requires -Description $msg.add_requires -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name edit -Description $msg.edit -ArgumentCompleter $unitCompleter
    New-CommandCompleter -Name get-default -Description $msg.get_default -NoFileCompletions
    New-CommandCompleter -Name set-default -Description $msg.set_default -ArgumentCompleter $unitCompleter
    
    # Manager commands
    New-CommandCompleter -Name daemon-reload -Description $msg.daemon_reload -NoFileCompletions
    New-CommandCompleter -Name daemon-reexec -Description $msg.daemon_reexec -NoFileCompletions
    New-CommandCompleter -Name show-environment -Description $msg.show_environment -NoFileCompletions
    New-CommandCompleter -Name set-environment -Description $msg.set_environment -NoFileCompletions
    New-CommandCompleter -Name unset-environment -Description $msg.unset_environment -NoFileCompletions
    New-CommandCompleter -Name import-environment -Description $msg.import_environment -NoFileCompletions
    New-CommandCompleter -Name service-watchdogs -Description $msg.service_watchdogs -NoFileCompletions
    New-CommandCompleter -Name log-level -Description $msg.log_level -NoFileCompletions
    New-CommandCompleter -Name log-target -Description $msg.log_target -NoFileCompletions
    New-CommandCompleter -Name is-system-running -Description $msg.is_system_running -NoFileCompletions
    
    # System commands
    New-CommandCompleter -Name default -Description $msg.default -NoFileCompletions
    New-CommandCompleter -Name rescue -Description $msg.rescue -NoFileCompletions
    New-CommandCompleter -Name emergency -Description $msg.emergency -NoFileCompletions
    New-CommandCompleter -Name halt -Description $msg.halt -NoFileCompletions
    New-CommandCompleter -Name poweroff -Description $msg.poweroff -NoFileCompletions
    New-CommandCompleter -Name reboot -Description $msg.reboot -NoFileCompletions
    New-CommandCompleter -Name kexec -Description $msg.kexec -NoFileCompletions
    New-CommandCompleter -Name exit -Description $msg.exit -NoFileCompletions
    New-CommandCompleter -Name switch-root -Description $msg.switch_root
    New-CommandCompleter -Name suspend -Description $msg.suspend -NoFileCompletions
    New-CommandCompleter -Name hibernate -Description $msg.hibernate -NoFileCompletions
    New-CommandCompleter -Name hybrid-sleep -Description $msg.hybrid_sleep -NoFileCompletions
    New-CommandCompleter -Name suspend-then-hibernate -Description $msg.suspend_then_hibernate -NoFileCompletions
    New-CommandCompleter -Name cancel -Description $msg.cancel -NoFileCompletions
) -Parameters @(
    New-ParamCompleter -ShortName t -LongName type -Description $msg.type -Type List -VariableName 'TYPE' -Arguments $typeValues
    New-ParamCompleter -LongName state -Description $msg.state -Type List -VariableName 'STATE' -Arguments $stateValues
    New-ParamCompleter -ShortName p -LongName property -Description $msg.property -Type List -VariableName 'NAME'
    New-ParamCompleter -ShortName a -LongName all -Description $msg.all
    New-ParamCompleter -ShortName r -LongName recursive -Description $msg.recursive
    New-ParamCompleter -LongName reverse -Description $msg.reverse
    New-ParamCompleter -LongName after -Description $msg.after
    New-ParamCompleter -LongName before -Description $msg.before
    New-ParamCompleter -LongName jobs -Description $msg.jobs
    New-ParamCompleter -LongName failed -Description $msg.failed
    New-ParamCompleter -ShortName l -LongName full -Description $msg.full
    New-ParamCompleter -LongName value -Description $msg.value
    New-ParamCompleter -LongName show-types -Description $msg.show_types
    New-ParamCompleter -LongName job-mode -Description $msg.job_mode -Type Required -Arguments $jobModeValues -VariableName 'MODE'
    New-ParamCompleter -LongName fail -Description $msg.fail
    New-ParamCompleter -LongName ignore-dependencies -Description $msg.ignore_dependencies
    New-ParamCompleter -ShortName i -LongName ignore-inhibitors -Description $msg.ignore_inhibitors
    New-ParamCompleter -LongName skip-redirect -Description $msg.skip_redirect
    New-ParamCompleter -LongName kill-mode -Description $msg.kill_mode -Type Required -Arguments "control-group","process","mixed","none" -VariableName 'MODE'
    New-ParamCompleter -LongName kill-value -Description $msg.kill_value -Type Required -VariableName 'VALUE'
    New-ParamCompleter -ShortName s -LongName signal -Description $msg.signal -Type Required -VariableName 'SIGNAL'
    New-ParamCompleter -LongName what -Description $msg.what -Type List -Arguments "configuration","state","cache","logs","runtime","fdstore","all" -VariableName 'RESOURCES'
    New-ParamCompleter -LongName now -Description $msg.now
    New-ParamCompleter -LongName dry-run -Description $msg.dry_run
    New-ParamCompleter -ShortName q -LongName quiet -Description $msg.quiet
    New-ParamCompleter -ShortName f -LongName force -Description $msg.force
    New-ParamCompleter -LongName message -Description $msg.message -Type Required -VariableName 'MESSAGE'
    New-ParamCompleter -LongName no-wall -Description $msg.no_wall
    New-ParamCompleter -LongName no-reload -Description $msg.no_reload
    New-ParamCompleter -LongName no-legend -Description $msg.no_legend
    New-ParamCompleter -LongName no-pager -Description $msg.no_pager
    New-ParamCompleter -LongName no-ask-password -Description $msg.no_ask_password
    New-ParamCompleter -LongName system -Description $msg.system
    New-ParamCompleter -LongName user -Description $msg.user
    New-ParamCompleter -LongName global -Description $msg.global
    New-ParamCompleter -LongName runtime -Description $msg.runtime
    New-ParamCompleter -ShortName n -LongName lines -Description $msg.lines -Type Required -VariableName 'INTEGER'
    New-ParamCompleter -ShortName o -LongName output -Description $msg.output -Type Required -Arguments $outputModeValues -VariableName 'MODE'
    New-ParamCompleter -LongName firmware-setup -Description $msg.firmware_setup
    New-ParamCompleter -LongName boot-loader-menu -Description $msg.boot_loader_menu -Type Required -VariableName 'TIMEOUT'
    New-ParamCompleter -LongName boot-loader-entry -Description $msg.boot_loader_entry -Type Required -VariableName 'ID'
    New-ParamCompleter -LongName plain -Description $msg.plain
    New-ParamCompleter -LongName timestamp -Description $msg.timestamp -Type Required -Arguments "pretty","unix","us","utc","us+utc" -VariableName 'FORMAT'
    New-ParamCompleter -LongName read-only -Description $msg.read_only
    New-ParamCompleter -LongName mkdir -Description $msg.mkdir
    New-ParamCompleter -LongName marked -Description $msg.marked
    New-ParamCompleter -LongName when -Description $msg.when -Type Required -Arguments "active","inactive","condition" -VariableName 'CONDITION'
    New-ParamCompleter -LongName preset-mode -Description $msg.preset_mode -Type Required -Arguments "full","enable-only","disable-only" -VariableName 'MODE'
    New-ParamCompleter -LongName root -Description $msg.root -Type Directory -VariableName 'PATH'
    New-ParamCompleter -LongName image -Description $msg.image -Type File -VariableName 'PATH'
    New-ParamCompleter -LongName image-policy -Description $msg.image_policy -Type Required -VariableName 'POLICY'
    New-ParamCompleter -ShortName H -LongName host -Description $msg.host -Type Required -VariableName 'HOST'
    New-ParamCompleter -ShortName M -LongName machine -Description $msg.machine -Type Required -VariableName 'CONTAINER'
    New-ParamCompleter -LongName wait -Description $msg.wait
    New-ParamCompleter -LongName version -Description $msg.version
    New-ParamCompleter -ShortName h -LongName help -Description $msg.help_cmd
) -NoFileCompletions