From eae52968e4ad57d62b47a09af556f725b80e4072 Mon Sep 17 00:00:00 2001 From: Alexandr Akulich Date: Fri, 7 Jul 2017 21:09:14 +0300 Subject: [PATCH] [urlresolver] Implement graceful shutdown. Fixes MER#1797 The plugin should exit only on _DISCONNECT signal, but let's also report an error and quit on unknown command. --- ssuurlresolver/ssuurlresolver.cpp | 27 +++++++++++++++++++++++---- ssuurlresolver/ssuurlresolver.h | 2 ++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/ssuurlresolver/ssuurlresolver.cpp b/ssuurlresolver/ssuurlresolver.cpp index e2f55f8..3a8110d 100644 --- a/ssuurlresolver/ssuurlresolver.cpp +++ b/ssuurlresolver/ssuurlresolver.cpp @@ -35,6 +35,12 @@ void SsuUrlResolver::error(const QString &message) QCoreApplication::exit(1); } +void SsuUrlResolver::ack() const +{ + zypp::PluginFrame out(zypp::PluginFrame::ackCommand()); + out.writeTo(std::cout); +} + bool SsuUrlResolver::writeZyppCredentialsIfNeeded(const QString &credentialsScope) { QString filePath = Sandbox::map("/etc/zypp/credentials.d/" + credentialsScope); @@ -73,14 +79,29 @@ bool SsuUrlResolver::writeZyppCredentialsIfNeeded(const QString &credentialsScop } void SsuUrlResolver::run() +{ + while (true) { + zypp::PluginFrame inputFrame(std::cin); + if (inputFrame.command() == "RESOLVEURL") { + resolve(inputFrame); + } else if (inputFrame.command() == "_DISCONNECT") { + ack(); + break; + } else { + error(QStringLiteral("Unknown plugin command")); + break; + } + } + emit done(); +} + +void SsuUrlResolver::resolve(PluginFrame &in) { QHash repoParameters; QString repo; bool isRnd = false; SsuLog *ssuLog = SsuLog::instance(); - PluginFrame in(std::cin); - if (in.headerEmpty()) { error("Received empty header list. Most likely your ssu setup is broken"); } @@ -185,6 +206,4 @@ void SsuUrlResolver::run() out.setBody(resolvedUrl.toStdString()); out.writeTo(std::cout); } - - emit done(); } diff --git a/ssuurlresolver/ssuurlresolver.h b/ssuurlresolver/ssuurlresolver.h index fee5f96..665e9a8 100644 --- a/ssuurlresolver/ssuurlresolver.h +++ b/ssuurlresolver/ssuurlresolver.h @@ -59,6 +59,8 @@ class SsuUrlResolver: public QObject private: Ssu ssu; void error(const QString &message); + void ack() const; + void resolve(zypp::PluginFrame &in); bool writeZyppCredentialsIfNeeded(const QString &credentialsScope); public slots: