summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSebastien Braun2010-10-06 18:00:08 +0200
committerSebastien Braun2010-10-07 09:30:25 +0200
commit32672a51fe8b8ccf63e1cfeb89ac5e020fde787a (patch)
tree98b0524e96cc370ca0f61632bb02d1787304901e /src
parentSanitize security model yet again (diff)
downloadpvs-32672a51fe8b8ccf63e1cfeb89ac5e020fde787a.tar.gz
pvs-32672a51fe8b8ccf63e1cfeb89ac5e020fde787a.tar.xz
pvs-32672a51fe8b8ccf63e1cfeb89ac5e020fde787a.zip
Implement magic SysRq handler.
Diffstat (limited to 'src')
-rw-r--r--src/input/CMakeLists.txt1
-rw-r--r--src/input/inputHandlerChain.h4
-rw-r--r--src/input/magicSysRqHandler.cpp28
-rw-r--r--src/input/magicSysRqHandler.h72
4 files changed, 104 insertions, 1 deletions
diff --git a/src/input/CMakeLists.txt b/src/input/CMakeLists.txt
index 0e72c4c..20fd531 100644
--- a/src/input/CMakeLists.txt
+++ b/src/input/CMakeLists.txt
@@ -21,6 +21,7 @@ if(UNIX)
pvsPrivInputSignalHandler.cpp
rebootSystemHandler.cpp
killX11Handler.cpp
+ magicSysRqHandler.cpp
sayHelloHandler.cpp
inputEventHandler.cpp
)
diff --git a/src/input/inputHandlerChain.h b/src/input/inputHandlerChain.h
index b012aa6..3c9446c 100644
--- a/src/input/inputHandlerChain.h
+++ b/src/input/inputHandlerChain.h
@@ -26,6 +26,7 @@
#include "rebootSystemHandler.h"
#include "sayHelloHandler.h"
#include "killX11Handler.h"
+#include "magicSysRqHandler.h"
typedef boost::mpl::list<
Handler<X11FakeKeyboardHandler, policy::RequireSystem<policy::UnixLike> >,
@@ -39,7 +40,8 @@ typedef InputEventHandlerChain<policy::SecurityAllowAny, unprivileged_handler_li
typedef boost::mpl::list<
Handler<SayHelloHandler, policy::RequireNoSystem, policy::SecurityAllowAny >,
Handler<KillX11Handler, policy::RequireSystem<policy::Linux> >,
- Handler<RebootLinuxSystemHandler, policy::RequireSystem<policy::Linux> >
+ Handler<RebootLinuxSystemHandler, policy::RequireSystem<policy::Linux> >,
+ Handler<MagicSysRqHandler, policy::RequireSystem<policy::Linux> >
>::type privileged_handler_list;
typedef InputEventHandlerChain<policy::SecurityAllowPhysicalOrPrivileged, privileged_handler_list> privileged_handler_chain;
diff --git a/src/input/magicSysRqHandler.cpp b/src/input/magicSysRqHandler.cpp
new file mode 100644
index 0000000..108bfca
--- /dev/null
+++ b/src/input/magicSysRqHandler.cpp
@@ -0,0 +1,28 @@
+/*
+ # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg
+ #
+ # This program is free software distributed under the GPL version 2.
+ # See http://openslx.org/COPYING
+ #
+ # If you have any feedback please consult http://openslx.org/feedback and
+ # send your suggestions, praise, or complaints to feedback@openslx.org
+ #
+ # General information about OpenSLX can be found at http://openslx.org/
+ # --------------------------------------------------------------------------
+ # inputEventHandler.h:
+ # - Common definitions for input event handlers
+ # --------------------------------------------------------------------------
+ */
+
+#include <QFile>
+#include "magicSysRqHandler.h"
+
+void MagicSysRqHandler::handle(InputEvent const& evt, InputEventContext const*)
+{
+ QFile trigger("/proc/sysrq-trigger");
+ trigger.open(QIODevice::WriteOnly);
+ char c = (char)(evt.value() & 0xff);
+ trigger.write(&c, 1);
+ trigger.flush();
+ trigger.close();
+}
diff --git a/src/input/magicSysRqHandler.h b/src/input/magicSysRqHandler.h
new file mode 100644
index 0000000..563d091
--- /dev/null
+++ b/src/input/magicSysRqHandler.h
@@ -0,0 +1,72 @@
+/*
+ # Copyright (c) 2009 - OpenSLX Project, Computer Center University of Freiburg
+ #
+ # This program is free software distributed under the GPL version 2.
+ # See http://openslx.org/COPYING
+ #
+ # If you have any feedback please consult http://openslx.org/feedback and
+ # send your suggestions, praise, or complaints to feedback@openslx.org
+ #
+ # General information about OpenSLX can be found at http://openslx.org/
+ # --------------------------------------------------------------------------
+ # magicSysRqHandler.h
+ # - Trigger Magic-SysRq functions - interface
+ # --------------------------------------------------------------------------
+ */
+
+#ifndef MAGICSYSRQHANDLER_H_
+#define MAGICSYSRQHANDLER_H_
+
+#include "inputEventHandler.h"
+
+class MagicSysRqHandler : public DefaultInputEventHandler<InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ>
+{
+public:
+ void handle(InputEvent const& evt, InputEventContext const* ctx);
+
+ static void describeInto(QList<SpecialInputEventDescription>& list)
+ {
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Reboot immediately"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'b');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Crash system"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'c');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Show all held logs"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'd');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Send SIGTERM to all"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'e');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Activate OOM killer"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'f');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Send SIGKILL to all"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'i');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Force thaw filesystems"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'j');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Kill all on terminal"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'k');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Show stack traces"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'l');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Dump memory info"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'm');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Make real-time tasks niceable"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'n');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Power off immediately"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'o');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Dump registers and flags"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'p');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Dump timers and clockevents"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'q');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Turn off raw keyboard mode"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'r');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Sync all mounted filesystems"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 's');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Dump task list"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 't');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Remount all read-only"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'u');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Dump uninterruptible tasks"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'w');
+ list << SpecialInputEventDescription(QCoreApplication::translate("InputEventHandler", "Dump ftrace buffer"),
+ InputEvent::ET_SPECIAL, InputEvent::EC_SYSRQ, 'z');
+ }
+};
+
+#endif /* MAGICSYSRQHANDLER_H_ */