Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Projets publics
Ravada-Mirror
Commits
3f9bd4e1
Commit
3f9bd4e1
authored
May 12, 2021
by
frankiejol
Browse files
wip(ports): set minimum port to expose
issue #1531
parent
ae0b1dc0
Changes
5
Hide whitespace changes
Inline
Side-by-side
lib/Ravada.pm
View file @
3f9bd4e1
...
...
@@ -1472,6 +1472,11 @@ sub _sql_insert_defaults($self){
,
name
=>
"
debug_ports
"
,
value
=>
0
}
,{
id_parent
=>
$id_backend
,
name
=>
'
expose_port_min
'
,
value
=>
'
60000
'
}
]
);
my
%field
=
(
settings
=>
'
name
'
);
...
...
lib/Ravada/Domain.pm
View file @
3f9bd4e1
...
...
@@ -25,6 +25,7 @@ no warnings "experimental::signatures";
use
feature
qw(signatures)
;
use
Ravada::Domain::
Driver
;
use
Ravada::Auth::
SQL
;
use
Ravada::
Utils
;
our
$TIMEOUT_SHUTDOWN
=
20
;
...
...
@@ -2816,7 +2817,12 @@ sub _add_expose($self, $internal_port, $name, $restricted) {
}
sub
_set_public_port
($self, $id_port, $internal_port, $name, $restricted) {
my
$public_port
=
$self
->
_vm
->
_new_free_port
();
my
$public_port
;
eval
{
$public_port
=
undef
;
$public_port
=
$self
->
_vm
->
_new_free_port
();
};
my
$error
=
$@
;
for
(;;)
{
if
(
$id_port
)
{
my
$sth
=
$$CONNECTOR
->
dbh
->
prepare
("
UPDATE domain_ports set public_port=?
"
...
...
@@ -2844,6 +2850,12 @@ sub _set_public_port($self, $id_port, $internal_port, $name, $restricted) {
}
$public_port
+=
int
(
rand
(
10
))
+
1
;
}
if
(
$error
)
{
my
$user
=
Ravada::Auth::
SQL
->
search_by_id
(
$self
->
_data
('
id_owner
'));
$user
->
send_message
(
$error
);
warn
$error
;
die
$error
;
}
}
sub
_used_ports_iptables
($self, $port, $skip_port) {
...
...
@@ -2880,7 +2892,7 @@ sub _open_exposed_port($self, $internal_port, $name, $restricted) {
);
$sth
->
execute
(
$internal_ip
,
$self
->
id
,
$internal_port
);
if
(
!
$>
)
{
if
(
!
$>
&&
$public_port
)
{
my
(
$out
,
$err
)
=
$self
->
_vm
->
run_command
("
iptables-save
","
-t
","
nat
");
my
@open1
=
(
grep
/--dport $public_port/
,
split
/\n/
,
$out
);
my
@open2
=
(
grep
/--to-destination $internal_ip:$internal_port/
,
split
/\n/
,
$out
);
...
...
@@ -3112,9 +3124,19 @@ sub list_ports($self) {
my
@ports_base
=
$base
->
list_ports
();
for
my
$data
(
@ports_base
)
{
next
if
exists
$clone_port
{
$data
->
{
internal_port
}};
unlock_hash
(
%$data
);
$data
->
{
public_port
}
=
$self
->
_vm
->
_new_free_port
()
if
$self
->
_vm
;
lock_hash
(
%$data
);
if
(
$self
->
_vm
)
{
unlock_hash
(
%$data
);
eval
{
$data
->
{
public_port
}
=
'';
$data
->
{
public_port
}
=
$self
->
_vm
->
_new_free_port
();
};
my
$error
=
$@
;
if
(
$error
)
{
my
$user
=
Ravada::Auth::
SQL
->
search_by_id
(
$self
->
_data
('
id_owner
'));
$user
->
send_message
(
substr
(
$error
,
0
,
80
));
}
lock_hash
(
%$data
);
}
push
@list
,(
$data
);
}
}
...
...
lib/Ravada/VM.pm
View file @
3f9bd4e1
...
...
@@ -1925,10 +1925,13 @@ sub _new_free_port($self) {
$self
->
_list_used_ports_ss
(
$used_port
);
$self
->
_list_used_ports_iptables
(
$used_port
);
my
$free_port
=
5950
;
my
$min_free_port
=
Ravada::
setting
(
undef
,'
/backend/expose_port_min
');
my
$free_port
=
$min_free_port
;
for
(;;)
{
last
if
!
$used_port
->
{
$free_port
};
$free_port
++
;
die
"
Error: no free ports available from
$min_free_port
.
\n
"
if
$free_port
>
65535
;
}
return
$free_port
;
}
...
...
templates/main/admin_settings.html.ep
View file @
3f9bd4e1
...
...
@@ -140,6 +140,19 @@
</div>
</div>
<div
class=
"row"
>
<div
class=
"col-md-1"
></div>
<div
class=
"col-md-2"
>
<label
for=
"debug"
>
Port expose
</label>
</div>
<div
class=
"col-md-8"
>
<input
name=
"debug"
ng-model=
"settings.backend.expose_port_min.value"
type=
"number"
min=
"1"
max=
"65530"
>
<
%=
l
'
Minimum
port
number
to
expose
virtual
machine
services.
'
%
>
<a
href=
"https://ravada.readthedocs.io/en/latest/docs/expose_ports.html"
><i
class=
"fa fa-info"
></i></a>
</div>
</div>
<hr>
...
...
templates/main/run_request.html.ep
View file @
3f9bd4e1
...
...
@@ -65,9 +65,12 @@
<ul
ng-show=
"domain.ports.length"
>
<li
ng-repeat=
"port in domain.ports"
>
<b>
{{port.name}}
</b>
<span
ng-show=
"port.public_port"
>
{{domain.display.ip}}:{{port.public_port}}
<i
class=
"fa fa-arrow-right"
></i>
{{port.internal_port}}
</span>
<span
ng-hide=
"port.public_port"
>
Error: no free ports to expose
</span>
</li>
</ul>
</div>
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment