use strict;
use warnings;
use JSON;
+use File::Basename qw(dirname);
+use File::Path qw(make_path);
+use PVE::APIClient::Helpers;
use PVE::APIClient::JSONSchema;
use PVE::APIClient::SectionConfig;
+use PVE::APIClient::PTY;
use PVE::APIClient::Tools qw(file_get_contents file_set_contents);
use base qw(PVE::APIClient::SectionConfig);
PVE::APIClient::JSONSchema::register_standard_option('pveclient-output-format', {
type => 'string',
description => 'Output format.',
- enum => [ 'table', 'json' ],
+ enum => [ 'text', 'json' ],
optional => 1,
- default => 'table',
+ default => 'text',
});
PVE::APIClient::JSONSchema::register_standard_option('pveclient-remote-name', {
sub config_filename {
my ($class) = @_;
- my $home = $ENV{HOME};
+ my $dir = PVE::APIClient::Helpers::configuration_directory();
- die "environment HOME not set\n" if !defined($home);
+ return "$dir/config";
+}
+
+sub lock_config {
+ my ($class, $timeout, $code, @param) = @_;
+
+ my $dir = PVE::APIClient::Helpers::configuration_directory();
+ make_path($dir);
+
+ my $filename = "$dir/.config.lck";
+
+ my $res = PVE::APIClient::Tools::lock_file($filename, $timeout, $code, @param);
+
+ die $@ if $@;
- return "$home/.pveclient";
+ return $res;
}
sub format_section_header {
my $filename = $class->config_filename();
+ make_path(dirname($filename));
+
$cfg->{order}->{$defaults_section} = -1; # write as first section
my $raw = $class->write_config($filename, $cfg);
my $section = $class->lookup_remote($cfg, $remote);
+ my $trylogin = sub {
+ my ($ticket_or_password) = @_;
+
+ if (!defined($ticket_or_password)) {
+ $ticket_or_password = PVE::APIClient::PTY::read_password("Remote password: ")
+ }
+
+ my $setup = {
+ username => $section->{username},
+ password => $ticket_or_password,
+ host => $section->{host},
+ port => $section->{port} // 8006,
+ cached_fingerprints => {
+ $section->{fingerprint} => 1,
+ }
+ };
+
+ my $conn = PVE::APIClient::LWP->new(%$setup);
+
+ $conn->login();
+
+ return $conn;
+ };
+
my $password = $section->{password};
- if (!defined($password)) {
- $password = PVE::PTY::read_password("Remote password: ")
- }
- my $conn = PVE::APIClient::LWP->new(
- username => $section->{username},
- password => $password,
- host => $section->{host},
- port => $section->{port} // 8006,
- cached_fingerprints => {
- $section->{fingerprint} => 1,
+ my $conn;
+
+ if (defined($password)) {
+ $conn = $trylogin->($password);
+ } else {
+
+ if (my $ticket = PVE::APIClient::Helpers::ticket_cache_lookup($remote)) {
+ eval { $conn = $trylogin->($ticket); };
+ if (my $err = $@) {
+ PVE::APIClient::Helpers::ticket_cache_update($remote, undef);
+ if (ref($err) && (ref($err) eq 'PVE::APIClient::Exception') && ($err->{code} == 401)) {
+ $conn = $trylogin->();
+ } else {
+ die $err;
+ }
+ }
+ } else {
+ $conn = $trylogin->();
}
- );
+ }
- $conn->login;
+ PVE::APIClient::Helpers::ticket_cache_update($remote, $conn->{ticket});
return $conn;
}