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 1DE8A1FF09B for ; Mon, 28 Sep 2026 09:15:02 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 5DB2E2169E; Mon, 28 Sep 2026 09:14:57 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pyeMpEZJwXK+2emHxaclyoDe9kBPFbHuGkvWDhb3UM04zg4Uia4/VuStbDvXhb0F6gAuNvZkBHQpk0xItvRyJbgdn/JLoX6xbLZgpoTRAHpiI2yOlN9HompZsC6NlcoYbiWKfgB132aYRUU23E6GuJOnz+l54QKnNLBww2YDEq6R7u+etvKWy7erF1Iopj029bwFBmupHXocBcoS4oLSyRNu+0ox/5nWZfEqivU11AsBvHSfL9J0HFMM/KKpMJDoJfx2ohKLTcOjXQ+BzCBAcGjOWQk0W4zqHQ0TAFhBCmiJwMZgrWzTCApydlSs0cewPMhBOLrhRVFpCLVtzxVNcg== 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=fWpjK26xV9/g4M9yGp8p5gSwwtECc9GaegTGLOA8NuA=; b=mvNgo//RC6PemF4dm1g3i/E9JBxW3hQfBjAY5n1YMc1asjoJm5FqiJPIe15A/7pmIpjK0xAJ4MvpDdyX1lrvNrEtZoecrEJzUvgfVSOa/zHz6TK5XbbPIgHfW7ggkicn1VbnB/svHE6sw1u0v6KI3d+zTbxEtgAjfJIUovtP6tZw+KOecjj/hy1AG7LUsVNntvoYSNvBM0IWK4T8oOiIk6VGIH/CK3tEmh1ojhIJaXQ40IrIDmBBdboYFQ0xvvVMMfaEH7Se8o4NWOxZI31feLQPX8pto/Thh33d+K5zPg7pC2esH0x+ua8jFGuVuILbsfl6aI8pwvmVKftSeMmSfQ== 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=fWpjK26xV9/g4M9yGp8p5gSwwtECc9GaegTGLOA8NuA=; b=b5/xIYrkeEGhzXufe4WJaTW36mZrGN5WFaumflinA7uKHgviIWbBAEbz0t5a+krM5QQi+Gyr7unF7ENMmSxNGqvcQ54z7V33A+IWOsPYdTURlTfO/6TpzN/X0WRTsbcPYUhACudOBNt+qv+ynU/MxyarlFGBYnYjLByAkSbQgAFR/tqbM7HmsQ9zgQCq8PuzHlWjYt0V3Xejrvrfa+YM7bS0IgBhTInIuD1Tzwoqyi5KEqqxkxslR1PzihN87j7zeeOUfROLnnKCP8nckmxaCFdX8Ihm3H7mlrNyTJmkDzl6dYaE407jBPFuMh57kufwzis20DSu7i7XVd9JeA3C+Q== From: Mauro de Pascale To: "pve-devel@lists.proxmox.com" Subject: [PATCH 2/2] manager: add GUI support for backup export and import Thread-Topic: [PATCH 2/2] manager: add GUI support for backup export and import Thread-Index: AQHdS1aH2VWivx8ZlEmRzLlB12jHLA== Date: Wed, 23 Sep 2026 12:25:12 +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: 020f21c8-0cef-4caa-80d9-08df196db729 x-ms-exchange-slblob-mailprops: 30ekHghIwFoGqEgxaY/OAvK55SjXyV7l/nLDssafZidzboGRP6KzQ2FuSR7cBAq3XvYNZZvibkT0adE6YsvKTH8U4e1+cysczE1fw53cfjpmmnsnnMYRMRvY1xVDJUXtQFwZz42O2vVps8MPdvWSM4cc9MxnMDlmWsZhScm8JwNX+xU8iieuLgUrO8hB9EZqDiUobyRv8HOy97Sho/jisl+BkyXC2YDg+zjAvqXhVWsvmywfHyYAd7SPJhDxLNOl0WgdHU6MUwNjxpCSdvOh5dXQEWMMdKP60wVlmB4isnkblw44UBASDGYcUXncqb6ANxZ52xiimR5bNoALtVL9NthYtHvVMdhqNMCVdkijHlSatTLtFPU9haPwf7/nK2uc9EWMx1noa6tXMcs7iqky7FD4mBeWEnNUqdShVPd1WtcBfdM5nHzRewqbiP4FfqDXZlPjC4q+ZMw4Wpw5BYtOkaQmtbQRsihOM+OZIyjD3UOZX0ynclO9XE8NqeR2MivPdfoOYcJPcR1cRpbsISwZfQRdAiq9I4tdzZWvO/qixwS/r+HZ8OtjZaYWmOhCyk1GJiTE+RJCaep4bSFUEsJK3mTbmKyw1W9+R7WBL/WB9gQhzFIG0DWT5ABBbCC1TXCntgB9zNTl7PZM+p3DJ92f+KQgPh+OKVFCQBeqZNArCoenAvg3ySLhWbVVJOTSRNRyneJphRLyRkx7jG1/U+dup+TPknvoAt/t0o0bCSYazme2/ckUd4oevgGCXp/yqkX2 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-2022-jp?B?RzdIQkdzQzAwUmJybkp0ZXI1VnlYTUxXRWo2RkFvQnZnUXpJeGlyZ3VV?= =?iso-2022-jp?B?RS84YklveGRiTDlTcXZ5Q2g4YnBjbTNWQURFYkVQaThlTTcrV3ExNGVh?= =?iso-2022-jp?B?c3l4OFJ4QWRuRWxmeDkzd2xjc1Uvc05zZUJZTi9xYnNhdWtZa1MxVkxE?= =?iso-2022-jp?B?RGtLQkx0enFKSnNQZzRtcmw1YmFGWlkrSER3cGtLTU9tdTZETEVZbWh2?= =?iso-2022-jp?B?UzMzUjVhNm5ZVjl4bDFmdU1laWZtaHlTWS96QjBRY3V1aFYzYVcxYzJH?= =?iso-2022-jp?B?ZUhnUHVSWjVZeFJuQ1c0YU1HQm4xOElVWHdxUkdwUmRwTUlTUWxtMmtP?= =?iso-2022-jp?B?M01Jek1DekdleWF6YTFJUlB2M29UU0FrK1VpMjZTRS9iT3JMT3pYUlRj?= =?iso-2022-jp?B?aEpBYVd2YnZXd2RtVDNjcUZyQzhiVmhNTEY2MmVOL245VFRmVHF2dUFZ?= =?iso-2022-jp?B?QThtUGhsc242K2R4Tk95d1VPbjBqd2dXclg3OE83eHErOGhXNmJDendP?= =?iso-2022-jp?B?QzFZa2RQU0tERTdFckF1T1daM1JvNUtvNWRRYldzNDNta0YxaWlrQUlH?= =?iso-2022-jp?B?UURnQlVMbTBFcEZDTVZ5TzJPZ3JGR2xrRGY5TEpIWk9HRm1DNHpPOFZr?= =?iso-2022-jp?B?Y0p3NjVyZ3drNHptUWZScmdreVlsYkNoVDlLNldGWm5sSUUzcTlHeG9D?= =?iso-2022-jp?B?UDA0U1JyNk51L2ZwS3RDZ1dudVhRbWNGWkVqTGdEVVpTcFE1MitLWjJX?= =?iso-2022-jp?B?MzdPcEdwZ04xbW82RXlVMlk0UFE3UFVCSmNUMis1UlZodGV6cmc5c2dH?= =?iso-2022-jp?B?TDkzbENFUnhNUkVnaXhrOXYzd0xSdEJ4QXRKNVhwcEhrSmFFZUJWQ3R5?= =?iso-2022-jp?B?N2hLazgvWUxXSkVra0VqUlEzNjcwL01mZGI3WVNhQzBEVGtYU0hLZDVK?= =?iso-2022-jp?B?V0RvMlYyRkx6VndWNk1NVU5PWWRuK3JUTTR0NVVFZE01Q0lFYjVsVnM3?= =?iso-2022-jp?B?RkgrazNJMWhjZ1Z0TlJzcTVxZUtDbVJUZTVvZXFhakcwTFpTN2RpbzR2?= =?iso-2022-jp?B?RnY2VDhsajJlbTg1MUVJeTRDYXo0SnljMytoV0lPVktBMVA1VFlBQU5F?= =?iso-2022-jp?B?bzdBMHJxdm40R0tsdjZtS21VQWM4V3JHRWhOamxmQVBVcUJBSDcrSXFF?= =?iso-2022-jp?B?ejd6UDZSSGExajFUaUx6dVFIWnFSWVRCUXBnOWZuUjBLMGtGR3ZVQ25B?= =?iso-2022-jp?B?QVVtS2dTcnBtRzlVWjhHQzFuYVAxOUh0ajhXK0RLZW02VU5aSEk4SnNU?= =?iso-2022-jp?B?UCtIN0xKeVk3TEVZQTVBandMbWFuMkdIUjdjbFpSM2R0T2RwOGRGdmZR?= =?iso-2022-jp?B?aFh4THB0bjRnZXAxOXdJMk1yTnJxNHlmNG9SNXBkTFE4TUhaRVBSNFBO?= =?iso-2022-jp?B?U3VtNXIvcndzVWp6ZUtuaEhVY1FtY1V0bmNtcDkvMzZzTkEzbjRKOU1x?= =?iso-2022-jp?B?Mk95YjdHY2NFL0U4L3B3LzhXZFdvWmlBZnM1RFQxS2NUckpuUGs=?= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-2022-jp?B?aVlSYnQ2TTdHNTZKcVB1UXEwSEdPYXBMdWpQUnZ4ZWp3clI0U2lzVC9j?= =?iso-2022-jp?B?aVlZd2JLdXpBVyt3QVJWQ1RwOHovMnNKc3J0b1E4VStRcENxeCtkRWZW?= =?iso-2022-jp?B?SzU0WGEyUnBDVTR1RldrbjQyY29BUnlUMW02bXJqcjhNZWlBUDFoWFF6?= =?iso-2022-jp?B?U0xlVm9HMDZsbVNWcjMwaThva3VBdDVsY2Z3dEZIQXZKeDJ2SUh2YS9s?= =?iso-2022-jp?B?RkJ0VFkzaXpiNGxhVXRoaldGcFZBMEtPMys0Q3QyWFY4VXUzK3VseHFp?= =?iso-2022-jp?B?aGlIVjQvTVRKWW9JNE9wRUxPdDI0UTg1cGRCZndVdWtmR2ZQSGJPYlYw?= =?iso-2022-jp?B?UmMrZU45REJJcDRJYkVqTDFpUGkyeGd3NWpLVzRtMDFvSHBRdG51U0hz?= =?iso-2022-jp?B?QmU0d2tsUHg3dzBDN1NPaWZzVG4rc2VoVnQ2cEtGbllLQmthYUoxK1Na?= =?iso-2022-jp?B?Tk1OWlRmdEE1OGYzandyUXVRTjF1Z0o2NS9qNFhoU3VyK2hMTkVKSUtH?= =?iso-2022-jp?B?VmRabEJEaFpmL3YxK3dxMzNrMHphZ2pmS2IwcEZMb0JyeHhNTXVLZFRC?= =?iso-2022-jp?B?bEZsWmNnaS9naDROY3lSUEJ5MUJ1eW5iR1pSVnYrM1lqNHNEQVdQSEtJ?= =?iso-2022-jp?B?RlpqTmxLTlNSTndVWE1leUhTTlZLTGdRTlZLOEo0SWRiS2Ftb2s3ZDl2?= =?iso-2022-jp?B?TDZSK3JaUVNxZDhRTnhHTGIzakIrNk52Q2xOYzd6RmpJZk1LbXF6RStU?= =?iso-2022-jp?B?K2lYakFteFZSanlEcGE4K1pPRUFFeEhPUDE3Qmh2S092T0lXTktTWDR4?= =?iso-2022-jp?B?SHB4VzJINTd4aGoxWFgwTzFGOGtIdWtEYnZrVjd4Nzg5Y0h1WGRwb3By?= =?iso-2022-jp?B?YXF3ajF5WVJoWmRRUnQrZVhIK0FYUC9CdXkyeWthTTNTN1U2NC9yVmlo?= =?iso-2022-jp?B?WnlwckJJSS9KUUtTU01qbmpDN3Z2bENCRUNxc25NQUJFK2l3ZTdpaWVN?= =?iso-2022-jp?B?NERIQ0J4ZWd1d3hEQ1B3dk9LSzNOdDdkRkxEMS9BNSthR2pYQkVBcm9z?= =?iso-2022-jp?B?c2hBOUhhaWtqQXlDV01ZWkpIanowdHhYOEp5N0M5V2hvUEhDR0V3UlBi?= =?iso-2022-jp?B?NnJmQTZmZFkwSFBKanVscnBpZFJzYVU2aThMVW1nR0d0V0p1UnRUZFN4?= =?iso-2022-jp?B?ZXp0MDZEZVFzNVZPR1VaZzhHNkp0WXVaalVFU1RLNGZYRmdzU0xsMk1B?= =?iso-2022-jp?B?Y2JiV3NKQ2g0bmhDb2tqZVRkU1JKTnhpYk5neC9MNjJiY3orejlQYndQ?= =?iso-2022-jp?B?dFFCWnV0bDFDQTdpb1UwL1o0bUFkNHo3WXVjS2Jta3JvNHNSWU1nSnVp?= =?iso-2022-jp?B?Z05qSG90TnU4RWF2eXJhcWh3cGlkMGVHMlZXdXJ2Qkwwb3VTczdiSE1P?= =?iso-2022-jp?B?a1Bjc1l4SS9pTHA0dzVITG9vZ2R4MmVOZy9LWmViZkF4cEszWE9NdmZM?= =?iso-2022-jp?B?bnpxUytHdU5XTVpKRGpxV2puSUYzdWJEVDRnbDlMVnhnY1BKMm9PY3k4?= =?iso-2022-jp?B?VVRKNmhTRUF2MGdGQWgxdXhtSUphSHVNdlF0NDlZdldpTFRNOHdUTGhV?= =?iso-2022-jp?B?akVYeURjM2xqTVB1OFB2MUJYVG9qTXl4bGlHV2dwR2h6cTV6SHlCU3VE?= =?iso-2022-jp?B?SWpMSkpLUlZnUFcrWW56Q1g3eGRJb2dUUW5ObTczODFBbWdjaHFoVmNX?= =?iso-2022-jp?B?OGlXUUZEOEZHdVludmRDRElpNFJlVXEyNW1UaW1mZWNlK3ptRHAraDRx?= =?iso-2022-jp?B?NjBLMDFtM0VJSWdEMkNlM2FZKzlzQkxUdjRXZDAzOTA4aDNsL0dTeTBS?= =?iso-2022-jp?B?WjlrY2JQQUM4NmxNblVyN09wZkRUdzFnc2ptOWtmNmRQUkJZMUw3OFdK?= =?iso-2022-jp?B?d0ZOSk9JcVVGK2czc0RzOS92ODVGMkdIT2NNcklNcmtHUk1vMmhveXd4?= =?iso-2022-jp?B?Wkl2WlVhOWlQR096TGNRemtTRFROTEZWYURoNWNGUWpqZHVwNHZlRU1K?= =?iso-2022-jp?B?RWc9PQ==?= 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: 020f21c8-0cef-4caa-80d9-08df196db729 X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Sep 2026 12:25:12.4832 (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.049 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 POISEN_SPAM_PILL_4 0.1 random spam to be learned in bayes 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 X-MailFrom: mauro.depascale.work@outlook.it X-Mailman-Rule-Hits: max-size X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; news-moderation; no-subject; digests; suspicious-header Message-ID-Hash: T4UVIYCEGCKTZE4ZABAPWTMKVUSLBF3Q X-Message-ID-Hash: T4UVIYCEGCKTZE4ZABAPWTMKVUSLBF3Q X-Mailman-Approved-At: Mon, 28 Sep 2026 09:14:42 +0200 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="iso-2022-jp" 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 Expose backup export from the backup dialog and allow uploading VMA archives for restore directly from the storage view. ________________________________ PVE/API2/VZDump.pm | 2 +- www/manager6/Utils.js | 16 +++---- www/manager6/grid/BackupView.js | 24 +++++++++- www/manager6/storage/BackupView.js | 29 +++++++++++- www/manager6/window/Backup.js | 33 ++++++++++++- www/manager6/window/UploadToStorage.js | 65 ++++++++++++++++++++++++-- 6 files changed, 149 insertions(+), 20 deletions(-) diff --git a/PVE/API2/VZDump.pm b/PVE/API2/VZDump.pm index 84f42352..45c316c1 100644 --- a/PVE/API2/VZDump.pm +++ b/PVE/API2/VZDump.pm @@ -351,7 +351,7 @@ __PACKAGE__->register_method({ : $param->{compress} eq 'gzip' ? 'gz' : $param->{compress} eq 'lzo' ? 'lzo' : 'vma'; * * * my $filename = "vzdump-qemu-$vmid.vma.$suffix"; my $cmd = ['/usr/bin/vzdump', $vmid, '--stdout','1','--compress',$compress]; diff --git a/www/manager6/Utils.js b/www/manager6/Utils.js index 040b5ae0..412fba0a 100644 --- a/www/manager6/Utils.js +++ b/www/manager6/Utils.js @@ -145,7 +145,7 @@ Ext.define('PVE.Utils', { bvers = b.toString().split('.'); } * for (;;) { * for (; ;) { * let av = avers.shift(); let bv = bvers.shift(); @@ -1272,8 +1272,7 @@ Ext.define('PVE.Utils', { calculate_disk_usage: function (data) { if ( !Ext.isNumeric(data.disk) || * data.type === 'qemu' || * (data.type === 'lxc' && data.uptime === 0) || * ((data.type === 'qemu' || data.type === 'lxc') && data.uptime === 0) || * data.maxdisk === 0 ) { return -1; * @@ -1298,8 +1297,7 @@ Ext.define('PVE.Utils', { * if ( !Ext.isNumeric(disk) || maxdisk === 0 || * type === 'qemu' || * (type === 'lxc' && record.data.uptime === 0) * ((type === 'qemu' || type === 'lxc') && record.data.uptime === 0) * ) { return ''; } * @@ -1810,9 +1808,6 @@ Ext.define('PVE.Utils', { * qemu_min_version: function (toCheck, minVersion) { let i; for (i = 0; i < toCheck.length && i < minVersion.length; i++) { * if (toCheck[i] > minVersion[i]) { * return true; * } * if (toCheck[i] < minVersion[i]) { return false; } * @@ -1902,8 +1897,8 @@ Ext.define('PVE.Utils', { * container.mask( Ext.String.format( gettext('{0} not installed.') + * ' ' + * gettext('Log in as root to install.'), * ' ' + * gettext('Log in as root to install.'), * 'Ceph', ), ['pve-static-mask'], * @@ -2185,6 +2180,7 @@ Ext.define('PVE.Utils', { * hastop: ['HA', gettext('Stop')], imgcopy: ['', gettext('Copy data')], imgdel: ['', gettext('Erase data')], * importvm: ['VM', gettext('Importing')], * lvmcreate: [gettext('LVM Storage'), gettext('Create')], lvmremove: ['Volume Group', gettext('Remove')], lvmthincreate: [gettext('LVM-Thin Storage'), gettext('Create')], * diff --git a/www/manager6/grid/BackupView.js b/www/manager6/grid/BackupView.js index 406143dc..e63c7bdc 100644 --- a/www/manager6/grid/BackupView.js +++ b/www/manager6/grid/BackupView.js @@ -253,6 +253,27 @@ Ext.define('PVE.grid.BackupView', { * }, }); * let import_btn = Ext.create('Proxmox.button.Button', { * text: 'Import', * iconCls: 'fa fa-upload', * tooltip: gettext('Import backup and restore VM from local machine'), * handler: function () { * Ext.create('PVE.window.UploadToStorage', { * nodename: nodename, * storage: storagesel.getValue(), * requiredPermissions: { * check: ['Datastore.Allocate', 'VM.Allocate'], * }, * content: 'import', * listeners: { * destroy: () => reload(), * }, * autoShow: true, * }); * }, * }); * * * Ext.apply(me, { selModel: sm, tbar: { * @@ -260,6 +281,8 @@ Ext.define('PVE.grid.BackupView', { * items: [ backup_btn, '-', * import_btn, * '-', * restore_btn, file_restore_btn, config_btn, * @@ -376,7 +399,6 @@ Ext.define('PVE.grid.BackupView', { * renderer: PVE.Utils.render_backup_encryption, }, { * // TRANSLATORS: The state of the verification task * header: gettext('Verify State'), dataIndex: 'verification', renderer: PVE.Utils.render_backup_verification, * diff --git a/www/manager6/storage/BackupView.js b/www/manager6/storage/BackupView.js index 8c91ec99..f36030b9 100644 --- a/www/manager6/storage/BackupView.js +++ b/www/manager6/storage/BackupView.js @@ -10,6 +10,9 @@ Ext.define('PVE.storage.BackupView', { * initComponent: function () { let me = this; * let content = me.pveSelNode.data.content?.split(',') ?? []; * me.hasBackupContent = content.includes('backup'); * * let nodename = (me.nodename = me.pveSelNode.data.node); if (!nodename) { throw 'no node name specified'; * @@ -79,6 +82,30 @@ Ext.define('PVE.storage.BackupView', { * let isPBS = me.pluginType === 'pbs'; me.tbar = [ * { * xtype: 'proxmoxButton', * text: gettext('Import'), * iconCls: 'fa fa-upload', * //disabled: false, * selModel: null, * disabled: !me.hasBackupContent, * requiredPermissions: { * check: ['Datastore.Allocate', 'VM.Allocate'], * }, * tooltip: gettext('Import backup and restore VM from local machine'), * handler: function () { * let win = Ext.create('PVE.window.UploadToStorage', { * nodename: me.nodename, * storage: me.storage, * content: 'import', * listeners: { * destroy: () => me.store.load(), * }, * }); * win.show(); * }, * }, * '-', * { xtype: 'proxmoxButton', text: gettext('Restore'), * @@ -106,7 +133,7 @@ Ext.define('PVE.storage.BackupView', { * }, }); }, * }, * } * ]; if (isPBS) { me.tbar.push({ * diff --git a/www/manager6/window/Backup.js b/www/manager6/window/Backup.js index 7c1c54de..d8837d6b 100644 --- a/www/manager6/window/Backup.js +++ b/www/manager6/window/Backup.js @@ -41,7 +41,6 @@ Ext.define('PVE.window.Backup', { * xtype: 'proxmoxKVComboBox', comboItems: [ ['notification-system', gettext('Use global settings')], * // TRANSLATORS: sendmail is a piece of software * ['legacy-sendmail', gettext('Use sendmail (legacy)')], ], fieldLabel: gettext('Notification'), * @@ -245,11 +244,34 @@ Ext.define('PVE.window.Backup', { * padding: '0 0 1 0', }); * let exportCheckbox = Ext.create('Proxmox.form.Checkbox', { * name: 'export', * checked: false, * uncheckedValue: 0, * tooltip: gettext('If selected Backup is saved to local machine'), * fieldLabel: gettext('Export'), * // Tiny amount of padding to stop the UI from shifting * // when the 'mailto' field is shown. * padding: '0 0 1 0', * listeners: { * change: function (f, checked) { * * //console.log('clicked "export"'); * storagesel.setDisabled(checked); * protectedCheckbox.setHidden(checked); * notificationModeSelector.setDisabled(checked); * if (checked) { * protectedCheckbox.setValue(false); * } * }, * }, * }); * * me.formPanel = Ext.create('Proxmox.panel.InputPanel', { bodyPadding: 10, border: false, column1: [storagesel, modeSelector, protectedCheckbox, pbsChangeDetection], * column2: [compressionSelector, notificationModeSelector, mailtoField, removeCheckbox], * column2: [compressionSelector, notificationModeSelector, exportCheckbox, mailtoField, removeCheckbox], * columnB: [ { xtype: 'textareafield', * @@ -341,6 +363,13 @@ Ext.define('PVE.window.Backup', { * ); } * if (values.export) { * let url = `/api2/json/nodes/${me.nodename}/vzdump/export?vmid=${me.vmid}&compress=${values.compress}`; * window.open(url, '_blank'); * me.close(); * return; * } * * Proxmox.Utils.API2Request({ url: '/nodes/' + me.nodename + '/vzdump', params: params, * diff --git a/www/manager6/window/UploadToStorage.js b/www/manager6/window/UploadToStorage.js index cc53596d..7d4bace9 100644 --- a/www/manager6/window/UploadToStorage.js +++ b/www/manager6/window/UploadToStorage.js @@ -9,7 +9,7 @@ Ext.define('PVE.window.UploadToStorage', { * title: gettext('Upload'), acceptedExtensions: { * import: ['.ova', '.qcow2', '.raw', '.vmdk'], * import: ['.ova', '.qcow2', '.raw', '.vmdk', '.vma', '.vma.zst'], * iso: ['.img', '.iso'], vztmpl: ['.tar.gz', '.tar.xz', '.tar.zst'], }, * @@ -24,14 +24,15 @@ Ext.define('PVE.window.UploadToStorage', { * cbindData: function (initialConfig) { const me = this; const ext = me.acceptedExtensions[me.content] || []; * * let fRegex = new RegExp('^.(?:' + ext.map(e => e.replace(/./g, '\.')).join('|') + ')$', 'i'); * me.url = `/nodes/${me.nodename}/storage/${me.storage}/upload`; let fileSelectorExt = ext.concat(Object.keys(me.extensionAliases[me.content] ?? {})); + return { extensions: fileSelectorExt.join(', '), * filenameRegex: new RegExp('^.(?:' + ext.join('|').replaceAll('.', '\.') + ')$', 'i'), * filenameRegex: fRegex, * }; }, @@ -45,6 +46,17 @@ Ext.define('PVE.window.UploadToStorage', { controller: { submit: function (button) { + * let doUpload = function () { * xhr.open('POST', `/api2/json${url}`, true); * * if (window.Proxmox && Proxmox.CSRFPreventionToken) { * xhr.setRequestHeader('CSRFPreventionToken', Proxmox.CSRFPreventionToken); * } * * xhr.send(fd); * }; * * const view = this.getView(); const form = this.lookup('formPanel').getForm(); const abortBtn = this.lookup('abortBtn'); * @@ -141,8 +153,49 @@ Ext.define('PVE.window.UploadToStorage', { * false, ); * xhr.open('POST', `/api2/json${view.url}`, true); * xhr.send(fd); * let url = view.url; * * if (view.content === 'import') { * let vmid = null; * * // estrai vmid dal filename tipo vzdump-qemu-100.vma.zst * let match = filename.match(/-(\d+)./); * if (match) { * vmid = match[1]; * } * * if (vmid) { * Proxmox.Utils.API2Request({ * url: `/nodes/${view.nodename}/qemu/${vmid}/status/current`, * method: 'GET', * * success: function () { * // VM esiste → chiedi conferma * Ext.Msg.confirm( * gettext('Confirm Restore'), * Ext.String.format( * gettext('VM {0} already exists. Overwrite?'), * vmid * ), * function (btn) { * if (btn === 'yes') { * doUpload(); * } * } * ); * }, * * failure: function () { * // VM non esiste → procedi direttamente * doUpload(); * }, * }); * * return; // blocca flusso normale * } * } * * doUpload(); * }, validitychange: function (f, valid) { @@ -327,4 +380,6 @@ Ext.define('PVE.window.UploadToStorage', { me.callParent(); }, + + }); -- 2.47.3