Class: Pvectl::Commands::ConsoleCt

Inherits:
Object
  • Object
show all
Defined in:
lib/pvectl/commands/console_ct.rb

Overview

Handler for the ‘pvectl console ct` command.

Opens an interactive terminal console session to an LXC container via WebSocket-based termproxy. Requires a running container and interactive terminal (TTY).

Examples:

Open console to container 200

pvectl console ct 200

Open console with explicit credentials

pvectl console ct 200 --user root@pam --password secret

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ctid, options, global_options) ⇒ ConsoleCt

Initializes a console container command.

Parameters:

  • ctid (String, nil)

    container identifier

  • options (Hash)

    command options

  • global_options (Hash)

    global CLI options



35
36
37
38
39
# File 'lib/pvectl/commands/console_ct.rb', line 35

def initialize(ctid, options, global_options)
  @ctid = ctid
  @options = options
  @global_options = global_options
end

Class Method Details

.execute(ctid, options, global_options) ⇒ Integer

Executes the console container command.

Parameters:

  • ctid (String, nil)

    container identifier

  • options (Hash)

    command options (:user, :password)

  • global_options (Hash)

    global CLI options

Returns:

  • (Integer)

    exit code



26
27
28
# File 'lib/pvectl/commands/console_ct.rb', line 26

def self.execute(ctid, options, global_options)
  new(ctid, options, global_options).execute
end

Instance Method Details

#executeInteger

Executes the console flow.

Returns:

  • (Integer)

    exit code



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/pvectl/commands/console_ct.rb', line 44

def execute
  return usage_error("CTID is required") unless @ctid
  return usage_error("Console requires an interactive terminal (TTY)") unless $stdin.tty?

  load_config
  connection = Pvectl::Connection.new(@config)
  repo = Pvectl::Repositories::Container.new(connection)

  resource = repo.get(@ctid.to_i)
  return not_found("Container #{@ctid} not found") unless resource

  username, password = resolve_credentials
  return ExitCodes::GENERAL_ERROR if username.nil? || password.nil?

  $stderr.puts "Connecting to container #{resource.vmid} (#{resource.name || 'unnamed'}) on node #{resource.node}..."

  Pvectl::Services::Console.new.run(
    resource: resource,
    resource_path: resource_path,
    server: @config.server,
    username: username,
    password: password,
    verify_ssl: @config.verify_ssl
  )

  ExitCodes::SUCCESS
rescue Services::Console::ResourceNotRunningError => e
  $stderr.puts "Error: #{e.message}"
  ExitCodes::GENERAL_ERROR
rescue Services::Console::AuthenticationError => e
  $stderr.puts "Error: #{e.message}"
  ExitCodes::PERMISSION_DENIED
rescue Pvectl::Config::ConfigNotFoundError,
       Pvectl::Config::InvalidConfigError,
       Pvectl::Config::ContextNotFoundError,
       Pvectl::Config::ClusterNotFoundError,
       Pvectl::Config::UserNotFoundError,
       Pvectl::Config::MissingCredentialsError
  raise # re-raise for CLI handler
rescue Errno::ECONNREFUSED, SocketError, Timeout::Error => e
  $stderr.puts "Error: Cannot connect to console: #{e.message}"
  ExitCodes::CONNECTION_ERROR
rescue StandardError => e
  $stderr.puts "Error: #{e.message}"
  ExitCodes::GENERAL_ERROR
end