Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kanku for openSUSE:Factory checked in at 2021-04-15 16:58:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kanku (Old) and /work/SRC/openSUSE:Factory/.kanku.new.12324 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kanku" Thu Apr 15 16:58:06 2021 rev:3 rq:885626 version:0.10.3 Changes: -------- --- /work/SRC/openSUSE:Factory/kanku/kanku.changes 2021-02-20 22:12:57.815081998 +0100 +++ /work/SRC/openSUSE:Factory/.kanku.new.12324/kanku.changes 2021-04-15 16:58:48.954807079 +0200 @@ -1,0 +2,22 @@ +Thu Apr 15 10:46:53 UTC 2021 - fschrei...@suse.com + +- Update to version 0.10.3: + * [dist] bind "Requires: kanku*" to specific version + * [web] fix 'Subroutine redefined' in Kanku::REST + * [web] help for guest page + * [dist] removed help from views + * [web] help page as modal window + * [dist] added help page to spec + * [web] help page for job_history + * [web] fix tooltips in job page + * [web] more explainations in guest.js + * [web] fix for showDetails in common.js + * [handler] fixed ssh for Fedora 33 + * [util] fix for Fedora login behavior + * [web] job id in comment title + * [web] improved tooltips + * [web] fix closeModal in common.js + * [web] fix route handling when retrigger a job + * [web] refresh button in jobs_results page + +------------------------------------------------------------------- Old: ---- kanku-0.10.2.tar.xz New: ---- _maintainers.asc debian.changelog debian.compat debian.control debian.rules kanku-0.10.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kanku.spec ++++++ --- /var/tmp/diff_new_pack.bprYc8/_old 2021-04-15 16:58:49.634808155 +0200 +++ /var/tmp/diff_new_pack.bprYc8/_new 2021-04-15 16:58:49.634808155 +0200 @@ -22,7 +22,7 @@ Name: kanku # Version gets set by obs-service-tar_scm -Version: 0.10.2 +Version: 0.10.3 Release: 0 License: GPL-3.0-only Summary: Development and continuous integration @@ -91,12 +91,12 @@ BuildRequires: perl(Mail::Sendmail) BuildRequires: perl(Net::AMQP::RabbitMQ) BuildRequires: perl(UUID) -Requires: kanku-cli -Requires: kanku-dispatcher -Requires: kanku-scheduler -Requires: kanku-triggerd -Requires: kanku-web -Requires: kanku-worker +Requires: kanku-cli = %{version} +Requires: kanku-dispatcher = %{version} +Requires: kanku-scheduler = %{version} +Requires: kanku-triggerd = %{version} +Requires: kanku-web = %{version} +Requires: kanku-worker = %{version} %description kanku is a utility for integration of kiwi images built @@ -293,7 +293,7 @@ %package cli Summary: Command line client for kanku -Requires: kanku-common +Requires: kanku-common = %{version} Requires: libvirt-client Requires(pre): libvirt-daemon libvirt-daemon-driver-qemu Requires(pre): sudo @@ -344,8 +344,8 @@ %package web Summary: WebUI for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} Requires: perl(Dancer2::Plugin::WebSocket) Requires: perl(Mail::Message::Body::String) Requires: perl(Mail::Transport::Send) @@ -411,8 +411,8 @@ %package worker Summary: Worker daemon for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} Requires: perl(Net::AMQP::RabbitMQ) Requires: perl(Sys::CPU) Requires: perl(Sys::LoadAvg) @@ -449,8 +449,8 @@ %package dispatcher Summary: Dispatcher daemon for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} Requires: perl(Net::AMQP::RabbitMQ) Requires(pre): sudo Recommends: rabbitmq-server @@ -477,8 +477,8 @@ %package scheduler Summary: Scheduler daemon for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} %description scheduler A scheduler for kanku based on RabbitMQ. @@ -500,8 +500,8 @@ %package triggerd Summary: Trigger daemon for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} %description triggerd A triggerd for kanku based on RabbitMQ. @@ -535,7 +535,7 @@ %package urlwrapper Summary: Url wrapper for kanku:// urls Requires: desktop-file-utils -Requires: kanku-cli +Requires: kanku-cli = %{version} Requires: shared-mime-info Obsoletes: kanku-url-wrapper ++++++ _service ++++++ --- /var/tmp/diff_new_pack.bprYc8/_old 2021-04-15 16:58:49.698808257 +0200 +++ /var/tmp/diff_new_pack.bprYc8/_new 2021-04-15 16:58:49.698808257 +0200 @@ -5,7 +5,14 @@ <param name="scm">git</param> <param name="changesgenerate">enable</param> <param name="extract">dist/kanku.spec</param> + <param name="extract">dist/debian.changelog</param> + <param name="extract">dist/debian.compat</param> + <param name="extract">dist/debian.control</param> + <param name="extract">dist/debian.dsc</param> + <param name="extract">dist/debian.rules</param> <param name="revision">master</param> + <param name="latest-signed-tag">true</param> + <param name="maintainers-asc">_maintainers.asc</param> </service> <service name="recompress" mode="disabled"> <param name="compression">xz</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.bprYc8/_old 2021-04-15 16:58:49.722808294 +0200 +++ /var/tmp/diff_new_pack.bprYc8/_new 2021-04-15 16:58:49.722808294 +0200 @@ -1,4 +1,4 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/M0ses/kanku.git</param> - <param name="changesrevision">b7a464a8576b36c6da6fb81637aaa8c982e2bfa7</param></service></servicedata> \ No newline at end of file + <param name="changesrevision">f74afeded58d95457cc006f600cbe82e417b6973</param></service></servicedata> \ No newline at end of file ++++++ debian.changelog ++++++ kanku (0.10.3-0) UNRELEASED; urgency=medium * updated to upstream version 0.10.1 -- Frank Schreiner <fschrei...@suse.de> Thu, 04 Feb 2021 07:58:17 +0100 kanku (0.6.4-0) unstable; urgency=low * generated OBS deb build -- Frank Schreiner <fschrei...@suse.de> Mon, 25 Dec 2007 10:50:38 +0100 ++++++ debian.compat ++++++ 10 ++++++ debian.control ++++++ Priority: optional Maintainer: Frank Schreiner <fschrei...@suse.de> Source: kanku Build-Depends: debhelper (>= 5), libmoosex-app-perl, libnamespace-autoclean-perl, libmoose-perl, libmodule-pluggable-perl, libpod-elemental-perl, libio-interactive-perl, liblog-log4perl-perl, libmoosex-singleton-perl, libyaml-pp-perl, liblwp-protocol-https-perl, libwww-perl, libjson-xs-perl, libpath-class-perl, libfile-homedir-perl, libterm-readkey-perl, libdbix-class-perl, libdbix-class-migration-perl, liblog-log4perl-perl, libjson-maybexs-perl, libtype-tiny-perl, libjson-maybexs-perl, libdevel-partialdump-perl, libsql-translator-perl, liblog-any-perl, libsys-virt-perl, libexpect-perl, libtemplate-perl, libnet-ip-perl, libxml-xpath-perl, libfile-libmagic-perl, libipc-run-perl, libnet-amqp-perl, libnet-amqp-rabbitmq-perl, libmath-int64-perl, libconst-fast-perl, libnet-ssh2-perl, libuuid-perl Standards-Version: 3.8.2 Homepage: https://github.com/M0ses/kanku Section: httpd Package: kanku Architecture: any Description: TODO: add some meaningful description to be more verbose Depends: libmoosex-app-perl, libnamespace-autoclean-perl, libmoose-perl, libmodule-pluggable-perl, libpod-elemental-perl, libio-interactive-perl, liblog-log4perl-perl, libmoosex-singleton-perl, libyaml-pp-perl, liblwp-protocol-https-perl, libwww-perl, libjson-xs-perl, libpath-class-perl, libfile-homedir-perl, libterm-readkey-perl, libdbix-class-perl, libdbix-class-migration-perl, liblog-log4perl-perl, libjson-maybexs-perl, libtype-tiny-perl, libjson-maybexs-perl, libdevel-partialdump-perl, libsql-translator-perl, liblog-any-perl, libsys-virt-perl, libexpect-perl, libtemplate-perl, libnet-ip-perl, libxml-xpath-perl, libfile-libmagic-perl, libipc-run-perl, libnet-amqp-perl, libnet-amqp-rabbitmq-perl, libmath-int64-perl, libconst-fast-perl, libnet-ssh2-perl, libuuid-perl, libdancer2-perl, libsession-token-perl,libdancer2-plugin-dbic-perl, libnet-obs-client-perl, libtest-exception-perl, libdbix-class-fixtures-perl, libdancer2-plugin-auth-extensible-perl, libxml-structured-perl, libmoosex -app-perl, libdata-dump-streamer-perl, libdancer2-plugin-websocket-perl, libdata-visitor-perl, libconfig-tiny-perl, libio-all-perl, gnupg2, libdbix-class-deploymenthandler-perl, liblog-contextual-perl, libmoosex-role-parameterized-perl, libsql-splitstatement-perl, libdbix-class-schema-loader-perl, libfile-sharedir-projectdistdir-perl, libdbd-sqlite3-perl, libdatetime-format-sqlite-perl, libmoosex-app-cmd-perl, libvirt-daemon-system, libarchive-cpio-perl, libfile-copy-recursive-perl Recommends: libyaml-pp-libyaml-perl ++++++ debian.dsc ++++++ --- /var/tmp/diff_new_pack.bprYc8/_old 2021-04-15 16:58:49.822808453 +0200 +++ /var/tmp/diff_new_pack.bprYc8/_new 2021-04-15 16:58:49.826808459 +0200 @@ -2,8 +2,8 @@ Source: kanku Binary: kanku Architecture: any -Version: 0.10.2 -Maintainer: unknown <unkn...@debian.org> +Version: 0.10.3 +Maintainer: Frank Schreiner <fschrei...@suse.de> Standards-Version: 3.8.2 Homepage: https://github.com/M0ses/kanku Build-Depends: debhelper (>= 5), libmoosex-app-perl, libnamespace-autoclean-perl, libmoose-perl, libmodule-pluggable-perl, libpod-elemental-perl, libio-interactive-perl, liblog-log4perl-perl, libmoosex-singleton-perl, libyaml-perl, liblwp-protocol-https-perl, libwww-perl, libjson-xs-perl, libpath-class-perl, libfile-homedir-perl, libterm-readkey-perl, libdbix-class-perl, libdbix-class-migration-perl, liblog-log4perl-perl, libjson-maybexs-perl, libtype-tiny-perl, libjson-maybexs-perl, libdevel-partialdump-perl, libsql-translator-perl, liblog-any-perl, libsys-virt-perl, libexpect-perl, libtemplate-perl, libnet-ip-perl, libxml-xpath-perl, libfile-libmagic-perl, libipc-run-perl, libnet-amqp-perl, libnet-amqp-rabbitmq-perl, libmath-int64-perl, libconst-fast-perl, libnet-ssh2-perl, libuuid-perl, libdancer2-perl, libsession-token-perl,libdancer2-plugin-dbic-perl, libnet-obs-client-perl, libtest-exception-perl, libdbix-class-fixtures-perl, libdancer2-plugin-auth-extensible-perl, libxml-stru ctured-perl, libmoosex-app-perl, libdata-dump-streamer-perl, libdancer2-plugin-websocket-perl, libdata-visitor-perl, libconfig-tiny-perl, libio-all-perl, gnupg2, libdbix-class-deploymenthandler-perl, liblog-contextual-perl, libmoosex-role-parameterized-perl, libsql-splitstatement-perl, libdbix-class-schema-loader-perl, libfile-sharedir-projectdistdir-perl, libdbd-sqlite3-perl, libdatetime-format-sqlite-perl, libmoosex-app-cmd-perl, libyaml-pp-perl ++++++ debian.rules ++++++ #!/usr/bin/make -f # See debhelper(7) (uncomment to enable) # output every command that modifies files on the build system. #DH_VERBOSE = 1 # see FEATURE AREAS in dpkg-buildflags(1) #export DEB_BUILD_MAINT_OPTIONS = hardening=+all # see ENVIRONMENT in dpkg-buildflags(1) # package maintainers to append CFLAGS #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic # package maintainers to append LDFLAGS #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed DEB_BUILD_OPTIONS=nocheck %: dh $@ ++++++ kanku-0.10.2.tar.xz -> kanku-0.10.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/dist/kanku.spec new/kanku-0.10.3/dist/kanku.spec --- old/kanku-0.10.2/dist/kanku.spec 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/dist/kanku.spec 2021-04-15 12:21:54.000000000 +0200 @@ -90,12 +90,12 @@ BuildRequires: libvirt-daemon BuildRequires: desktop-file-utils BuildRequires: shared-mime-info -Requires: kanku-cli -Requires: kanku-web -Requires: kanku-worker -Requires: kanku-scheduler -Requires: kanku-dispatcher -Requires: kanku-triggerd +Requires: kanku-cli = %{version} +Requires: kanku-web = %{version} +Requires: kanku-worker = %{version} +Requires: kanku-scheduler = %{version} +Requires: kanku-dispatcher = %{version} +Requires: kanku-triggerd = %{version} %description kanku is a utility for integration of kiwi images built @@ -290,7 +290,7 @@ %package cli Summary: Command line client for kanku -Requires: kanku-common +Requires: kanku-common = %{version} Requires: libvirt-client Requires(pre): libvirt-daemon libvirt-daemon-driver-qemu Requires(pre): sudo @@ -341,8 +341,8 @@ %package web Summary: WebUI for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} Requires: perl(Dancer2::Plugin::WebSocket) Requires: perl(Twiggy) Requires: perl(Mail::Message::Body::String) @@ -408,8 +408,8 @@ %package worker Summary: Worker daemon for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} Requires: perl(Net::AMQP::RabbitMQ) Requires: perl(UUID) Requires: perl(Sys::CPU) @@ -446,8 +446,8 @@ %package dispatcher Summary: Dispatcher daemon for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} Requires: perl(Net::AMQP::RabbitMQ) Requires(pre): sudo Recommends: rabbitmq-server @@ -474,8 +474,8 @@ %package scheduler Summary: Scheduler daemon for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} %description scheduler A scheduler for kanku based on RabbitMQ. @@ -497,8 +497,8 @@ %package triggerd Summary: Trigger daemon for kanku -Requires: kanku-common -Requires: kanku-common-server +Requires: kanku-common = %{version} +Requires: kanku-common-server = %{version} %description triggerd A triggerd for kanku based on RabbitMQ. @@ -532,7 +532,7 @@ %package urlwrapper Summary: Url wrapper for kanku:// urls -Requires: kanku-cli +Requires: kanku-cli = %{version} Requires: desktop-file-utils Requires: shared-mime-info Obsoletes: kanku-url-wrapper diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/lib/Kanku/Handler/PrepareSSH.pm new/kanku-0.10.3/lib/Kanku/Handler/PrepareSSH.pm --- old/kanku-0.10.2/lib/Kanku/Handler/PrepareSSH.pm 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/lib/Kanku/Handler/PrepareSSH.pm 2021-04-15 12:21:54.000000000 +0200 @@ -113,8 +113,12 @@ "EOF\n" ); + # Hack for Fedora 33 + my $crypto_cfg = '/etc/crypto-policies/back-ends/opensshserver.config'; + $con->cmd("[ -f $crypto_cfg ] && sed -i -E 's/(PubkeyAcceptedKeyTypes .*)/\\1,ssh-rsa/' $crypto_cfg"); + # TODO: make dynamically switchable between systemV and systemd - $con->cmd("systemctl start sshd.service"); + $con->cmd("systemctl restart sshd.service"); $con->cmd("systemctl enable sshd.service"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/lib/Kanku/REST.pm new/kanku-0.10.3/lib/Kanku/REST.pm --- old/kanku-0.10.2/lib/Kanku/REST.pm 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/lib/Kanku/REST.pm 2021-04-15 12:21:54.000000000 +0200 @@ -3,7 +3,6 @@ use Moose; use Dancer2; -use Dancer2::Plugin; use Dancer2::Plugin::REST; use Dancer2::Plugin::DBIC; use Dancer2::Plugin::Auth::Extensible; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/lib/Kanku/Util/VM/Console.pm new/kanku-0.10.3/lib/Kanku/Util/VM/Console.pm --- old/kanku-0.10.2/lib/Kanku/Util/VM/Console.pm 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/lib/Kanku/Util/VM/Console.pm 2021-04-15 12:21:54.000000000 +0200 @@ -139,6 +139,18 @@ ); $exp->expect( 10, + # Ugly fix for nasty Fedora (32) behavior + [ '^\S+ login: ' => + sub { + my $exp = shift; + if ( $exp->match =~ /^(\S+) login: / ) { + $logger->debug("Found match '$1' again"); + } + $logger->debug(" - Re-Sending username '$user'"); + $exp->send("$user\n"); + exp_continue; + } + ], [ qr/Password: / => sub { my $exp = shift; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/lib/Kanku.pm new/kanku-0.10.3/lib/Kanku.pm --- old/kanku-0.10.2/lib/Kanku.pm 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/lib/Kanku.pm 2021-04-15 12:21:54.000000000 +0200 @@ -53,6 +53,10 @@ template 'index' , { %{ get_defaults_for_views() } }; }; +get '/help/:page' => sub { + template 'help/'.route_parameters->get('page'), { %{ get_defaults_for_views() } }; +}; + ### LOGIN / SIGNIN / SIGNUP sub email_welcome_send { Binary files old/kanku-0.10.2/public/images/help/dispatching.png and new/kanku-0.10.3/public/images/help/dispatching.png differ Binary files old/kanku-0.10.2/public/images/help/failed.png and new/kanku-0.10.3/public/images/help/failed.png differ Binary files old/kanku-0.10.2/public/images/help/obs/kanku-job_history-1-admin.png and new/kanku-0.10.3/public/images/help/obs/kanku-job_history-1-admin.png differ Binary files old/kanku-0.10.2/public/images/help/questionmark.png and new/kanku-0.10.3/public/images/help/questionmark.png differ Binary files old/kanku-0.10.2/public/images/help/running.png and new/kanku-0.10.3/public/images/help/running.png differ Binary files old/kanku-0.10.2/public/images/help/scheduled.png and new/kanku-0.10.3/public/images/help/scheduled.png differ Binary files old/kanku-0.10.2/public/images/help/skipped.png and new/kanku-0.10.3/public/images/help/skipped.png differ Binary files old/kanku-0.10.2/public/images/help/succeed.png and new/kanku-0.10.3/public/images/help/succeed.png differ Binary files old/kanku-0.10.2/public/images/help/triggered.png and new/kanku-0.10.3/public/images/help/triggered.png differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/public/js/kanku/common.js new/kanku-0.10.3/public/js/kanku/common.js --- old/kanku-0.10.2/public/js/kanku/common.js 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/public/js/kanku/common.js 2021-04-15 12:21:54.000000000 +0200 @@ -45,6 +45,13 @@ job.duration = r[1]; }; +Vue.component('help-button',{ + template: ` + <button class="btn btn-primary float-right pull-right" style="margin-left: 5px; padding: 0.6rem;" @click="$emit('showHelp')"> + <i class="fas fa-question-circle"></i> + </button>` +}); + Vue.component('refresh-button',{ methods: { refreshPage: function() { @@ -75,6 +82,29 @@ + ' </div>' }); +Vue.component('show-details',{ + methods: { + toggleDetails: function() { + this.showDetails = ! this.showDetails; + this.$emit("toggleDetails"); + } + }, + data: function() { + return { + showDetails: 0 + } + }, + template: '' + + ' <span v-on:click="toggleDetails()" style="color:black">' + + ' <span v-show="!showDetails">' + + ' <i class="fas fa-plus-square" data-bs-toggle="tooltip" data-bs-placement="top" title="Show details"/></i>' + + ' </span>' + + ' <span v-show="showDetails">' + + ' <i class="far fa-minus-square" data-bs-toggle="tooltip" data-bs-placement="top" title="Hide details"/>' + + ' </span>' + + ' </span>' +}); + Vue.component('to-top-button',{ methods: { toTop: function() { @@ -174,14 +204,7 @@ <div class="card-header alert" v-bind:class="task.state_class"> <div class="row"> <div class="col-md-12"> - <span @click="toggleDetails()"> - <span v-show="!showDetails"> - <i class="fas fa-plus-square"></i> - </span> - <span v-show="showDetails"> - <i class="far fa-minus-square"></i> - </span> - </span> + <show-details @toggleDetails="toggleDetails()"></show-details> <span class="badge badge-secondary">{{ task.id }}</span> {{ task.name }} </div> </div> @@ -266,13 +289,14 @@ host: tmp[0] || 'localhost', pid: tmp[1] || 0, queue: tmp[2] || '', - loglink: 'http://'+tmp[0]+'/kanku-console-logs/job-'+this.job.id+'-console.log' + loglink: 'http://'+tmp[0]+'/kanku-console-logs/job-'+this.job.id+'-console.log', } }, show_pwrand: function() { if (this.is_admin && this.job.pwrand && this.job.pwrand !='{}') { return true } return false; }, + comment_title: function() { return "Comment for Job "+this.job.id }, }, methods: { toggleDetails: function() { @@ -298,7 +322,7 @@ }, closeModal: function() { this.$refs.modalComment.hide(); - this.$root.updatePage(); + this.$emit('updatePage'); }, createJobComment: function() { var url = uri_base+'/rest/job/comment/'+this.job.id+'.json'; @@ -321,14 +345,7 @@ + ' <div class="card-header alert" v-bind:class="job.state_class">' + ' <div class="row">' + ' <div class="col-md-6">' - + ' <span v-on:click="toggleDetails()">' - + ' <span v-show="!showDetails">' - + ' <i class="fas fa-plus-square"></i>' - + ' </span>' - + ' <span v-show="showDetails">' - + ' <i class="far fa-minus-square"></i>' - + ' </span>' - + ' </span>' + + ' <show-details @toggleDetails="toggleDetails()"></show-details>' + ' <span class="badge badge-secondary">{{ job.id }}</span> {{ job.name }} ({{ workerInfo.host }})</a>' + ' </div>' + ' <div class="col-md-2">' @@ -342,13 +359,13 @@ + ' <console-log-link v-bind:loglink="workerInfo.loglink"></console-log-link>' + ' <job-details-link v-bind:id="job.id"></job-details-link>' + ' <comments-link v-show="show_comments" :job="job" ref="commentsLink"></comments-link>' - + ' <job-retrigger-link v-show="is_admin" :id="job.id" :is_admin="is_admin" @updatePage="$emit(\'updatePage\')"></job-retrigger-link>' + + ' <job-retrigger-link v-show="is_admin" :id="job.id" :is_admin="is_admin"></job-retrigger-link>' + ' <pwrand-link v-show="show_pwrand" :job_id="job.id"></pwrand-link>' + ' </div>' + ' </div>' + ' </div>' + ' <task-list v-show="showDetails" ref="tasklist" v-bind:workerinfo="workerInfo" v-bind:subtasks="subtasks" v-bind:result="job.result"></task-list>' - + ' <b-modal ref="modalComment" hide-footer title="Comments for Job">' + + ' <b-modal ref="modalComment" hide-footer :title="comment_title">' + ' <div>' + ' <single-job-comment v-for="cmt in job.comments" v-bind:key="cmt.id" v-bind:comment="cmt">' + ' </single-job-comment>' @@ -383,7 +400,7 @@ } }, template: '' - + '<a class="float-right" style="margin-left:5px;" v-on:click="showModal()" data-toggle="tooltip" data-placement="top" title="Comments">' + + '<a class="float-right" style="margin-left:5px;" v-on:click="showModal()" data-bs-toggle="tooltip" data-bs-placement="top" title="Comments">' + ' <span v-if="comments_length > 0" key="commented"><i class="fas fa-comments"></i></span>' + ' <span v-else><i class="far fa-comments" key="uncommented"></i></span>' + '</a>' @@ -392,7 +409,7 @@ Vue.component('job-details-link',{ props: ['id'], template: '' - + '<router-link class="float-right" style="margin-left:5px;" :to="\'/job_result/\'+id" data-toggle="tooltip" data-placement="top" title="Link to Result">' + + '<router-link class="float-right" style="margin-left:5px;" :to="\'/job_result/\'+id" data-bs-toggle="tooltip" data-bs-placement="top" title="Link to Result">' + ' <i class="fas fa-link"></i>' + '</router-link>' }); @@ -402,26 +419,26 @@ methods: { retriggerJob: function() { var url = uri_base + "/rest/job/retrigger/" + this.id + ".json"; + var self = this; axios.post(url, {is_admin: this.is_admin}).then(function(response) { show_messagebox(response.data.state, response.data.msg); - }); - var npage = this.$route.params.page; + var npage = self.$route.params.page; var o_job_states = ['running', 'failed', 'succeed', 'dispatching', 'triggered']; var o_query = { "job_states": o_job_states }; - if (! this.$route.query.show_only_latest_results ) { + if (! self.$route.query.show_only_latest_results ) { npage = 1; o_query['show_only_latest_results'] = true; } - this.$router.push({ + self.$router.push({ name: 'job_history', params: {page: npage}, query: o_query, }); - this.$emit('updatePage'); + }); }, }, template: '' - + '<span class="float-right" style="margin-left:5px;" @click="retriggerJob()" data-toggle="tooltip" data-placement="top" title="Retrigger">' + + '<span class="float-right" style="margin-left:5px;" @click="retriggerJob()" data-bs-toggle="tooltip" data-bs-placement="top" title="Retrigger">' + ' <i class="fas fa-redo-alt"></i>' + '</span>' }); @@ -437,7 +454,7 @@ }, }, template: '' - + ' <a class="float-right" style="margin-left:5px;" v-on:click="showModalPwRand()" data-toggle="tooltip" data-placement="top" title="Password">' + + ' <a class="float-right" style="margin-left:5px;" v-on:click="showModalPwRand()" data-bs-toggle="tooltip" data-bs-placement="top" title="Password">' + ' <i class="fas fa-lock"></i>' + ' </a>' }); @@ -445,7 +462,7 @@ Vue.component('console-log-link',{ props: ['loglink'], template: '' - + '<a class="float-right" style="margin-left:5px;" :href="loglink" target="_blank" data-toggle="tooltip" data-placement="top" title="Console Log">' + + '<a class="float-right" style="margin-left:5px;" :href="loglink" target="_blank" data-bs-toggle="tooltip" data-bs-placement="top" title="Console Log">' + ' <i class="fa fa-file-alt"></i>' + '</a>' }); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/public/js/kanku/guest.js new/kanku-0.10.3/public/js/kanku/guest.js --- old/kanku-0.10.2/public/js/kanku/guest.js 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/public/js/kanku/guest.js 2021-04-15 12:21:54.000000000 +0200 @@ -77,31 +77,28 @@ return true; } return false; - } + }, + found_ports: function() { + return Object.keys(this.data.forwarded_ports).length; + }, }, template: '' + '<div class="card guest-card">' + ' <div :class="header_classes">' + ' <div class="row">' + ' <div class="col-md-10">' - + ' <span v-on:click="toggleDetails()">' - + ' <a href="#" v-show="!showDetails">' - + ' <i class="fas fa-plus-square"></i>' - + ' </a>' - + ' <a href="#" v-show="showDetails">' - + ' <i class="far fa-minus-square"></i>' - + ' </a>' - + ' </span>' - + ' <span :class="badge_classes">{{ data.domain_name }} ({{ data.host }})</span>' + + ' <show-details @toggleDetails="toggleDetails()"></show-details>' + + ' <span :class="badge_classes">{{ data.domain_name }} ({{ data.host }})</span>' + ' </div>' + ' <div class="col-md-2">' - + ' <a class="float-right" :href="href_vm"><i class="fas fa-link"/></a>' - + ' <a v-if="allowDelete" class="float-right" href="#" @click="triggerRemoveDomain()"><i class="far fa-trash-alt"/></a>' + + ' <a class="float-right" :href="href_vm"><i class="fas fa-link" data-bs-toggle="tooltip" data-bs-placement="top" title="Link"/></a>' + + ' <a v-show="allowDelete" class="float-right" href="#" @click="triggerRemoveDomain()"><i class="far fa-trash-alt"data-bs-toggle="tooltip" data-bs-placement="top" title="Delete"/></a>' + ' </div>' + ' </div>' + ' </div>' + ' <div class="card-body" style="padding:5px;" v-show="showDetails">' + ' <iface-line v-for="nic in data.nics" v-bind:data="nic" v-bind:key="nic.hwaddr"></iface-line>' + + ' <div v-if="!found_ports">No current forwarded ports found!</div>' + ' <ipaddr-card v-for="(ports, ipaddr) in data.forwarded_ports" v-bind:ports="ports" v-bind:ipaddr="ipaddr" v-bind:key="ipaddr"></ipaddr-card>' + ' </div>' + ' </div>' @@ -110,7 +107,7 @@ Vue.component('search-tooltip-guest',{ template: '' - + ' <div class="badge badge-primary" style="padding:0.6em" data-toggle="tooltip" data-placement="bottom" ' + + ' <div class="badge badge-primary" style="padding:0.6em" data-bs-toggle="tooltip" data-bs-placement="bottom" ' + ' title="<strong>Search by domain or host:</strong><br>use '.*' wildcard<br>' + ' <strong>Supported fields:</strong><br>domain, host, worker (alias for host)<br>' + ' <strong>Supported Values:</strong><br>perl regex<br>' @@ -143,6 +140,9 @@ show_messagebox("danger", error); }); } + $(function () { + $('[data-bs-toggle="tooltip"]').tooltip({html:true, trigger:'hover'}); + }); }); }, sortedGuests: function() { @@ -153,21 +153,25 @@ return [domain_name]; } return Object.keys(this.guest_list).sort(); - } + }, + showHelp: function() { + var w = this.$refs.modalHelpGuest; + var v = w.$refs.modalHelpGuest; + v.show(); + }, }, mounted: function() { this.refreshPage(); - $(function () { - $('[data-toggle="tooltip"]').tooltip({html:true}) - }); }, template: '' + '<div>' + ' <head-line text="Guest"></head-line>' + + ' <help-guest ref="modalHelpGuest"></help-guest>' + ' <div class="row top_pager">' + ' <search-field @search-term-change="refreshPage" :filter="filter" comment="Enter search term - SEE Tooltips for details"></search-field>' + ' <div class="col-md-8">' - + ' <search-tooltip-guest></search-tooltip-guest>' + + ' <span><b>Hint:</b> The displayed port forwards do not reflect validated services.</span>' + + ' <help-button @showHelp="showHelp"></help-button>' + ' <refresh-button @refreshPage="refreshPage"></refresh-button>' + ' </div>' + ' </div>' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/public/js/kanku/help.js new/kanku-0.10.3/public/js/kanku/help.js --- old/kanku-0.10.2/public/js/kanku/help.js 1970-01-01 01:00:00.000000000 +0100 +++ new/kanku-0.10.3/public/js/kanku/help.js 2021-04-15 12:21:54.000000000 +0200 @@ -0,0 +1,79 @@ +Vue.component('help-job-history',{ + template: ` +<b-modal ref="modalHelpJobHistory" hide-footer title="Job History Help"> +<p>In the job history page you can see a list of all jobs in kanku.</p> +<p>They can be filtered by their current state or various other filters can be applied with the search field.</p> + +<h2>Search Field</h2> + +<p><strong>Search by job_name:</strong><br>Use '%' as wildcard</p> +<p><strong>Supported fields:</strong><br>id, state, name, worker</p> +<p><strong>Supported Values:</strong><br>comma separated lists (except worker)</p> +<p><strong>Examples:<br></strong>'id:1,2', 'state:running', 'name=obs-server,kanku-devel', 'obs-server%'</p> + +<h2>States</h2> + +<table class="table"> + <thead> + <tr> + <th scope="col">State</th> + <th scope="col">Description</th> + </tr> + </thead> + <tbody> + <tr> + <td><img src="`+uri_base+`/images/help/succeed.png" alt="succeed patch"></td> + <td>Job finished successfully.</td> + </tr> + <tr> + <td><img src="`+uri_base+`/images/help/failed.png" alt="failed patch"></td> + <td>Job finished with error.</td> + </tr> + <tr> + <td><img src="`+uri_base+`/images/help/dispatching.png" alt="dispatching patch"></td> + <td>Job started but not yet assigned to worker</td> + </tr> + <tr> + <td><img src="`+uri_base+`/images/help/running.png" alt="running patch"></td> + <td>Job is currently running on worker</td> + </tr> + <tr> + <td><img src="`+uri_base+`/images/help/scheduled.png" alt="scheduled patch"></td> + <td>Job generated by kanku-scheduler and waiting to get picked by kanku-dispatcher</td> + </tr> + <tr> + <td><img src="`+uri_base+`/images/help/triggered.png" alt="triggered patch"></td> + <td>Job generated by webui, kanku cli tool or kanku-triggerd (listening on rabbitmq)</td> + </tr> + <tr> + <td><img src="`+uri_base+`/images/help/skipped.png" alt="skipped patch"></td> + <td>Job skipped - Handler can decide to skip a job if it makes no sense to continue any longer.</td> + </tr> + </tbody> +</table> +</b-modal> +` +}); + +Vue.component('help-guest',{ + template: ` +<b-modal ref="modalHelpGuest" hide-footer title="Guest Help"> +<p>In the Guest page you can see a list of all Guest VMs existing in the kanku cluster. </p> +<p>The guests with a <span class="badge badge-success">green</span> headline are currently running. </p> +<p>The guests with a <span class="badge badge-warning">yellow</span> headline are down at the moment.</p> +<p>In the details you can find some additional information like the network bridge interface on the host, the MAC address and current portforwardings.</p> +<p>The forwarded ports are not necessarily reachable, e.g. when the service is down on the VM.</p> +<p>For port 22 automatically a ssh command line is generated to connect to the VM directly.</p> +<p>For port 80 and 443 a href is generate to get easy access to the web pages.</p> +<p>You can easily specify links to non common http(s) ports in the job configuration file. SEE 'man Kanku::Handler::PortForward' for more information.</p> +</p> + +<h2>Search Field</h2> + +<p><strong>Search by domain or host:</strong><br>use '.*' wildcard</p> +<p><strong>Supported fields:</strong><br>domain, host, worker (alias for host)</p> +<p><strong>Supported Values:</strong><br>perl regex</p> +<p><strong>Examples:</strong><br>'domain:obs-server', 'host:kanku-worker1', 'worker=.*1'</p> +</b-modal> +` +}); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/public/js/kanku/job.js new/kanku-0.10.3/public/js/kanku/job.js --- old/kanku-0.10.2/public/js/kanku/job.js 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/public/js/kanku/job.js 2021-04-15 12:21:54.000000000 +0200 @@ -91,7 +91,7 @@ } }, methods: { - toggleTaskList: function() { + toggleDetails: function() { this.showTaskList = !this.showTaskList; }, restoreDefaults: function() { @@ -113,14 +113,7 @@ template: '' + '<div class="card" style="margin-bottom:5px;">' + ' <div class="card-header">' - + ' <span v-on:click="toggleTaskList()">' - + ' <span v-show="!showTaskList">' - + ' <i class="fas fa-plus-square"></i>' - + ' </span>' - + ' <span v-show="showTaskList">' - + ' <i class="far fa-minus-square"></i>' - + ' </span>' - + ' </span>' + + ' <show-details @toggleDetails="toggleDetails()"></show-details>' + ' <span class="badge badge-secondary">{{ job.job_name }}</span>' + ' </div>' + ' <form :id="job.job_name">' @@ -201,6 +194,9 @@ show_messagebox('danger', "URL: " + url + "<br>" +error, timeout=0); }).then(function () { $('#spinner').hide(); + $(function () { + $('[data-bs-toggle="tooltip"]').tooltip({html:true, trigger: 'hover'}) + }); }); } }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/public/js/kanku/job_history.js new/kanku-0.10.3/public/js/kanku/job_history.js --- old/kanku-0.10.2/public/js/kanku/job_history.js 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/public/js/kanku/job_history.js 2021-04-15 12:21:54.000000000 +0200 @@ -1,14 +1,3 @@ -Vue.component('search-tooltip-job_history',{ - template: '' - + '<span class="badge badge-primary" style="padding: 0.6rem;" data-toggle="tooltip" data-placement="bottom" ' - + ' title="<strong>Search by job_name:</strong><br>Use '%' as wildcard<br>' - + ' <strong>Supported fields:</strong><br>id, state, name, worker<br>' - + ' <strong>Supported Values:</strong><br>comma separated lists (except worker)<br>' - + ' <strong>Examples:<br></strong>'id:1,2', 'state:running', 'name=obs-server,kanku-devel', 'obs-server%'">' - + ' <i class="fas fa-question-circle fa-2x" ></i>' - + '</span>' -}); - Vue.component('job-state-checkbox',{ props: ['name','state_class'], data: function() { @@ -134,11 +123,16 @@ .then(function () { $('#spinner').hide(); $(function () { - $('[data-toggle="tooltip"]').tooltip({html:true}) + $('[data-bs-toggle="tooltip"]').tooltip({html:true, trigger: 'hover'}) }); } ); - } + }, + showHelp: function() { + var w = this.$refs.modalHelpJobHistory; + var v = w.$refs.modalHelpJobHistory; + v.show(); + }, }, mounted: function() { this.refreshPage(); @@ -156,15 +150,14 @@ + ' <job-state-checkbox name="scheduled" state_class="badge badge-warning" @updatePage="refreshPage"></job-state-checkbox>' + ' <job-state-checkbox name="triggered" state_class="badge badge-warning" @updatePage="refreshPage"></job-state-checkbox>' + ' <job-state-checkbox name="skipped" state_class="badge badge-warning" @updatePage="refreshPage"></job-state-checkbox>' - + ' <div class="col col-md-3">' - + ' </div>' + + ' <div class="col col-md-3"></div>' + ' </div>' + ' <div class="row top_pager">' + ' <search-field :filter="filter" @search-term-change="refreshPage" comment="Enter search term - SEE Tooltips for details"></search-field>' - + ' <search-tooltip-job_history></search-tooltip-job_history>' + ' <show-only-latest-results @updatePage="refreshPage"></show-only-latest-results>' + ' <limit-select @updatePage="refreshPage" selected_limit="limit"></limit-select>' - + ' <div class="col-md-2">' + + ' <div class="col-md-3">' + + ' <help-button @showHelp="showHelp"></help-button>' + ' <refresh-button @refreshPage="refreshPage"></refresh-button>' + ' </div>' + ' </div>' @@ -180,5 +173,6 @@ + ' </div>' + ' <div class="col-md-4"></div>' + ' </div>' + + ' <help-job-history ref="modalHelpJobHistory"></help-job-history>' + '</div>' }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/public/js/kanku/job_result.js new/kanku-0.10.3/public/js/kanku/job_result.js --- old/kanku-0.10.2/public/js/kanku/job_result.js 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/public/js/kanku/job_result.js 2021-04-15 12:21:54.000000000 +0200 @@ -6,7 +6,7 @@ }; }, methods: { - updatePage: function() { + refreshPage: function() { var currentUrl = window.location.pathname; var urlParts = currentUrl.split('/'); var job_id = urlParts.pop(); @@ -20,11 +20,16 @@ }, }, mounted: function() { - this.updatePage(); + this.refreshPage(); }, template: '' + '<div>' + ' <head-line text="Job Result"></head-line>' + + ' <div class="row top_pager">' + + ' <div class="col-md-12">' + + ' <refresh-button @refreshPage="refreshPage"></refresh-button>' + + ' </div>' + + ' </div>' + ' <job-history-header></job-history-header>' + ' <job-history-card :job="job" :is_admin="is_admin" @updatePage="$emit(\'updatePage\')"></job-history-card>' + '</div>' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kanku-0.10.2/views/layouts/main.tt new/kanku-0.10.3/views/layouts/main.tt --- old/kanku-0.10.2/views/layouts/main.tt 2021-02-13 13:24:13.000000000 +0100 +++ new/kanku-0.10.3/views/layouts/main.tt 2021-04-15 12:21:54.000000000 +0200 @@ -40,6 +40,7 @@ </script> <script src="[% request.uri_base %]/js/kanku/common.js"></script> +<script src="[% request.uri_base %]/js/kanku/help.js"></script> <script src="[% request.uri_base %]/js/kanku/admin.js"></script> <script src="[% request.uri_base %]/js/kanku/guest.js"></script> <script src="[% request.uri_base %]/js/kanku/job_history.js"></script> @@ -54,9 +55,12 @@ </head> <body> - <div id="vue_app"> - </div> - [% content %] - <script src="[% request.uri_base %]/js/kanku/router.js"></script> + [% IF (matches = request.path.match('/help/(.*)')) %] + [% content %] + [% ELSE %] + <div id="vue_app"> + </div> + <script src="[% request.uri_base %]/js/kanku/router.js"></script> + [% END %] </body> </html>