summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: bb1b94f)
raw | patch | inline | side by side (parent: bb1b94f)
author | Vincent Brillault <git@lerya.net> | |
Wed, 11 Feb 2015 22:19:53 +0000 (23:19 +0100) | ||
committer | Vincent Brillault <git@lerya.net> | |
Sat, 28 Feb 2015 06:35:42 +0000 (07:35 +0100) |
Backporting commit 98481e79b60a50d699b79292ff1b7e56e7fa8425
from Len Brown <len.brown@intel.com>
For turbostat to run as non-root, it needs to permissions:
1. read access to /dev/cpu/*/msr
via standard user/group/world file permissions
2. CAP_SYS_RAWIO
eg. # setcap cap_sys_rawio=ep $(which collectd)
Yes, running as root still works.
from Len Brown <len.brown@intel.com>
For turbostat to run as non-root, it needs to permissions:
1. read access to /dev/cpu/*/msr
via standard user/group/world file permissions
2. CAP_SYS_RAWIO
eg. # setcap cap_sys_rawio=ep $(which collectd)
Yes, running as root still works.
src/turbostat.c | patch | blob | history |
diff --git a/src/turbostat.c b/src/turbostat.c
index 34c11b889f619450c73e8ac97cca96743eec3256..cd2cf434bc7d5594d2fabaf431b5014095628562 100644 (file)
--- a/src/turbostat.c
+++ b/src/turbostat.c
#include <ctype.h>
#include <sched.h>
#include <cpuid.h>
+#include <sys/capability.h>
#define PLUGIN_NAME "turbostat"
return ret;
}
+static int
+check_permissions(void)
+{
+ struct __user_cap_header_struct cap_header_data;
+ cap_user_header_t cap_header = &cap_header_data;
+ struct __user_cap_data_struct cap_data_data;
+ cap_user_data_t cap_data = &cap_data_data;
+ int ret = 0;
+
+ if (getuid() == 0) {
+ /* We have everything we need */
+ return 0;
+ }
+
+ /* check for CAP_SYS_RAWIO */
+ cap_header->pid = getpid();
+ cap_header->version = _LINUX_CAPABILITY_VERSION;
+ if (capget(cap_header, cap_data) < 0) {
+ ERROR("Turbostat plugin: capget failed");
+ return -1;
+ }
+
+ if ((cap_data->effective & (1 << CAP_SYS_RAWIO)) == 0) {
+ WARNING("Turbostat plugin: Collectd doesn't have the "
+ "CAP_SYS_RAWIO capability. If you don't want to run "
+ "collectd as root, try running \"setcap "
+ "cap_sys_rawio=ep\" on collectd binary");
+ ret = -1;
+ }
+
+ if (euidaccess("/dev/cpu/0/msr", R_OK)) {
+ WARNING("Turbostat plugin: Collectd cannot open"
+ "/dev/cpu/0/msr. If you don't want to run collectd as "
+ "root, you need to change the ownership (chown) and "
+ "permissions on /dev/cpu/*/msr to allow such access");
+ ret = -1;
+ }
+
+ if (ret != 0)
+ ERROR("Turbostat plugin: Initialization failed: this plugin "
+ "requires collectd to either to run as root or give "
+ "collectd a special capability (CAP_SYS_RAWIO) and read "
+ "access to /dev/cpu/*/msr (see previous warnings)");
+ return ret;
+}
+
static int
turbostat_init(void)
{
return -1;
}
- if (getuid() != 0) {
- ERROR("Turbostat plugin: Initialization failed: this plugin "
- "requires collectd to run as root in order to read "
- "special CPU registers");
- return -1;
- }
+ DO_OR_GOTO_ERR(check_permissions());
DO_OR_GOTO_ERR(probe_cpu());