# Copyright (c) 2026, Thomas Goirand <zigo@debian.org>
# Copyright (c) 2026, Infomaniak <production@infomaniak.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, see <https://www.gnu.org/licenses/>.
#
# Bash completion for the "orac" command (the orac project).
#
# Covers both surfaces: the legacy command line (get/set with the
# dotted target grammar, the client-side flows) and the friendly
# object-verb commands, including the reversed lowercase target paths
# ("orac bios bootsettings setbootorderen show|set").
#
# Adapted from the completion script shipped by openstack-cluster-installer,
# (c) 2018-2024 Thomas Goirand <zigo@debian.org>, by the same author.

_orac_reply () {
	# $1: the candidate word list, $2: the current word prefix.
	local words
	words=$(compgen -W "$1" -- "$2" | sort -u)
	COMPREPLY=( $words )
}

_orac_output_opts () {
	_orac_reply "--format csv json table value shell yaml
		-c --column --sort-column --fit-width --print-empty
		--max-width --noindent --prefix --variable --quote" \
		"${cur}"
}

_orac_target_words () {
	# Completes the lowercase path words of the reversed target
	# grammar: each typed word matches its position's component
	# case-insensitively, or the component ends with the word (the
	# FQDD prefix a group repeats stays optional).  The candidates
	# at the current position are the next component of every
	# matching target, both whole and stripped of the previous
	# component; a complete path completes the show/set verbs.  Past
	# a verb (the set value) nothing is offered: the value
	# vocabulary is attribute specific.
	local -a words=("${cmd_name}")
	local w target lower ok i c next prev_comp candidates
	candidates=""
	for w in "${COMP_WORDS[@]:2:COMP_CWORD-2}"; do
		case "${w}" in
		-*) ;;
		show|set) return 0 ;;
		*) words+=("${w}") ;;
		esac
	done
	for target in ${iDRAC_OPTS} ${BIOS_OPTS} ${NIC_OPTS} ${STORAGE_OPTS}; do
		lower="${target,,}"
		local -a comps
		IFS="." read -r -a comps <<< "${lower}"
		if [ "${#comps[@]}" -eq "${#words[@]}" ]; then
			ok=1
			for i in "${!comps[@]}"; do
				c="${comps[i]}"
				w="${words[i]}"
				case "${c}" in
				"${w}") ;;
				*"${w}") [ -n "${w}" ] || ok=0 ;;
				*) ok=0 ;;
				esac
				[ "${ok}" -eq 1 ] || break
			done
			[ "${ok}" -eq 1 ] && candidates="${candidates} show set"
			continue
		fi
		[ "${#comps[@]}" -gt "${#words[@]}" ] || continue
		ok=1
		for i in "${!words[@]}"; do
			c="${comps[i]}"
			w="${words[i]}"
			case "${c}" in
			"${w}") ;;
			*"${w}") [ -n "${w}" ] || ok=0 ;;
			*) ok=0 ;;
			esac
			[ "${ok}" -eq 1 ] || break
		done
		if [ "${ok}" -eq 1 ]; then
			next="${comps[${#words[@]}]}"
			prev_comp=""
			if [ "${#words[@]}" -gt 0 ]; then
				prev_comp="${comps[$(( ${#words[@]} - 1 ))]}"
			fi
			if [ "${#prev_comp}" -gt 2 ] && \
			   [ "${next}" != "${next#"${prev_comp}"}" ]; then
				candidates="${candidates} ${next#"${prev_comp}"}"
			fi
			candidates="${candidates} ${next}"
		fi
	done
	_orac_reply "${candidates}" "${cur}"
}

_orac () {
	local cur prev cmd_name w
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[COMP_CWORD-1]}"
	cmd_name=""
	for w in "${COMP_WORDS[@]:1:COMP_CWORD-1}"; do
		case "${w}" in
		-*) ;;
		*)
			cmd_name="${w}"
			break
		;;
		esac
	done

	opts="help arp autoupdatescheduler bioscert biosscan clearasrscreen clearpending closessn clrsel config getconfig coredump coredumpdelete driverpack debug eventfilters exposeisminstallertohost fwupdate get gethostnetworkinterfaces getled getniccfg getraclog getractime getremoteservicesstatus getsel getsensorinfo getssninfo getsvctag getsysinfo gettracelog getuscversion getversion groupmanager httpsbootcert ifconfig inlettemphistory idmconfig krbkeytabupload license lclog localConRedirDisable frontpanelerror netstat ping ping6 plugin racdump racreset racresetcfg recover remoteimage rollback sekm serialcapture serveraction set setled setniccfg sshpkauth sslcertchallenge sslcertupload sslcertdelete sslcertdownload sslcertview sslcsrgen sslencryptionstrength sslkeyupload sslresetcfg supportassist swinventory switchconnection systemerase testemail testrsyslogconnection testtrap testalert traceroute traceroute6 techsupreport usercertupload usercertview vflashpartition vflashsd vmdisconnect raid storage hwinventory nicstatistics infinibandstatistics fcstatistics networktransceiverstatistics update jobqueue sensorsettings diagnostics systemperfstatistics ackdriveremoval bezelfilter cmreset coredumpexport heatermanager pcieslotview remoteimage2 setgpu witnessnodepoweraction BIOS iDRAC LifecycleController Nic Storage System FC InfiniBand"

	iDRAC_OPTS="iDRAC iDRAC.ActiveDirectory iDRAC.ActiveDirectory.AuthTimeout iDRAC.ActiveDirectory.CertValidationEnable iDRAC.ActiveDirectory.DCLookupByUserDomain iDRAC.ActiveDirectory.DCLookupDomainName iDRAC.ActiveDirectory.DCLookupEnable iDRAC.ActiveDirectory.DomainController1 iDRAC.ActiveDirectory.DomainController2 iDRAC.ActiveDirectory.DomainController3 iDRAC.ActiveDirectory.Enable iDRAC.ActiveDirectory.GCLookupEnable iDRAC.ActiveDirectory.GCRootDomain iDRAC.ActiveDirectory.GlobalCatalog1 iDRAC.ActiveDirectory.GlobalCatalog2 iDRAC.ActiveDirectory.GlobalCatalog3 iDRAC.ActiveDirectory.RacDomain iDRAC.ActiveDirectory.RacName iDRAC.ActiveDirectory.Schema iDRAC.ActiveDirectory.SSOEnable iDRAC.ADGroup iDRAC.ASRConfig.Enable iDRAC.Autodiscovery iDRAC.Autodiscovery.EnableIPChangeAnnounce iDRAC.Autodiscovery.EnableIPChangeAnnounceFromDHCP iDRAC.Autodiscovery.EnableIPChangeAnnounceFrommDNS iDRAC.Autodiscovery.EnableIPChangeAnnounceFromUnicastDNS iDRAC.Autodiscovery.SendTestAnnouncement iDRAC.Autodiscovery.UnsolicitedIPChangeAnnounceRate iDRAC.AutoOSLockGroup iDRAC.AutoOSLockGroup.AutoOSLockState iDRAC.CurrentIPv4 iDRAC.CurrentIPv6 iDRAC.CurrentNIC iDRAC.DefaultCredentialMitigationConfigGroup.DefaultCredentialMitigation iDRAC.DelegatedAuth iDRAC.DelegatedAuth.iDRAC.DelegatedAuth.1 iDRAC.DelegatedAuth.iDRAC.DelegatedAuth.2 iDRAC.DelegatedAuthConfig.JwkCacheTime iDRAC.EmailAlert iDRAC.EmailAlert.iDRAC.EmailAlert.1 iDRAC.EmailAlert.iDRAC.EmailAlert.2 iDRAC.EmailAlert.iDRAC.EmailAlert.3 iDRAC.EmailAlert.iDRAC.EmailAlert.4 iDRAC.GroupManager iDRAC.GroupManager.Status iDRAC.GUI iDRAC.GUI.SecurityPolicyMessage iDRAC.Info iDRAC.IntegratedDatacenter.DiscoveryEnable iDRAC.InventoryHash iDRAC.InventoryHash.HashCalculationInterval iDRAC.IOIDOpt iDRAC.IOIDOpt.InitiatorPersistencePolicy iDRAC.IOIDOpt.IOIDOptEnable iDRAC.IOIDOpt.PersistencePolicyOnPartReplacement iDRAC.IOIDOpt.StorageTargetPersistencePolicy iDRAC.IOIDOpt.VirtualAddressPersistencePolicyAuxPwrd iDRAC.IOIDOpt.VirtualAddressPersistencePolicyNonAuxPwrd iDRAC.IPBlocking iDRAC.IPBlocking.BlockEnable iDRAC.IPBlocking.FailCount iDRAC.IPBlocking.FailWindow iDRAC.IPBlocking.PenaltyTime iDRAC.IPBlocking.RangeAddr iDRAC.IPBlocking.RangeAddr2 iDRAC.IPBlocking.RangeAddr3 iDRAC.IPBlocking.RangeAddr4 iDRAC.IPBlocking.RangeAddr5 iDRAC.IPBlocking.RangeEnable iDRAC.IPBlocking.RangeEnable2 iDRAC.IPBlocking.RangeEnable3 iDRAC.IPBlocking.RangeEnable4 iDRAC.IPBlocking.RangeEnable5 iDRAC.IPBlocking.RangeMask iDRAC.IPBlocking.RangeMask2 iDRAC.IPBlocking.RangeMask3 iDRAC.IPBlocking.RangeMask4 iDRAC.IPBlocking.RangeMask5 iDRAC.IPMILan iDRAC.IPMILan.AlertEnable iDRAC.IPMILan.CommunityName iDRAC.IPMILan.Enable iDRAC.IPMILan.EncryptionKey iDRAC.IPMILan.PrivLimit iDRAC.IPMISerial iDRAC.IPMISOL iDRAC.IPMISOL.AccumulateInterval iDRAC.IPMISOL.BaudRate iDRAC.IPMISOL.Enable iDRAC.IPMISOL.MinPrivilege iDRAC.IPMISOL.SendThreshold iDRAC.IPv4 iDRAC.IPv4.Address iDRAC.IPv4.DHCPEnable iDRAC.IPv4.DNS1 iDRAC.IPv4.DNS2 iDRAC.IPv4.DNSFromDHCP iDRAC.IPv4.Enable iDRAC.IPv4.Gateway iDRAC.IPv4.Netmask iDRAC.IPv4Static iDRAC.IPv4Static.Address iDRAC.IPv4Static.DNS1 iDRAC.IPv4Static.DNS2 iDRAC.IPv4Static.DNSFromDHCP iDRAC.IPv4Static.Gateway iDRAC.IPv4Static.Netmask iDRAC.IPv6 iDRAC.IPv6.Address1 iDRAC.IPv6.AutoConfig iDRAC.IPv6.DNS1 iDRAC.IPv6.DNS2 iDRAC.IPv6.DNSFromDHCP6 iDRAC.IPv6.Enable iDRAC.IPv6.Gateway iDRAC.IPv6.PrefixLength iDRAC.IPv6Static iDRAC.IPv6Static.Address1 iDRAC.IPv6Static.DNS1 iDRAC.IPv6Static.DNS2 iDRAC.IPv6Static.DNSFromDHCP6 iDRAC.IPv6Static.Gateway iDRAC.IPv6Static.PrefixLength iDRAC.IPv6URL iDRAC.KMS iDRAC.LDAP iDRAC.LDAP.BaseDN iDRAC.LDAP.BindDN iDRAC.LDAP.BindPassword iDRAC.LDAP.CertValidationEnable iDRAC.LDAP.Enable iDRAC.LDAP.GroupAttribute iDRAC.LDAP.GroupAttributeIsDN iDRAC.LDAP.Port iDRAC.LDAP.SearchFilter iDRAC.LDAP.Server iDRAC.LDAP.UserAttribute iDRAC.LDAPRoleGroup iDRAC.LDAPRoleGroup.1 iDRAC.LDAPRoleGroup.2 iDRAC.LDAPRoleGroup.3 iDRAC.LDAPRoleGroup.4 iDRAC.LDAPRoleGroup.5 iDRAC.LocalSecurity iDRAC.LocalSecurity.LocalConfig iDRAC.LocalSecurity.PrebootConfig iDRAC.Lockdown iDRAC.Lockdown.SystemLockdown iDRAC.Logging iDRAC.Logging.SELBufferType iDRAC.Logging.SELOEMEventFilterEnable iDRAC.NIC iDRAC.NIC.AutoConfig iDRAC.NIC.AutoDetect iDRAC.NIC.Autoneg iDRAC.NIC.DedicatedNICScanTime iDRAC.NIC.DiscoveryLLDP iDRAC.NIC.DNSDomainFromDHCP iDRAC.NIC.DNSDomainName iDRAC.NIC.DNSDomainNameFromDHCP iDRAC.NIC.DNSRacName iDRAC.NIC.DNSRegister iDRAC.NIC.DNSRegisterInterval iDRAC.NIC.Duplex iDRAC.NIC.Enable iDRAC.NIC.Failover iDRAC.NIC.MACAddress iDRAC.NIC.MTU iDRAC.NIC.PowerOnOCPSlot1InS5 iDRAC.NIC.Selection iDRAC.NIC.SharedNICScanTime iDRAC.NIC.Speed iDRAC.NIC.SwitchConnection iDRAC.NIC.SwitchPortConnection iDRAC.NIC.TopologyLldp iDRAC.NIC.VLanEnable iDRAC.NIC.VLanID iDRAC.NIC.VLanPort iDRAC.NIC.VLanPriority iDRAC.NICStatic iDRAC.NICStatic.DNSDomainFromDHCP iDRAC.NICStatic.DNSDomainName iDRAC.NTPConfigGroup iDRAC.NTPConfigGroup.NTP1 iDRAC.NTPConfigGroup.NTP1SecurityKey iDRAC.NTPConfigGroup.NTP1SecurityKeyNumber iDRAC.NTPConfigGroup.NTP2 iDRAC.NTPConfigGroup.NTP2SecurityKey iDRAC.NTPConfigGroup.NTP2SecurityKeyNumber iDRAC.NTPConfigGroup.NTP2SecurityType iDRAC.NTPConfigGroup.NTP3 iDRAC.NTPConfigGroup.NTP3SecurityKey iDRAC.NTPConfigGroup.NTP3SecurityKeyNumber iDRAC.NTPConfigGroup.NTP3SecurityType iDRAC.NTPConfigGroup.NTPEnable iDRAC.NTPConfigGroup.NTPMaxDist iDRAC.OS-BMC iDRAC.OS-BMC.AdminState iDRAC.OS-BMC.OsIpAddress iDRAC.OS-BMC.PTCapability iDRAC.OS-BMC.PTMode iDRAC.OS-BMC.UsbNicIpAddress iDRAC.OS-BMC.UsbNicIpv4AddressSupport iDRAC.OS-BMC.UsbNicIpV6Address iDRAC.OS-BMC.UsbNicULA iDRAC.PCIeVDM iDRAC.PCIeVDM.Enable iDRAC.PlatformCapability iDRAC.PMLicensing iDRAC.PMLicensing.Generation iDRAC.Racadm iDRAC.Racadm.Enable iDRAC.Racadm.MaxSessions iDRAC.Racadm.Timeout iDRAC.Redfish iDRAC.Redfish.Enable iDRAC.RedfishEventing iDRAC.RedfishEventing.DeliveryRetryAttempts iDRAC.RedfishEventing.DeliveryRetryIntervalInSeconds iDRAC.RedfishEventing.IgnoreCertificateErrors iDRAC.RemoteHosts iDRAC.RemoteHosts.ConnectionEncryption iDRAC.RemoteHosts.MessageSubjectPrefix iDRAC.RemoteHosts.SenderEmail iDRAC.RemoteHosts.SMTPAuthentication iDRAC.RemoteHosts.SMTPPassword iDRAC.RemoteHosts.SMTPPort iDRAC.RemoteHosts.SMTPServerIPAddress iDRAC.RemoteHosts.SMTPUserName iDRAC.RFS iDRAC.RFS.AttachMode iDRAC.RFS.Enable iDRAC.RFS.IgnoreCertWarning iDRAC.RFS.Image iDRAC.RFS.MediaAttachState iDRAC.RFS.Password iDRAC.RFS.Status iDRAC.RFS.User iDRAC.RFS.WriteProtected iDRAC.RSASecurID2FA iDRAC.SCEP iDRAC.SecureDefaultPassword iDRAC.SecureDefaultPassword.ForceChangePassword iDRAC.Security iDRAC.Security.CsrCommonName iDRAC.Security.CsrCountryCode iDRAC.Security.CsrEmailAddr iDRAC.Security.CsrKeySize iDRAC.Security.CsrLocalityName iDRAC.Security.CsrOrganizationName iDRAC.Security.CsrOrganizationUnit iDRAC.Security.CsrStateName iDRAC.Security.CsrSubjectAltName iDRAC.Security.FIPSMode iDRAC.Security.FIPSVersion iDRAC.Security.MinimumPasswordScore iDRAC.Security.PasswordMinimumLength iDRAC.Security.PasswordRequireNumbers iDRAC.Security.PasswordRequireRegex iDRAC.Security.PasswordRequireSymbols iDRAC.Security.PasswordRequireUpperCase iDRAC.SecurityCertificate iDRAC.SEKM iDRAC.SEKMCert iDRAC.Serial iDRAC.SerialCapture iDRAC.SerialRedirection iDRAC.SerialRedirection.Enable iDRAC.SerialRedirection.QuitKey iDRAC.ServerBoot iDRAC.ServerBoot.BootOnce iDRAC.ServerBoot.FirstBootDevice iDRAC.ServiceModule iDRAC.ServiceModule.ChipsetSATASupported iDRAC.ServiceModule.HostSNMPAlert iDRAC.ServiceModule.HostSNMPGet iDRAC.ServiceModule.HostSNMPOMSAAlert iDRAC.ServiceModule.iDRACHardReset iDRAC.ServiceModule.iDRACSSOLauncher iDRAC.ServiceModule.LCLReplication iDRAC.ServiceModule.OMSAPresence iDRAC.ServiceModule.OSInfo iDRAC.ServiceModule.ServiceModuleEnable iDRAC.ServiceModule.ServiceModuleState iDRAC.ServiceModule.ServiceModuleVersion iDRAC.ServiceModule.SSEventCorrelation iDRAC.ServiceModule.WatchdogRecoveryAction iDRAC.ServiceModule.WatchdogResetTime iDRAC.ServiceModule.WatchdogState iDRAC.ServiceModule.WMIInfo iDRAC.SmartCard iDRAC.SmartCard.SmartCardCRLEnable iDRAC.SmartCard.SmartCardLogonEnable iDRAC.SNMP iDRAC.SNMP.AgentCommunity iDRAC.SNMP.AgentEnable iDRAC.SNMP.AlertPort iDRAC.SNMP.DiscoveryPort iDRAC.SNMP.EngineID iDRAC.SNMP.SNMPProtocol iDRAC.SNMP.TrapFormat iDRAC.SNMPAlert iDRAC.SNMPAlert.1 iDRAC.SNMPAlert.2 iDRAC.SNMPAlert.3 iDRAC.SNMPAlert.4 iDRAC.SNMPAlert.5 iDRAC.SNMPAlert.6 iDRAC.SNMPAlert.7 iDRAC.SNMPAlert.8 iDRAC.SNMPTrapIPv4 iDRAC.SNMPTrapIPv4.1 iDRAC.SNMPTrapIPv4.2 iDRAC.SNMPTrapIPv4.3 iDRAC.SNMPTrapIPv4.4 iDRAC.SNMPTrapIPv6 iDRAC.SNMPTrapIPv6.1 iDRAC.SNMPTrapIPv6.2 iDRAC.SNMPTrapIPv6.3 iDRAC.SSH iDRAC.SSH.Banner iDRAC.SSH.Enable iDRAC.SSH.MaxSessions iDRAC.SSH.Port iDRAC.SSH.Timeout iDRAC.SSHCrypto iDRAC.SSHCrypto.Ciphers iDRAC.SSHCrypto.HostKeyAlgorithms iDRAC.SSHCrypto.KexAlgorithms iDRAC.SSHCrypto.MACs iDRAC.SupportAssist iDRAC.SupportAssist.DefaultIPAddress iDRAC.SupportAssist.DefaultPassword iDRAC.SupportAssist.DefaultProtocol iDRAC.SupportAssist.DefaultProtocolPort iDRAC.SupportAssist.DefaultShareName iDRAC.SupportAssist.DefaultUserName iDRAC.SupportAssist.DefaultWorkgroupName iDRAC.SupportAssist.EmailOptIn iDRAC.SupportAssist.EventBasedAutoCollection iDRAC.SupportAssist.FilterAutoCollections iDRAC.SupportAssist.HostOSProxyAddress iDRAC.SupportAssist.HostOSProxyConfigured iDRAC.SupportAssist.HostOSProxyPassword iDRAC.SupportAssist.HostOSProxyPort iDRAC.SupportAssist.HostOSProxyUserName iDRAC.SupportAssist.iDRACFirstPowerUpDateTime iDRAC.SupportAssist.NativeOSLogsCollectionSupported iDRAC.SupportAssist.PreferredLanguage iDRAC.SupportAssist.ProSupportPlusRecommendationsReport iDRAC.SupportAssist.RegistrationID iDRAC.SupportAssist.RequestTechnicianForPartsDispatch iDRAC.SupportAssist.SupportAssistEnableState iDRAC.SwitchConnectionView iDRAC.SwitchConnectionView.Enable iDRAC.SysInfo iDRAC.SysInfo.LocalConsoleLockOut iDRAC.SysInfo.POSTCode iDRAC.SysInfo.SystemRev iDRAC.SysLog iDRAC.Telemetry iDRAC.Telemetry.Port iDRAC.Telemetry.PowerLogEnable iDRAC.Telemetry.PowerLogInterval iDRAC.Telemetry.Server1 iDRAC.Telemetry.Server2 iDRAC.Telemetry.Server3 iDRAC.Telemetry.SysLogEnable iDRAC.TelemetryAggregationMetrics iDRAC.TelemetryCPUMemMetrics iDRAC.TelemetryCPURegisters iDRAC.TelemetryCPUSensor iDRAC.TelemetryFanSensor iDRAC.TelemetryFCPortStatistics iDRAC.TelemetryFCSensor iDRAC.TelemetryFPGASensor iDRAC.TelemetryGPUMetrics iDRAC.TelemetryGPUStatistics iDRAC.TelemetryMemorySensor iDRAC.TelemetryNICSensor iDRAC.TelemetryNICStatistics iDRAC.TelemetryNVMeSMARTData iDRAC.TelemetryPowerMetrics iDRAC.TelemetryPowerStatistics iDRAC.TelemetryPSUMetrics iDRAC.TelemetrySensor iDRAC.TelemetrySerialLog iDRAC.TelemetryStorageDiskSMARTData iDRAC.TelemetryStorageSensor iDRAC.TelemetrySystemUsage iDRAC.TelemetryThermalMetrics iDRAC.TelemetryThermalSensor iDRAC.Time iDRAC.Time.DayLightOffset iDRAC.Time.Timezone iDRAC.Time.TimeZoneOffset iDRAC.Update iDRAC.Update.FwUpdateIPAddr iDRAC.Update.FwUpdatePath iDRAC.Update.FwUpdateTFTPEnable iDRAC.USB iDRAC.USB.ConfigurationXML iDRAC.USB.ManagementPortMode iDRAC.USB.PortStatus iDRAC.USB.ZipPassword iDRAC.UserDomain iDRAC.UserDomain.1 iDRAC.UserDomain.2 iDRAC.UserDomain.3 iDRAC.UserDomain.4 iDRAC.UserDomain.5 iDRAC.UserDomain.6 iDRAC.UserDomain.7 iDRAC.UserDomain.8 iDRAC.UserDomain.9 iDRAC.UserDomain.10 iDRAC.UserDomain.11 iDRAC.UserDomain.12 iDRAC.UserDomain.13 iDRAC.UserDomain.14 iDRAC.UserDomain.15 iDRAC.UserDomain.16 iDRAC.UserDomain.17 iDRAC.UserDomain.18 iDRAC.UserDomain.19 iDRAC.UserDomain.20 iDRAC.UserDomain.21 iDRAC.UserDomain.22 iDRAC.UserDomain.23 iDRAC.UserDomain.24 iDRAC.UserDomain.25 iDRAC.UserDomain.26 iDRAC.UserDomain.27 iDRAC.UserDomain.28 iDRAC.UserDomain.29 iDRAC.UserDomain.30 iDRAC.UserDomain.31 iDRAC.UserDomain.32 iDRAC.UserDomain.33 iDRAC.UserDomain.34 iDRAC.UserDomain.35 iDRAC.UserDomain.36 iDRAC.UserDomain.37 iDRAC.UserDomain.38 iDRAC.UserDomain.39 iDRAC.UserDomain.40 iDRAC.Users iDRAC.Users.1 iDRAC.Users.2 iDRAC.Users.3 iDRAC.Users.4 iDRAC.Users.5 iDRAC.Users.6 iDRAC.Users.7 iDRAC.Users.8 iDRAC.Users.9 iDRAC.Users.10 iDRAC.Users.11 iDRAC.Users.12 iDRAC.Users.13 iDRAC.Users.14 iDRAC.Users.15 iDRAC.Users.16 iDRAC.VirtualConsole iDRAC.VirtualConsole.AccessPrivilege iDRAC.VirtualConsole.ActiveSessions iDRAC.VirtualConsole.AttachState iDRAC.VirtualConsole.CloseUnusedPort iDRAC.VirtualConsole.Enable iDRAC.VirtualConsole.EncryptEnable iDRAC.VirtualConsole.LocalDisable iDRAC.VirtualConsole.LocalVideo iDRAC.VirtualConsole.MaxSessions iDRAC.VirtualConsole.PluginType iDRAC.VirtualConsole.Port iDRAC.VirtualConsole.Timeout iDRAC.VirtualConsole.TimeoutEnable iDRAC.VirtualConsole.WebRedirect iDRAC.VirtualMedia iDRAC.VirtualMedia.ActiveSessions iDRAC.VirtualMedia.Attached iDRAC.VirtualMedia.BootOnce iDRAC.VirtualMedia.Enable iDRAC.VirtualMedia.EncryptEnable iDRAC.VirtualMedia.FloppyEmulation iDRAC.VirtualMedia.KeyEnable iDRAC.VirtualMedia.MaxSessions iDRAC.VNCServer iDRAC.VNCServer.ActiveSessions iDRAC.VNCServer.Enable iDRAC.VNCServer.MaxSessions iDRAC.VNCServer.Password iDRAC.VNCServer.Port iDRAC.VNCServer.SSLEncryptionBitLength iDRAC.VNCServer.Timeout iDRAC.WebServer iDRAC.WebServer.CustomCipherString iDRAC.WebServer.Enable iDRAC.WebServer.Http2Enable iDRAC.WebServer.HttpPort iDRAC.WebServer.HttpsPort iDRAC.WebServer.HttpsRedirection iDRAC.WebServer.MaxNumberOfSessions iDRAC.WebServer.SSLEncryptionBitLength iDRAC.WebServer.Timeout iDRAC.WebServer.TitleBarOption iDRAC.WebServer.TitleBarOptionCustom iDRAC.WebServer.TLSProtocol"

	BIOS_OPTS="BIOS BIOS.BiosBootSettings BIOS.BiosBootSettings BIOS.BiosBootSettings.BootMode BIOS.BiosBootSettings.BootSeq BIOS.BiosBootSettings.BootSeqRetry BIOS.BiosBootSettings.GenericUsbBoot BIOS.BiosBootSettings.HddFailover BIOS.BiosBootSettings.HddPlaceholder BIOS.BiosBootSettings.HddSeq BIOS.BiosBootSettings.SetBootOrderDis BIOS.BiosBootSettings.SetBootOrderEn BIOS.BiosBootSettings.SetBootOrderFqdd1 BIOS.BiosBootSettings.SetBootOrderFqdd10 BIOS.BiosBootSettings.SetBootOrderFqdd11 BIOS.BiosBootSettings.SetBootOrderFqdd12 BIOS.BiosBootSettings.SetBootOrderFqdd13 BIOS.BiosBootSettings.SetBootOrderFqdd14 BIOS.BiosBootSettings.SetBootOrderFqdd15 BIOS.BiosBootSettings.SetBootOrderFqdd16 BIOS.BiosBootSettings.SetBootOrderFqdd2 BIOS.BiosBootSettings.SetBootOrderFqdd3 BIOS.BiosBootSettings.SetBootOrderFqdd4 BIOS.BiosBootSettings.SetBootOrderFqdd5 BIOS.BiosBootSettings.SetBootOrderFqdd6 BIOS.BiosBootSettings.SetBootOrderFqdd7 BIOS.BiosBootSettings.SetBootOrderFqdd8 BIOS.BiosBootSettings.SetBootOrderFqdd9 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd1 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd10 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd11 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd12 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd13 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd14 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd15 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd16 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd2 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd3 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd4 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd5 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd6 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd7 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd8 BIOS.BiosBootSettings.SetLegacyHddOrderFqdd9 BIOS.BiosBootSettings.SysPrepClean BIOS.BiosBootSettings.UefiBootSeq BIOS.DellControlledTurbo BIOS.DellControlledTurbo.ControlledTurbo BIOS.DellControlledTurbo.ControlledTurboMinusBin BIOS.DellControlledTurbo.OptimizerMode BIOS.IntegratedDevices BIOS.IntegratedDevices.CurrentEmbVideoState BIOS.IntegratedDevices.EmbNic1Nic2 BIOS.IntegratedDevices.EmbVideo BIOS.IntegratedDevices.IntegratedNetwork1 BIOS.IntegratedDevices.IntegratedRaid BIOS.IntegratedDevices.MmioLimit BIOS.IntegratedDevices.OsWatchdogTimer BIOS.IntegratedDevices.PcieEnhancedPreferredIo BIOS.IntegratedDevices.PciePreferredIoBus BIOS.IntegratedDevices.SriovGlobalEnable BIOS.IntegratedDevices.UsbManagedPort BIOS.IntegratedDevices.UsbPorts BIOS.MemSettings BIOS.MemSettings.CECriticalSEL BIOS.MemSettings.CorrEccSmi BIOS.MemSettings.DramRefreshDelay BIOS.MemSettings.MemOpMode BIOS.MemSettings.MemTest BIOS.MemSettings.MemoryInterleaving BIOS.MemSettings.OppSrefEn BIOS.MemSettings.SysMemSize BIOS.MemSettings.SysMemSpeed BIOS.MemSettings.SysMemType BIOS.MemSettings.SysMemVolt BIOS.MemSettings.VideoMem BIOS.MemoryMapOut BIOS.MemoryMapOut.DimmSlot00 BIOS.MemoryMapOut.DimmSlot01 BIOS.MemoryMapOut.DimmSlot02 BIOS.MemoryMapOut.DimmSlot03 BIOS.MemoryMapOut.DimmSlot04 BIOS.MemoryMapOut.DimmSlot05 BIOS.MemoryMapOut.DimmSlot06 BIOS.MemoryMapOut.DimmSlot07 BIOS.MemoryMapOut.DimmSlot08 BIOS.MemoryMapOut.DimmSlot09 BIOS.MemoryMapOut.DimmSlot10 BIOS.MemoryMapOut.DimmSlot11 BIOS.MemoryMapOut.DimmSlot12 BIOS.MemoryMapOut.DimmSlot13 BIOS.MemoryMapOut.DimmSlot14 BIOS.MemoryMapOut.DimmSlot15 BIOS.MemoryMapOut.DimmSlot16 BIOS.MemoryMapOut.DimmSlot17 BIOS.MemoryMapOut.DimmSlot18 BIOS.MemoryMapOut.DimmSlot19 BIOS.MemoryMapOut.DimmSlot20 BIOS.MemoryMapOut.DimmSlot21 BIOS.MemoryMapOut.DimmSlot22 BIOS.MemoryMapOut.DimmSlot23 BIOS.MemoryMapOut.DimmSlot24 BIOS.MemoryMapOut.DimmSlot25 BIOS.MemoryMapOut.DimmSlot26 BIOS.MemoryMapOut.DimmSlot27 BIOS.MemoryMapOut.DimmSlot28 BIOS.MemoryMapOut.DimmSlot29 BIOS.MemoryMapOut.DimmSlot30 BIOS.MemoryMapOut.DimmSlot31 BIOS.MiscSettings BIOS.MiscSettings.AssetTag BIOS.MiscSettings.DellWyseP25BIOSAccess BIOS.MiscSettings.ErrPrompt BIOS.MiscSettings.ForceInt10 BIOS.MiscSettings.NumLock BIOS.MiscSettings.PowerCycleRequest BIOS.NvmeSettings BIOS.NvmeSettings.BiosNvmeDriver BIOS.NvmeSettings.NvmeMode BIOS.OneTimeBoot BIOS.OneTimeBoot.OneTimeBootMode BIOS.OneTimeBoot.OneTimeBootSeqDev BIOS.OneTimeBoot.OneTimeHddSeqDev BIOS.ProcSettings BIOS.ProcSettings.CcdCores BIOS.ProcSettings.CcxAsNumaDomain BIOS.ProcSettings.CpuMinSevAsid BIOS.ProcSettings.DirectMemAccessProtection BIOS.ProcSettings.IommuSupport BIOS.ProcSettings.L1StreamHwPrefetcher BIOS.ProcSettings.L2StreamHwPrefetcher BIOS.ProcSettings.LogicalProc BIOS.ProcSettings.MadtCoreEnumeration BIOS.ProcSettings.NumaNodesPerSocket BIOS.ProcSettings.Proc1Brand BIOS.ProcSettings.Proc1Id BIOS.ProcSettings.Proc1L2Cache BIOS.ProcSettings.Proc1L3Cache BIOS.ProcSettings.Proc1Microcode BIOS.ProcSettings.Proc1NumCores BIOS.ProcSettings.Proc2Brand BIOS.ProcSettings.Proc2Id BIOS.ProcSettings.Proc2L2Cache BIOS.ProcSettings.Proc2L3Cache BIOS.ProcSettings.Proc2Microcode BIOS.ProcSettings.Proc2NumCores BIOS.ProcSettings.ProcBusSpeed BIOS.ProcSettings.ProcCcds BIOS.ProcSettings.ProcConfigTdp BIOS.ProcSettings.ProcCoreSpeed BIOS.ProcSettings.ProcVirtualization BIOS.ProcSettings.ProcX2Apic BIOS.ProcSettings.TransparentSme BIOS.RedundantOsControl BIOS.RedundantOsControl.RedundantOsBoot BIOS.RedundantOsControl.RedundantOsLocation BIOS.RedundantOsControl.RedundantOsState BIOS.SataSettings BIOS.SataSettings.EmbSata BIOS.SataSettings.SataPortA BIOS.SataSettings.SataPortACapacity BIOS.SataSettings.SataPortADriveType BIOS.SataSettings.SataPortAModel BIOS.SataSettings.SataPortB BIOS.SataSettings.SataPortBCapacity BIOS.SataSettings.SataPortBDriveType BIOS.SataSettings.SataPortBModel BIOS.SataSettings.SataPortC BIOS.SataSettings.SataPortCCapacity BIOS.SataSettings.SataPortCDriveType BIOS.SataSettings.SataPortCModel BIOS.SataSettings.SataPortD BIOS.SataSettings.SataPortDCapacity BIOS.SataSettings.SataPortDDriveType BIOS.SataSettings.SataPortDModel BIOS.SataSettings.SataPortE BIOS.SataSettings.SataPortECapacity BIOS.SataSettings.SataPortEDriveType BIOS.SataSettings.SataPortEModel BIOS.SataSettings.SataPortF BIOS.SataSettings.SataPortFCapacity BIOS.SataSettings.SataPortFDriveType BIOS.SataSettings.SataPortFModel BIOS.SataSettings.SataPortG BIOS.SataSettings.SataPortGCapacity BIOS.SataSettings.SataPortGDriveType BIOS.SataSettings.SataPortGModel BIOS.SataSettings.SataPortH BIOS.SataSettings.SataPortHCapacity BIOS.SataSettings.SataPortHDriveType BIOS.SataSettings.SataPortHModel BIOS.SataSettings.SecurityFreezeLock BIOS.SataSettings.WriteCache BIOS.SerialCommSettings BIOS.SerialCommSettings.ConTermType BIOS.SerialCommSettings.ExtSerialConnector BIOS.SerialCommSettings.FailSafeBaud BIOS.SerialCommSettings.RedirAfterBoot BIOS.SerialCommSettings.SerialComm BIOS.SerialCommSettings.SerialPortAddress BIOS.SlotBifurcation BIOS.SlotBifurcation.DellAutoDiscovery BIOS.SlotBifurcation.Slot1Bif BIOS.SlotBifurcation.Slot2Bif BIOS.SlotBifurcation.Slot3Bif BIOS.SlotDisablement BIOS.SlotDisablement.Slot1 BIOS.SlotDisablement.Slot2 BIOS.SlotDisablement.Slot3 BIOS.SysInformation BIOS.SysProfileSettings BIOS.SysSecurity BIOS.SysSecurity.AcPwrRcvry BIOS.SysSecurity.AcPwrRcvryDelay BIOS.SysSecurity.AcPwrRcvryUserDelay BIOS.SysSecurity.AesNi BIOS.SysSecurity.AuthorizeDeviceFirmware BIOS.SysSecurity.PasswordStatus BIOS.SysSecurity.PwrButton BIOS.SysSecurity.SHA256SetupPassword BIOS.SysSecurity.SHA256SetupPasswordSalt BIOS.SysSecurity.SHA256SystemPassword BIOS.SysSecurity.SHA256SystemPasswordSalt BIOS.SysSecurity.SecureBoot BIOS.SysSecurity.SecureBootMode BIOS.SysSecurity.SecureBootPolicy BIOS.SysSecurity.SetupPassword BIOS.SysSecurity.SysPassword BIOS.SysSecurity.TpmInfo BIOS.SysSecurity.UefiVariableAccess BIOS.TpmAdvancedSettings"

	NIC_OPTS="NIC NIC.DCBSettings NIC.DCBSettings.1 NIC.DCBSettings.2 NIC.DeviceLevelConfig NIC.DeviceLevelConfig.1 NIC.DeviceLevelConfig.2 NIC.FrmwImgMenu NIC.FrmwImgMenu.1 NIC.FrmwImgMenu.2 Nic.FrmwImgMenu NIC.IscsiFirstTgtParams.1 NIC.IscsiFirstTgtParams.2 Nic.IscsiGenParams NIC.IscsiGenParams.1 NIC.IscsiGenParams.2 Nic.IscsiInitiatorParams NIC.IscsiInitiatorParams.1 NIC.IscsiInitiatorParams.2 Nic.NICConfig NIC.NICConfig.1 NIC.NICConfig.2 Nic.NICPartitioningConfig NIC.NICPartitioningConfig.1 NIC.NICPartitioningConfig.2 Nic.VndrConfigPage NIC.VndrConfigPage.1 NIC.VndrConfigPage.2"

	STORAGE_OPTS="Storage Storage.Controller Storage.Controller.1 Storage.Controller.2"

	friendly_first="inventory job log raw sensor system bios idrac nic storage"
	global_opts="--config-file --debug --device --help --log-file --verbose --version --remote --remote-user --remote-password --remote-port --interactive --stop-on-certificate-error --nocertwarn -r -u -p -P -i -S"

	# The values of the friendly formatter and command options,
	# wherever they appear on the line.
	case "${prev}" in
	--format)
		_orac_reply "csv json table value shell yaml" "${cur}"
		return 0
	;;
	--type)
		_orac_reply "sel rac trace" "${cur}"
		return 0
	;;
	esac

	# Global options come before the subcommand.
	if [ -z "${cmd_name}" ]; then
		case "${prev}" in
		--device|--log-file|--config-file|--remote-user|--remote-password|--remote-port)
			COMPREPLY=( $(compgen -f -- "${cur}") )
			return 0
		;;
		esac
		case "${cur}" in
		-*)
			_orac_reply "${global_opts}" "${cur}"
			return 0
		;;
		esac
		_orac_reply "help ${opts} ${friendly_first}" "${cur}"
		return 0
	fi

	case "${cmd_name}" in
	help)
		_orac_reply "${opts}" "${cur}"
		return 0
	;;
	get|set)
		_orac_reply "${iDRAC_OPTS} ${BIOS_OPTS} ${NIC_OPTS} ${STORAGE_OPTS}" "${cur}"
		return 0
	;;
	jobqueue)
		case "${prev}" in
		"jobqueue")
			COMPREPLY=( $(compgen -W "create" -- ${cur}) )
			return 0
		;;
		"create")
			COMPREPLY=( $(compgen -W "BIOS.Setup.1-1" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	getsel|getraclog|gettracelog)
		# Client-side options of the log commands.
		if [[ "${cur}" == -* ]]; then
			COMPREPLY=( $(compgen -W "-m --more -i" -- "${cur}") )
		fi
		return 0
	;;
	system)
		_orac_reply "show" "${cur}"
		return 0
	;;
	log)
		_orac_reply "list --type sel rac trace --latest --severity" "${cur}"
		return 0
	;;
	job)
		_orac_reply "list create delete" "${cur}"
		return 0
	;;
	inventory)
		_orac_reply "list --software" "${cur}"
		return 0
	;;
	sensor)
		_orac_reply "list" "${cur}"
		return 0
	;;
	raw)
		_orac_reply "${opts}" "${cur}"
		return 0
	;;
	bios|idrac|nic|storage)
		_orac_target_words
		return 0
	;;
	esac
}
complete -F _orac orac
