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 
&apos;.*&apos; 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 &apos;%&apos; 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>&apos;id:1,2&apos;, 
&apos;state:running&apos;, &apos;name=obs-server,kanku-devel&apos;, 
&apos;obs-server%&apos;</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 &apos;.*&apos; 
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>&apos;domain:obs-server&apos;, 
&apos;host:kanku-worker1&apos;, &apos;worker=.*1&apos;</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 &apos;%&apos; 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>&apos;id:1,2&apos;, 
&apos;state:running&apos;, &apos;name=obs-server,kanku-devel&apos;, 
&apos;obs-server%&apos;">'
-    + ' <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>

Reply via email to