Accepting request 503692 from home:ptesarik:branches:Kernel:kdump
Aarch64 support, systemd services, IP in directory name OBS-URL: https://build.opensuse.org/request/show/503692 OBS-URL: https://build.opensuse.org/package/show/Kernel:kdump/kdump?expand=0&rev=129
This commit is contained in:
parent
d58c1277f3
commit
e0f11a3f9b
@ -3,6 +3,8 @@ From: Petr Tesarik <ptesarik@suse.com>
|
||||
Subject: Add KDUMP_SSH_IDENTITY config option
|
||||
References: FATE#321583
|
||||
Git-commit: 3e7e5f020024eed5c6d944e0ff9554772cbdb896
|
||||
Git-commit: d7e6f45461bf0f899cfedf564d985cf5cd41f331
|
||||
Git-commit: f0a43757c99635ece304fc9c011c0b82acd86f64
|
||||
Upstream: v0.8.17
|
||||
|
||||
Make the SSH private file configurable.
|
||||
@ -10,14 +12,14 @@ Make the SSH private file configurable.
|
||||
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
|
||||
---
|
||||
doc/man/kdump.5.txt.in | 9 +++++++++
|
||||
init/setup-kdump.functions | 37 ++++++++++++++++++++++++++-----------
|
||||
doc/man/kdump.5.txt.in | 10 ++++++++++
|
||||
init/setup-kdump.functions | 39 ++++++++++++++++++++++++++++-----------
|
||||
kdumptool/define_opt.h | 1 +
|
||||
3 files changed, 36 insertions(+), 11 deletions(-)
|
||||
3 files changed, 39 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/doc/man/kdump.5.txt.in
|
||||
+++ b/doc/man/kdump.5.txt.in
|
||||
@@ -643,7 +643,16 @@ Example (broken into lines for readabili
|
||||
@@ -643,7 +643,17 @@ Example (broken into lines for readabili
|
||||
|
||||
Default: ""
|
||||
|
||||
@ -26,7 +28,8 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
|
||||
+List of SSH identity files for public key authentication. If empty, kdump
|
||||
+will try all standard OpenSSH identities for the 'root' user (rsa, dsa,
|
||||
+ecdsa, ed25519, in this order).
|
||||
+ecdsa, ed25519, in this order). The path to every identity file is relative
|
||||
+to +~root/.ssh+, or an absolute path can be given.
|
||||
+
|
||||
+Example: "/root/.ssh/id_kdump_rsa"
|
||||
+
|
||||
@ -36,7 +39,7 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
----------
|
||||
--- a/init/setup-kdump.functions
|
||||
+++ b/init/setup-kdump.functions
|
||||
@@ -935,6 +935,27 @@ function kdump_modify_multipath()
|
||||
@@ -935,6 +935,29 @@ function kdump_modify_multipath()
|
||||
} # }}}
|
||||
|
||||
#
|
||||
@ -45,18 +48,20 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
+# 1) dest: root of the temporary area
|
||||
+function kdump_copy_ssh_ident() # {{{
|
||||
+{
|
||||
+ local dest="$1"
|
||||
+ local ssh_conf="$dest/kdump/.ssh/config"
|
||||
+ local sshdir="$1/kdump/.ssh"
|
||||
+ local ssh_conf="$sshdir/config"
|
||||
+ local f
|
||||
+
|
||||
+ shift
|
||||
+ for f in "$@"; do
|
||||
+ test "${f:0:1}" = "/" || f=~root/".ssh/$f"
|
||||
+ test -f "$f" || continue
|
||||
+
|
||||
+ cp "$f" "${dest}/kdump/.ssh/"
|
||||
+ test -f "${f}.pub" && cp "${f}.pub" "${dest}/kdump/.ssh/"
|
||||
+ test -f "${f}-cert.pub" && cp "${f}-cert.pub" "${dest}/kdump/.ssh/"
|
||||
+ echo "IdentityFile ${f}" >> "$ssh_conf"
|
||||
+ cp "$f" "$sshdir/"
|
||||
+ test -f "${f}.pub" && cp "${f}.pub" "$sshdir/"
|
||||
+ test -f "${f}-cert.pub" && cp "${f}-cert.pub" "$sshdir/"
|
||||
+ f=$( basename $f )
|
||||
+ echo "IdentityFile /kdump/.ssh/${f}" >> "$ssh_conf"
|
||||
+ done
|
||||
+} # }}}
|
||||
+
|
||||
@ -64,7 +69,7 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
# Copy SSH keys and create a config file in the target
|
||||
# Parameters:
|
||||
# 1) dest: root of the temporary area
|
||||
@@ -952,17 +973,11 @@ function kdump_init_ssh() # {{{
|
||||
@@ -952,17 +975,11 @@ function kdump_init_ssh() # {{{
|
||||
echo "StrictHostKeyChecking yes" >> "$ssh_conf"
|
||||
echo "UserKnownHostsFile /kdump/.ssh/known_hosts" >> "$ssh_conf"
|
||||
|
||||
@ -82,7 +87,7 @@ Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
+ if [ -n "$KDUMP_SSH_IDENTITY" ] ; then
|
||||
+ kdump_copy_ssh_ident "$dest" $KDUMP_SSH_IDENTITY
|
||||
+ else
|
||||
+ kdump_copy_ssh_ident "$dest" /root/.ssh/id_{rsa,dsa,ecdsa,ed25519}
|
||||
+ kdump_copy_ssh_ident "$dest" id_{rsa,dsa,ecdsa,ed25519}
|
||||
+ fi
|
||||
} # }}}
|
||||
|
||||
|
159
kdump-Routable-preferred-source-address.patch
Normal file
159
kdump-Routable-preferred-source-address.patch
Normal file
@ -0,0 +1,159 @@
|
||||
Date: Fri Jun 9 16:46:10 2017 +0200
|
||||
From: Petr Tesarik <ptesarik@suse.com>
|
||||
Subject: Routable: parse and store preferred source address
|
||||
References: FATE#321844
|
||||
Upstream: v0.8.17
|
||||
Git-commit: 3748faebf9834eae0a0676800984ebccd7d3cab9
|
||||
|
||||
This is the preferred source address, used by the kernel for outgoing
|
||||
connections when no other address is explicitly set.
|
||||
|
||||
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
|
||||
diff --git a/kdumptool/routable.cc b/kdumptool/routable.cc
|
||||
index d9833f6..6137f89 100644
|
||||
--- a/kdumptool/routable.cc
|
||||
+++ b/kdumptool/routable.cc
|
||||
@@ -58,6 +58,10 @@ class NetLink {
|
||||
|
||||
int waitRouteChange(void);
|
||||
|
||||
+ const char *prefSrc(void) const
|
||||
+ throw ()
|
||||
+ { return m_prefsrc; }
|
||||
+
|
||||
protected:
|
||||
class RecvCheck {
|
||||
public:
|
||||
@@ -89,6 +93,8 @@ class NetLink {
|
||||
throw ()
|
||||
{ return m_message; }
|
||||
|
||||
+ int parseAttrs(const struct rtattr *rta, size_t len);
|
||||
+
|
||||
private:
|
||||
int m_timeout;
|
||||
|
||||
@@ -99,13 +105,16 @@ class NetLink {
|
||||
size_t m_buflen;
|
||||
unsigned char *m_buffer;
|
||||
struct nlmsghdr *m_message;
|
||||
+
|
||||
+ int m_family;
|
||||
+ char m_prefsrc[INET6_ADDRSTRLEN];
|
||||
};
|
||||
|
||||
unsigned NetLink::m_seq;
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
NetLink::NetLink(unsigned subscribe, size_t recv_max)
|
||||
- : m_timeout(-1), m_buflen(recv_max)
|
||||
+ : m_timeout(-1), m_buflen(recv_max), m_family(AF_UNSPEC)
|
||||
{
|
||||
struct sockaddr_nl sa;
|
||||
socklen_t salen;
|
||||
@@ -126,6 +135,8 @@ NetLink::NetLink(unsigned subscribe, size_t recv_max)
|
||||
throw KSystemError("Cannot get local netlink address", errno);
|
||||
if (salen != sizeof m_local || m_local.nl_family != AF_NETLINK)
|
||||
throw KError("Invalid local netlink address");
|
||||
+
|
||||
+ m_prefsrc[0] = '\0';
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -354,7 +365,8 @@ int NetLink::checkRoute(const struct addrinfo *ai)
|
||||
case RTN_BROADCAST:
|
||||
case RTN_ANYCAST:
|
||||
case RTN_MULTICAST:
|
||||
- return 0;
|
||||
+ m_family = rt->rtm_family;
|
||||
+ return parseAttrs(RTM_RTA(rt), RTM_PAYLOAD(nh));
|
||||
case RTN_UNREACHABLE:
|
||||
return -EHOSTUNREACH;
|
||||
case RTN_BLACKHOLE:
|
||||
@@ -368,6 +380,49 @@ int NetLink::checkRoute(const struct addrinfo *ai)
|
||||
}
|
||||
}
|
||||
|
||||
+// -----------------------------------------------------------------------------
|
||||
+int NetLink::parseAttrs(const struct rtattr *rta, size_t len)
|
||||
+{
|
||||
+ while (RTA_OK(rta, len)) {
|
||||
+ void *data = RTA_DATA(rta);
|
||||
+ size_t dlen = RTA_PAYLOAD(rta);
|
||||
+ int res;
|
||||
+
|
||||
+ switch (rta->rta_type) {
|
||||
+ case RTA_PREFSRC:
|
||||
+ if (m_family == AF_INET &&
|
||||
+ dlen == sizeof(struct in_addr)) {
|
||||
+ struct sockaddr_in saddr;
|
||||
+ memset(&saddr, 0, sizeof saddr);
|
||||
+ saddr.sin_family = AF_INET;
|
||||
+ saddr.sin_addr = *(struct in_addr *)data;
|
||||
+ res = getnameinfo((struct sockaddr*)&saddr, sizeof saddr,
|
||||
+ m_prefsrc, sizeof m_prefsrc,
|
||||
+ NULL, 0, NI_NUMERICHOST);
|
||||
+ } else if (m_family == AF_INET6 &&
|
||||
+ dlen == sizeof(struct in6_addr)) {
|
||||
+ struct sockaddr_in6 saddr;
|
||||
+ memset(&saddr, 0, sizeof saddr);
|
||||
+ saddr.sin6_family = AF_INET6;
|
||||
+ saddr.sin6_addr = *(struct in6_addr *)data;
|
||||
+ res = getnameinfo((struct sockaddr*)&saddr, sizeof saddr,
|
||||
+ m_prefsrc, sizeof m_prefsrc,
|
||||
+ NULL, 0, NI_NUMERICHOST);
|
||||
+ } else
|
||||
+ res = EAI_FAMILY;
|
||||
+ if (res)
|
||||
+ throw KGaiError("Cannot parse preferred source address", res);
|
||||
+
|
||||
+ break;
|
||||
+ }
|
||||
+ rta = RTA_NEXT(rta, len);
|
||||
+ }
|
||||
+ if (len)
|
||||
+ throw KError("Netlink rtattr truncated");
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
//}}}
|
||||
|
||||
//{{{ Routable -----------------------------------------------------------------
|
||||
@@ -388,8 +443,11 @@ bool Routable::hasRoute(void)
|
||||
Debug::debug()->trace("hasRoute(%s)", m_host.c_str());
|
||||
|
||||
for (p = m_ai; p; p = p->ai_next) {
|
||||
- if (nl.checkRoute(p) == 0)
|
||||
+ if (nl.checkRoute(p) == 0) {
|
||||
+ Debug::debug()->dbg("m_prefsrc='%s'", nl.prefSrc());
|
||||
+ m_prefsrc.assign(nl.prefSrc());
|
||||
return true;
|
||||
+ }
|
||||
}
|
||||
|
||||
return false;
|
||||
diff --git a/kdumptool/routable.h b/kdumptool/routable.h
|
||||
index cdfffaf..0763131 100644
|
||||
--- a/kdumptool/routable.h
|
||||
+++ b/kdumptool/routable.h
|
||||
@@ -42,6 +42,10 @@ class Routable {
|
||||
|
||||
bool check(int timeout);
|
||||
|
||||
+ const std::string& prefsrc(void) const
|
||||
+ throw ()
|
||||
+ { return m_prefsrc; }
|
||||
+
|
||||
protected:
|
||||
bool resolve(void)
|
||||
throw (KError);
|
||||
@@ -51,6 +55,7 @@ class Routable {
|
||||
private:
|
||||
int m_nlfd;
|
||||
std::string m_host;
|
||||
+ std::string m_prefsrc;
|
||||
struct addrinfo *m_ai;
|
||||
};
|
||||
|
617
kdump-URLTransfer-complete-target.patch
Normal file
617
kdump-URLTransfer-complete-target.patch
Normal file
@ -0,0 +1,617 @@
|
||||
Date: Wed Jun 14 10:48:33 2017 +0200
|
||||
From: Petr Tesarik <ptesarik@suse.com>
|
||||
Subject: Use the complete target URL for URLTransfer
|
||||
References: FATE#321844
|
||||
Upstream: v0.8.17
|
||||
Git-commit: 4540de762995219c19f8feac2f594868595741ea
|
||||
|
||||
Append the subdirectory name in the caller and pass around a standard
|
||||
vector or RootDirURL objects.
|
||||
|
||||
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
|
||||
diff --git a/kdumptool/configuration.cc b/kdumptool/configuration.cc
|
||||
index 167195d..192dcfd 100644
|
||||
--- a/kdumptool/configuration.cc
|
||||
+++ b/kdumptool/configuration.cc
|
||||
@@ -180,11 +180,13 @@ bool Configuration::needsNetwork()
|
||||
if (netconfig != "auto")
|
||||
return true;
|
||||
|
||||
- RootDirURLVector urlv(KDUMP_SAVEDIR.value(), "");
|
||||
- RootDirURLVector::iterator it;
|
||||
- for (it = urlv.begin(); it != urlv.end(); ++it)
|
||||
- if (it->getProtocol() != URLParser::PROT_FILE)
|
||||
+ std::istringstream iss(KDUMP_SAVEDIR.value());
|
||||
+ string elem;
|
||||
+ while (iss >> elem) {
|
||||
+ URLParser url(elem);
|
||||
+ if (url.getProtocol() != URLParser::PROT_FILE)
|
||||
return true;
|
||||
+ }
|
||||
|
||||
return !KDUMP_SMTP_SERVER.value().empty() &&
|
||||
!KDUMP_NOTIFICATION_TO.value().empty();
|
||||
diff --git a/kdumptool/deletedumps.cc b/kdumptool/deletedumps.cc
|
||||
index 500299e..f19a421 100644
|
||||
--- a/kdumptool/deletedumps.cc
|
||||
+++ b/kdumptool/deletedumps.cc
|
||||
@@ -87,10 +87,12 @@ void DeleteDumps::execute()
|
||||
return;
|
||||
}
|
||||
|
||||
- RootDirURLVector urls(config->KDUMP_SAVEDIR.value(), m_rootdir);
|
||||
- RootDirURLVector::const_iterator it;
|
||||
- for (it = urls.begin(); it != urls.end(); ++it)
|
||||
- delete_one(*it, oldDumps);
|
||||
+ std::istringstream iss(config->KDUMP_SAVEDIR.value());
|
||||
+ string elem;
|
||||
+ while (iss >> elem) {
|
||||
+ RootDirURL url(elem, m_rootdir);
|
||||
+ delete_one(url, oldDumps);
|
||||
+ }
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
diff --git a/kdumptool/print_target.cc b/kdumptool/print_target.cc
|
||||
index 06dbc41..8d3e50d 100644
|
||||
--- a/kdumptool/print_target.cc
|
||||
+++ b/kdumptool/print_target.cc
|
||||
@@ -60,12 +60,16 @@ void PrintTarget::execute()
|
||||
|
||||
Configuration *config = Configuration::config();
|
||||
|
||||
- RootDirURLVector urlv(config->KDUMP_SAVEDIR.value(), m_rootdir);
|
||||
- RootDirURLVector::iterator it;
|
||||
- for (it = urlv.begin(); it != urlv.end(); ++it) {
|
||||
- if (it != urlv.begin())
|
||||
+ std::istringstream iss(config->KDUMP_SAVEDIR.value());
|
||||
+ string elem;
|
||||
+ bool first = true;
|
||||
+ while (iss >> elem) {
|
||||
+ RootDirURL url(elem, m_rootdir);
|
||||
+ if (first)
|
||||
+ first = false;
|
||||
+ else
|
||||
cout << endl;
|
||||
- print_one(*it);
|
||||
+ print_one(url);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/kdumptool/rootdirurl.cc b/kdumptool/rootdirurl.cc
|
||||
index 38e613c..41352e9 100644
|
||||
--- a/kdumptool/rootdirurl.cc
|
||||
+++ b/kdumptool/rootdirurl.cc
|
||||
@@ -44,19 +44,4 @@ RootDirURL::RootDirURL(const std::string &url, const std::string &rootdir)
|
||||
|
||||
//}}}
|
||||
|
||||
-//{{{ RootDirURLVector ---------------------------------------------------------
|
||||
-
|
||||
-// -----------------------------------------------------------------------------
|
||||
-RootDirURLVector::RootDirURLVector(const std::string &urls,
|
||||
- const std::string &rootdir)
|
||||
- throw (KError)
|
||||
-{
|
||||
- std::istringstream iss(urls);
|
||||
- std::string url;
|
||||
- while (iss >> url)
|
||||
- push_back(RootDirURL(url, rootdir));
|
||||
-}
|
||||
-
|
||||
-//}}}
|
||||
-
|
||||
// vim: set sw=4 ts=4 fdm=marker et: :collapseFolds=1:
|
||||
diff --git a/kdumptool/rootdirurl.h b/kdumptool/rootdirurl.h
|
||||
index c93c825..724d4ab 100644
|
||||
--- a/kdumptool/rootdirurl.h
|
||||
+++ b/kdumptool/rootdirurl.h
|
||||
@@ -59,28 +59,7 @@ class RootDirURL : public URLParser {
|
||||
std::string m_realpath;
|
||||
};
|
||||
|
||||
-//}}}
|
||||
-
|
||||
-//{{{ RootDirURLVector ---------------------------------------------------------
|
||||
-
|
||||
-/**
|
||||
- * Parse a list of URLs.
|
||||
- */
|
||||
-class RootDirURLVector: public std::vector<RootDirURL> {
|
||||
-
|
||||
- public:
|
||||
-
|
||||
- /**
|
||||
- * Creates a new RootDirURLVector.
|
||||
- *
|
||||
- * @param[in] urls space-separated list of URLs to parse
|
||||
- * @param[in] rootdir root directory for local files
|
||||
- * @exception KError if any URL from the list cannot be parsed
|
||||
- */
|
||||
- RootDirURLVector(const std::string &urls, const std::string &rootdir)
|
||||
- throw (KError);
|
||||
-
|
||||
-};
|
||||
+typedef std::vector<RootDirURL> RootDirURLVector;
|
||||
|
||||
//}}}
|
||||
|
||||
diff --git a/kdumptool/savedump.cc b/kdumptool/savedump.cc
|
||||
index eeec24e..9938b6f 100644
|
||||
--- a/kdumptool/savedump.cc
|
||||
+++ b/kdumptool/savedump.cc
|
||||
@@ -110,9 +110,15 @@ void SaveDump::execute()
|
||||
// build the transfer object
|
||||
// prepend a time stamp to the save dir
|
||||
string subdir = Stringutil::formatCurrentTime(ISO_DATETIME);
|
||||
- RootDirURLVector urlv(config->KDUMP_SAVEDIR.value(), m_rootdir);
|
||||
+ RootDirURLVector urlv;
|
||||
+ std::istringstream iss(config->KDUMP_SAVEDIR.value());
|
||||
+ FilePath elem;
|
||||
+ while (iss >> elem) {
|
||||
+ RootDirURL url(elem.appendPath(subdir), m_rootdir);
|
||||
+ urlv.push_back(url);
|
||||
+ }
|
||||
|
||||
- m_transfer = getTransfer(urlv, subdir);
|
||||
+ m_transfer = getTransfer(urlv);
|
||||
|
||||
// save the dump
|
||||
try {
|
||||
@@ -120,11 +126,11 @@ void SaveDump::execute()
|
||||
} catch (const KError &error) {
|
||||
setErrorCode(1);
|
||||
|
||||
- sendNotification(true, urlv, subdir);
|
||||
+ sendNotification(true, urlv);
|
||||
|
||||
// run checkAndDelete() in any case
|
||||
try {
|
||||
- checkAndDelete(urlv, subdir);
|
||||
+ checkAndDelete(urlv);
|
||||
} catch (const KError &error) {
|
||||
cout << error.what() << endl;
|
||||
}
|
||||
@@ -136,13 +142,13 @@ void SaveDump::execute()
|
||||
}
|
||||
|
||||
// send the email afterwards
|
||||
- sendNotification(false, urlv, subdir);
|
||||
+ sendNotification(false, urlv);
|
||||
|
||||
// because we don't know the file size in advance, check
|
||||
// afterwards if the disk space is not sufficient and delete
|
||||
// the dump again
|
||||
try {
|
||||
- checkAndDelete(urlv, subdir);
|
||||
+ checkAndDelete(urlv);
|
||||
} catch (const KError &error) {
|
||||
setErrorCode(1);
|
||||
if (config->KDUMP_CONTINUE_ON_ERROR.value())
|
||||
@@ -594,22 +600,20 @@ string SaveDump::findMapfile()
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-void SaveDump::checkAndDelete(const RootDirURLVector &urlv,
|
||||
- const string &subdir)
|
||||
+void SaveDump::checkAndDelete(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
{
|
||||
RootDirURLVector::const_iterator it;
|
||||
for (it = urlv.begin(); it != urlv.end(); ++it)
|
||||
- check_one(*it, subdir);
|
||||
+ check_one(*it);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-void SaveDump::check_one(const RootDirURL &parser,
|
||||
- const string &subdir)
|
||||
+void SaveDump::check_one(const RootDirURL &parser)
|
||||
throw (KError)
|
||||
{
|
||||
- Debug::debug()->trace("SaveDump::check_one(\"%s\", \"%s\")",
|
||||
- parser.getURL().c_str(), subdir.c_str());
|
||||
+ Debug::debug()->trace("SaveDump::check_one(\"%s\")",
|
||||
+ parser.getURL().c_str());
|
||||
|
||||
// only do that check for local files
|
||||
if (parser.getProtocol() != URLParser::PROT_FILE) {
|
||||
@@ -618,7 +622,6 @@ void SaveDump::check_one(const RootDirURL &parser,
|
||||
}
|
||||
|
||||
FilePath path = parser.getRealPath();
|
||||
- path.appendPath(subdir);
|
||||
Configuration *config = Configuration::config();
|
||||
|
||||
unsigned long long freeSize = path.freeDiskSize();
|
||||
@@ -634,8 +637,7 @@ void SaveDump::check_one(const RootDirURL &parser,
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-void SaveDump::sendNotification(bool failure, const RootDirURLVector &urlv,
|
||||
- const string &subdir)
|
||||
+void SaveDump::sendNotification(bool failure, const RootDirURLVector &urlv)
|
||||
throw ()
|
||||
{
|
||||
Debug::debug()->trace("SaveDump::sendNotification");
|
||||
@@ -694,10 +696,8 @@ void SaveDump::sendNotification(bool failure, const RootDirURLVector &urlv,
|
||||
else {
|
||||
ss << "Dump has been copied to" << endl;
|
||||
RootDirURLVector::const_iterator it;
|
||||
- for (it = urlv.begin(); it != urlv.end(); ++it) {
|
||||
- FilePath fp = it->getURL();
|
||||
- ss << fp.appendPath(subdir) << endl;
|
||||
- }
|
||||
+ for (it = urlv.begin(); it != urlv.end(); ++it)
|
||||
+ ss << it->getURL() << endl;
|
||||
}
|
||||
|
||||
email.setBody(ss.str());
|
||||
@@ -738,12 +738,11 @@ string SaveDump::getKernelReleaseCommandline()
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-Transfer *SaveDump::getTransfer(const RootDirURLVector &urlv,
|
||||
- const string &subdir)
|
||||
+Transfer *SaveDump::getTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
{
|
||||
- Debug::debug()->trace("SaveDump::getTransfer(%p, \"%s\")",
|
||||
- &urlv, subdir.c_str());
|
||||
+ Debug::debug()->trace("SaveDump::getTransfer(%p)",
|
||||
+ &urlv);
|
||||
|
||||
if (urlv.size() == 0)
|
||||
throw KError("No target specified!");
|
||||
@@ -751,27 +750,27 @@ Transfer *SaveDump::getTransfer(const RootDirURLVector &urlv,
|
||||
switch (urlv.begin()->getProtocol()) {
|
||||
case URLParser::PROT_FILE:
|
||||
Debug::debug()->dbg("Returning FileTransfer");
|
||||
- return new FileTransfer(urlv, subdir);
|
||||
+ return new FileTransfer(urlv);
|
||||
|
||||
case URLParser::PROT_FTP:
|
||||
Debug::debug()->dbg("Returning FTPTransfer");
|
||||
- return new FTPTransfer(urlv, subdir);
|
||||
+ return new FTPTransfer(urlv);
|
||||
|
||||
case URLParser::PROT_SFTP:
|
||||
Debug::debug()->dbg("Returning SFTPTransfer");
|
||||
- return new SFTPTransfer(urlv, subdir);
|
||||
+ return new SFTPTransfer(urlv);
|
||||
|
||||
case URLParser::PROT_SSH:
|
||||
Debug::debug()->dbg("Returning SSHTransfer");
|
||||
- return new SSHTransfer(urlv, subdir);
|
||||
+ return new SSHTransfer(urlv);
|
||||
|
||||
case URLParser::PROT_NFS:
|
||||
Debug::debug()->dbg("Returning NFSTransfer");
|
||||
- return new NFSTransfer(urlv, subdir);
|
||||
+ return new NFSTransfer(urlv);
|
||||
|
||||
case URLParser::PROT_CIFS:
|
||||
Debug::debug()->dbg("Returning CIFSTransfer");
|
||||
- return new CIFSTransfer(urlv, subdir);
|
||||
+ return new CIFSTransfer(urlv);
|
||||
|
||||
default:
|
||||
throw KError("Unknown protocol.");
|
||||
diff --git a/kdumptool/savedump.h b/kdumptool/savedump.h
|
||||
index cd3f70d..cd11177 100644
|
||||
--- a/kdumptool/savedump.h
|
||||
+++ b/kdumptool/savedump.h
|
||||
@@ -86,12 +86,10 @@ class SaveDump : public Subcommand {
|
||||
std::string findMapfile()
|
||||
throw (KError);
|
||||
|
||||
- void checkAndDelete(const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+ void checkAndDelete(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
- void sendNotification(bool failure, const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+ void sendNotification(bool failure, const RootDirURLVector &urlv)
|
||||
throw ();
|
||||
|
||||
std::string getKernelReleaseCommandline()
|
||||
@@ -106,8 +104,7 @@ class SaveDump : public Subcommand {
|
||||
* @exception KError if parsing the URL failed or there's no
|
||||
* implementation for that class.
|
||||
*/
|
||||
- Transfer *getTransfer(const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+ Transfer *getTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
private:
|
||||
@@ -122,8 +119,7 @@ class SaveDump : public Subcommand {
|
||||
std::string m_hostname;
|
||||
bool m_nomail;
|
||||
|
||||
- void check_one(const RootDirURL &parser,
|
||||
- const std::string &subdir)
|
||||
+ void check_one(const RootDirURL &parser)
|
||||
throw (KError);
|
||||
};
|
||||
|
||||
diff --git a/kdumptool/sshtransfer.cc b/kdumptool/sshtransfer.cc
|
||||
index 5a036db..12f315d 100644
|
||||
--- a/kdumptool/sshtransfer.cc
|
||||
+++ b/kdumptool/sshtransfer.cc
|
||||
@@ -40,10 +40,9 @@ using std::endl;
|
||||
//{{{ SSHTransfer -------------------------------------------------------------
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
-SSHTransfer::SSHTransfer(const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+SSHTransfer::SSHTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
- : URLTransfer(urlv, subdir)
|
||||
+ : URLTransfer(urlv)
|
||||
{
|
||||
if (urlv.size() > 1)
|
||||
cerr << "WARNING: First dump target used; rest ignored." << endl;
|
||||
@@ -59,9 +58,7 @@ SSHTransfer::SSHTransfer(const RootDirURLVector &urlv,
|
||||
cerr << "WARNING: Dump target not reachable" << endl;
|
||||
|
||||
string remote;
|
||||
- FilePath fp = target.getPath();
|
||||
- fp.appendPath(getSubDir());
|
||||
- remote.assign("mkdir -p ").append(fp);
|
||||
+ remote.assign("mkdir -p ").append(target.getPath());
|
||||
|
||||
SubProcess p;
|
||||
p.spawn("ssh", makeArgs(remote));
|
||||
@@ -96,7 +93,7 @@ void SSHTransfer::perform(DataProvider *dataprovider,
|
||||
const RootDirURL &target = urlv.front();
|
||||
|
||||
FilePath fp = target.getPath();
|
||||
- fp.appendPath(getSubDir()).appendPath(target_files.front());
|
||||
+ fp.appendPath(target_files.front());
|
||||
|
||||
string remote;
|
||||
remote.assign("dd of=").append(fp).append("-incomplete");
|
||||
@@ -357,10 +354,9 @@ ByteVector const &SFTPPacket::update(void)
|
||||
//{{{ SFTPTransfer -------------------------------------------------------------
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
-SFTPTransfer::SFTPTransfer(const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+SFTPTransfer::SFTPTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
- : URLTransfer(urlv, subdir)
|
||||
+ : URLTransfer(urlv)
|
||||
{
|
||||
if (urlv.size() > 1)
|
||||
cerr << "WARNING: First dump target used; rest ignored." << endl;
|
||||
@@ -394,9 +390,7 @@ SFTPTransfer::SFTPTransfer(const RootDirURLVector &urlv,
|
||||
m_proto_ver = initpkt.getInt32();
|
||||
Debug::debug()->dbg("Remote SFTP version %lu", m_proto_ver);
|
||||
|
||||
- FilePath fp = parser.getPath();
|
||||
- fp.appendPath(getSubDir());
|
||||
- mkpath(fp);
|
||||
+ mkpath(parser.getPath());
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
@@ -433,7 +427,7 @@ void SFTPTransfer::perform(DataProvider *dataprovider,
|
||||
const RootDirURL &target = urlv.front();
|
||||
|
||||
FilePath fp = target.getPath();
|
||||
- fp.appendPath(getSubDir()).appendPath(target_files.front());
|
||||
+ fp.appendPath(target_files.front());
|
||||
|
||||
string handle = createfile(fp);
|
||||
try {
|
||||
diff --git a/kdumptool/sshtransfer.h b/kdumptool/sshtransfer.h
|
||||
index e90d0c3..8a9081a 100644
|
||||
--- a/kdumptool/sshtransfer.h
|
||||
+++ b/kdumptool/sshtransfer.h
|
||||
@@ -41,7 +41,7 @@ class SSHTransfer : public URLTransfer {
|
||||
*
|
||||
* @exception KError when initialising the underlying library fails
|
||||
*/
|
||||
- SSHTransfer(const RootDirURLVector &urlv, const std::string &subdir)
|
||||
+ SSHTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
/**
|
||||
@@ -205,7 +205,7 @@ class SFTPTransfer : public URLTransfer {
|
||||
*
|
||||
* @exception KError when initialising the underlying library fails
|
||||
*/
|
||||
- SFTPTransfer(const RootDirURLVector &urlv, const std::string &subdir)
|
||||
+ SFTPTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
/**
|
||||
diff --git a/kdumptool/transfer.cc b/kdumptool/transfer.cc
|
||||
index 365055e..4e419ff 100644
|
||||
--- a/kdumptool/transfer.cc
|
||||
+++ b/kdumptool/transfer.cc
|
||||
@@ -64,9 +64,9 @@ void Transfer::perform(DataProvider *dataprovider,
|
||||
//{{{ URLTransfer --------------------------------------------------------------
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-URLTransfer::URLTransfer(const RootDirURLVector &urlv, const string &subdir)
|
||||
+URLTransfer::URLTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
- : m_urlVector(urlv), m_subDir(subdir)
|
||||
+ : m_urlVector(urlv)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -74,10 +74,9 @@ URLTransfer::URLTransfer(const RootDirURLVector &urlv, const string &subdir)
|
||||
//{{{ FileTransfer -------------------------------------------------------------
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-FileTransfer::FileTransfer(const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+FileTransfer::FileTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
- : URLTransfer(urlv, subdir), m_bufferSize(0), m_buffer(NULL)
|
||||
+ : URLTransfer(urlv), m_bufferSize(0), m_buffer(NULL)
|
||||
{
|
||||
RootDirURLVector::const_iterator it;
|
||||
for (it = urlv.begin(); it != urlv.end(); ++it)
|
||||
@@ -87,7 +86,6 @@ FileTransfer::FileTransfer(const RootDirURLVector &urlv,
|
||||
// create directories
|
||||
for (it = urlv.begin(); it != urlv.end(); ++it) {
|
||||
FilePath dir = it->getRealPath();
|
||||
- dir.appendPath(subdir);
|
||||
dir.mkdir(true);
|
||||
}
|
||||
|
||||
@@ -130,7 +128,7 @@ void FileTransfer::perform(DataProvider *dataprovider,
|
||||
RootDirURLVector::const_iterator itv = urlv.begin();
|
||||
for (it = target_files.begin(); it != target_files.end(); ++it) {
|
||||
FilePath fp = itv->getRealPath();
|
||||
- full_targets.push_back(fp.appendPath(getSubDir()).appendPath(*it));
|
||||
+ full_targets.push_back(fp.appendPath(*it));
|
||||
if (++itv == urlv.end())
|
||||
itv = urlv.begin();
|
||||
}
|
||||
@@ -308,10 +306,9 @@ static int curl_debug(CURL *curl, curl_infotype info, char *buffer,
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-FTPTransfer::FTPTransfer(const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+FTPTransfer::FTPTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
- : URLTransfer(urlv, subdir), m_curl(NULL)
|
||||
+ : URLTransfer(urlv), m_curl(NULL)
|
||||
{
|
||||
if (urlv.size() > 1)
|
||||
cerr << "WARNING: First dump target used; rest ignored." << endl;
|
||||
@@ -425,7 +422,7 @@ void FTPTransfer::open(DataProvider *dataprovider,
|
||||
|
||||
// set the URL
|
||||
FilePath full_url = parser.getURL();
|
||||
- full_url.appendPath(getSubDir()).appendPath(target_file);
|
||||
+ full_url.appendPath(target_file);
|
||||
err = curl_easy_setopt(m_curl, CURLOPT_URL, full_url.c_str());
|
||||
if (err != CURLE_OK)
|
||||
throw KError(string("CURL error: ") + m_curlError);
|
||||
@@ -440,16 +437,15 @@ void FTPTransfer::open(DataProvider *dataprovider,
|
||||
//{{{ NFSTransfer --------------------------------------------------------------
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-NFSTransfer::NFSTransfer(const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+NFSTransfer::NFSTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
- : URLTransfer(urlv, subdir), m_mountpoint(""), m_fileTransfer(NULL)
|
||||
+ : URLTransfer(urlv), m_mountpoint(""), m_fileTransfer(NULL)
|
||||
{
|
||||
- RootDirURLVector file_urlv("", "");
|
||||
+ RootDirURLVector file_urlv;
|
||||
RootDirURLVector::const_iterator it;
|
||||
for (it = urlv.begin(); it != urlv.end(); ++it)
|
||||
file_urlv.push_back(translate(*it));
|
||||
- m_fileTransfer = new FileTransfer(file_urlv, subdir);
|
||||
+ m_fileTransfer = new FileTransfer(file_urlv);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -521,16 +517,15 @@ void NFSTransfer::close()
|
||||
//{{{ CIFSTransfer -------------------------------------------------------------
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
-CIFSTransfer::CIFSTransfer(const RootDirURLVector &urlv,
|
||||
- const std::string &subdir)
|
||||
+CIFSTransfer::CIFSTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError)
|
||||
- : URLTransfer(urlv, subdir), m_mountpoint(""), m_fileTransfer(NULL)
|
||||
+ : URLTransfer(urlv), m_mountpoint(""), m_fileTransfer(NULL)
|
||||
{
|
||||
- RootDirURLVector file_urlv("", "");
|
||||
+ RootDirURLVector file_urlv;
|
||||
RootDirURLVector::const_iterator it;
|
||||
for (it = urlv.begin(); it != urlv.end(); ++it)
|
||||
file_urlv.push_back(translate(*it));
|
||||
- m_fileTransfer = new FileTransfer(file_urlv, subdir);
|
||||
+ m_fileTransfer = new FileTransfer(file_urlv);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
diff --git a/kdumptool/transfer.h b/kdumptool/transfer.h
|
||||
index d81f2d4..a1ecf4f 100644
|
||||
--- a/kdumptool/transfer.h
|
||||
+++ b/kdumptool/transfer.h
|
||||
@@ -102,10 +102,10 @@ class URLTransfer : public Transfer {
|
||||
/**
|
||||
* Creates a new URLTransfer object.
|
||||
*
|
||||
- * @param[in] url the URL
|
||||
+ * @param[in] urlv target URLs
|
||||
* @throw KError if parsing the URL failed
|
||||
*/
|
||||
- URLTransfer(const RootDirURLVector &urlv, const std::string &subdir)
|
||||
+ URLTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
/**
|
||||
@@ -117,18 +117,8 @@ class URLTransfer : public Transfer {
|
||||
throw ()
|
||||
{ return m_urlVector; }
|
||||
|
||||
- /**
|
||||
- * Returns the subdirectory part.
|
||||
- *
|
||||
- * @return reference to the subdirectory.
|
||||
- */
|
||||
- const std::string &getSubDir()
|
||||
- throw ()
|
||||
- { return m_subDir; }
|
||||
-
|
||||
private:
|
||||
RootDirURLVector m_urlVector;
|
||||
- std::string m_subDir;
|
||||
};
|
||||
|
||||
//}}}
|
||||
@@ -144,10 +134,10 @@ class FileTransfer : public URLTransfer {
|
||||
/**
|
||||
* Creates a new FileTransfer object.
|
||||
*
|
||||
- * @param[in] target_url the directory
|
||||
+ * @param[in] urlv target directories
|
||||
* @throw KError if parsing the URL or creating the directory failed
|
||||
*/
|
||||
- FileTransfer(const RootDirURLVector &urlv, const std::string &subdir)
|
||||
+ FileTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
/**
|
||||
@@ -202,7 +192,7 @@ class FTPTransfer : public URLTransfer {
|
||||
*
|
||||
* @exception KError when initialising the underlying library fails
|
||||
*/
|
||||
- FTPTransfer(const RootDirURLVector &urlv, const std::string &subdir)
|
||||
+ FTPTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
/**
|
||||
@@ -248,7 +238,7 @@ class NFSTransfer : public URLTransfer {
|
||||
*
|
||||
* @exception KError when mounting the share failes
|
||||
*/
|
||||
- NFSTransfer(const RootDirURLVector &urlv, const std::string &subdir)
|
||||
+ NFSTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
/**
|
||||
@@ -302,7 +292,7 @@ class CIFSTransfer : public URLTransfer {
|
||||
*
|
||||
* @exception KError when mounting the share failes
|
||||
*/
|
||||
- CIFSTransfer(const RootDirURLVector &urlv, const std::string &subdir)
|
||||
+ CIFSTransfer(const RootDirURLVector &urlv)
|
||||
throw (KError);
|
||||
|
||||
/**
|
199
kdump-aarch64.patch
Normal file
199
kdump-aarch64.patch
Normal file
@ -0,0 +1,199 @@
|
||||
From: Matthias Brugger <mbrugger@suse.com>
|
||||
Date: Mon May 8 13:58:38 2017 +0200
|
||||
Subject: kdumptool: add aarch64
|
||||
References: bsc#1033464
|
||||
Upstream: v0.8.17
|
||||
Git-commit: 914c79f493c858e7ab2c07248c17f23f9195daa3
|
||||
Git-commit: f43e30a71f294020817f0c4f35ea96931ea9ab93
|
||||
Git-commit: e6afa41112b5ab4a961a595841f3d6b6751f99b4
|
||||
Git-commit: a885ddf80fb2c6c2490f2550338042581bca6150
|
||||
|
||||
Add support for Aarch64.
|
||||
|
||||
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
|
||||
Acked-by: Petr Tesarik <ptesarik@suse.com>
|
||||
|
||||
---
|
||||
kdumptool/identifykernel.cc | 3 ++
|
||||
kdumptool/kerneltool.cc | 47 +++++++++++++++++++++++++++++++++++++++++++-
|
||||
kdumptool/kerneltool.h | 9 ++++++++
|
||||
kdumptool/savedump.cc | 7 ++++++
|
||||
tests/identify_kernel.sh | 5 +++-
|
||||
5 files changed, 69 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/kdumptool/kerneltool.cc
|
||||
+++ b/kdumptool/kerneltool.cc
|
||||
@@ -130,6 +130,8 @@ list<string> KernelTool::imageNames(cons
|
||||
ret.push_back("vmlinuz");
|
||||
} else if (arch == "s390x") {
|
||||
ret.push_back("image");
|
||||
+ } else if (arch == "aarch64") {
|
||||
+ ret.push_back("Image");
|
||||
} else {
|
||||
ret.push_back("vmlinux");
|
||||
}
|
||||
@@ -181,6 +183,11 @@ KernelTool::KernelType KernelTool::getKe
|
||||
return KT_S390;
|
||||
else
|
||||
return KT_NONE;
|
||||
+ } else if (Util::getArch() == "aarch64") {
|
||||
+ if (isAarch64Kernel())
|
||||
+ return KT_AARCH64;
|
||||
+ else
|
||||
+ return KT_NONE;
|
||||
} else
|
||||
return KT_NONE;
|
||||
}
|
||||
@@ -201,6 +208,9 @@ bool KernelTool::isRelocatable() const
|
||||
case KernelTool::KT_S390:
|
||||
return true;
|
||||
|
||||
+ case KernelTool::KT_AARCH64:
|
||||
+ return true;
|
||||
+
|
||||
default:
|
||||
throw KError("Invalid kernel type.");
|
||||
break;
|
||||
@@ -257,6 +267,39 @@ bool KernelTool::isS390Kernel() const
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
+bool KernelTool::isAarch64Kernel() const
|
||||
+ throw (KError)
|
||||
+{
|
||||
+ struct {
|
||||
+ uint32_t code0; /* Executable code */
|
||||
+ uint32_t code1; /* Executable code */
|
||||
+ uint64_t text_offset; /* Image load offset, little endian */
|
||||
+ uint64_t image_size; /* Effective Image size, little endian */
|
||||
+ uint64_t flags; /* kernel flags, little endian */
|
||||
+ uint64_t res2; /* reserved */
|
||||
+ uint64_t res3; /* reserved */
|
||||
+ uint64_t res4; /* reserved */
|
||||
+ uint32_t magic; /* Magic number, little endian, "ARM\x64" */
|
||||
+ uint32_t res5; /* reserved (used for PE COFF offset) */
|
||||
+ } buffer;
|
||||
+
|
||||
+ /* check the magic number */
|
||||
+ if (lseek(m_fd, 0, SEEK_SET) == (off_t)-1) {
|
||||
+ throw KSystemError("IdentifyKernel::isAarch64Kernel: lseek to "
|
||||
+ "file start failed", errno);
|
||||
+ }
|
||||
+
|
||||
+ int ret = read(m_fd, &buffer, sizeof(buffer));
|
||||
+ if (ret < 0) {
|
||||
+ throw KSystemError("IdentifyKernel::isAarch64Kernel: read of magic "
|
||||
+ "start failed", errno);
|
||||
+ } else if (ret < (int)sizeof(buffer))
|
||||
+ return false;
|
||||
+
|
||||
+ return buffer.magic == 0x644d5241; /* little endian "ARM\x64" */
|
||||
+}
|
||||
+
|
||||
+// -----------------------------------------------------------------------------
|
||||
bool KernelTool::x86isRelocatable() const
|
||||
throw (KError)
|
||||
{
|
||||
@@ -390,7 +433,7 @@ bool KernelTool::elfIsRelocatable() cons
|
||||
bool KernelTool::isArchAlwaysRelocatable(const string &machine) const
|
||||
throw ()
|
||||
{
|
||||
- return machine == "ia64";
|
||||
+ return machine == "ia64" || machine == "aarch64";
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@@ -426,6 +469,7 @@ string KernelTool::archFromElfMachine(un
|
||||
case EM_S390: return "s390";
|
||||
case EM_IA_64: return "ia64";
|
||||
case EM_X86_64: return "x86_64";
|
||||
+ case EM_AARCH64: return "aarch64";
|
||||
default: return "unknown";
|
||||
}
|
||||
}
|
||||
@@ -681,6 +725,7 @@ string KernelTool::extractKernelConfig()
|
||||
case KernelTool::KT_ELF:
|
||||
case KernelTool::KT_ELF_GZ:
|
||||
case KernelTool::KT_S390:
|
||||
+ case KernelTool::KT_AARCH64:
|
||||
return extractKernelConfigELF();
|
||||
|
||||
case KernelTool::KT_X86:
|
||||
--- a/tests/identify_kernel.sh
|
||||
+++ b/tests/identify_kernel.sh
|
||||
@@ -28,18 +28,21 @@ KERNEL_IMAGES=("kernel-bzImage-x86_64"
|
||||
"kernel-ELFgz-ia64"
|
||||
"kernel-ELF-ia64"
|
||||
"kernel-ELF-ppc64"
|
||||
+ "kernel-ELF-aarch64"
|
||||
)
|
||||
RELOCATABLE=( 1
|
||||
0
|
||||
0
|
||||
1
|
||||
1
|
||||
- 0 )
|
||||
+ 0
|
||||
+ 1 )
|
||||
TYPE=( "x86"
|
||||
"ELF gzip"
|
||||
"ELF"
|
||||
"ELF gzip"
|
||||
"ELF"
|
||||
+ "ELF"
|
||||
"ELF" )
|
||||
|
||||
# }}}
|
||||
--- a/kdumptool/savedump.cc
|
||||
+++ b/kdumptool/savedump.cc
|
||||
@@ -563,6 +563,13 @@ string SaveDump::findKernel()
|
||||
if (binaryroot.exists())
|
||||
return binary;
|
||||
|
||||
+ // 5: Image
|
||||
+ (binary = "/boot").appendPath("Image-" + m_crashrelease);
|
||||
+ (binaryroot = m_rootdir).appendPath(binary);
|
||||
+ Debug::debug()->dbg("Trying %s", binaryroot.c_str());
|
||||
+ if (binaryroot.exists())
|
||||
+ return binary;
|
||||
+
|
||||
FilePath fp = m_rootdir;
|
||||
fp.appendPath("/boot");
|
||||
throw KError("No kernel image found in " + fp);
|
||||
--- a/kdumptool/identifykernel.cc
|
||||
+++ b/kdumptool/identifykernel.cc
|
||||
@@ -91,6 +91,9 @@ void IdentifyKernel::execute()
|
||||
case KernelTool::KT_S390:
|
||||
cout << "S390" << endl;
|
||||
break;
|
||||
+ case KernelTool::KT_AARCH64:
|
||||
+ cout << "Aarch64" << endl;
|
||||
+ break;
|
||||
default:
|
||||
throw KError("The specified file is not a kernel image.");
|
||||
}
|
||||
--- a/kdumptool/kerneltool.h
|
||||
+++ b/kdumptool/kerneltool.h
|
||||
@@ -42,6 +42,7 @@ class KernelTool {
|
||||
KT_ELF_GZ,
|
||||
KT_X86,
|
||||
KT_S390,
|
||||
+ KT_AARCH64,
|
||||
KT_NONE
|
||||
};
|
||||
|
||||
@@ -207,6 +208,14 @@ class KernelTool {
|
||||
throw (KError);
|
||||
|
||||
/**
|
||||
+ * Checks if the kernel is an Aarch64 kernel image.
|
||||
+ *
|
||||
+ * @return @c true if it's an Aarch64 kernel image, @c false otherwise.
|
||||
+ */
|
||||
+ bool isAarch64Kernel() const
|
||||
+ throw (KError);
|
||||
+
|
||||
+ /**
|
||||
* Returns the architecture as string from the ELF machine type.
|
||||
*
|
||||
* @param[in] et_machine the ELF machine type such as EM_386
|
92
kdump-fix-service-files.patch
Normal file
92
kdump-fix-service-files.patch
Normal file
@ -0,0 +1,92 @@
|
||||
From: Michal Koutny <mkoutny@suse.com>
|
||||
Date: Wed Jun 7 15:16:05 2017 +0200
|
||||
Subject: Fix kdump-related services
|
||||
References: bsc#1021484
|
||||
Upstreams: v0.8.17
|
||||
Git-commit: 168b7bfeb992594df08c7e4020ac34f1d9a825bb
|
||||
|
||||
kdump.service should be the "big switch" to turn kdump on and off. We
|
||||
can achieve this by adding an Also= directive.
|
||||
|
||||
kdump-early.service is merely a way to load a kdump kernel a early
|
||||
during the boot process if and only if the kdumprd already exists (e.g.
|
||||
from a previous boot). There may be some use cases for enabling only
|
||||
the early service without kdump.service.
|
||||
|
||||
OTOH, it is not an error if the initrd is not found during the early
|
||||
stages. This is indicated by exit code 6 (originally conforming to LSB
|
||||
"program not configured" exit code).
|
||||
|
||||
Signed-off-by: Michal Koutny <mkoutny@suse.com>
|
||||
Acked-by: Petr Tesarik <ptesarik@suse.com>
|
||||
|
||||
---
|
||||
init/CMakeLists.txt | 2 +-
|
||||
init/kdump-early.service | 14 ++++++++++++++
|
||||
init/kdump-rebuild-initrd.service | 12 ------------
|
||||
init/kdump.service | 8 ++++----
|
||||
4 files changed, 19 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/init/kdump.service
|
||||
+++ b/init/kdump.service
|
||||
@@ -1,13 +1,13 @@
|
||||
[Unit]
|
||||
-Description=Load kdump kernel on startup
|
||||
-After=local-fs.target
|
||||
-Wants=kdump-rebuild-initrd.service
|
||||
+Description=Load kdump kernel and initrd
|
||||
+After=local-fs.target network.service YaST2-Second-Stage.service YaST2-Firstboot.service
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
-ExecStart=/lib/kdump/load.sh
|
||||
+ExecStart=/lib/kdump/load.sh --update
|
||||
ExecStop=/lib/kdump/unload.sh
|
||||
RemainAfterExit=true
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
+Also=kdump-early.service
|
||||
--- /dev/null
|
||||
+++ b/init/kdump-early.service
|
||||
@@ -0,0 +1,14 @@
|
||||
+[Unit]
|
||||
+Description=Load kdump kernel early on startup
|
||||
+After=local-fs.target
|
||||
+
|
||||
+[Service]
|
||||
+Type=oneshot
|
||||
+ExecStart=/lib/kdump/load.sh
|
||||
+ExecStop=/lib/kdump/unload.sh
|
||||
+RemainAfterExit=true
|
||||
+# It is OK if the initrd is missing in this early attempt
|
||||
+SuccessExitStatus=6
|
||||
+
|
||||
+[Install]
|
||||
+WantedBy=multi-user.target
|
||||
--- a/init/kdump-rebuild-initrd.service
|
||||
+++ /dev/null
|
||||
@@ -1,12 +0,0 @@
|
||||
-[Unit]
|
||||
-Description=Reload kdump kernel and updated initrd after the network is configured
|
||||
-After=local-fs.target network.service YaST2-Second-Stage.service YaST2-Firstboot.service
|
||||
-
|
||||
-[Service]
|
||||
-Type=oneshot
|
||||
-ExecStart=/lib/kdump/load.sh --update
|
||||
-ExecStop=/lib/kdump/unload.sh
|
||||
-RemainAfterExit=true
|
||||
-
|
||||
-[Install]
|
||||
-WantedBy=multi-user.target
|
||||
--- a/init/CMakeLists.txt
|
||||
+++ b/init/CMakeLists.txt
|
||||
@@ -39,7 +39,7 @@ INSTALL(
|
||||
INSTALL(
|
||||
FILES
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/kdump.service
|
||||
- ${CMAKE_CURRENT_SOURCE_DIR}/kdump-rebuild-initrd.service
|
||||
+ ${CMAKE_CURRENT_SOURCE_DIR}/kdump-early.service
|
||||
DESTINATION
|
||||
/usr/lib/systemd/system
|
||||
PERMISSIONS
|
44
kdump-prepend-IP-address.patch
Normal file
44
kdump-prepend-IP-address.patch
Normal file
@ -0,0 +1,44 @@
|
||||
Date: Wed Jun 14 14:39:15 2017 +0200
|
||||
From: Petr Tesarik <ptesarik@suse.com>
|
||||
Subject: Prepend IP address to remote target subdirectory
|
||||
References: FATE#321844
|
||||
Upstream: v0.8.17
|
||||
Git-commit: d8f0f0cb4450776b0765ddb0441a5d5669a78062
|
||||
|
||||
Check the target route directly from save_dump and take the preferred
|
||||
source IP address into the subdirectory name.
|
||||
|
||||
Signed-off-by: Petr Tesarik <ptesarik@suse.com>
|
||||
|
||||
diff --git a/kdumptool/savedump.cc b/kdumptool/savedump.cc
|
||||
index 9938b6f..14e66b3 100644
|
||||
--- a/kdumptool/savedump.cc
|
||||
+++ b/kdumptool/savedump.cc
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "vmcoreinfo.h"
|
||||
#include "identifykernel.h"
|
||||
#include "email.h"
|
||||
+#include "routable.h"
|
||||
|
||||
using std::string;
|
||||
using std::list;
|
||||
@@ -114,8 +115,17 @@ void SaveDump::execute()
|
||||
std::istringstream iss(config->KDUMP_SAVEDIR.value());
|
||||
FilePath elem;
|
||||
while (iss >> elem) {
|
||||
- RootDirURL url(elem.appendPath(subdir), m_rootdir);
|
||||
- urlv.push_back(url);
|
||||
+ RootDirURL url(elem, m_rootdir);
|
||||
+ if (url.getProtocol() != URLParser::PROT_FILE) {
|
||||
+ Routable rt(url.getHostname());
|
||||
+ if (!rt.check(config->KDUMP_NET_TIMEOUT.value())) {
|
||||
+ cerr << "WARNING: Dump target not reachable" << endl;
|
||||
+ elem.appendPath(string("unknown-") + subdir);
|
||||
+ } else
|
||||
+ elem.appendPath(rt.prefsrc() + '-' + subdir);
|
||||
+ } else
|
||||
+ elem.appendPath(subdir);
|
||||
+ urlv.push_back(RootDirURL(elem, m_rootdir));
|
||||
}
|
||||
|
||||
m_transfer = getTransfer(urlv);
|
@ -1,3 +1,30 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Jun 14 12:48:34 UTC 2017 - ptesarik@suse.com
|
||||
|
||||
- kdump-Routable-preferred-source-address.patch: Routable: parse
|
||||
and store preferred source address (FATE#321844).
|
||||
- kdump-URLTransfer-complete-target.patch: Use the complete target
|
||||
URL for URLTransfer (FATE#321844).
|
||||
- kdump-prepend-IP-address.patch: Prepend IP address to remote
|
||||
target subdirectory (FATE#321844).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Jun 8 15:02:09 UTC 2017 - ptesarik@suse.com
|
||||
|
||||
- kdump-fix-service-files.patch: Fix kdump-related services
|
||||
(bsc#1021484).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Jun 8 13:10:41 UTC 2017 - ptesarik@suse.com
|
||||
|
||||
- kernel-ELF-aarch64: Test data for aarch64 findkernel.
|
||||
- kdump-KDUMP_SSH_IDENTITY.patch: Update with later upstream fixes.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Jun 7 11:43:46 UTC 2017 - ptesarik@suse.com
|
||||
|
||||
- kdump-aarch64.patch: kdumptool: add aarch64 (bsc#1033464).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed May 17 13:31:11 UTC 2017 - ptesarik@suse.com
|
||||
|
||||
|
24
kdump.spec
24
kdump.spec
@ -40,6 +40,7 @@ License: GPL-2.0+
|
||||
Group: System/Kernel
|
||||
Url: https://github.com/ptesarik/kdump
|
||||
Source: %{name}-%{version}.tar.bz2
|
||||
Source1: kernel-ELF-aarch64
|
||||
Source2: %{name}-rpmlintrc
|
||||
Patch1: %{name}-cmake-compat.patch
|
||||
Patch2: %{name}-KDUMP_SSH_IDENTITY.patch
|
||||
@ -49,6 +50,11 @@ Patch5: %{name}-always-pass-kernelver-to-dracut.patch
|
||||
Patch6: %{name}-pre-generate-mount-units.patch
|
||||
Patch7: %{name}-bind-mount-sysroot.patch
|
||||
Patch8: %{name}-x86_64-kexec-file-syscall.patch
|
||||
Patch9: %{name}-aarch64.patch
|
||||
Patch10: %{name}-fix-service-files.patch
|
||||
Patch11: %{name}-Routable-preferred-source-address.patch
|
||||
Patch12: %{name}-URLTransfer-complete-target.patch
|
||||
Patch13: %{name}-prepend-IP-address.patch
|
||||
BuildRequires: asciidoc
|
||||
BuildRequires: cmake
|
||||
BuildRequires: gcc-c++
|
||||
@ -116,6 +122,12 @@ after a crash dump has occured.
|
||||
%patch6 -p1
|
||||
%patch7 -p1
|
||||
%patch8 -p1
|
||||
%patch9 -p1
|
||||
cp %{S:1} tests/data/
|
||||
%patch10 -p1
|
||||
%patch11 -p1
|
||||
%patch12 -p1
|
||||
%patch13 -p1
|
||||
|
||||
%build
|
||||
export CFLAGS="%{optflags}"
|
||||
@ -151,14 +163,14 @@ rm %{buildroot}%{_initddir}/boot.kdump
|
||||
ln -s %{_sbindir}/service %{buildroot}%{_sbindir}/rckdump
|
||||
%else
|
||||
rm %{buildroot}/usr/lib/systemd/system/kdump.service
|
||||
rm %{buildroot}/usr/lib/systemd/system/kdump-rebuild-initrd.service
|
||||
rm %{buildroot}/usr/lib/systemd/system/kdump-early.service
|
||||
ln -s ../..%{_initddir}/boot.kdump %{buildroot}%{_sbindir}/rckdump
|
||||
%endif
|
||||
|
||||
%if %{systemd_present}
|
||||
%pre
|
||||
%service_add_pre kdump.service
|
||||
%service_add_pre kdump-rebuild-initrd.service
|
||||
%service_add_pre kdump-early.service
|
||||
%endif
|
||||
|
||||
%post
|
||||
@ -171,7 +183,7 @@ fi
|
||||
%if %{systemd_present}
|
||||
%{fillup_only -n kdump}
|
||||
%service_add_post kdump.service
|
||||
%service_add_post kdump-rebuild-initrd.service
|
||||
%service_add_post kdump-early.service
|
||||
%else
|
||||
%{fillup_and_insserv -n kdump boot.kdump}
|
||||
%endif
|
||||
@ -188,7 +200,7 @@ fi
|
||||
echo "Stopping kdump ..."
|
||||
%if %{systemd_present}
|
||||
%service_del_preun kdump.service
|
||||
%service_del_preun kdump-rebuild-initrd.service
|
||||
%service_del_preun kdump-early.service
|
||||
%else
|
||||
%stop_on_removal boot.kdump
|
||||
%endif
|
||||
@ -200,7 +212,7 @@ touch %{_sysconfdir}/sysconfig/kdump
|
||||
rm /var/log/dump >/dev/null 2>&1 || true
|
||||
%if %{systemd_present}
|
||||
%service_del_postun kdump.service
|
||||
%service_del_postun kdump-rebuild-initrd.service
|
||||
%service_del_postun kdump-early.service
|
||||
%else
|
||||
%restart_on_update boot.kdump
|
||||
%insserv_cleanup
|
||||
@ -230,7 +242,7 @@ rm /var/log/dump >/dev/null 2>&1 || true
|
||||
%{_udevrulesdir}/70-kdump.rules
|
||||
%if %{systemd_present}
|
||||
%{_unitdir}/kdump.service
|
||||
%{_unitdir}/kdump-rebuild-initrd.service
|
||||
%{_unitdir}/kdump-early.service
|
||||
%else
|
||||
%{_sysconfdir}/init.d/boot.kdump
|
||||
%endif
|
||||
|
BIN
kernel-ELF-aarch64
Normal file
BIN
kernel-ELF-aarch64
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user