From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id DF2611FF0AB for ; Wed, 23 Sep 2026 14:25:28 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 772A9215B0; Wed, 23 Sep 2026 14:25:20 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=taeaEmejGjjKexzV/ZQYM2XlhP1uS6A0kvBMQlST6ElbdmMkWt1VWDyIHYTJcOSQ+sOWxbFgfEGVBB0qbzcfrJvAS1lQbUhDrYO7c86p46zOFo33Xi0hnr/JgeVooUmMFt3SmsIQSY3qvIN6uz3ZeGwhdzn2DNrkztQ/JIde4f23QNkCcW9V6Buk2ODYkcut3O/46cTxfk8HcPa3MxTDmAtSSF/dVPuFtRId/QYZbfCDhYehr66jZ9m5sgL5c/39dHw00txxYOCAoxNap3kWvoMC5mr2mCEkzLBHDXM8RqcHgerbVUTco6Btqdb4inl6LeKTSDvSvhZU0dCss0s0Tg== 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=MYncRLoqOBhAneQt4Q9lG+bOCxS2XW9Z1PGWWcSaXmU=; b=sSWGTntsV833an7uBy/4nCjZxiWiYaWUnNmH5DfMYacar6FlaDpH1fxnPQGwVpeaUYkIodizMjkgie6L2VZNpq3lLyIgKCMP1WEx6O+PIq+XbhRaBygmke9NYobSpHmJQepPpqEe91yhbz7/+wxOgI0SzEpIQe+TXIGsQ093e/Lwe7+ZrZdls9gpRokoMBwbvEx9MFxJr7+OukkFl5E4CCZZ6eV965o/BZ8sDITx9F+n0FiiS1G/yF4UZoFVQYNNiqjiLkXrB5jDk6Smq4ifuBMo2OgvxRCEKdeNNMQyiBMOjiV6/Av4mrG/FJLt/KyTLZbH2W11dMjSv0P4E37APA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=OUTLOOK.IT; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=MYncRLoqOBhAneQt4Q9lG+bOCxS2XW9Z1PGWWcSaXmU=; b=F5ToExxXtfb51Mx+HHsl+szbTEQ437y9Vz61a2Jv/DgKX52B4iIjqunjqo5w1YflP3wyAGIFXQryU2Hx8L0PmNxYvSFq6VI8gOj+qmNKzaWabYlnlYu221gXRulZvUJPtT5jntYNcA2E6vC3ltabDxex8yJA7mdASijQjI2NzFloXyKWyb99Qa33SSzsNtXR78eWz300hkb+VcYrYaYntPspOatJZQUzMhosKYQVs2n21WTN/DRDcyskyiiQlXyo8C+PBbI4HALcpsQxED6PKQZsuM52oRzg7Q51XqOGCazpEb81LbUHOaP/DQ8iN7+nvkrlLon7v4Q9hFJrAa5JBw== From: Mauro de Pascale To: "pve-devel@lists.proxmox.com" Subject: [PATCH 1/2] manager: add API endpoint for streamed VM backup export Thread-Topic: [PATCH 1/2] manager: add API endpoint for streamed VM backup export Thread-Index: AQHdS1ZkxCabnhySQkW1GVAOzVxApQ== Date: Wed, 23 Sep 2026 12:25:08 +0000 Message-ID: Accept-Language: it-IT, en-US Content-Language: it-IT X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: LOBP265MB8961:EE_|CWLP265MB6847:EE_ x-ms-office365-filtering-correlation-id: 3c541ee9-c6cf-4331-210b-08df196db483 x-ms-exchange-slblob-mailprops: F3kBGFPBgzYMDyXLQkgUaCYjF6hsLC12kFuBvKoIw9b6UV5kIztz3UpQ9VeDCK6tYj/TjGbR3Am7thc0Ui0WpAPHL+dixlT1SkEM4zuOt+vukfd7Lz+R/zhwzgQpG6XXHuc/c11asgXQ+UdbYLdfocreO0FXkg7Vq+v8e+yos2JZBBOCI0oMwRraXEYBE2zdWw37vQmhjHIjkh9ZsbP0TlxRDZGyVLm8Ao0wkxSC+PWzojuRtzdSiL02CRiJwNMpGdcirxtNhPKUyVJ4muK8W+CUAKAMy1sAJyKT2C91QdufLgCX8XM2c6/IlIgdxuNx9xfMOJB++lFVfqmjBQcOWwxE1mUUH0ao9itx1oRSWgVB+1hU4zejIHxlmiyJFZBqh9RRm7TGmfI7sPvS0GkCNfEoyTyzHMhGB1k6SW3IUEAhUVJJHm8liP5WjFWyS2Fm7h9fm0w85o0jnRJNHvp1IrYpKkX7djTWnSW24SPcPc1FDrY76+FfyswQx8d2I+v889LARiDLK47qOwgpurik6DOYZd9QSic0GUVKxOfpvUDgbR+ISUA1XwHvZyljNDUBqxKhDa8G48ahQqAyz9f9xP6JvjM51ln/5x0ZhUwBejLNMJJ3PyOWkJNyFJQB2xZfJXWfxZgyIvNWc5J4D51fBxBdpvvM+OYosbeLVQq2MC3O3SxzbKZm9gE0cInVtlZKeZgoYoiaSg9Htu3vghaNNEIiMaVwAa4UBkyfnr+8VunWTl2UXfOHGbL1H6yfy49/THxOgP78yU2aZmpmAtB+vLDmFQaQzCyf x-microsoft-antispam: BCL:0;ARA:14566002|15030799006|15080799012|24021099003|12121999013|25010399006|41001999006|5062599005|51005399006|8062599012|19110799012|8060799015|31061999003|40105399003|2607281247196008|102099032|3412199025|440099028; x-microsoft-antispam-message-info: =?iso-8859-1?Q?7uNahywwFPwtIFqZSBSFZWxXo2W18ilwmPanntK/h1s8Sm2xUHMOKyN+jC?= =?iso-8859-1?Q?Gz7uICmlVixs6JbulxALFLG8IKPGt4J4CTyJU5ji82l+uEjmVhPe+0NsqP?= =?iso-8859-1?Q?gavmQE8mL3aq9zN8884s4mrrKXy4RsBTGY4rSzUJv9QJtEzsOo8Bk6VQxu?= =?iso-8859-1?Q?6mquEIV2VRgB55wVrZZD/PxxQ4rHUGIKh8JTW2Ii9qle2dSjJxU9JMgiIz?= =?iso-8859-1?Q?RtY4kenQ54O+V/j8UKbDjuUfEabW4mI0Ty6dfhIlhNzDPyF/nLV5SzlRyw?= =?iso-8859-1?Q?TUgETriq2ZYiutycTbv8lXc5EBwBVk2n3HXa1xFn819lifPm9t28fSCyrC?= =?iso-8859-1?Q?qIFyzfpu8kKXeFJ+zT21MD1y1u9Ypqf4ph520fD+UVAoGVL67hllhTw8Iu?= =?iso-8859-1?Q?lkQrd0XSMgTFaUETFnB2JAw574NhnAcbEacmAbx+hibXXwn0P4FJ9Chnji?= =?iso-8859-1?Q?MZLHkXnCLjMUog9XAhjiuzXuTTDZBJApdmbQU/CKaWqtOXLXjZm+GYQMrq?= =?iso-8859-1?Q?f0suom2FqeKrw0hLyVT6PoiI1ZtZ9lWqOe2zYyvk5P91BzhkgUI7tqLpQq?= =?iso-8859-1?Q?UqLGawuDq18XU7RRz5HDdvBfOI8wwFZn8gJPNo+K3H8+53C/+CgrkW4L29?= =?iso-8859-1?Q?LCq4BFg5sJCB/3IxODZlNcJjgY9WTohMCSm6yXLCr5PfIuIEbhucP7mX4x?= =?iso-8859-1?Q?zt+RwmaiWX+2T0G6ON/gxMJP7KCIOIjrumE6pSfXEVEPsDUWYOyt1esfJe?= =?iso-8859-1?Q?gtZ9RUr7Q07Af3sBLxR7VFVUK5w60r9VP5GZm8k2yyb7XknHt7i3pJkrmb?= =?iso-8859-1?Q?HZrNcM4wQ7PJpqBKz5ODLsCNPVXM0Z8r5IIXtiCQZrvrj1YM7EuY3qr/qw?= =?iso-8859-1?Q?1Uf74JS9YyslGRY2xX3In7scAJ1WmyqZsTQteQhelhYh3jvKgclcF/hcD3?= =?iso-8859-1?Q?hB2HQ6yvtqdVP4IzSs9w+Rx9hufDp2TFHW1MxzZ0gIodu8nhPidQhQ8isT?= =?iso-8859-1?Q?ASBHjAMj3XHg7l7NdHCkfNLPLzrGUWBjJKeji5kPZnj6plZJBShwQKFumw?= =?iso-8859-1?Q?58bRXEFVdPzURv/6jZa3MaRSs74v9J9NA5CnHATMAjJw?= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?8CkoWxpn3DspJXtvJJ4w1rKsLjKpBRd/fX1OxspSpLPuzuys01NjdHv/Hs?= =?iso-8859-1?Q?TgyzHY/K+lm2dd9efr6oiNxfdXFxSj4ge/sDrAhxoP9IBVOIO5s9unFHaT?= =?iso-8859-1?Q?OGeXXLE7/pcn6/gZMWfUbnUWHbXvpagyfUzCifl2ObSU9ibrVrvTTK6bqX?= =?iso-8859-1?Q?ot6DUjqoPTYkkXZFID7+HIk4FaD/1O9QZr5kID/DRMvIMf906ZNdYjPz1g?= =?iso-8859-1?Q?2yDnq4CNc9mwus0GVp5Eqq+CHiuPUnTjfy160OJny6y8ZX6hQTu8rDlTNb?= =?iso-8859-1?Q?CWdTKJAeNblE30JLoS4YUhAzvPTE3D3lRSeUaz3jg2TfkrcPILo93833kB?= =?iso-8859-1?Q?jRYxETZ5upjHz5e/mB/mR+D2+Ju8rIXx3mqO1ZrPzetyY+Ie98FlabY5uA?= =?iso-8859-1?Q?buDlwGQssH9esdILgdzwwAThlcnNkgEg/EG19W7u9aJoePbXToaTU6LxYs?= =?iso-8859-1?Q?g6LM3o+UyR+Djv8LEKBNNWbrWBoxh+pIix+/BUT+waARcow+uu2QruzSX/?= =?iso-8859-1?Q?3K3N8ZT6puzdNlaR8jeKvVxuRjx8bs11VAILQWS/y6E9N84IuhQay6gbBa?= =?iso-8859-1?Q?WrzzLy1lGWA0pG/QBMubeVBE72n3DoBu5M4kemolz0h95O0b3VQqEghTy3?= =?iso-8859-1?Q?OFVHz/kyQWlkmElvh3ZmN+q5bcFS+X2r45vYZlEun4kEt1QlWV3lMXKnFS?= =?iso-8859-1?Q?0Mh+ZapxR3V1EmyrIrtl6CO/c9sdvP3fxhlscfoBz1atM/xOVQ1MG2QeRy?= =?iso-8859-1?Q?nQuvl6Q8w0E0aECsQePlGpdxAohfq9HuOjTqvRo3jLio/RFRYpANFYeBph?= =?iso-8859-1?Q?xtxPoL5jrGP6ODs6yNLN+UZem9covQ++CCbsIAx7Pg2H32A1FA7lbFkM/q?= =?iso-8859-1?Q?h4ZQHSZAYdnVEHWZkKneMJ/kzKE5iKZ/BYw3nqxGHjm96bRlVnDWcENHOR?= =?iso-8859-1?Q?IIYD16lyMf/wLimP9OUvaW52g85hvbvD9nh0Et32qJd/JkHgi0kt6CMFvj?= =?iso-8859-1?Q?CC9csjrujy4QJlScMLlfEQE3i99VIDecjL1a0CeQEKOrJLcLFUiFxu1K/3?= =?iso-8859-1?Q?29V6hNfyl9DMB7gSE7HCZAHurS4PFNLxe7r39o+q/hvIZSrO5MhulIhkVK?= =?iso-8859-1?Q?iX8fPQwuJVsh/+gH7/XbI75scS8MlYC9EBHzG/PeHGRqyueB8ZFptygv7v?= =?iso-8859-1?Q?0tbY/79/QgT/3TMDtSArxZCILRC7Kaa+Qxfkhurc7qU3s6L8Y5nei8hUwG?= =?iso-8859-1?Q?NM54NfwZn3dEL+8Xt5YHZd2wz/MO7bTY27xDXanFAmq3qpUfqo1eiGRCy/?= =?iso-8859-1?Q?3SoBPJwvtlpWYjm711/OVDipG7UxscLu1NBin/7bTbKWpUu3OlZuFjkJ2P?= =?iso-8859-1?Q?+JtgsiDsuLDI45OEXIS0mq9cnWOxpEnMPvpyENNrQ3Oo1nQ87PA7khi1hN?= =?iso-8859-1?Q?aS/qvd78maG1RtE2K0vfzP+jSXGC+IDc2OZ8ww=3D=3D?= MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-9412-4-msonline-outlook-7f0c1.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: LOBP265MB8961.GBRP265.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: 3c541ee9-c6cf-4331-210b-08df196db483 X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Sep 2026 12:25:08.0173 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CWLP265MB6847 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.001 Adjusted score from AWL reputation of From: address 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 FREEMAIL_FROM 0.001 Sender email is commonly abused enduser mail provider HTML_MESSAGE 0.001 HTML included in message RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: F3WI45ARXS6RADGXBD2NI32ALW3JKT4O X-Message-ID-Hash: F3WI45ARXS6RADGXBD2NI32ALW3JKT4O X-MailFrom: mauro.depascale.work@outlook.it X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="iso-8859-1" X-Content-Filtered-By: Mailman/MimeDel 3.3.10 X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Mauro de Pascale Add an API endpoint that exposes vzdump output as a streamed download, allowing clients to export VM backups directly without storing them on the server first. ________________________________ PVE/API2/VZDump.pm | 65 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/PVE/API2/VZDump.pm b/PVE/API2/VZDump.pm index a8f21eba..84f42352 100644 --- a/PVE/API2/VZDump.pm +++ b/PVE/API2/VZDump.pm @@ -9,11 +9,15 @@ use PVE::Exception qw(raise_param_exc); use PVE::INotify; use PVE::JSONSchema qw(get_standard_option); use PVE::RPCEnvironment; +use PVE::SafeSyslog; use PVE::Storage; use PVE::Tools qw(extract_param); use PVE::VZDump::Common; use PVE::VZDump; +use IPC::Open3; +use Symbol qw(gensym); + use PVE::API2::Backup; use PVE::API2Tools; @@ -311,4 +315,65 @@ __PACKAGE__->register_method({ }, }); +__PACKAGE__->register_method({ * name =3D> 'export', * path =3D> 'export', * method =3D> 'GET', * description =3D> "Export a VM dump stream", * proxyto =3D> 'node', * protected =3D> 1, * permissions =3D> { * check =3D> ['perm', '/vms/{vmid}', ['VM.Backup']], * }, * parameters =3D> { * additionalProperties =3D> 0, * properties =3D> { * node =3D> get_standard_option('pve-node'), * vmid =3D> get_standard_option('pve-vmid'), * compress =3D> { * description =3D> "compression algorithm to use.", * type =3D> 'string', * enum =3D> ['zstd', 'gzip', 'lzo', '0'], * optional =3D> 1, * default =3D> 'zstd', * }, * }, * }, * returns =3D> { type =3D> 'object' }, * download =3D> 1, * code =3D> sub { * my ($param) =3D @_; * * my $vmid =3D $param->{vmid}; * my $compress =3D $param->{compress} // 'zstd'; * * my $suffix =3D $compress eq 'zstd' ? 'zst' * : $param->{compress} eq 'gzip' ? 'gz' * : $param->{compress} eq 'lzo' ? 'lzo' * : 'vma'; * * my $filename =3D "vzdump-qemu-$vmid.vma.$suffix"; * * my $cmd =3D ['/usr/bin/vzdump', $vmid, '--stdout','1','--compress',$compres= s]; * my $cmdstr =3D join(' ', @$cmd); * syslog('info', "running export cmd: $cmdstr"); * * #my ($fh, $pid) =3D PVE::Tools::run_command($cmd, pipe =3D> 1); * open my $fh, '-|', @$cmd * or die "unable to execute backup $! "; * * binmode($fh); * * * return { * download =3D> { * fh =3D> $fh, * filename =3D> $filename, * stream =3D> 1, * 'content-type' =3D> 'application/octet-stream', * 'content-disposition' =3D> "attachment; filename=3D"$filename"", * } * }; * }}); * * 1; * -- 2.47.3