hwdb: add database for basic IMDS properties

This adds a hardware database that contains information about IDMS
functionality of various clouds, keyed off the SMBIOS identification of
each. Currently this contains information about 6 major clouds, but the
idea is that this grows to include more and more major clouds.

Nothing uses this data yet, that's added in a later commit.
This commit is contained in:
Lennart Poettering
2026-03-26 10:54:15 +01:00
parent 211cd6e9a3
commit f3eac272e6
3 changed files with 125 additions and 1 deletions
+105
View File
@@ -0,0 +1,105 @@
# This file is part of systemd
# This provides various properties that declare if and how IMDS is available on
# the local system, i.e. we are running in a major cloud service that provides
# something resembling AWS' or Azure's Instance Metadata Service.
#
# General IMDS endpoint data:
# IMDS_VENDOR= → Indicates IMDS is available, and which vendor it is
# IMDS_TOKEN_URL= → The URL to request an API token from. If not set, no API token is requested.
# IMDS_REFRESH_HEADER_NAME= → The HTTP request header field (everything before the ":") that contains the refresh TTL (in seconds) when requesting a token.
# IMDS_DATA_URL= → The base URL to request actual IMDS data fields from
# IMDS_DATA_URL_SUFFIX= → Parameters to suffix the URLs with
# IMDS_TOKEN_HEADER_NAME= → The HTTP request header field (everything before the ":") used to pass the token
# IMDS_EXTRA_HEADER=, IMDS_EXTRA_HEADER2=, IMDS_EXTRA_HEADER3=, …
# → Additional HTTP headers to pass when requesting a data field (full header, including ":")
# IMDS_ADDRESS_IPV4= → IPv4 address of the IMDS server
# IMDS_ADDRESS_IPV6= → IPv6 address of the IMDS server
#
# Well-known IMDS keys:
# IMDS_KEY_HOSTNAME= → IMDS key for the hostname
# IMDS_KEY_REGION= → IMDS key for the region, if that concept applies
# IMDS_KEY_ZONE= → IMDS key for the zone, if that concept applies
# IMDS_KEY_IPV4_PUBLIC= → IMDS key for the primary public IPv4 address if there is any
# IMDS_KEY_IPV6_PUBLIC= → IMDS key for the primary public IPv6 address if there is any
# IMDS_KEY_SSH_KEY= → IMDS key for an SSH public key to install in the root account
# IMDS_KEY_USERDATA= → IMDS key for arbitrary userdata (if there's only one)
# IMDS_KEY_USERDATA_BASE= → IMDS key for arbitrary userdata (if there are multiple, this is the common prefix)
# IMDS_KEY_USERDATA_BASE64= → IMDS key for arbitrary userdata (if there's only one, but it is base64 encoded)
# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
dmi:bvnAmazonEC2:*
IMDS_VENDOR=amazon-ec2
IMDS_TOKEN_URL=http://169.254.169.254/latest/api/token
IMDS_REFRESH_HEADER_NAME=X-aws-ec2-metadata-token-ttl-seconds
IMDS_DATA_URL=http://169.254.169.254/latest
IMDS_TOKEN_HEADER_NAME=X-aws-ec2-metadata-token
IMDS_ADDRESS_IPV4=169.254.169.254
IMDS_ADDRESS_IPV6=fd00:ec2::254
IMDS_KEY_HOSTNAME=/meta-data/hostname
IMDS_KEY_REGION=/meta-data/placement/region
IMDS_KEY_ZONE=/meta-data/placement/availability-zone
IMDS_KEY_IPV4_PUBLIC=/meta-data/public-ipv4
IMDS_KEY_IPV6_PUBLIC=/meta-data/ipv6
IMDS_KEY_SSH_KEY=/meta-data/public-keys/0/openssh-key
IMDS_KEY_USERDATA=/user-data
# https://learn.microsoft.com/en-us/azure/virtual-machines/instance-metadata-service#instance-metadata
dmi:*:cat7783-7084-3265-9085-8269-3286-77:*
IMDS_VENDOR=microsoft-azure
IMDS_DATA_URL=http://169.254.169.254/metadata
IMDS_DATA_URL_SUFFIX=?api-version=2025-04-07&format=text
IMDS_EXTRA_HEADER=Metadata: true
IMDS_ADDRESS_IPV4=169.254.169.254
IMDS_KEY_HOSTNAME=/instance/compute/osProfile/computerName
IMDS_KEY_REGION=/instance/compute/location
IMDS_KEY_ZONE=/instance/compute/physicalZone
IMDS_KEY_IPV4_PUBLIC=/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress
IMDS_KEY_IPV6_PUBLIC=/instance/network/interface/0/ipv6/ipAddress/0/publicIpAddress
IMDS_KEY_SSH_KEY=/instance/compute/publicKeys/0/keyData
IMDS_KEY_USERDATA_BASE64=/instance/compute/userData
# https://docs.cloud.google.com/compute/docs/metadata/predefined-metadata-keys
dmi:*:pnGoogleComputeEngine:*
IMDS_VENDOR=google-gcp
IMDS_DATA_URL=http://169.254.169.254/computeMetadata/v1
IMDS_EXTRA_HEADER=Metadata-Flavor: Google
IMDS_ADDRESS_IPV4=169.254.169.254
IMDS_KEY_HOSTNAME=/instance/hostname
IMDS_KEY_REGION=/instance/region
IMDS_KEY_ZONE=/instance/zone
IMDS_KEY_IPV4_PUBLIC=/instance/network-interfaces/0/access-configs/0/external-ip
IMDS_KEY_USERDATA_BASE=/instance/attributes
# https://docs.hetzner.cloud/reference/cloud#description/server-metadata
dmi:bvnHetzner:*
IMDS_VENDOR=hetzner-cloud
IMDS_DATA_URL=http://169.254.169.254/hetzner/v1/metadata
IMDS_ADDRESS_IPV4=169.254.169.254
IMDS_KEY_HOSTNAME=/hostname
IMDS_KEY_REGION=/region
IMDS_KEY_ZONE=/availability-zone
IMDS_KEY_IPV4_PUBLIC=/public-ipv4
IMDS_KEY_SSH_KEY=/public-keys/0
IMDS_KEY_USERDATA=/userdata
# https://docs.oracle.com/en-us/iaas/Content/Compute/Tasks/gettingmetadata.htm#metadata-keys
dmi:*:catOracleCloud.com:*
IMDS_VENDOR=oracle-cloud-oci
IMDS_DATA_URL=http://169.254.169.254/opc/v2
IMDS_ADDRESS_IPV4=169.254.169.254
IMDS_ADDRESS_IPV6=fd00:c1::a9fe:a9fe
IMDS_EXTRA_HEADER=Authorization: Bearer Oracle
IMDS_KEY_HOSTNAME=/instance/hostname
IMDS_KEY_REGION=/instance/region
IMDS_KEY_ZONE=/instance/availabilityDomain
IMDS_KEY_SSH_KEY=/instance/metadata/ssh_authorized_keys
IMDS_KEY_USERDATA_BASE64=/metadata/user_data
# https://www.scaleway.com/en/docs/instances/how-to/use-cloud-init/
dmi:*:svnScaleway:*
IMDS_VENDOR=scaleway
IMDS_DATA_URL=http://169.254.42.42
IMDS_ADDRESS_IPV4=169.254.42.42
IMDS_ADDRESS_IPV6=fd00:42::42
IMDS_KEY_USERDATA=/user_data
+1
View File
@@ -19,6 +19,7 @@ hwdb_files_notest = files(
hwdb_files_test = files(
'20-dmi-id.hwdb',
'20-net-ifname.hwdb',
'40-imds.hwdb',
'60-autosuspend.hwdb',
'60-autosuspend-fingerprint-reader.hwdb',
'60-evdev.hwdb',
+19 -1
View File
@@ -125,7 +125,7 @@ def hwdb_grammar():
matchline = (matchline_typed | matchline_general) + EOL
propertyline = (White(' ', exact=1).suppress() +
Combine(UDEV_TAG - '=' - Optional(Word(alphanums + '_=:@*.!-;, "/'))
Combine(UDEV_TAG - '=' - Optional(Word(alphanums + '_=:@*.!-;, "/?&'))
- Optional(pythonStyleComment)) +
EOL)
propertycomment = White(' ', exact=1) + pythonStyleComment + EOL
@@ -215,6 +215,24 @@ def property_grammar():
('ID_NET_NAME_FROM_DATABASE', name_literal),
('ID_NET_NAME_INCLUDE_DOMAIN', zero_one),
('TPM2_BROKEN_NVPCR', zero_one),
('IMDS_VENDOR', name_literal),
('IMDS_TOKEN_URL', name_literal),
('IMDS_REFRESH_HEADER_NAME', name_literal),
('IMDS_DATA_URL', name_literal),
('IMDS_DATA_URL_SUFFIX', name_literal),
('IMDS_TOKEN_HEADER_NAME', name_literal),
('IMDS_EXTRA_HEADER', name_literal),
('IMDS_ADDRESS_IPV4', name_literal),
('IMDS_ADDRESS_IPV6', name_literal),
('IMDS_KEY_HOSTNAME', name_literal),
('IMDS_KEY_REGION', name_literal),
('IMDS_KEY_ZONE', name_literal),
('IMDS_KEY_IPV4_PUBLIC', name_literal),
('IMDS_KEY_IPV6_PUBLIC', name_literal),
('IMDS_KEY_SSH_KEY', name_literal),
('IMDS_KEY_USERDATA', name_literal),
('IMDS_KEY_USERDATA_BASE', name_literal),
('IMDS_KEY_USERDATA_BASE64', name_literal),
)
fixed_props = [Literal(name)('NAME') - Suppress('=') - val('VALUE')
for name, val in props]