diff --git a/tools/striker-manage-vnc-pipes b/tools/striker-manage-vnc-pipes index 7fd00d01..f92b4c9c 100755 --- a/tools/striker-manage-vnc-pipes +++ b/tools/striker-manage-vnc-pipes @@ -28,13 +28,6 @@ my $ss = $anvil->data->{path}{exe}{'ss'}; my $sed = $anvil->data->{path}{exe}{'sed'}; my $websockify = $anvil->data->{path}{exe}{'websockify'}; -sub drop_vnc_pipes_table -{ - my $query = "DROP TABLE IF EXISTS public.vnc_pipes;"; - - $anvil->Database->write({ query => $query, source => $THIS_FILE, line => __LINE__ }); -} - $anvil->Get->switches; $anvil->Database->connect; @@ -197,7 +190,7 @@ sub find_ws_processes my $process = { pid => $pid, sport => $sport, tport => $tport }; - set_ws_process({ debug => $debug, process => $process, processes => $result }); + set_ws_process({ debug => $debug, entry => $process, entries => $result }); } return (0, $result); @@ -229,34 +222,40 @@ sub find_tp_processes my $process = { ctl_path => $ctl_path, pid => $pid, target => $target, tunnel_ls_path => $tunnel_ls_path }; - set_tp_process({ debug => $debug, process => $process, processes => $result }); + set_tp_process({ debug => $debug, entry => $process, entries => $result }); } return (0, $result); } -sub find_tunnel +sub find_tunnels { my $parameters = shift; my $debug = $parameters->{debug} || 3; - my $svr_uuid = $parameters->{svr_uuid}; my $tunnel_ls_path = $parameters->{tunnel_ls_path}; - $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => $debug, list => $parameters, prefix => "find_tunnel" }); + return (1) if (not defined $tunnel_ls_path); + + open(my $tunnel_ls_fh, "< :encoding(UTF-8)", $tunnel_ls_path) or return (1); + + my $result = { server_uuids => {}, lports => {} }; - return (1) if ( (not defined $svr_uuid) || (not defined $tunnel_ls_path) ); + while my $line (<$tunnel_ls_fh>) + { + chomp($line); - my $call = "$sed -En 's/^${svr_uuid}.*:([[:digit:]]+):.*:([[:digit:]]+)\$/\\1,\\2/p' '$tunnel_ls_path'"; + $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => $debug, list => { tunnel_line => $line } }); - my ($rcode, $output) = call({ call => $call, debug => $debug }); + my ($svr_uuid, $tunnel_lport, $tunnel_rport) = $line =~ /^([^\s]+)-[L|R].*:(\d+):.*:(\d+)$/; - return (1) if ($rcode); + my $tunnel = { lport => $lport, rport => $rport, server_uuid => $svr_uuid }; - chomp($output); + set_tunnel({ debug => $debug, entry => $tunnel, entries => $result }); + } - my ($lport, $rport) = split(/,/, $output); + close($tunnel_ls_fh) or return (1); - return (0, { lport => $lport, rport => $rport }); + return (0, $result); } sub get_strikers @@ -319,32 +318,28 @@ sub is_uuid_v4 return $_[0] =~ /[a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}/; } -sub set_process +sub set_entry { my $parameters = shift; my $debug = $parameters->{debug} || 3; my $handle_delete = $parameters->{handle_delete}; my $handle_set = $parameters->{handle_set}; - my $pid = $parameters->{pid}; - my $process = $parameters->{process}; - my $processes = $parameters->{processes}; + my $id = $parameters->{id}; + my $entry = $parameters->{entry}; + my $entries = $parameters->{entries}; - $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => $debug, list => $parameters, prefix => "set_process" }); - $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => $debug, list => $process }); + $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => $debug, list => $parameters, prefix => "set_entry" }); + $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => $debug, list => $entry }); - return (1) if (not defined $processes); + return (1) if (not defined $entries); - if (defined $process) + if (defined $entry) { - $pid = $process->{pid}; - - $handle_set->($pid, $process, $processes); + $handle_set->($id, $entry, $entries); } - elsif (defined $pid) + elsif (defined $id) { - $process = $processes->{pids}{$pid}; - - $handle_delete->($pid, $process, $processes); + $handle_delete->($id, $entry, $entries); } return (0); @@ -357,6 +352,8 @@ sub set_tp_process $parameters->{handle_delete} = sub { my ($pid, $process, $processes) = @_; + $process = $processes->{pids}{$pid}; + my $target = $process->{target}; delete $processes->{pids}{$pid}; @@ -366,13 +363,44 @@ sub set_tp_process $parameters->{handle_set} = sub { my ($pid, $process, $processes) = @_; + $pid = $process->{pid}; + my $target = $process->{target}; $processes->{pids}{$pid} = $process; $processes->{targets}{$target} = $pid; }; - return set_process($parameters); + return set_entry($parameters); +} + +sub set_tunnel +{ + my $parameters = shift; + + $parameters->{handle_delete} = sub { + my ($svr_uuid, $tunnel, $tunnels) = @_; + + $tunnel = $tunnels->{server_uuids}{$svr_uuid}; + + my $lport = $tunnel->{lport}; + + delete $tunnels->{server_uuids}{$svr_uuid}; + delete $tunnels->{lports}{$lport}; + }; + + $parameters->{handle_set} = sub { + my ($svr_uuid, $tunnel, $tunnels) = @_; + + $svr_uuid = $tunnel->{server_uuid}; + + my $lport = $tunnel->{lport}; + + $tunnels->{server_uuids}{$svr_uuid} = $tunnel; + $tunnels->{lports}{$lport} = $svr_uuid; + }; + + return set_entry($parameters); } sub set_tunnel_variable @@ -406,6 +434,8 @@ sub set_ws_process $parameters->{handle_delete} = sub { my ($pid, $process, $processes) = @_; + $process = $processes->{pids}{$pid}; + my $sport = $process->{sport}; my $tport = $process->{tport}; @@ -417,6 +447,8 @@ sub set_ws_process $parameters->{handle_set} = sub { my ($pid, $process, $processes) = @_; + $pid = $process->{pid}; + my $sport = $process->{sport}; my $tport = $process->{tport}; @@ -425,7 +457,7 @@ sub set_ws_process $processes->{targets}{$tport} = $pid; }; - return set_process($parameters); + return set_entry($parameters); } sub start_pipe @@ -482,18 +514,26 @@ sub start_pipe my $tp_process = $tp_processes->{pids}{$tp_pid}; - ($rcode, my $tunnel) = start_tunnel({ + my $tunnels = find_tunnels({ tunnel_ls_path => $tp_process->{tunnel_ls_path} }); + + ($rcode) = start_tunnel({ svr_uuid => $svr_uuid, tp_ctl_path => $tp_process->{ctl_path}, tp_target => $host_name, tp_target_uuid => $host_uuid, + tunnels => $tunnels, ws_sport => $ws_process->{sport}, %$common_params, }); next if ($rcode); - ($rcode) = set_tunnel_variable($tunnel); + ($rcode) = set_tunnel_variable({ + debug => $debug, + end_port => $tunnel_rport, + svr_uuid => $svr_uuid, + tp_target_uuid => $host_uuid + }); if ($rcode) { @@ -543,7 +583,7 @@ sub start_tp my $tp_process = { ctl_path => $tp_ctl_path, pid => $tp_pid, target => $tp_target, tunnel_ls_path => $tp_tunnel_ls_path }; - set_tp_process({ debug => $debug, process => $tp_process, processes => $tp_processes }); + set_tp_process({ debug => $debug, entry => $tp_process, entries => $tp_processes }); return (0, $tp_pid); } @@ -556,6 +596,7 @@ sub start_tunnel my $tp_ctl_path = $parameters->{tp_ctl_path}; my $tp_target = $parameters->{tp_target}; my $tp_target_uuid = $parameters->{tp_target_uuid}; + my $tunnels = $parameters->{tunnels}; my $ws_sport = $parameters->{ws_sport}; $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => $debug, list => $parameters, prefix => "start_tunnel" }); @@ -564,8 +605,15 @@ sub start_tunnel || (not defined $tp_target) || (not defined $tp_target_uuid) || (not defined $tp_ctl_path) || ($tp_ctl_path eq "") || (not -e $tp_ctl_path) + || (not defined $tunnels) || (not defined $ws_sport) ); + my $existing_tunnel = $tunnels->{server_uuids}{$svr_uuid}; + + $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => $debug, list => { existing_tunnel => $existing_tunnel } }); + + return (0, $svr_uuid) if (defined $existing_tunnel); + my $build_rcode; my $sh_call; @@ -606,7 +654,11 @@ sub start_tunnel return (1) if ($start_rcode); - return (0, { debug => $debug, end_port => $tunnel_rport, svr_uuid => $svr_uuid, tp_target_uuid => $tp_target_uuid }); + my $tunnel = { lport => $ws_sport, rport => $tunnel_rport, server_uuid => $svr_uuid }; + + set_tunnel({ debug => $debug, entry => $tunnel, entries => $tunnels }); + + return (0, $svr_uuid); } sub start_ws @@ -643,7 +695,7 @@ sub start_ws my $ws_process = { pid => $ws_pid, sport => $ws_sport, tport => $svr_vnc_port }; - set_ws_process({ debug => $debug, process => $ws_process, processes => $ws_processes }); + set_ws_process({ debug => $debug, entry => $ws_process, entries => $ws_processes }); return (0, $ws_pid); } @@ -654,8 +706,9 @@ sub stop_pipe my $debug = $parameters->{debug} || 3; my $svr_uuid = $parameters->{svr_uuid}; my $svr_vnc_port = $parameters->{svr_vnc_port}; + my $tunnels = $parameters->{tunnels}; - return (1) if (not is_uuid_v4($svr_uuid)); + return (1) if ( (not is_uuid_v4($svr_uuid)) || (not defined $tunnels) ); my $common_params = { debug => $debug }; @@ -696,15 +749,11 @@ sub stop_pipe my $tp_pid = $tp_processes->{targets}{$host_name}; my $tp_process = $tp_processes->{pids}{$tp_pid}; - ($rcode, my $tunnel_ports) = find_tunnel({ - svr_uuid => $svr_uuid, - tunnel_ls_path => $tp_process->{tunnel_ls_path}, - %$common_params, - }); + my $tunnel = $tunnels->{server_uuids}{$svr_uuid}; - next if ($rcode); + next if (not defined $tunnel); - stop_tunnel({ %$tunnel_ports, tp_ctl_path => $tp_process->{ctl_path}, %$common_params }); + stop_tunnel({ %$tunnel, tp_ctl_path => $tp_process->{ctl_path}, %$common_params }); } return (0); @@ -721,7 +770,7 @@ sub stop_tp call({ debug => $debug, call => "$kill $tp_pid || $kill -9 $tp_pid" }); - set_tp_process({ debug => $debug, pid => $tp_pid, processes => $tp_processes }); + set_tp_process({ debug => $debug, id => $tp_pid, entries => $tp_processes }); } sub stop_tunnel @@ -762,5 +811,5 @@ sub stop_ws call({ debug => $debug, call => "$kill $ws_pid || $kill -9 $ws_pid" }); - set_ws_process({ debug => $debug, pid => $ws_pid, processes => $ws_processes }); + set_ws_process({ debug => $debug, id => $ws_pid, entries => $ws_processes }); }