diff --git a/lib/Ravada/Domain.pm b/lib/Ravada/Domain.pm index 4021390f0..ed03472e1 100644 --- a/lib/Ravada/Domain.pm +++ b/lib/Ravada/Domain.pm @@ -6657,9 +6657,9 @@ sub _add_hardware_display($orig, $self, $index, $data) { $sth->execute($self->id, $data->{port}); my ($exposed) = $sth->fetchrow; - confess "Error: ".$self->name."[".$self->id."] display $data->{driver} can not be used because port $data->{port} " - ." is already exported. Remove it from hardware / ports\n" - if $exposed; + if ( $exposed ) { + $self->remove_expose($data->{port}); + } my $public_port = $self->expose( port => $data->{port} , name => $data->{driver} diff --git a/script/rvd_front b/script/rvd_front index a020b7599..7c037ebb8 100644 --- a/script/rvd_front +++ b/script/rvd_front @@ -4672,10 +4672,11 @@ sub shutdown_machine { my $id_req; if ($domain) { my $req; - $req = Ravada::Request->force_shutdown_domain(id_domain => $domain->id, uid => $USER->id) - if ($c->param('force') && $c->param('force') eq 'true'); - $req = Ravada::Request->shutdown_domain(id_domain => $domain->id, uid => $USER->id) - unless ($c->param('force') eq 'true'); + if ($c->param('force') && $c->param('force') eq 'true') { + $req = Ravada::Request->force_shutdown_domain(id_domain => $domain->id, uid => $USER->id) + } else { + $req = Ravada::Request->shutdown_domain(id_domain => $domain->id, uid => $USER->id) + } $id_req = $req->id if $req; } return $c->redirect_to('/machines') if $type eq 'html'; diff --git a/t/vm/20_base.t b/t/vm/20_base.t index 24976eab1..a233d28c3 100644 --- a/t/vm/20_base.t +++ b/t/vm/20_base.t @@ -1537,21 +1537,6 @@ sub test_display_drivers($vm, $remove) { $domain->remove(user_admin); } -sub test_display_port_already_used($vm) { - my $domain = create_domain($vm); - $domain->expose( port => 22 ); - my $req = Ravada::Request->add_hardware( - uid => user_admin->id - ,name => 'display' - ,data => { driver => 'x2go' } - ,id_domain =>$domain->id - ); - wait_request(check_error => 0); - is($req->status,'done'); - like($req->error,qr'already'); - $domain->remove(user_admin); -} - sub test_display_conflict_non_builtin($vm) { my $base= $BASE->clone(name => new_domain_name, user => user_admin); my $req = Ravada::Request->add_hardware( @@ -1917,8 +1902,6 @@ for my $vm_name ( vm_names() ) { test_display_info($vm); - test_display_port_already_used($vm); - test_remove_display($vm); test_display_drivers($vm,0); diff --git a/t/vm/23_display.t b/t/vm/23_display.t index 46d8fb992..b0ff7808c 100644 --- a/t/vm/23_display.t +++ b/t/vm/23_display.t @@ -24,6 +24,31 @@ my $DISPLAY_IP = '99.1.99.1'; my $BASE; ######################################################################## +sub test_display_overwrite($vm) { + diag("Test display overwrite"); + my $domain = $BASE->clone(name => new_domain_name, user => user_admin); + Ravada::Request->expose( uid => user_admin->id + , id_domain => $domain->id + , port => 3389 + , restricted => 0 + , name => 'old' + ); + wait_request(); + + Ravada::Request->add_hardware( + uid => user_admin->id + ,id_domain => $domain->id + ,name => 'display' + ,data => { driver => 'rdp'} + ); + wait_request(); + + my $port = $domain->exposed_port(3389); + is($port->{restricted},1); + is($port->{name}, 'rdp'); + + remove_domain($domain); +} sub test_display_conflict($vm) { diag("Test display conflict"); @@ -231,6 +256,7 @@ for my $db ( 'mysql', 'sqlite' ) { } flush_rules() if !$<; + test_display_overwrite($vm); test_display_conflict($vm); } } diff --git a/templates/main/manage_machine_new_display.html.ep b/templates/main/manage_machine_new_display.html.ep index 492628d30..30baa4d8f 100644 --- a/templates/main/manage_machine_new_display.html.ep +++ b/templates/main/manage_machine_new_display.html.ep @@ -9,5 +9,10 @@ ng-options="driver for driver in showmachine.drivers['display']"> +