[pve-devel] Proxmox VE 6.4 released

2021-04-28 Thread Martin Maurer

Hi all,

We are proud to announce the general availability of Proxmox Virtual 
Environment 6.4, our open-source virtualization platform. This version brings 
unified single-file restore for virtual machine (VM) and container (CT) backup 
archives stored on a Proxmox Backup Server as well as live restore of VM backup 
archives located on a Proxmox Backup Server.

Version 6.4 also comes with Ceph Octopus 15.2.11 and Ceph Nautilus 14.2.20, 
many enhancements to KVM/QEMU, and notable bug fixes. Many new Ceph-specific 
management features have been added to the GUI. We have improved the 
integration of the placement group (PG) auto-scaler, and you can configure 
Target Size or Target Ratio settings in the GUI.

The new version is based on Debian Buster 10.9, but using a newer, long-term 
supported Linux kernel 5.4. Optionally, the 5.11 kernel can be installed, 
providing support for the latest hardware. The latest versions of QEMU 5.2, LXC 
4.0, and OpenZFS 2.0.4 have been included.

There are some notable bug fixes and smaller improvements, see the full release 
notes.

Release notes
https://pve.proxmox.com/wiki/Roadmap

Press release
https://www.proxmox.com/en/news/press-releases/proxmox-virtual-environment-6-4-available

Video tutorial
https://www.proxmox.com/en/training/video-tutorials/item/what-s-new-in-proxmox-ve-6-4

Download
https://www.proxmox.com/en/downloads
Alternate ISO download:
http://download.proxmox.com/iso

Documentation
https://pve.proxmox.com/pve-docs

Community Forum
https://forum.proxmox.com

Source Code
https://git.proxmox.com

Bugtracker
https://bugzilla.proxmox.com

FAQ
Q: Can I dist-upgrade Proxmox VE 6.x to 6.4 with apt?
A: Yes, just via GUI or via CLI with apt update && apt dist-upgrade

Q: Can I install Proxmox VE 6.4 on top of Debian Buster?
A: Yes, see https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_Buster

Q: Can I upgrade my Proxmox VE 5.4 cluster with Ceph Luminous to 6.x and higher 
with Ceph Nautilus and even Ceph Octopus?
A: This is a three step process. First, you have to upgrade Proxmox VE from 5.4 
to 6.4, and afterwards upgrade Ceph from Luminous to Nautilus. There are a lot 
of improvements and changes, please follow exactly the upgrade documentation.
https://pve.proxmox.com/wiki/Upgrade_from_5.x_to_6.0
https://pve.proxmox.com/wiki/Ceph_Luminous_to_Nautilus

Finally, do the upgrade to Ceph Octopus - 
https://pve.proxmox.com/wiki/Ceph_Nautilus_to_Octopus

Q: Where can I get more information about feature updates?
A: Check our roadmap, forum, mailing lists, and subscribe to our newsletter.

A big THANK YOU to our active community for all your feedback, testing, bug 
reporting and patch submitting!

--
Best Regards,

Martin Maurer
Proxmox VE project leader


___
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



[pve-devel] [PATCH docs] pveproxy: improve LISTEN_IP doc

2021-04-28 Thread Oguz Bektas
* fix small typo
* add details for link-local addresses
* mention that pveproxy needs to be restarted

Signed-off-by: Oguz Bektas 
---
 pveproxy.adoc | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/pveproxy.adoc b/pveproxy.adoc
index 08c5f63..b9f8ade 100644
--- a/pveproxy.adoc
+++ b/pveproxy.adoc
@@ -71,10 +71,18 @@ exposure to the public internet:
 
  LISTEN_IP="192.0.2.1"
 
-Similarly you can also set a n IPv6 address:
+Similarly you can also set an IPv6 address:
 
  LISTEN_IP="2001:db8:85a3::1"
 
+And for a link-local IPv6 address on vmbr0 (interface name is necessary in 
this case):
+
+ LISTEN_IP="fe80::d8ee:34ff:fe37:4579%vmbr0"
+
+After the change you have to restart `pveproxy` for it to take effect:
+
+ systemctl restart pveproxy
+
 WARNING: The nodes in a cluster need access to `pveproxy` for communication,
 possibly on different sub-nets. It is **not recommended** to set `LISTEN_IP` on
 clustered systems.
-- 
2.20.1


___
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



Re: [pve-devel] [PATCH docs] pveproxy: improve LISTEN_IP doc

2021-04-28 Thread Thomas Lamprecht
On 28.04.21 13:16, Oguz Bektas wrote:
> * fix small typo
> * add details for link-local addresses
> * mention that pveproxy needs to be restarted
> 
> Signed-off-by: Oguz Bektas 
> ---
>  pveproxy.adoc | 10 +-
>  1 file changed, 9 insertions(+), 1 deletion(-)
> 
> diff --git a/pveproxy.adoc b/pveproxy.adoc
> index 08c5f63..b9f8ade 100644
> --- a/pveproxy.adoc
> +++ b/pveproxy.adoc
> @@ -71,10 +71,18 @@ exposure to the public internet:
>  
>   LISTEN_IP="192.0.2.1"
>  
> -Similarly you can also set a n IPv6 address:
> +Similarly you can also set an IPv6 address:
>  
>   LISTEN_IP="2001:db8:85a3::1"
>  
> +And for a link-local IPv6 address on vmbr0 (interface name is necessary in 
> this case):

Does not reads like an actual sentence... I'd write something a long the lines 
of:

"Note, if you want to specify a link-local IPv6 address, you need to provide 
the interface name itself:"

> +
> + LISTEN_IP="fe80::d8ee:34ff:fe37:4579%vmbr0"
> +
> +After the change you have to restart `pveproxy` for it to take effect:

I'd specifically state that a reload is not enough and then add a small warning 
that
a restart can stop some existing workers (not all, but e.g., shell connection 
is stopped
and reconnected which may loose info on CTs without a screen/tmux instance 
running).
Also, there's a short time window where no new connections are accepted IIRC 
(albeit
I was the one fixing that for reload it's been to long since then, so not sure 
anymore)

> +
> + systemctl restart pveproxy

and spiceproxy?

> +
>  WARNING: The nodes in a cluster need access to `pveproxy` for communication,
>  possibly on different sub-nets. It is **not recommended** to set `LISTEN_IP` 
> on
>  clustered systems.
> 


___
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



Re: [pve-devel] [PATCH docs] pveproxy: improve LISTEN_IP doc

2021-04-28 Thread Thomas Lamprecht
On 28.04.21 13:42, Oguz Bektas wrote:
>>> +
>>> + LISTEN_IP="fe80::d8ee:34ff:fe37:4579%vmbr0"
>>> +
>>> +After the change you have to restart `pveproxy` for it to take effect:
>>
>> I'd specifically state that a reload is not enough and then add a small 
>> warning that
>> a restart can stop some existing workers (not all, but e.g., shell 
>> connection is stopped
>> and reconnected which may loose info on CTs without a screen/tmux instance 
>> running).
>> Also, there's a short time window where no new connections are accepted IIRC 
>> (albeit
>> I was the one fixing that for reload it's been to long since then, so not 
>> sure anymore)
> 
> i think the phrasing "you have to restart" already emphasizes this,
> adding too many warnings or notes would just confuse users in my
> opinion.

No, it's clear that something needs to be restarted, but "restart" is a general
overused term which can mean lots of things (even reboot for some).

> 
> though i don't see any harm in making the **restart** bold in that
> sentence and adding that small warning about possible connection drop.

as said, restart is often used for the general semantic thing, be it reload or 
restart,
so this is really not clear. The gui also only triggers a reload, IIRC (pls. 
check)
and thus "restarting" (it's named that way there) from there would not help.

You just need to write it in such a way that it is not confusing, then it is not
a problem.


___
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



Re: [pve-devel] [PATCH docs] pveproxy: improve LISTEN_IP doc

2021-04-28 Thread Oguz Bektas
hi,

thanks for checking.

On Wed, Apr 28, 2021 at 01:35:40PM +0200, Thomas Lamprecht wrote:
> On 28.04.21 13:16, Oguz Bektas wrote:
> > * fix small typo
> > * add details for link-local addresses
> > * mention that pveproxy needs to be restarted
> > 
> > Signed-off-by: Oguz Bektas 
> > ---
> >  pveproxy.adoc | 10 +-
> >  1 file changed, 9 insertions(+), 1 deletion(-)
> > 
> > diff --git a/pveproxy.adoc b/pveproxy.adoc
> > index 08c5f63..b9f8ade 100644
> > --- a/pveproxy.adoc
> > +++ b/pveproxy.adoc
> > @@ -71,10 +71,18 @@ exposure to the public internet:
> >  
> >   LISTEN_IP="192.0.2.1"
> >  
> > -Similarly you can also set a n IPv6 address:
> > +Similarly you can also set an IPv6 address:
> >  
> >   LISTEN_IP="2001:db8:85a3::1"
> >  
> > +And for a link-local IPv6 address on vmbr0 (interface name is necessary in 
> > this case):
> 
> Does not reads like an actual sentence... I'd write something a long the 
> lines of:
> 
> "Note, if you want to specify a link-local IPv6 address, you need to provide 
> the interface name itself:"

okay

> 
> > +
> > + LISTEN_IP="fe80::d8ee:34ff:fe37:4579%vmbr0"
> > +
> > +After the change you have to restart `pveproxy` for it to take effect:
> 
> I'd specifically state that a reload is not enough and then add a small 
> warning that
> a restart can stop some existing workers (not all, but e.g., shell connection 
> is stopped
> and reconnected which may loose info on CTs without a screen/tmux instance 
> running).
> Also, there's a short time window where no new connections are accepted IIRC 
> (albeit
> I was the one fixing that for reload it's been to long since then, so not 
> sure anymore)

i think the phrasing "you have to restart" already emphasizes this,
adding too many warnings or notes would just confuse users in my
opinion.

though i don't see any harm in making the **restart** bold in that
sentence and adding that small warning about possible connection drop.

> 
> > +
> > + systemctl restart pveproxy
> 
> and spiceproxy?
ah yes forgot that, also adding to v2
> 
> > +
> >  WARNING: The nodes in a cluster need access to `pveproxy` for 
> > communication,
> >  possibly on different sub-nets. It is **not recommended** to set 
> > `LISTEN_IP` on
> >  clustered systems.
> > 


___
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



Re: [pve-devel] [PATCH docs] pveproxy: improve LISTEN_IP doc

2021-04-28 Thread Oguz Bektas
On Wed, Apr 28, 2021 at 01:51:51PM +0200, Thomas Lamprecht wrote:
> On 28.04.21 13:42, Oguz Bektas wrote:
> >>> +
> >>> + LISTEN_IP="fe80::d8ee:34ff:fe37:4579%vmbr0"
> >>> +
> >>> +After the change you have to restart `pveproxy` for it to take effect:
> >>
> >> I'd specifically state that a reload is not enough and then add a small 
> >> warning that
> >> a restart can stop some existing workers (not all, but e.g., shell 
> >> connection is stopped
> >> and reconnected which may loose info on CTs without a screen/tmux instance 
> >> running).
> >> Also, there's a short time window where no new connections are accepted 
> >> IIRC (albeit
> >> I was the one fixing that for reload it's been to long since then, so not 
> >> sure anymore)
> > 
> > i think the phrasing "you have to restart" already emphasizes this,
> > adding too many warnings or notes would just confuse users in my
> > opinion.
> 
> No, it's clear that something needs to be restarted, but "restart" is a 
> general
> overused term which can mean lots of things (even reboot for some).
> 
> > 
> > though i don't see any harm in making the **restart** bold in that
> > sentence and adding that small warning about possible connection drop.
> 
> as said, restart is often used for the general semantic thing, be it reload 
> or restart,
> so this is really not clear. 

why is it not clear? there's not a single instance of 'systemctl reload'
command in the documentation, and in instances where a service restart
is required, we specify 'systemctl restart' without any mention, e.g.,
in pvenode.adoc when setting up certificates)

so i don't see why users would imagine to 'reload' the service instead
of 'restart' when it's clearly written in bold, and the command is
right beneath the explanation...

> The gui also only triggers a reload, IIRC (pls. check)
> and thus "restarting" (it's named that way there) from there would not help.

yes, on the button it says "restart" but the tasklog says "reload".
so to me that sounds like a mislabeled button with wrong/lax use
of "restart" instead of the correct "reload".

> 
> You just need to write it in such a way that it is not confusing, then it is 
> not
> a problem.

there's really nothing confusing IMO (besides the button). but if you
insist i will send another patch with the changes you recommended.

some possible alternative phrasing i'd suggest:

=
After the change you have to **restart** `pveproxy` and `spiceproxy` for
it to take effect (**reload** or restart from GUI does not suffice):
 systemctl restart pveproxy spiceproxy
=

or much simpler and less confusing:
=
Run the following command to restart the proxy servers and apply the change:
 systemctl restart pveproxy spiceproxy
=

with a note about the connection drop during restart.


___
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



Re: [pve-devel] [PATCH docs] pveproxy: improve LISTEN_IP doc

2021-04-28 Thread Thomas Lamprecht
On 28.04.21 14:20, Oguz Bektas wrote:
> On Wed, Apr 28, 2021 at 01:51:51PM +0200, Thomas Lamprecht wrote:
>> On 28.04.21 13:42, Oguz Bektas wrote:
> +
> + LISTEN_IP="fe80::d8ee:34ff:fe37:4579%vmbr0"
> +
> +After the change you have to restart `pveproxy` for it to take effect:

 I'd specifically state that a reload is not enough and then add a small 
 warning that
 a restart can stop some existing workers (not all, but e.g., shell 
 connection is stopped
 and reconnected which may loose info on CTs without a screen/tmux instance 
 running).
 Also, there's a short time window where no new connections are accepted 
 IIRC (albeit
 I was the one fixing that for reload it's been to long since then, so not 
 sure anymore)
>>>
>>> i think the phrasing "you have to restart" already emphasizes this,
>>> adding too many warnings or notes would just confuse users in my
>>> opinion.
>>
>> No, it's clear that something needs to be restarted, but "restart" is a 
>> general
>> overused term which can mean lots of things (even reboot for some).
>>
>>>
>>> though i don't see any harm in making the **restart** bold in that
>>> sentence and adding that small warning about possible connection drop.
>>
>> as said, restart is often used for the general semantic thing, be it reload 
>> or restart,
>> so this is really not clear. 
> 
> why is it not clear? there's not a single instance of 'systemctl reload'
> command in the documentation, and in instances where a service restart
> is required, we specify 'systemctl restart' without any mention, e.g.,
> in pvenode.adoc when setting up certificates)
> 
> so i don't see why users would imagine to 'reload' the service instead
> of 'restart' when it's clearly written in bold, and the command is
> right beneath the explanation...
> 
>> The gui also only triggers a reload, IIRC (pls. check)
>> and thus "restarting" (it's named that way there) from there would not help.
> 
> yes, on the button it says "restart" but the tasklog says "reload".
> so to me that sounds like a mislabeled button with wrong/lax use
> of "restart" instead of the correct "reload".

I *always* use try-reload-or-restart, as I want to avoid service disruption,
as most people actually running relevant systems do...
What I surely do not is reading all the docs, comparing how often reload vs.
restart is used and then try to read into that and conclude something from
that...

I *never* saw anybody complaining about an additional note of some side-effects
that may come unexpected, but I saw quite some situations where there was no 
such note and user run into issues, I do not suggest such changes just for the
hell of it...

> 
>>
>> You just need to write it in such a way that it is not confusing, then it is 
>> not
>> a problem.
> 
> there's really nothing confusing IMO (besides the button). but if you
> insist i will send another patch with the changes you recommended.

You said you would write it in a confusing way when adding an explicit note,
so I suggest doing it in a not confusing manner ;)

> 
> some possible alternative phrasing i'd suggest:
> 
> =
> After the change you have to **restart** `pveproxy` and `spiceproxy` for
> it to take effect (**reload** or restart from GUI does not suffice):
>  systemctl restart pveproxy spiceproxy
> =
> 
> or much simpler and less confusing:
> =
> Run the following command to restart the proxy servers and apply the change:
>  systemctl restart pveproxy spiceproxy
> =
> 
> with a note about the connection drop during restart.
> 

I applied the fixes, the notes and another small grammar style fix for the comma
after "Similarly," myself, seemed to be the faster way to resolve this nicely..


___
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



[pve-devel] [PATCH storage 1/1] fix #1710: add retrieve method for storage

2021-04-28 Thread Lorenz Stechauner
Users are now able to download/retrieve any .iso/... file onto their
storages and verify file integrity with checksums.

Signed-off-by: Lorenz Stechauner 
---
 PVE/API2/Storage/Status.pm | 244 +
 1 file changed, 244 insertions(+)

diff --git a/PVE/API2/Storage/Status.pm b/PVE/API2/Storage/Status.pm
index 897b4a7..3919be7 100644
--- a/PVE/API2/Storage/Status.pm
+++ b/PVE/API2/Storage/Status.pm
@@ -5,6 +5,8 @@ use warnings;
 
 use File::Path;
 use File::Basename;
+use HTTP::Request;
+use LWP::UserAgent;
 use PVE::Tools;
 use PVE::INotify;
 use PVE::Cluster;
@@ -497,4 +499,246 @@ __PACKAGE__->register_method ({
return $upid;
}});
 
+__PACKAGE__->register_method({
+name => 'retrieve',
+path => '{storage}/retrieve',
+method => 'POST',
+description => "Download templates and ISO images by using an URL.",
+permissions => {
+   check => ['perm', '/storage/{storage}', ['Datastore.AllocateTemplate']],
+},
+protected => 1,
+parameters => {
+   additionalProperties => 0,
+   properties => {
+   node => get_standard_option('pve-node'),
+   storage => get_standard_option('pve-storage-id'),
+   url => {
+   description => "The URL to retrieve the file from.",
+   type => 'string',
+   },
+   content => {
+   description => "Content type.",
+   type => 'string', format => 'pve-storage-content',
+   },
+   filename => {
+   description => "The name of the file to create. Alternatively 
the file name given by the server will be used.",
+   type => 'string',
+   optional => 1,
+   },
+   checksum => {
+   description => "The expected checksum of the file.",
+   type => 'string',
+   optional => 1,
+   },
+   checksumalg => {
+   description => "The algorithm to claculate the checksum of the 
file.",
+   type => 'string',
+   optional => 1,
+   },
+   metaonly => {
+   description => "Only return the file name and size.",
+   type => 'boolean',
+   optional => 1,
+   },
+   insecure => {
+   description => "Allow TLS certificates to be invalid.",
+   type => 'boolean',
+   optional => 1,
+   }
+   },
+},
+returns => {
+   type => "object",
+   properties => {
+   filename => { type => 'string' },
+   upid => { type => 'string' },
+   size => {
+   type => 'integer',
+   renderer => 'bytes',
+   },
+   },
+},
+code => sub {
+   my ($param) = @_;
+
+   my @hash_algs = ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'];
+
+   my $rpcenv = PVE::RPCEnvironment::get();
+
+   my $user = $rpcenv->get_user();
+
+   my $cfg = PVE::Storage::config();
+
+   my $node = $param->{node};
+   my $scfg = PVE::Storage::storage_check_enabled($cfg, $param->{storage}, 
$node);
+
+   die "can't upload to storage type '$scfg->{type}'"
+   if !defined($scfg->{path});
+
+   my $content = $param->{content};
+
+   my $url = $param->{url};
+
+   die "invalid https or http url"
+   if $url !~ qr!^https?://!;
+
+   my $checksum = $param->{checksum};
+   my $hash_alg = $param->{checksumalg};
+
+   $hash_alg = undef
+   if $hash_alg eq 'none';
+
+   die "either 'checksum' and 'checksumalg' or none of these have to be 
specified"
+   if ($checksum && !$hash_alg) || (!$checksum && $hash_alg);
+
+   die "unsupported checksumalg: '$hash_alg'"
+   if $hash_alg && ($hash_alg !~ /^(md5|sha1|sha(224|256|384|512))$/);
+
+   my $req = HTTP::Request->new(HEAD => $url);
+   my $ua = LWP::UserAgent->new();
+   my $res = $ua->request($req);
+
+   die "invalid server response: '" . $res->status_line() . "'"
+   if ($res->code() != 200);
+
+   my $size = $res->header("Content-Length");
+   my $dispo = $res->header("Content-Disposition");
+
+   my $filename_remote;
+
+   if ($dispo && $dispo =~ m/filename=(.+)/) {
+   $filename_remote = $1;
+   } elsif ($url =~ m!^[^?]+/([^?/]*)(?:\?.*)?$!) {
+   $filename_remote = $1;
+   }
+
+   chomp $filename_remote;
+   $filename_remote =~ s/^.*[\/\\]//;
+   $filename_remote =~ s/[^-a-zA-Z0-9_.]/_/g;
+
+   if ($param->{metaonly}) {
+   return {
+   filename => $filename_remote,
+   upid => 0,
+   size => $size + 0,
+   };
+   }
+
+   my $filename = $param->{filename} || $filename_remote;
+   chomp $filename;
+   $filename =~ s/^.*[\/\\]//;
+   $filename =~ s/[^-a-zA-Z0-9_.]/_/g;
+
+   my $path;
+
+   if ($content eq 'iso') {
+   if ($filen

[pve-devel] [PATCH widget-toolkit 1/1] window: add upidFieldName option

2021-04-28 Thread Lorenz Stechauner
Signed-off-by: Lorenz Stechauner 
---
 src/window/Edit.js | 11 +++
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/window/Edit.js b/src/window/Edit.js
index 53d0e73..867ba9b 100644
--- a/src/window/Edit.js
+++ b/src/window/Edit.js
@@ -53,6 +53,10 @@ Ext.define('Proxmox.window.Edit', {
 
 showTaskViewer: false,
 
+// name of the upid field in response data
+// required for showTaskViewer
+upidFieldName: undefined,
+
 // gets called if we have a progress bar or taskview and it detected that
 // the task finished. function(success)
 taskDone: Ext.emptyFn,
@@ -165,9 +169,8 @@ Ext.define('Proxmox.window.Edit', {
Ext.Msg.alert(gettext('Error'), response.htmlStatus);
},
success: function(response, options) {
-   let hasProgressBar =
-   (me.backgroundDelay || me.showProgress || 
me.showTaskViewer) &&
-   response.result.data;
+   let data = response.result.data;
+   let hasProgressBar = (me.backgroundDelay || me.showProgress || 
me.showTaskViewer) && data;
 
me.apiCallDone(true, response, options);
 
@@ -176,7 +179,7 @@ Ext.define('Proxmox.window.Edit', {
// when background action is completed
me.hide();
 
-   let upid = response.result.data;
+   let upid = me.upidFieldName ? data[me.upidFieldName] : data;
let viewerClass = me.showTaskViewer ? 'Viewer' : 'Progress';
Ext.create('Proxmox.window.Task' + viewerClass, {
autoShow: true,
-- 
2.20.1


___
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



[pve-devel] [PATCH manager 1/1] fix #1710: add retrieve from url button for storage

2021-04-28 Thread Lorenz Stechauner
Add PVE.storage.Retrieve window and PVE.form.hashAlgorithmSelector.
Users are now able to download/retrieve any .iso/... file onto their
storages and verify file integrity with checksums.

Signed-off-by: Lorenz Stechauner 
---
 www/manager6/Makefile  |   1 +
 www/manager6/form/HashAlgorithmSelector.js |  21 +++
 www/manager6/storage/ContentView.js| 161 +
 3 files changed, 183 insertions(+)
 create mode 100644 www/manager6/form/HashAlgorithmSelector.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index afed3283..8e6557d8 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -38,6 +38,7 @@ JSSRC=
\
form/GlobalSearchField.js   \
form/GroupSelector.js   \
form/GuestIDSelector.js \
+   form/HashAlgorithmSelector.js   \
form/HotplugFeatureSelector.js  \
form/IPProtocolSelector.js  \
form/IPRefSelector.js   \
diff --git a/www/manager6/form/HashAlgorithmSelector.js 
b/www/manager6/form/HashAlgorithmSelector.js
new file mode 100644
index ..4a72cc08
--- /dev/null
+++ b/www/manager6/form/HashAlgorithmSelector.js
@@ -0,0 +1,21 @@
+Ext.define('PVE.form.hashAlgorithmSelector', {
+extend: 'Proxmox.form.KVComboBox',
+alias: ['widget.pveHashAlgorithmSelector'],
+comboItems: [],
+hasNoneOption: false,
+initComponent: function() {
+   var me = this;
+   me.comboItems = [
+   ['md5', 'MD5'],
+   ['sha1', 'SHA-1'],
+   ['sha224', 'SHA-224'],
+   ['sha256', 'SHA-256'],
+   ['sha384', 'SHA-384'],
+   ['sha512', 'SHA-512'],
+   ];
+   if (me.hasNoneOption) {
+   me.comboItems.unshift(['none', 'None']);
+   }
+   this.callParent();
+},
+});
diff --git a/www/manager6/storage/ContentView.js 
b/www/manager6/storage/ContentView.js
index dd6df4b1..7187ebbe 100644
--- a/www/manager6/storage/ContentView.js
+++ b/www/manager6/storage/ContentView.js
@@ -191,6 +191,153 @@ Ext.define('PVE.storage.Upload', {
 },
 });
 
+Ext.define('PVE.storage.Retrieve', {
+extend: 'Proxmox.window.Edit',
+alias: 'widget.pveStorageRetrieve',
+
+resizable: false,
+
+modal: true,
+
+isCreate: true,
+
+showTaskViewer: true,
+upidFieldName: 'upid',
+
+initComponent: function() {
+var me = this;
+
+   if (!me.nodename) {
+   throw "no node name specified";
+   }
+   if (!me.storage) {
+   throw "no storage ID specified";
+   }
+
+   me.url = `/nodes/${me.nodename}/storage/${me.storage}/retrieve`;
+   me.method = 'POST';
+
+   let defaultContent = me.contents[0] || '';
+
+   let urlField = Ext.create('Ext.form.field.Text', {
+   name: 'url',
+   allowBlank: false,
+   fieldLabel: gettext('URL'),
+   });
+
+   let fileNameField = Ext.create('Ext.form.field.Text', {
+   name: 'filename',
+   allowBlank: false,
+   fieldLabel: gettext('File name'),
+   });
+
+   let fileSizeField = Ext.create('Ext.form.field.Text', {
+   name: 'size',
+   disabled: true,
+   fieldLabel: gettext('File size'),
+   emptyText: gettext('unknown'),
+   });
+
+   let checksumField = Ext.create('Ext.form.field.Text', {
+   name: 'checksum',
+   fieldLabel: gettext('Checksum'),
+   allowBlank: true,
+   disabled: true,
+   emptyText: gettext('none'),
+   });
+
+   let checksumAlgField = Ext.create('PVE.form.hashAlgorithmSelector', {
+   name: 'checksumalg',
+   fieldLabel: gettext('Hash algorithm'),
+   allowBlank: true,
+   hasNoneOption: true,
+   value: 'none',
+   });
+
+   let inputPanel = Ext.create('Proxmox.panel.InputPanel', {
+   method: 'POST',
+   waitMsgTarget: true,
+   border: false,
+   columnT: [
+   urlField,
+   fileNameField,
+   ],
+   column1: [
+   {
+   xtype: 'pveContentTypeSelector',
+   cts: me.contents,
+   fieldLabel: gettext('Content'),
+   name: 'content',
+   value: defaultContent,
+   allowBlank: false,
+   },
+   ],
+   column2: [
+   fileSizeField,
+   ],
+   advancedColumn1: [
+   checksumField,
+   checksumAlgField,
+   ],
+   advancedColumn2: [
+   {
+   xtype: 'checkbox',
+   name: 'insecure',
+   fieldLabel: gettext('Trust invalid certificates'),
+   labelWidth: 150,
+   },
+