Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package perl-Libssh-Session for
openSUSE:Factory checked in at 2026-11-03 17:59:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Libssh-Session (Old)
and /work/SRC/openSUSE:Factory/.perl-Libssh-Session.new.1257 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Libssh-Session"
Tue Nov 3 17:59:52 2026 rev:3 rq:1394679 version:1.200.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-Libssh-Session/perl-Libssh-Session.changes
2024-06-27 16:03:56.096005792 +0200
+++
/work/SRC/openSUSE:Factory/.perl-Libssh-Session.new.1257/perl-Libssh-Session.changes
2026-11-03 18:05:08.462459538 +0100
@@ -1,0 +2,6 @@
+Thu Oct 8 12:03:32 UTC 2026 - Tina Müller <[email protected]>
+
+- updated to 1.200.0 (1.2)
+ see /usr/share/doc/packages/perl-Libssh-Session/Changes
+
+-------------------------------------------------------------------
Old:
----
Libssh-Session-1.1.tar.gz
New:
----
Libssh-Session-1.2.tar.gz
README.md
_scmsync.obsinfo
build.specials.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Libssh-Session.spec ++++++
--- /var/tmp/diff_new_pack.zmXPFh/_old 2026-11-03 18:05:09.349496820 +0100
+++ /var/tmp/diff_new_pack.zmXPFh/_new 2026-11-03 18:05:09.351496904 +0100
@@ -1,7 +1,7 @@
#
# spec file for package perl-Libssh-Session
#
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,16 +18,17 @@
%define cpan_name Libssh-Session
Name: perl-Libssh-Session
-Version: 1.100.0
+Version: 1.200.0
Release: 0
-# 1.1 -> normalize -> 1.100.0
-%define cpan_version 1.1
+# 1.2 -> normalize -> 1.200.0
+%define cpan_version 1.2
#Upstream: This library is licensed under the Apache License 2.0. Details of
this license can be found within the 'LICENSE' text file
License: Apache-2.0
Summary: Perl interface for libssh
URL: https://metacpan.org/release/%{cpan_name}
Source0:
https://cpan.metacpan.org/authors/id/Q/QG/QGARNIER/%{cpan_name}-%{cpan_version}.tar.gz
Source1: cpanspec.yml
+Source100: README.md
BuildRequires: perl
BuildRequires: perl-macros
Provides: perl(Libssh::Session) = %{version}
@@ -46,9 +47,7 @@
Right now, you can authenticate and execute commands on a SSH server.
%prep
-%autosetup -n %{cpan_name}-%{cpan_version}
-
-find . -type f ! -path "*/t/*" ! -name "*.pl" ! -path "*/bin/*" ! -path
"*/script/*" ! -path "*/scripts/*" ! -name "configure" -print0 | xargs -0 chmod
644
+%autosetup -n %{cpan_name}-%{cpan_version} -p1
%build
perl Makefile.PL INSTALLDIRS=vendor OPTIMIZE="%{optflags}"
++++++ Libssh-Session-1.1.tar.gz -> Libssh-Session-1.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Libssh-Session-1.1/Changes
new/Libssh-Session-1.2/Changes
--- old/Libssh-Session-1.1/Changes 2024-06-18 15:44:08.000000000 +0200
+++ new/Libssh-Session-1.2/Changes 2026-10-07 17:27:34.000000000 +0200
@@ -1,5 +1,8 @@
Revision history for Perl extension Libssh.
+1.2 2026-06-09
+ - Add execute_scenario methods
+
1.1 2024-06-18
- Fix release
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Libssh-Session-1.1/META.json
new/Libssh-Session-1.2/META.json
--- old/Libssh-Session-1.1/META.json 2024-06-18 15:44:25.000000000 +0200
+++ new/Libssh-Session-1.2/META.json 2026-10-07 17:27:34.000000000 +0200
@@ -47,5 +47,5 @@
}
},
"release_status" : "stable",
- "version" : "1.1"
+ "version" : "1.2"
}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Libssh-Session-1.1/META.yml
new/Libssh-Session-1.2/META.yml
--- old/Libssh-Session-1.1/META.yml 2024-06-18 15:44:17.000000000 +0200
+++ new/Libssh-Session-1.2/META.yml 2026-10-07 17:27:34.000000000 +0200
@@ -32,7 +32,7 @@
bugtracker: https://github.com/garnier-quentin/perl-libssh/issues
homepage: https://github.com/garnier-quentin/perl-libssh
repository: git://github.com/garnier-quentin/perl-libssh.git
-version: '1.1'
+version: '1.2'
x_contributors:
- 'Vesislav Dimitrov'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Libssh-Session-1.1/examples/client_execute_scenario.pl
new/Libssh-Session-1.2/examples/client_execute_scenario.pl
--- old/Libssh-Session-1.1/examples/client_execute_scenario.pl 1970-01-01
01:00:00.000000000 +0100
+++ new/Libssh-Session-1.2/examples/client_execute_scenario.pl 2026-10-07
17:27:34.000000000 +0200
@@ -0,0 +1,45 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Libssh::Session qw(:all);
+
+my $ssh_host = "127.0.0.1";
+my $ssh_port = 22;
+my $ssh_user = "root";
+my $ssh_pass = "centreon";
+
+my $session = Libssh::Session->new();
+if ($session->options(host => $ssh_host, port => $ssh_port, user => $ssh_user)
!= SSH_OK) {
+ print $session->error() . "\n";
+ exit(1);
+}
+
+if ($session->connect() != SSH_OK) {
+ print $session->error() . "\n";
+ exit(1);
+}
+
+if ($session->auth_publickey_auto() != SSH_AUTH_SUCCESS) {
+ printf("auth issue pubkey: %s\n", $session->error(GetErrorSession => 1));
+ if ($session->auth_password(password => $ssh_pass) != SSH_AUTH_SUCCESS) {
+ printf("auth issue: %s\n", $session->error(GetErrorSession => 1));
+ exit(1);
+ }
+}
+
+print "== authentification succeeded\n";
+
+my $ret = $session->execute_scenario(
+ interactive => 1,
+ scenario => [
+ { "cmd" => "waitfor", "options" => { "Match" => 'root@debian:~#',
"Timeout" => "5" } },
+ { "cmd" => "put", "options" => { "String" => "mystring\n", "Timeout"
=> "5" } },
+ { "cmd" => "waitfor", "options" => { "Match" => 'root@debian:~#',
"Timeout" => "5" } },
+ { "cmd" => "close" }
+ ]
+);
+use Data::Dumper;
+print Data::Dumper::Dumper($ret);
+
+exit(0);
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Libssh-Session-1.1/lib/Libssh/Session.pm
new/Libssh-Session-1.2/lib/Libssh/Session.pm
--- old/Libssh-Session-1.1/lib/Libssh/Session.pm 2024-06-18
15:44:36.000000000 +0200
+++ new/Libssh-Session-1.2/lib/Libssh/Session.pm 2026-10-07
17:27:34.000000000 +0200
@@ -7,7 +7,7 @@
use XSLoader;
use Time::HiRes;
-our $VERSION = '1.1';
+our $VERSION = '1.2';
XSLoader::load('Libssh::Session', $VERSION);
@@ -716,6 +716,155 @@
return pop(@{$self->{store_no_callback}});
}
+#
+# Scenario methods
+#
+
+sub init_scenario {
+ my ($self, %options) = @_;
+
+ my $channel_id = $self->open_channel();
+ if ($channel_id !~ /^\d+\:\d+$/) {
+ $self->{scenario}->{exit} = SSH_ERROR;
+ $self->set_err(msg => 'cannot init channel');
+ return undef;
+ }
+
+ if (defined($options{interactive}) && $options{interactive} =~ /1/) {
+ $self->channel_request_pty(channel =>
${$self->{channels}->{$channel_id}});
+ $self->channel_change_pty_size(channel =>
${$self->{channels}->{$channel_id}}, cols => $options{cols}, rows =>
$options{rows});
+ $self->channel_request_shell(channel =>
${$self->{channels}->{$channel_id}});
+ }
+
+ return $channel_id;
+}
+
+sub execute_scenario_read_channel {
+ my ($self, %options) = @_;
+
+ my $channel = ${$self->{channels}->{ $options{channel_id} }};
+
+ # read stdout
+ my $stdout = '';
+ while (1) {
+ my $result = ssh_channel_read($channel, 4092, 0, 1);
+ if (defined($result->{message})) {
+ $stdout .= $result->{message};
+ }
+
+ last if ($result->{code} != 4092);
+ }
+
+ # read stderr
+ my $stderr = '';
+ while (1) {
+ my $result = ssh_channel_read($channel, 4092, 1, 1);
+ if (defined($result->{message})) {
+ $stderr .= $result->{message};
+ }
+
+ last if ($result->{code} != 4092);
+ }
+
+ if (ssh_channel_is_eof($channel) != 0) {
+ my $channel_exit_status = SSH_ERROR;
+ for (my $i = 0; $i < 20; $i++) {
+ $channel_exit_status = $self->channel_get_exit_status(channel =>
$channel);
+ last if $channel_exit_status != SSH_ERROR;
+ Time::HiRes::usleep(50000);
+ }
+ $self->{scenario}->{exit_code} = $channel_exit_status;
+ $self->close_channel(channel_id => $options{channel_id});
+ } else {
+ $self->{scenario}->{read} = 1;
+ }
+
+ return ($stdout, $stderr);
+}
+
+sub execute_scenario {
+ my ($self, %options) = @_;
+ my $cols = (defined($options{pty}->{cols}) && int($options{pty}->{cols}) >
0) ?
+ $options{pty}->{cols} : 80;
+ my $rows = (defined($options{pty}->{rows}) && int($options{pty}->{rows}) >
0) ?
+ $options{pty}->{rows} : 24;
+
+ $self->{scenario} = { exit => SSH_OK, msg_error => '', stdout => '',
stderr => '', steps => [] };
+ my $channel_id = $self->init_scenario(interactive =>
$options{interactive}, cols => $cols, rows => $rows);
+ if (!defined($channel_id)) {
+ return $self->{scenario};
+ }
+
+ my $count_steps = scalar(@{$options{scenario}});
+ my $step = 0;
+ while ($step < $count_steps) {
+
+ if ($options{scenario}->[$step]->{cmd} eq 'waitfor') {
+ $self->{scenario}->{read} = 0;
+ my ($stdout, $stderr) = ('', '');
+ my $timeout =
(defined($options{scenario}->[$step]->{options}->{Timeout}) &&
int($options{scenario}->[$step]->{options}->{Timeout}) > 0) ?
+ $options{scenario}->[$step]->{options}->{Timeout} : 60;
+ my $timeout_nodata =
(defined($options{scenario}->[$step]->{options}->{TimeoutNoData}) &&
int($options{scenario}->[$step]->{options}->{TimeoutNoData}) > 0) ?
+ $options{scenario}->[$step]->{options}->{TimeoutNoData} : 60;
+
+ while (1) {
+ my $now = Time::HiRes::time();
+ my $ret =
ssh_channel_select_read([${$self->{channels}->{$channel_id}}], 5);
+ if ($ret->{code} == SSH_OK) {
+ my ($read_stdout, $read_stderr) =
$self->execute_scenario_read_channel(channel_id => $channel_id);
+ $self->{scenario}->{stdout} .= $read_stdout;
+ $self->{scenario}->{stderr} .= $read_stderr;
+ $stdout .= $read_stdout;
+ $stderr .= $read_stderr;
+ }
+ my $now2 = Time::HiRes::time();
+
+ if ($stdout =~
/$options{scenario}->[$step]->{options}->{Match}/) {
+ $step++;
+ last;
+ }
+
+ # check timeout
+ my $seconds = ($now2 - $now);
+
+ $timeout -= $seconds;
+ if ($self->{scenario}->{read} == 0) {
+ $timeout_nodata -= $seconds;
+ }
+
+ if ($timeout <= 0 ||
+ $timeout_nodata <= 0) {
+ $self->close_channel(channel_id => $channel_id);
+
+ $self->{scenario}->{exit} = SSH_AGAIN;
+ $self->{scenario}->{msg_error} = 'timeout raiched';
+ $self->set_err(msg => 'timeout raiched');
+ return $self->{scenario};
+ }
+ }
+
+ } elsif ($options{scenario}->[$step]->{cmd} eq 'put') {
+ if ($self->channel_write(channel => ${$self->{channels}->{
$channel_id }}, data => $options{scenario}->[$step]->{options}->{String}) ==
SSH_ERROR) {
+ $self->{scenario}->{exit} = SSH_ERROR;
+ $self->set_err(msg => 'cannot write in channel');
+ $self->{scenario}->{msg_error} = 'cannot write in channel';
+ return $self->{scenario};
+ }
+ $step++;
+ } elsif ($options{scenario}->[$step]->{cmd} eq 'close') {
+ $self->close_channel(channel_id => $channel_id);
+ $step++;
+ } else {
+ $self->{scenario}->{exit} = SSH_ERROR;
+ $self->set_err(msg => 'unknown scenario command');
+ $self->{scenario}->{msg_error} = 'unknown scenario command';
+ return $self->{scenario};
+ }
+ }
+
+ return $self->{scenario};
+}
+
sub open_channel {
my ($self, %options) = @_;
@@ -796,6 +945,18 @@
return ssh_channel_request_shell($options{channel});
}
+sub channel_request_pty {
+ my ($self, %options) = @_;
+
+ return ssh_channel_request_pty($options{channel});
+}
+
+sub channel_change_pty_size {
+ my ($self, %options) = @_;
+
+ return ssh_channel_change_pty_size($options{channel}, $options{cols},
$options{rows});
+}
+
sub channel_close {
my ($self, %options) = @_;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Libssh-Session-1.1/lib/Libssh/Sftp.pm
new/Libssh-Session-1.2/lib/Libssh/Sftp.pm
--- old/Libssh-Session-1.1/lib/Libssh/Sftp.pm 2024-06-18 15:44:44.000000000
+0200
+++ new/Libssh-Session-1.2/lib/Libssh/Sftp.pm 2026-10-07 17:27:34.000000000
+0200
@@ -7,7 +7,7 @@
use Libssh::Session;
use Exporter qw(import);
-our $VERSION = '1.1';
+our $VERSION = '1.2';
use constant SSH_OK => 0;
use constant SSH_ERROR => -1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Libssh-Session-1.1/libssh.xs
new/Libssh-Session-1.2/libssh.xs
--- old/Libssh-Session-1.1/libssh.xs 2024-05-28 10:26:37.000000000 +0200
+++ new/Libssh-Session-1.2/libssh.xs 2026-10-07 17:27:34.000000000 +0200
@@ -417,6 +417,18 @@
OUTPUT: RETVAL
int
+ssh_channel_request_pty(ssh_channel channel)
+ CODE:
+ RETVAL = ssh_channel_request_pty(channel);
+ OUTPUT: RETVAL
+
+int
+ssh_channel_change_pty_size(ssh_channel channel, int cols, int rows)
+ CODE:
+ RETVAL = ssh_channel_change_pty_size(channel, cols, rows);
+ OUTPUT: RETVAL
+
+int
ssh_channel_write(ssh_channel channel, char *data)
CODE:
RETVAL = ssh_channel_write(channel, data, strlen(data));
++++++ README.md ++++++
## Build Results
Current state of perl in openSUSE:Factory is

The current state of perl in the devel project build (devel:languages:perl)

++++++ _scmsync.obsinfo ++++++
mtime: 1791461013
commit: fca3f49edc6546e5072b38822129ee0399b3e9b22d89b25e1d5dc089a8f1d761
url: https://src.opensuse.org/perl/perl-Libssh-Session
revision: fca3f49edc6546e5072b38822129ee0399b3e9b22d89b25e1d5dc089a8f1d761
projectscmsync: https://src.opensuse.org/perl/_ObsPrj
++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore 1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore 2026-10-08 14:03:33.000000000 +0200
@@ -0,0 +1 @@
+.osc