Git Product home page Git Product logo

proxmox-ve-api-perl's People

Contributors

djzort avatar dpiquet avatar ebl avatar japp-0xlabs avatar manwar avatar martijnlievaart avatar mrproper avatar p5i avatar pmorch avatar poptix avatar sauriol avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

proxmox-ve-api-perl's Issues

login() API provides no way for caller to investigate error code/msg

The canonical way to login is to:

$host->login() or die ('Couldnt log in to proxmox host');

But what exactly failed? The caller has no idea. login() should return an error that could be investigated or provide an error() API call for that purpose so proper diagnosis is possible without having to revert to

vi lib/Net/Proxmox/VE/Access.pm

and printf...

If login() changed and returned false on OK, but returned the HTTP::Response / $reponse on error, one could:

if (my $error = $host->login()) {
    die sprintf "Couldn't login. HTTP code: %d status line: %s",
        $error->code(),
        $error->status_line
}

(In our case,

printf("Code: %d\nStatus Line: %s\n",
    $response->code,
    $response->status_line
);

printed:

Code: 500
Status Line: 500 Can't connect to proxmox01:8006 (certificate verify failed)

but that is a separate issue - more on that later)

Json parsing error with threads

I am blocked by using this interesting module because it is unable is parse the JSON response. The parent script who is calling the API's are using threads.

use threads;
use threads::shared;
use Thread::Queue;

Sample error:
2023/08/01 02:31:37 PID5817[undef] WARN TA::Comm::Service::Proxmox::_connect(): 42 : Couldn't log in to proxmox host. ERROR: JSON text must be an object or array (but found number, string, true, false or null, use allow_nonref to allow this) at /usr/local/share/perl/5.26.1/Net/Proxmox/VE/Access.pm line 435.

Suggested fix:

` if ( $response->is_success ) {
# my $content = $response->decoded_content;
+ $self->{ticket} = JSON->new->allow_nonref->decode($response->decoded_content)->{data};
- my $login_ticket_data = decode_json( $response->decoded_content );
- $self->{ticket} = $login_ticket_data->{data};

    # We use request time as the time to get the json ticket is undetermined,
    # id rather have a ticket a few seconds shorter than have a ticket that incorrectly
    # says its valid for a couple more
    $self->{ticket_timestamp} = $request_time;
    print "DEBUG: login successful\n"
      if $self->{params}->{debug};
    return 1;
}

`

Net::Proxmox::VE's sub action should not print warnings to STDOUT

sub action has this:

sub action {
    ...
    if ( $response->is_success ) {
        ...
    }
    else {
        print "WARNING: request failed: " . $request->as_string . "\n";
        print "WARNING: response status: " . $response->status_line . "\n";
    }
    return;
}

No. A library should never print to STDOUT or STDERR.

warn($warning) is perfectly good for that. Or provide a possibility in the API to handle the warning. Or something other than silently and uncatchably print to STDOUT.

Also, isn't a get that fails an error, not a warning?

(Actually - for the next person to stumble onto this - it can be caught like this:

    my $interfaces;
    my $stdout;
    {
        open local(*STDOUT),'>',\$stdout;
        $interfaces = $proxmox->get(
            $getVMURL(123) . '/agent/network-get-interfaces'
        );
    }
    if ($stdout) {
        # Handle anticipated errors
        if ($stdout =~ /response status: 500 QEMU guest agent is not running/ ||
            $stdout =~ /response status: 500 No QEMU guest agent configured/) {
            return;
        } else {
            # die on other errors
            chomp $stdout;
            die sprintf "Got error from %s: %s",
                $self->_getVMURL . '/agent/network-get-interfaces',
                $stdout;
        }
    }

)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.