From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [IPv6:2a0f:8001:1:32::40]) by lore.proxmox.com (Postfix) with ESMTPS id 1C9321FF13E for ; Wed, 01 Jul 2026 10:05:32 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 83B46214CB; Wed, 01 Jul 2026 10:04:56 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XCOLL9iVmyuiBbaoSYgWxXzpMrNZQ9aVF+rOp/UtT/2gjFQt2Zf2FX6xzJXmk1g4ZpAPZ3smU4ovvlgf0MDPeGnUG4LBcKTjPrqEDSEA97N9tjq2i/29uDFGVYkvRGcHz3dMg0x8xd7sLWNSyoam6w+r5cYAcVRTOBFKg1Sk0bHl2QZNiHUiHvkqVwkQyBZN1JhVDsDcMO6AJFkbwfFXZLtLCU13bwysbLJNi8rq/r2cn26uuKP+D+OSJqctKh7Xntb6SDX0GkV/m+tQqvTHIS8PWyUzqthNssi8qSTffvX7adxeChWn+SzkTGE5lVpdZ1Wl4gFOyrasEURBuf4+ow== 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=aXifJA2DU0A/mYQD585PZBcMEoc7swMaa+915u6VrvQ=; b=wVewtNbsoN4J6Td3T2Ej7dDsyMicPo/tEHd5fqlaxh+swO1qsmXssyeVpkuzOpcEU2IEb4jUXxNeBFIC/bSnmwWsHp0HSnKYOYr7J5rPw3d95rp2kmXv4B/aqw1of4Fah2sIc+a5ZGLxpIEQCHgIufYMelvsP+uUerZs2VXBB5ryd0/2ZyXsxWryIZL+IgtS/p2BFXozYUPCkmaumrWJ6zQ2kVagGuOUHocVe+dXSbOZB1bF12+IzbPpSOQrq+clGbMYMtCaTwMJ0JuAJwFSMM6lkkIkkHI2bISKvVy+Yje/St4pSEkZogzVFZ92HfgGLMbJQVyAUkHon5CQYKBLyg== 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=aXifJA2DU0A/mYQD585PZBcMEoc7swMaa+915u6VrvQ=; b=KzPIIUIO6XLU5moqkAeedlorXejHDGogXeCeBuVV5THpF7JwhyJ9aYxt0thXQRxkCuVPwyev0BrslNCmxDQ+2eKfyQzf59SoLYxJ1cnSDUtk7mv0gwn+Pt0El/JTkvpCDthJANJtMrzUdZN6r00opGo+YQeRCdWeOOie7KOfbAYrz5KEDbkfv1NCCheorsXzmc5iR8uMRh4WyKWf4PczFOcUPZlYX+dFrEsJE4/oQeo84QoiseBqIHIvTd32xX7fU4heqJYWbWT701w0GFlKov76WeeX0PtI9+gVFo19TUrEO1pa+PgYXEoa2/U3Of7nYQX2Lf6bjfolmvsotrylfQ== 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: AQHdBYr7Kup6cSV+mEy2JPi90vh8Zw== Date: Fri, 26 Jun 2026 16:43:57 +0000 Message-ID: <20260626164354.44747-2-mauro.depascale.work@outlook.it> References: <20260626164354.44747-1-mauro.depascale.work@outlook.it> In-Reply-To: <20260626164354.44747-1-mauro.depascale.work@outlook.it> Accept-Language: it-IT, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: LOBP265MB8961:EE_|LO3P265MB1771:EE_ x-ms-office365-filtering-correlation-id: 71940e57-d5fd-4d9d-236b-08ded3a21e1c x-ms-exchange-slblob-mailprops: laRBL560oLSPhlJ95/U7v6W/AahuugGaPQef+lA0CVfj6DRVmgekfeE6ef4nL5sJPqYqrUZAKDC0xcpdZSxicLXMnBmn9+d6LOI4OaqeS+5JgiU5oJ5M0LKBWonuyq9TNuP3uZZ/VS554C30qt22hUM5fXgSFzTCMVKFq0gEXUq9pUFUzSJO68+QALZPHr+WYK7yNOA+4xzAFkdMCvyq5YtlKgqNQ7C0gN9VrpvpP15/Qg4cdNiojgilV7YtRHpTGN9//CKbAL832DPZZNxy1KPf74efKXoArqgjgEeIPySBh1mYtt01DD5YYtsmtk+Lmodraa+bo8yNbZUtpZ3sWDlojpl6/Ro3l1IXO5XoGsc9Dh6Oq8dAwLfNV8PtWRfCwM4GY3AFJ1JcgZ3BLcDUj7ni0w18OxsKoet0ttlQukrb+mJd+77t16JeGfJKeh1ghteu7aJWmERlsYikxB65ZiAHfVBW5TAsXm7KSMminViy33J4woUtB4SfAW0rF2gASKLf9/wa17JkI/62e2Z8vRouWrULWQMFSAmwW78MroyI17ouW8oVr1QhtHTRp72DYVQWp2Ujr8tw4tkcnEkMuhOuv3pVpJViR7meq9+feEbjunQ8MrKfH/5a89vYdSQW1ii7ROb72eFqrLWl8Di+aFchRh/zUKUmvA73ZesxVz5DTGPruUTVrbC90iccgLqlBJ7eyVgh/Mz85S8nAXz78m6KJKxWOyTmFWnBpkkGQsaTc483IBaRZm0bz6Hlf4j94svEwNYW7FJEcwmrdnqJUIX2r6DOepMB x-microsoft-antispam: BCL:0;ARA:14566002|15080799012|38102599003|19110799012|8060799015|55001999006|8062599012|31061999003|12121999013|51005399006|24021099003|25010399006|41001999006|40105399003|3412199025|440099028|102099032|1710799026; x-microsoft-antispam-message-info: =?iso-8859-1?Q?vQvvi/lFE06Dl9Q24skOMOMHPs4fiM7UgJPuKEvszwQgnsE+gIMBZKSn98?= =?iso-8859-1?Q?r3HpYyevfbWLOORaZZog9EGdLkn7M767sMaMUcLzDl3KCkSKFBDpTKufPb?= =?iso-8859-1?Q?XHp54P6xpTLUOExKsIulFEIbHvJRGb5sxiBlqYRJQB3srzWYfEqw/lBccq?= =?iso-8859-1?Q?C6lVz0QBhULmp3k38Pk7VSQoCW5gvJiARficDJ/EywFp0/ai1unctJul5K?= =?iso-8859-1?Q?0oStzAlDNZZy9rsBEvsLSKvvEKZ+DLOldSOW/3H/XuYMRB7XH2LxrervnB?= =?iso-8859-1?Q?6ywshAyaEz86jjZ6vnARNRZ43oyWUDdFp0B7AwDADVpYd0rMwVeaCkWhkE?= =?iso-8859-1?Q?Ex6J8LXEdRhT78n5dDNdC3ekXamj18B0hJUKat/IMLsZWMG/XUapiLJP+8?= =?iso-8859-1?Q?9jXaMnDRJZgBUFR3297wl53PUvb42ZJQndoceq9q8Xuf3rQk9OuYe6hlRj?= =?iso-8859-1?Q?uE1lwp7ubm7DHi+U+l+aINiice6N1TFgcZUWO7Qze6CMWCmi4UpIYLkBKB?= =?iso-8859-1?Q?hULNkARNKeNMNCAwoBYS6FMN3tbIpqQjXvDXWtJqVv6HxKDyonhCthostN?= =?iso-8859-1?Q?oRnKdUzk81qKxFNjQZ5t+CuhGU9b4sm0dSknRaKYB5ChcMTfLhFfdvI15w?= =?iso-8859-1?Q?1tcwUxCus6Ep+1h9JfGKStBN2fL2y1j9BfG2+Ee6zTA+Yw61bY5t6nmeUu?= =?iso-8859-1?Q?s/LIyAJO3fVG+jKyM/3i+pb2pPo4EXoDeyXCy++sGRPBW2V5GNdmTNsRQ6?= =?iso-8859-1?Q?WEWSfRuC5bGMc1F4SU7gjbrdPvG19LFQxdXYUmbDv48T7q52BPEYmJAKvs?= =?iso-8859-1?Q?IfxkVSq77mfzkCM97MZW85zn+yNb+uVjk/mrbEwjO9+o7MWTEZvMfyxXmJ?= =?iso-8859-1?Q?HELPq21rV4PpE9dLXGJXQ/7Ea0SXbRJYhruobilLS4EuBPwlst71s3IeSj?= =?iso-8859-1?Q?FefsZI6rcgCOZjNlDGabo+w0Dqgi4fOomdg2gGMzuyOVACf57fZ80fOy8U?= =?iso-8859-1?Q?EDEtfU0PSD7ID+QuWqxDHi0AtKAn1kf0xlEdlwVGIhKKF58SXtCgrykmrQ?= =?iso-8859-1?Q?Jzt3AggNn7c1c3mh4nMoMNdcwXEUr4MFvh0x11BEx98jKoCd+Y26tFAbmy?= =?iso-8859-1?Q?KarmQFJC/EkibA6M3zdlUwffgVrb4=3D?= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?4edFS2kallph9S3szUnuKHnnMvkVUFO4YgMPaBB3Oezp4s61Cy4UaxwmOi?= =?iso-8859-1?Q?JPTW3Gol8maJxjVt1/WdNmExFRLErT2U9/6nQzh99M/+Kjt0Jax83RPqfm?= =?iso-8859-1?Q?CK4tLXAN5B3mHoKE8B7FA+klpXTUYgXlUBfq5prEE+LIE/mKicUrlIvK4p?= =?iso-8859-1?Q?QuihpRh1T2wGDRIsx2qOYrrrtqfuLWduqIPQXm1abAzov5VQJFktdtnTNV?= =?iso-8859-1?Q?XFCTRNacb7Bq0QcElyNWV6UVkAHJ3zefQc01usgPmq7cW5jIxH2NuksGoF?= =?iso-8859-1?Q?zy2ArU88ilDxcRRMCDF+dlRoXO5VGD9cpVCqOht4jkBu3WlYFnNZPobRiu?= =?iso-8859-1?Q?SC2yY7XP9A8YcK/3NI+sm254ognBrk5hkrlU9XELd1owJJKaHUusFmNT7u?= =?iso-8859-1?Q?/L58lHzBep6VT8ewM939Ucu2K0jK50yqaCws2ShOcS/4OGssg+9ssI6gXC?= =?iso-8859-1?Q?HxzOFtjpgCxvJQ/ApTnURSRiKuaj78M+iGCtKkCuBDKRfcI8cnEeElI1OF?= =?iso-8859-1?Q?hE+nMInPzWna1QGYtBEHHgZLMwZusqG8JMZWPzSCcqLgwwAGZjqecpqO6X?= =?iso-8859-1?Q?njFmowFH3jSO9ekAenzU4Dr4tTxgOHaR5DpFmK7WmGv8plhjCxEWqMURiP?= =?iso-8859-1?Q?gkRPUmCMPP8zLzgKZ05H1fZeIMQfldXGsnTF8FUpErypKSvcC4Ip3TD7UY?= =?iso-8859-1?Q?s0tbcHUN/8qSZmMU1VzTk8Lnvx+9rbxP896NT7lAD7xxvY48Xwu2LvYVax?= =?iso-8859-1?Q?1BJPwYYHN1qKyipLZWXTOpGAWkEqHwm05naQn+sYHqPwTWW/KpyxoVVAAy?= =?iso-8859-1?Q?HDw19MaKHzkO55XIKP/tkIPIObWvZ3FJSmRNOUx7fcmgHSDULASmC27HJr?= =?iso-8859-1?Q?9W9eHibSECUjGHGBjlmqDUoGW+UHsJuZ6wuSE5Ypo6EX9DtALgMJuUvWud?= =?iso-8859-1?Q?gz8Ahe9zJCkn8TPMlzRbpXwRU8TRF0hbysljpgxJSsEQIoZZ7v4jm5iel3?= =?iso-8859-1?Q?lzREnLP3QfUUWM7UgaxfV0DgOChCOJy8E8GYq/9I54G4qrGNxBpzwVVL/f?= =?iso-8859-1?Q?p+xFlh1Ieck6mSxZWeLej/F7Hxn9DkYP8QSFRKZJyaPsrPmZT56z8yQmZC?= =?iso-8859-1?Q?eC7XXNv3gzrDZQfel0AwI9LBD4hZXJqzGmfzRjKQUQBewh4JIXUs0kCzTA?= =?iso-8859-1?Q?PNmctfgyV9CtyASouxNPZoWv2hKwUXPmI4pXBNYhxGu6Cbt9k0cUt350oC?= =?iso-8859-1?Q?Hrpx0lynVHu8uak7yPCtAl8QwpbvKGYlIaBoTQAW5s2pNoP3PgyEVPhUEI?= =?iso-8859-1?Q?1e7gg3pf79YjnWIr3jMMiHPjMYs4CHq6gAuSDcULQRUMOq+t9DRBSd71Q+?= =?iso-8859-1?Q?OnEna4Nj7I5V38PhKKFJREn9sLDXiJyQhd9OmnFtymknd0Y8gaAHzTfcSy?= =?iso-8859-1?Q?YMA+C2v9rggdu9wT4LJhhdk78APhj52Z65KSlA=3D=3D?= Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable 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: 71940e57-d5fd-4d9d-236b-08ded3a21e1c X-MS-Exchange-CrossTenant-originalarrivaltime: 26 Jun 2026 16:43:57.6409 (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: LO3P265MB1771 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.038 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 FREEMAIL_FROM 0.001 Sender email is commonly abused enduser mail provider RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust RCVD_IN_MSPIKE_H2 0.001 Average reputation (+2) SPF_HELO_PASS -0.001 SPF: HELO matches SPF record SPF_PASS -0.001 SPF: sender matches SPF record X-MailFrom: mauro.depascale.work@outlook.it X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation Message-ID-Hash: NU75CVZINKEF3RNBV2E5ANO356JYXBVT X-Message-ID-Hash: NU75CVZINKEF3RNBV2E5ANO356JYXBVT X-Mailman-Approved-At: Wed, 01 Jul 2026 10:04:53 +0200 CC: Mauro de Pascale 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 =0A= =0A= Add an API endpoint that exposes vzdump output as a streamed download,=0A= allowing clients to export VM backups directly without storing them on=0A= the server first.=0A= ---=0A= PVE/API2/VZDump.pm | 65 ++++++++++++++++++++++++++++++++++++++++++++++=0A= 1 file changed, 65 insertions(+)=0A= =0A= diff --git a/PVE/API2/VZDump.pm b/PVE/API2/VZDump.pm=0A= index a8f21eba..84f42352 100644=0A= --- a/PVE/API2/VZDump.pm=0A= +++ b/PVE/API2/VZDump.pm=0A= @@ -9,11 +9,15 @@ use PVE::Exception qw(raise_param_exc);=0A= use PVE::INotify;=0A= use PVE::JSONSchema qw(get_standard_option);=0A= use PVE::RPCEnvironment;=0A= +use PVE::SafeSyslog;=0A= use PVE::Storage;=0A= use PVE::Tools qw(extract_param);=0A= use PVE::VZDump::Common;=0A= use PVE::VZDump;=0A= =0A= +use IPC::Open3;=0A= +use Symbol qw(gensym);=0A= +=0A= use PVE::API2::Backup;=0A= use PVE::API2Tools;=0A= =0A= @@ -311,4 +315,65 @@ __PACKAGE__->register_method({=0A= },=0A= });=0A= =0A= +__PACKAGE__->register_method({=0A= + name =3D> 'export',=0A= + path =3D> 'export',=0A= + method =3D> 'GET',=0A= + description =3D> "Export a VM dump stream",=0A= + proxyto =3D> 'node',=0A= + protected =3D> 1,=0A= + permissions =3D> {=0A= + check =3D> ['perm', '/vms/{vmid}', ['VM.Backup']],=0A= + },=0A= + parameters =3D> {=0A= + additionalProperties =3D> 0,=0A= + properties =3D> {=0A= + node =3D> get_standard_option('pve-node'),=0A= + vmid =3D> get_standard_option('pve-vmid'),=0A= + compress =3D> {=0A= + description =3D> "compression algorithm to use.",=0A= + type =3D> 'string',=0A= + enum =3D> ['zstd', 'gzip', 'lzo', '0'],=0A= + optional =3D> 1,=0A= + default =3D> 'zstd',=0A= + },=0A= + },=0A= + },=0A= + returns =3D> { type =3D> 'object' },=0A= + download =3D> 1,=0A= + code =3D> sub {=0A= + my ($param) =3D @_;=0A= +=0A= + my $vmid =3D $param->{vmid};=0A= + my $compress =3D $param->{compress} // 'zstd';=0A= +=0A= + my $suffix =3D $compress eq 'zstd' ? 'zst'=0A= + : $param->{compress} eq 'gzip' ? 'gz'=0A= + : $param->{compress} eq 'lzo' ? 'lzo'=0A= + : 'vma';=0A= + =0A= + my $filename =3D "vzdump-qemu-$vmid.vma.$suffix";=0A= +=0A= + my $cmd =3D ['/usr/bin/vzdump', $vmid, '--stdout','1','--compress',$compr= ess];=0A= + my $cmdstr =3D join(' ', @$cmd);=0A= + syslog('info', "running export cmd: $cmdstr");=0A= +=0A= + #my ($fh, $pid) =3D PVE::Tools::run_command($cmd, pipe =3D> 1);=0A= + open my $fh, '-|', @$cmd=0A= + or die "unable to execute backup $!\n";=0A= +=0A= + binmode($fh);=0A= +=0A= +=0A= + return {=0A= + download =3D> {=0A= + fh =3D> $fh,=0A= + filename =3D> $filename,=0A= + stream =3D> 1,=0A= + 'content-type' =3D> 'application/octet-stream',=0A= + 'content-disposition' =3D> "attachment; filename=3D\"$filename\"",=0A= + }=0A= + };=0A= + }});=0A= +=0A= 1;=0A= -- =0A= 2.47.3=0A= =0A=