From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id D34B91FF187 for ; Mon, 22 Sep 2025 19:47:41 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8FA87216AA; Mon, 22 Sep 2025 19:48:09 +0200 (CEST) To: "pve-devel@lists.proxmox.com" Date: Mon, 22 Sep 2025 12:30:30 +0000 X-Mailman-Approved-At: Mon, 22 Sep 2025 19:48:08 +0200 MIME-Version: 1.0 Message-ID: List-Id: Proxmox VE development discussion List-Post: From: Florian Paul Azim Hoberg via pve-devel Precedence: list Cc: Florian Paul Azim Hoberg X-Mailman-Version: 2.1.29 X-BeenThere: pve-devel@lists.proxmox.com List-Subscribe: , List-Unsubscribe: , List-Archive: Reply-To: Proxmox VE development discussion List-Help: Subject: [pve-devel] [PATCH installer 1/1] fix #2164: add option to define a vlan tag within the installer Content-Type: multipart/mixed; boundary="===============5633472189022210441==" Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" --===============5633472189022210441== Content-Type: message/rfc822 Content-Disposition: inline Return-Path: X-Original-To: pve-devel@lists.proxmox.com Delivered-To: pve-devel@lists.proxmox.com Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 43DA4D39EF for ; Mon, 22 Sep 2025 14:31:11 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 1B2161AE2D for ; Mon, 22 Sep 2025 14:30:41 +0200 (CEST) Received: from DB3PR0202CU003.outbound.protection.outlook.com (mail-northeuropeazlp170100001.outbound.protection.outlook.com [IPv6:2a01:111:f403:c200::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (secp384r1) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS for ; Mon, 22 Sep 2025 14:30:39 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wseGS/ZURxaoJE8dkpkf5+1sobz3F4MijwPOcY2vkg5q065/AIjZAocabRiQGyYdynO7DXOWrAdYNu7a+8w+Zqrxkat52xe6hDgKuE2+F+55D0rauE4e6bIP1z9J1SXHYwpSVne0rM1cry2p/VfqKhGiSJxVgFrQOAuN8eUvYoE4wXYeO0j3iiTL5mEQRsqV7xCz9Sbenluzu/Fz0bA806hxRYiO9eNZNjZvaXPN5l0MNI31MgZh2cg9GWExZa0M8yRibvgc/5ggo+MtaZZXhz74Wq1HmpWRXsSIl0DUmohWNsgY0ajAkkF1A+dPlqwEJOPVr1hOiyRK7KcgyVqnXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=EoEGpFSPNkrD5z+P8t1dkeQEO7T53YXNNap0Pe3f/bg=; b=lsUw+MZtcNcxrbS6asvGOqn6mXwH8gkzklfv2N9WM0k1zNjSORRz9YDnPRgzEQ6t6XlWTZ5+ww/e84AwEzjQ7/DXWbRZq3jPSL4St4GeKMTfg/uds34E0gagxI1zeVg7flOPupPVECouHBMREEC+LhG4rgCTlatnXC6zSIoSNv3fJC4aS4Ne6AjfDR2Cfz+ukN0yTYIp+ARHcGXKOoAPVLssEXb4doknaahxRSp2+LgDi3hPxnTzOPqv/nAaRL00WXiOT0hrYfg1ytsbLGeh8jzwml9i1J7JLSu3l/cnqVHJ/20zPOAQ3KlMpSQDIwkX0SZAo3uOUQ/3cXs8Cl8u7Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=credativ.de; dmarc=pass action=none header.from=credativ.de; dkim=pass header.d=credativ.de; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=credativ.de; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EoEGpFSPNkrD5z+P8t1dkeQEO7T53YXNNap0Pe3f/bg=; b=HUl8Zs3HbF6oHtjUX8NMuFNa4uy2OhYukIg2BaIjRr4Ld2r+S4iTUCkTUOATehJUr9njXnI79mhAeCbtkgpxrSXtblTRUgvi5mxSzwqDYZvLDsZNoxJ+8deQ8FMiheSerm4NjR31k4cFDNNZkZqOoXYRzNvrnrkuw9yMFn/kXiE= Received: from AS1P189MB1888.EURP189.PROD.OUTLOOK.COM (2603:10a6:20b:4a2::22) by DB8P189MB0745.EURP189.PROD.OUTLOOK.COM (2603:10a6:10:129::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.16; Mon, 22 Sep 2025 12:30:31 +0000 Received: from AS1P189MB1888.EURP189.PROD.OUTLOOK.COM ([fe80::c7c0:e244:c748:6c5f]) by AS1P189MB1888.EURP189.PROD.OUTLOOK.COM ([fe80::c7c0:e244:c748:6c5f%6]) with mapi id 15.20.9137.018; Mon, 22 Sep 2025 12:30:31 +0000 From: Florian Paul Azim Hoberg To: "pve-devel@lists.proxmox.com" Subject: [PATCH installer 1/1] fix #2164: add option to define a vlan tag within the installer Thread-Topic: [PATCH installer 1/1] fix #2164: add option to define a vlan tag within the installer Thread-Index: AQHcK7yvAjpl4bSBBUmrd+Lm0WWXbw== Date: Mon, 22 Sep 2025 12:30:30 +0000 Message-ID: <3978889E-73FA-4473-A70B-2C660662CC3D@credativ.de> Accept-Language: de-DE, en-US, en-GB Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=credativ.de; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: AS1P189MB1888:EE_|DB8P189MB0745:EE_ x-ms-office365-filtering-correlation-id: d74945b5-d00b-4887-8628-08ddf9d3d1d0 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|376014|10070799003|1800799024|366016|38070700021; x-microsoft-antispam-message-info: =?us-ascii?Q?g0O8xsiBj7eHcaxmf4M8u51P2ZoVleapk5U6dUqyiR9f8PFJJD6gLRbLc+hR?= =?us-ascii?Q?zSE/DPpGajPMwXv0mdmf6mHXOmK/YqQmo6RyWilqVg0WCzeEAOwnyYYiL06B?= =?us-ascii?Q?cZgzO7a6z8DP/SZpt6mxi6ikfh1sBbkCsycxO60iC4CQKPelf28ZgHHZhe9g?= =?us-ascii?Q?ELr9sS7w5R7bQHZn0OcGSaQKvqtDGdXjYxL1gAylgkVRG9RhA4uyK6l0oRtB?= =?us-ascii?Q?UlNxRSnsmM+aO4bdfDTmQgfb+K7qPETENQLYr+NaE39a/x19jfcWf/yjeWPe?= =?us-ascii?Q?V4mJremr14FGVSe09cAPmvhXKslPFUBlGEnbisWzg5DrCTkicNvsxoPOVHcF?= =?us-ascii?Q?Y4yHHoaYovbe+S8ZZg2bIF7ILgk60OrDh1GnxkJL77qk8nlXupx1riC1Eg+u?= =?us-ascii?Q?OEJ+z6EXl3KaGfleL1ijdzZjEpR5dAAb05XpcrEDGwxcxT0C301eDJnao4jk?= =?us-ascii?Q?tMFZS+tz9IBPIPKfiKN0I9f4ONTMFC+vS3YjX7DAd8/lO7GBR+hBhSP2wS/V?= =?us-ascii?Q?MO9TpbvzUXxOtOUDDqL2RVooKZ9Nb1MnZRKsQah4+3cLszdcAe18okZfhEcl?= =?us-ascii?Q?uoNGpvkqGxkpJb8wvQgvcUB5qkDJzg/QyLaO5mhzmrSyZRpDqaWB9plrnsfr?= =?us-ascii?Q?bN37Nbg9cWlmVhFT/AdnVPs03lSwI1du1o6LtzZhsNzOKG9euC5NBAHf/kTT?= =?us-ascii?Q?ygIrfsMSbQFw7cKunfMSLaZSiIzYy1hPivORnZ5YR6ToXSwRcnclBCVstuHV?= =?us-ascii?Q?94l/cR0N8lV1Wkt2+5UZmuOAEbmUOQcZXtvWdS0uuCGGU1lXDi9vDKPnZoAe?= =?us-ascii?Q?5fjSSsnl3QsD3nKvdMBoYniPn+uk5WypdlOr6rPNf+BxajRJzc5l3Rip6odR?= =?us-ascii?Q?dP7ccwRrLRQNoT9hKB+KF9d6RVkpATThFiTlZIm4msmubIyCxwwln7GCKKGC?= =?us-ascii?Q?KdSVyWWUwYQ5Ltpj7j2MoiVmS0kHVUTRNBk7dPKmk4yH63oIihVvnXeBfPR8?= =?us-ascii?Q?U1H5KWg22cUjENkyj2uNnP8wQTIgVKBcvwXmg4Y5j/87Y6DuENeZg7iyjltG?= =?us-ascii?Q?e7Odi9EJjPcn0mtRjgLPVGaFlyi7VdQ1HDI8mTxCWaCwI4u7uTI4NlEyi5qW?= =?us-ascii?Q?leYjvYtTUzgT8OmicFBj5dMtaQ+fXyjbTAvsYY73TA9X0w7oI/sFkYLaIZqk?= =?us-ascii?Q?GDPi+ZvPTFrIlstfmiZz4sFCWf1pGVmitVmoedyFbxXeQGxvAi9DSaekdWt7?= =?us-ascii?Q?rQ0GwgIl3+PhXAqXAs0HHoMKFg4evUA34YQ2hTgHFY379fz2WsvERVG/qYfS?= =?us-ascii?Q?BA/JJC2XZgVYM7M/zpUYvyjHrpJpOZgG9BmM+MngQN1x6lZHRP4GmPwPYB4s?= =?us-ascii?Q?KlsIn8rUpY+pe1jMq2mu1ThGQvolg3wRrEsVPplTGNYOQSLY/MU6IEUqKS5u?= =?us-ascii?Q?5iZiYb1q+r4IVKqQR5nA49XsSs6cCZdQrA9GG0DzSIwkjKYj7YxprA=3D=3D?= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AS1P189MB1888.EURP189.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(376014)(10070799003)(1800799024)(366016)(38070700021);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?s2k293TS407FJg5hMLVTaule1DkdwbX/HAbWTIz+ozrfvpl7kcW28PONPsbi?= =?us-ascii?Q?48B3/HrisQXokr2WVz466D8rvmaDv3tyyIZqRSoFXgANsN+yrsefRPCikL4G?= =?us-ascii?Q?Bjn15R8a6W3tuqNGknoWYlZR3hHR6CosEr86rTppRYhOMD/6u3jwxk7zt+KG?= =?us-ascii?Q?zpynuzt5zloHe7c5vdrNSnOITeFmyQwSifuh+2O/Mtx/m+ISwvSWMdjTtxsW?= =?us-ascii?Q?ebdFGOYr5p4SAaFTf9UlYx0sobIN08AUMj9JDpRzLIrw3fsEY9VBDQMo0kkF?= =?us-ascii?Q?sQYUrClSIxrwG1gLTl0Py/8FunNxSsIOPYQK2hy6Ivp2D4J6KLN3AouabflJ?= =?us-ascii?Q?zPikLChJorIOdMt/UTOzPxK0HYD9O9nLZDQIqXGGp4a9VOqLZfiY4fm+Xao0?= =?us-ascii?Q?OHAN0RCfjs1DGazxm/6Q2RPvxtkDTywlPygSG6mQgAQfhlglmsN3Y+eXZEyd?= =?us-ascii?Q?nE76WY30jfgQTDKSexn3/UXXT405YnkUFuMEmrCaFX59eh4BJ7GTroJqRHDe?= =?us-ascii?Q?gXAk/bxruC31VJ5fxCeGoSdUYx9PsSd+Q81cmGgGQ7+NRs3LvOYjjGAMXcJb?= =?us-ascii?Q?iCqJ+DMsgYVM6K+0BT8WN8OAeED36ngdHmm/W3CmPhZUHZvAslsqr3KJWsBU?= =?us-ascii?Q?eazCSOg95pV9B5R44ZsYu5gyxxWu2/0beqZxrg1H1DPDLQcGpK8Lbjfnf7xj?= =?us-ascii?Q?M6N1oOW+XzlEcluVVmqyHFw7fjfpI9uRQdx5ZbR4y64H4mTUaU0+6QQ7Gkai?= =?us-ascii?Q?/898FY56iNAvSLcnTVUSelHNfAQyzL8U2UyE90AaaBFNrCkYLPqLQSbN7x3M?= =?us-ascii?Q?sPBJSor/qzF3ZbZS0IQYzJl0kOpJ2oZmqYTvFMOq8W/akrZg6zjALwClxe9d?= =?us-ascii?Q?YaDn+i8rGcS1DwGKb1ZSZDU5Qf6RxllGzV5xwM8dh2dQ/BdkAFgFCY73/tqb?= =?us-ascii?Q?h/EFU/wYUR/9LNmBPcNv+hwfBnu31Ymhx7mbNKiXmyuCUrJBBxWKWC1S4IqQ?= =?us-ascii?Q?QFI2R7SlzUCDHUu+QCubM1xaobWd85lA89WtFrXqHGGmfdzTV1IWXOZfTy/3?= =?us-ascii?Q?LrObDh9s/28VzzUuGQmyFuELuG6v8mEtljWys9OjfR4X41ih7B731SZZpc9Q?= =?us-ascii?Q?DfWa+BQnG1hkir8VXIrp1jwz4DZhwHkrINsPB8G8oLifsQpVpyscDOxiL565?= =?us-ascii?Q?Z96sQe4LYd8eOs7xl9q0dAmn+rrSQGuMlg8gs+cZwPh4nEazOJsYnefTk0yL?= =?us-ascii?Q?8K3XnTVIdaCM7UX/ZyAQ+uWq3l1OVX/IQOIbPh45QlgX6pwR5h+cPmkkDQc9?= =?us-ascii?Q?SxeIf2gC3phg5LZteIzyHSX44HmQbBDldSS71SHCcBETvrx4THdUmOKhp7Jb?= =?us-ascii?Q?rtKBbaJ/n8qtoRbdWGOaE1VCJVOAEhwYxBdfGKO/bNv5sXtJkaxPu4efciYy?= =?us-ascii?Q?0QHduYy8zFgWtCsIDDgynnfOP24/FF5DywAjLglJQzszjJV7/Uww7NTjTzLT?= =?us-ascii?Q?zKckD22PCfsBYn5v4/Sv5YSCJQhoDNaWF9iC1I1dh7uGJRpX25Wc7CFpwglO?= =?us-ascii?Q?jIeZftw3ktcvQd9yprE2jlzVwRv15Py2H342A1PvftryIqYPkwWWqb1NgRyg?= =?us-ascii?Q?2MlXDIi70r0uLPL8gA8+Z162XmzTYdpm3czR9PYhg/4EgTD1O+FwOSvEFabu?= =?us-ascii?Q?yT/i6A=3D=3D?= Content-Type: text/plain; charset="us-ascii" Content-ID: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: credativ.de X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: AS1P189MB1888.EURP189.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-Network-Message-Id: d74945b5-d00b-4887-8628-08ddf9d3d1d0 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Sep 2025 12:30:30.9915 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 2062cad9-9089-4cde-825e-26ac6f54f57e X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: FmnAghQJnS16hIB2HiFJio1BYZ1s1iLFFgTPUT/2pOH6BwDIQ1r90rpRvdb1QyWoQVzf6HxMUouOPPjfQd3Uc3Nia4dxooySxnGHWrDAM9Y= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8P189MB0745 X-SPAM-LEVEL: Spam detection results: 0 ARC_SIGNED 0.001 Message has a ARC signature ARC_VALID -0.1 Message has a valid ARC signature AWL 0.052 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DKIM_SIGNED 0.1 Message has a DKIM or DK signature, not necessarily valid DKIM_VALID -0.1 Message has at least one valid DKIM or DK signature DKIM_VALID_AU -0.1 Message has a valid DKIM or DK signature from author's domain DKIM_VALID_EF -0.1 Message has a valid DKIM or DK signature from envelope-from domain DMARC_PASS -0.1 DMARC pass policy SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record X-Mailman-Approved-At: Mon, 22 Sep 2025 19:48:08 +0200 To ensure a Promox node can access a desired network resource which requires a given vlan tag, this feature adds the possibility to optionally define a vlan tag within the auto installer, tui and gui. Signed-off-by: Florian Paul Azim Hoberg @gyptazy --- initial commit: * Add possibility to optionally add vlan tag in: - auto installer - tui - gui * Tagged interface will be generated as: $interface.$tag in /etc/network/interfaces * Simple validation of given vlan tag: - Must be digit - Must be smaller than int(4094) Proxmox/Install.pm | 19 +++++++++++--- Proxmox/Install/Config.pm | 4 +++ html/ack_template.htm | 2 ++ proxinstall | 23 +++++++++++++++- proxmox-auto-installer/src/answer.rs | 3 +++ proxmox-auto-installer/src/utils.rs | 2 ++ proxmox-auto-installer/tests/parse-answer.rs | 1 + .../tests/resources/parse_answer/btrfs.json | 1 + .../btrfs_raid_level_uppercase.json | 1 + .../resources/parse_answer/disk_match.json | 1 + .../parse_answer/disk_match_all.json | 1 + .../parse_answer/disk_match_any.json | 1 + .../resources/parse_answer/first_boot.json | 1 + .../parse_answer/fqdn_from_dhcp.json | 1 + ...n_from_dhcp_empty_dhcp_domain_setting.json | 1 + ...cp_no_dhcp_domain_with_default_domain.json | 1 + ...ll_fqdn_from_dhcp_with_default_domain.json | 1 + .../parse_answer/hashed_root_password.json | 1 + .../tests/resources/parse_answer/minimal.json | 1 + .../resources/parse_answer/network_vlan.json | 20 ++++++++++++++ .../resources/parse_answer/network_vlan.toml | 19 ++++++++++++++ .../resources/parse_answer/nic_matching.json | 1 + .../resources/parse_answer/nic_matching.toml | 1 + .../resources/parse_answer/specific_nic.json | 1 + .../tests/resources/parse_answer/zfs.json | 1 + .../zfs_raid_level_uppercase.json | 1 + proxmox-installer-common/src/options.rs | 10 +++++++ proxmox-installer-common/src/setup.rs | 1 + proxmox-tui-installer/src/main.rs | 26 +++++++++++++++++++ proxmox-tui-installer/src/options.rs | 1 + proxmox-tui-installer/src/setup.rs | 1 + 31 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/net= work_vlan.json create mode 100644 proxmox-auto-installer/tests/resources/parse_answer/net= work_vlan.toml diff --git a/Proxmox/Install.pm b/Proxmox/Install.pm index 9cb88bc..aa8e6c7 100644 --- a/Proxmox/Install.pm +++ b/Proxmox/Install.pm @@ -1099,13 +1099,26 @@ sub extract_data { =20 my $ethdev =3D Proxmox::Install::Config::get_mngmt_nic(); my $cidr =3D Proxmox::Install::Config::get_cidr(); + my $vlan =3D Proxmox::Install::Config::get_vlan(); my $gateway =3D Proxmox::Install::Config::get_gateway(); =20 + # apply vlan tag to bridge if present + my $bridge =3D "vmbr0"; + if (defined $vlan) { + $bridge .=3D ".$vlan"; + } + + # apply vlan tag directly to interface if present + my $ethdev_non_bridge =3D $ethdev; + if (defined $vlan && !$iso_env->{cfg}->{bridged_network}) { + $ethdev_non_bridge .=3D ".$vlan"; + } + if ($iso_env->{cfg}->{bridged_network}) { $ifaces .=3D "iface $ethdev $ntype manual\n"; =20 $ifaces .=3D - "\nauto vmbr0\niface vmbr0 $ntype static\n" + "\nauto $bridge\niface $bridge $ntype static\n" . "\taddress $cidr\n" . "\tgateway $gateway\n" . "\tbridge-ports $ethdev\n" @@ -1113,8 +1126,8 @@ sub extract_data { . "\tbridge-fd 0\n"; } else { $ifaces .=3D - "auto $ethdev\n" - . "iface $ethdev $ntype static\n" + "auto $ethdev_non_bridge\n" + . "iface $ethdev_non_bridge $ntype static\n" . "\taddress $cidr\n" . "\tgateway $gateway\n"; } diff --git a/Proxmox/Install/Config.pm b/Proxmox/Install/Config.pm index da476da..c8232a8 100644 --- a/Proxmox/Install/Config.pm +++ b/Proxmox/Install/Config.pm @@ -106,6 +106,7 @@ my sub init_cfg { cidr =3D> undef, gateway =3D> undef, dns =3D> undef, + vlan =3D> undef, target_cmdline =3D> undef, =20 # proxmox-first-boot setup @@ -279,6 +280,9 @@ sub get_gateway { return get('gateway'); } sub set_dns { set_key('dns', $_[0]); } sub get_dns { return get('dns'); } =20 +sub set_vlan { set_key('vlan', $_[0]); } +sub get_vlan { return get('vlan'); } + sub set_target_cmdline { set_key('target_cmdline', $_[0]); } sub get_target_cmdline { return get('target_cmdline'); } =20 diff --git a/html/ack_template.htm b/html/ack_template.htm index 48d7213..4404321 100644 --- a/html/ack_template.htm +++ b/html/ack_template.htm @@ -54,6 +54,8 @@ =20 Management Interface: __interface__ =20 + Management Interface vlan tag: __vlan__ + Hostname: __hostname__ =20 IP CIDR: __cidr__ diff --git a/proxinstall b/proxinstall index 5ba65fa..13ece1d 100755 --- a/proxinstall +++ b/proxinstall @@ -472,6 +472,14 @@ sub create_ipconf_view { $grid->attach($dns_label, 0, 4, 1, 1); $grid->attach($ipconf_entry_dns, 1, 4, 1, 1); =20 + my $cfg_vlan =3D Proxmox::Install::Config::get_vlan(); + my $vlan =3D defined($cfg_vlan) ? $cfg_vlan : ''; + + my ($vlan_label, $ipconf_entry_vlan) =3D create_text_input($vlan, 'VLA= N Tag (Optional)'); + + $grid->attach($vlan_label, 0, 5, 1, 1); + $grid->attach($ipconf_entry_vlan, 1, 5, 1, 1); + $gtk_state->{inbox}->show_all; set_next( undef, @@ -538,7 +546,19 @@ sub create_ipconf_view { } Proxmox::Install::Config::set_dns($dns_ip); =20 - #print STDERR "TEST $ipaddress/$netmask $gateway_ip $dns_ip\n"= ; + my $vlan =3D $ipconf_entry_vlan->get_text(); + if ($vlan !~ /^\d*$/) { + Proxmox::UI::message("VLAN must contain only digits."); + $ipconf_entry_vlan->grab_focus(); + return; + } + if ($vlan ne '' && $vlan >=3D 4094) { + Proxmox::UI::message("VLAN must be smaller than 4094."); + $ipconf_entry_vlan->grab_focus(); + return; + } + $vlan =3D undef if $vlan eq ''; + Proxmox::Install::Config::set_vlan($vlan); =20 $step_number++; create_ack_view(); @@ -585,6 +605,7 @@ sub create_ack_view { __cidr__ =3D> Proxmox::Install::Config::get_cidr(), __gateway__ =3D> Proxmox::Install::Config::get_gateway(), __dnsserver__ =3D> Proxmox::Install::Config::get_dns(), + __vlan__ =3D> Proxmox::Install::Config::get_vlan(), ); =20 while (my ($k, $v) =3D each %config_values) { diff --git a/proxmox-auto-installer/src/answer.rs b/proxmox-auto-installer/= src/answer.rs index 88f4c87..cea5cb1 100644 --- a/proxmox-auto-installer/src/answer.rs +++ b/proxmox-auto-installer/src/answer.rs @@ -186,6 +186,7 @@ struct NetworkInAnswer { pub cidr: Option, pub dns: Option, pub gateway: Option, + pub vlan: Option, #[serde(default)] pub filter: BTreeMap, } @@ -219,6 +220,7 @@ impl TryFrom for Network { cidr: network.cidr.unwrap(), dns: network.dns.unwrap(), gateway: network.gateway.unwrap(), + vlan: network.vlan, filter: network.filter, }), }) @@ -254,6 +256,7 @@ pub struct NetworkManual { pub cidr: CidrAddress, pub dns: IpAddr, pub gateway: IpAddr, + pub vlan: Option, pub filter: BTreeMap, } =20 diff --git a/proxmox-auto-installer/src/utils.rs b/proxmox-auto-installer/s= rc/utils.rs index 7d42f2c..2fdb6df 100644 --- a/proxmox-auto-installer/src/utils.rs +++ b/proxmox-auto-installer/src/utils.rs @@ -66,6 +66,7 @@ fn get_network_settings( network_options.address =3D settings.cidr.clone(); network_options.dns_server =3D settings.dns; network_options.gateway =3D settings.gateway; + network_options.vlan =3D settings.vlan; network_options.ifname =3D get_single_udev_index(&settings.filter,= &udev_info.nics)?; } info!("Network interface used is '{}'", &network_options.ifname); @@ -494,6 +495,7 @@ pub fn parse_answer( domain: network_settings.fqdn.domain(), cidr: network_settings.address, gateway: network_settings.gateway, + vlan: network_settings.vlan, dns: network_settings.dns_server, =20 first_boot: InstallFirstBootSetup::default(), diff --git a/proxmox-auto-installer/tests/parse-answer.rs b/proxmox-auto-in= staller/tests/parse-answer.rs index 6754374..e7836d3 100644 --- a/proxmox-auto-installer/tests/parse-answer.rs +++ b/proxmox-auto-installer/tests/parse-answer.rs @@ -129,6 +129,7 @@ mod tests { full_fqdn_from_dhcp_with_default_domain, hashed_root_password, minimal, + network_vlan, nic_matching, specific_nic, zfs, diff --git a/proxmox-auto-installer/tests/resources/parse_answer/btrfs.json= b/proxmox-auto-installer/tests/resources/parse_answer/btrfs.json index 0c1f032..f4b4b23 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/btrfs.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/btrfs.json @@ -18,6 +18,7 @@ "mngmt_nic": "eno1", "root_password": { "plain": "12345678" }, "timezone": "Europe/Vienna", + "vlan": null, "btrfs_opts": { "compress": "zlib" }, diff --git a/proxmox-auto-installer/tests/resources/parse_answer/btrfs_raid= _level_uppercase.json b/proxmox-auto-installer/tests/resources/parse_answer= /btrfs_raid_level_uppercase.json index cb6711c..88fb75c 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/btrfs_raid_level_= uppercase.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/btrfs_raid_level_= uppercase.json @@ -18,6 +18,7 @@ "mngmt_nic": "eno1", "root_password": { "plain": "12345678" }, "timezone": "Europe/Vienna", + "vlan": null, "btrfs_opts": { "compress": "off" }, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/disk_match= .json b/proxmox-auto-installer/tests/resources/parse_answer/disk_match.json index d5ffddd..331a210 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/disk_match.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/disk_match.json @@ -20,6 +20,7 @@ "mngmt_nic": "eno1", "root_password": { "plain": "12345678" }, "timezone": "Europe/Vienna", + "vlan": null, "zfs_opts": { "arc_max": 2048, "ashift": 12, diff --git a/proxmox-auto-installer/tests/resources/parse_answer/disk_match= _all.json b/proxmox-auto-installer/tests/resources/parse_answer/disk_match_= all.json index 78a5e0c..23ca3b6 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/disk_match_all.js= on +++ b/proxmox-auto-installer/tests/resources/parse_answer/disk_match_all.js= on @@ -17,6 +17,7 @@ "mngmt_nic": "eno1", "root_password": { "plain": "12345678" }, "timezone": "Europe/Vienna", + "vlan": null, "zfs_opts": { "arc_max": 2048, "ashift": 12, diff --git a/proxmox-auto-installer/tests/resources/parse_answer/disk_match= _any.json b/proxmox-auto-installer/tests/resources/parse_answer/disk_match_= any.json index 2e65fce..631cd66 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/disk_match_any.js= on +++ b/proxmox-auto-installer/tests/resources/parse_answer/disk_match_any.js= on @@ -24,6 +24,7 @@ "mngmt_nic": "eno1", "root_password": { "plain": "12345678" }, "timezone": "Europe/Vienna", + "vlan": null, "zfs_opts": { "arc_max": 2048, "ashift": 12, diff --git a/proxmox-auto-installer/tests/resources/parse_answer/first_boot= .json b/proxmox-auto-installer/tests/resources/parse_answer/first_boot.json index fafde51..eff4227 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/first_boot.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/first_boot.json @@ -15,5 +15,6 @@ "root_password": { "plain": "12345678" }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": null, "first_boot": { "enabled": 1, "ordering_target": "network-pre" } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_= dhcp.json b/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_d= hcp.json index 5ec6656..860d5b2 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_dhcp.js= on +++ b/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_dhcp.js= on @@ -15,5 +15,6 @@ "root_password": { "plain": "12345678" }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": null, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_= dhcp_empty_dhcp_domain_setting.json b/proxmox-auto-installer/tests/resource= s/parse_answer/fqdn_from_dhcp_empty_dhcp_domain_setting.json index 5ec6656..860d5b2 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_dhcp_em= pty_dhcp_domain_setting.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_dhcp_em= pty_dhcp_domain_setting.json @@ -15,5 +15,6 @@ "root_password": { "plain": "12345678" }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": null, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_= dhcp_no_dhcp_domain_with_default_domain.json b/proxmox-auto-installer/tests= /resources/parse_answer/fqdn_from_dhcp_no_dhcp_domain_with_default_domain.j= son index 7ed46a2..aeaf145 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_dhcp_no= _dhcp_domain_with_default_domain.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/fqdn_from_dhcp_no= _dhcp_domain_with_default_domain.json @@ -15,5 +15,6 @@ "root_password": { "plain": "12345678" }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": null, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/full_fqdn_= from_dhcp_with_default_domain.json b/proxmox-auto-installer/tests/resources= /parse_answer/full_fqdn_from_dhcp_with_default_domain.json index 7ed46a2..aeaf145 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/full_fqdn_from_dh= cp_with_default_domain.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/full_fqdn_from_dh= cp_with_default_domain.json @@ -15,5 +15,6 @@ "root_password": { "plain": "12345678" }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": null, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/hashed_roo= t_password.json b/proxmox-auto-installer/tests/resources/parse_answer/hashe= d_root_password.json index 4e049bd..a33aca5 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/hashed_root_passw= ord.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/hashed_root_passw= ord.json @@ -17,5 +17,6 @@ }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": null, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/minimal.js= on b/proxmox-auto-installer/tests/resources/parse_answer/minimal.json index 0339dbc..3d79f68 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/minimal.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/minimal.json @@ -15,5 +15,6 @@ "root_password": { "plain": "12345678" }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": null, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/network_vl= an.json b/proxmox-auto-installer/tests/resources/parse_answer/network_vlan.= json new file mode 100644 index 0000000..4b93e6d --- /dev/null +++ b/proxmox-auto-installer/tests/resources/parse_answer/network_vlan.json @@ -0,0 +1,20 @@ +{ + "autoreboot": 1, + "cidr": "10.10.10.10/24", + "country": "at", + "dns": "10.10.10.1", + "domain": "testinstall", + "filesys": "ext4", + "gateway": "10.10.10.1", + "hdsize": 223.57088470458984, + "existing_storage_auto_rename": 1, + "hostname": "pveauto", + "keymap": "de", + "mailto": "mail@no.invalid", + "mngmt_nic": "enp129s0f1np1", + "root_password": { "plain": "12345678" }, + "target_hd": "/dev/sda", + "timezone": "Europe/Vienna", + "vlan": 123, + "first_boot": { "enabled": 0 } +} diff --git a/proxmox-auto-installer/tests/resources/parse_answer/network_vl= an.toml b/proxmox-auto-installer/tests/resources/parse_answer/network_vlan.= toml new file mode 100644 index 0000000..fad56c6 --- /dev/null +++ b/proxmox-auto-installer/tests/resources/parse_answer/network_vlan.toml @@ -0,0 +1,19 @@ +[global] +keyboard =3D "de" +country =3D "at" +fqdn =3D "pveauto.testinstall" +mailto =3D "mail@no.invalid" +timezone =3D "Europe/Vienna" +root-password =3D "12345678" + +[network] +source =3D "from-answer" +cidr =3D "10.10.10.10/24" +dns =3D "10.10.10.1" +vlan =3D 123 +gateway =3D "10.10.10.1" +filter.ID_NET_NAME =3D "enp129s0f1np1" + +[disk-setup] +filesystem =3D "ext4" +disk-list =3D ["sda"] diff --git a/proxmox-auto-installer/tests/resources/parse_answer/nic_matchi= ng.json b/proxmox-auto-installer/tests/resources/parse_answer/nic_matching.= json index 5d707c4..58969af 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/nic_matching.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/nic_matching.json @@ -15,5 +15,6 @@ "root_password": { "plain": "12345678" }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": 123, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/nic_matchi= ng.toml b/proxmox-auto-installer/tests/resources/parse_answer/nic_matching.= toml index 901f894..723dfc8 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/nic_matching.toml +++ b/proxmox-auto-installer/tests/resources/parse_answer/nic_matching.toml @@ -10,6 +10,7 @@ root-password =3D "12345678" source =3D "from-answer" cidr =3D "10.10.10.10/24" dns =3D "10.10.10.1" +vlan =3D 123 gateway =3D "10.10.10.1" filter.ID_NET_NAME_MAC =3D "*a0369f0ab382" =20 diff --git a/proxmox-auto-installer/tests/resources/parse_answer/specific_n= ic.json b/proxmox-auto-installer/tests/resources/parse_answer/specific_nic.= json index 49240b4..3e4fdd4 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/specific_nic.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/specific_nic.json @@ -15,5 +15,6 @@ "root_password": { "plain": "12345678" }, "target_hd": "/dev/sda", "timezone": "Europe/Vienna", + "vlan": null, "first_boot": { "enabled": 0 } } diff --git a/proxmox-auto-installer/tests/resources/parse_answer/zfs.json b= /proxmox-auto-installer/tests/resources/parse_answer/zfs.json index 622f6d6..0b9b912 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/zfs.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/zfs.json @@ -18,6 +18,7 @@ "mngmt_nic": "eno1", "root_password": { "plain": "12345678" }, "timezone": "Europe/Vienna", + "vlan": null, "zfs_opts": { "arc_max": 2048, "ashift": 12, diff --git a/proxmox-auto-installer/tests/resources/parse_answer/zfs_raid_l= evel_uppercase.json b/proxmox-auto-installer/tests/resources/parse_answer/z= fs_raid_level_uppercase.json index 46b8344..033168e 100644 --- a/proxmox-auto-installer/tests/resources/parse_answer/zfs_raid_level_up= percase.json +++ b/proxmox-auto-installer/tests/resources/parse_answer/zfs_raid_level_up= percase.json @@ -19,6 +19,7 @@ "mngmt_nic": "eno1", "root_password": { "plain": "12345678" }, "timezone": "Europe/Vienna", + "vlan": null, "zfs_opts": { "arc_max": 2048, "ashift": 12, diff --git a/proxmox-installer-common/src/options.rs b/proxmox-installer-co= mmon/src/options.rs index 48c77c9..1f849cb 100644 --- a/proxmox-installer-common/src/options.rs +++ b/proxmox-installer-common/src/options.rs @@ -483,6 +483,7 @@ pub struct NetworkOptions { pub address: CidrAddress, pub gateway: IpAddr, pub dns_server: IpAddr, + pub vlan: Option, } =20 impl NetworkOptions { @@ -507,6 +508,7 @@ impl NetworkOptions { address: CidrAddress::new(Ipv4Addr::new(192, 168, 100, 2), 24)= .unwrap(), gateway: Ipv4Addr::new(192, 168, 100, 1).into(), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, }; =20 if let Some(ip) =3D network.dns.dns.first() { @@ -715,6 +717,7 @@ mod tests { address: CidrAddress::new(Ipv4Addr::new(192, 168, 0, 2), 2= 4).unwrap(), gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 0, 1)), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, } ); =20 @@ -727,6 +730,7 @@ mod tests { address: CidrAddress::new(Ipv4Addr::new(192, 168, 0, 2), 2= 4).unwrap(), gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 0, 1)), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, } ); =20 @@ -739,6 +743,7 @@ mod tests { address: CidrAddress::new(Ipv4Addr::new(192, 168, 0, 2), 2= 4).unwrap(), gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 0, 1)), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, } ); =20 @@ -751,6 +756,7 @@ mod tests { address: CidrAddress::new(Ipv4Addr::new(192, 168, 0, 2), 2= 4).unwrap(), gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 0, 1)), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, } ); } @@ -767,6 +773,7 @@ mod tests { address: CidrAddress::new(Ipv4Addr::new(192, 168, 0, 2), 2= 4).unwrap(), gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 0, 1)), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, } ); =20 @@ -779,6 +786,7 @@ mod tests { address: CidrAddress::new(Ipv4Addr::new(192, 168, 0, 2), 2= 4).unwrap(), gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 0, 1)), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, } ); =20 @@ -791,6 +799,7 @@ mod tests { address: CidrAddress::new(Ipv4Addr::new(192, 168, 0, 2), 2= 4).unwrap(), gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 0, 1)), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, } ); } @@ -829,6 +838,7 @@ mod tests { address: CidrAddress::new(Ipv4Addr::new(192, 168, 100, 2),= 24).unwrap(), gateway: IpAddr::V4(Ipv4Addr::new(192, 168, 100, 1)), dns_server: Ipv4Addr::new(192, 168, 100, 1).into(), + vlan: None, } ); } diff --git a/proxmox-installer-common/src/setup.rs b/proxmox-installer-comm= on/src/setup.rs index 66cea72..23e43d2 100644 --- a/proxmox-installer-common/src/setup.rs +++ b/proxmox-installer-common/src/setup.rs @@ -580,6 +580,7 @@ pub struct InstallConfig { #[serde(serialize_with =3D "serialize_as_display")] pub cidr: CidrAddress, pub gateway: IpAddr, + pub vlan: Option, pub dns: IpAddr, =20 pub first_boot: InstallFirstBootSetup, diff --git a/proxmox-tui-installer/src/main.rs b/proxmox-tui-installer/src/= main.rs index 15ee5d3..21ef16f 100644 --- a/proxmox-tui-installer/src/main.rs +++ b/proxmox-tui-installer/src/main.rs @@ -516,6 +516,14 @@ fn network_dialog(siv: &mut Cursive) -> InstallerView = { "DNS server address", EditView::new().content(options.dns_server.to_string()), ) + .child( + "VLAN Tag (optional)", + EditView::new().content( + options.vlan + .map(|v| v.to_string()) + .unwrap_or_default(), + ), + ) .with_name("network-options"); =20 InstallerView::new( @@ -552,6 +560,23 @@ fn network_dialog(siv: &mut Cursive) -> InstallerView = { .parse::() .map_err(|err| err.to_string())?; =20 + let vlan_str =3D view + .get_value::(5) + .ok_or("failed to retrieve VLAN")?; + + let vlan =3D if vlan_str.trim().is_empty() { + None + } else { + let parsed_vlan =3D vlan_str.trim().parse::() + .map_err(|e| format!("Invalid VLAN: {e}"))?; + + if parsed_vlan >=3D 4094 { + return Err(format!("VLAN must be smaller than 4094= .")); + } + + Some(parsed_vlan) + }; + if address.addr().is_ipv4() !=3D gateway.is_ipv4() { Err("host and gateway IP address version must not diff= er".to_owned()) } else if address.addr().is_ipv4() !=3D dns_server.is_ipv4= () { @@ -565,6 +590,7 @@ fn network_dialog(siv: &mut Cursive) -> InstallerView { address, gateway, dns_server, + vlan, }) } }); diff --git a/proxmox-tui-installer/src/options.rs b/proxmox-tui-installer/s= rc/options.rs index c80877f..c59712e 100644 --- a/proxmox-tui-installer/src/options.rs +++ b/proxmox-tui-installer/src/options.rs @@ -72,6 +72,7 @@ impl InstallerOptions { SummaryOption::new("Keyboard layout", kb_layout), SummaryOption::new("Administrator email", &self.password.email= ), SummaryOption::new("Management interface", &self.network.ifnam= e), + SummaryOption::new("Management interface vlan tag", &self.netw= ork.vlan.map(|v| v.to_string()).unwrap_or("None".to_string())), SummaryOption::new("Hostname", self.network.fqdn.to_string()), SummaryOption::new("Host IP (CIDR)", self.network.address.to_s= tring()), SummaryOption::new("Gateway", self.network.gateway.to_string()= ), diff --git a/proxmox-tui-installer/src/setup.rs b/proxmox-tui-installer/src= /setup.rs index b90c7dc..5114106 100644 --- a/proxmox-tui-installer/src/setup.rs +++ b/proxmox-tui-installer/src/setup.rs @@ -41,6 +41,7 @@ impl From for InstallConfig { cidr: options.network.address, gateway: options.network.gateway, dns: options.network.dns_server, + vlan: options.network.vlan, =20 first_boot: InstallFirstBootSetup::default(), }; --=20 2.47.3= --===============5633472189022210441== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel --===============5633472189022210441==--