From daebff6bb861acc0ed7390bcb101b6e9af85efff Mon Sep 17 00:00:00 2001 From: Vincent Brillault Date: Wed, 11 Feb 2015 23:19:53 +0100 Subject: [PATCH] Turbostat plugin: relax dependency on root Backporting commit 98481e79b60a50d699b79292ff1b7e56e7fa8425 from Len Brown 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 | 54 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/src/turbostat.c b/src/turbostat.c index 34c11b88..cd2cf434 100644 --- a/src/turbostat.c +++ b/src/turbostat.c @@ -57,6 +57,7 @@ #include #include #include +#include #define PLUGIN_NAME "turbostat" @@ -1484,6 +1485,52 @@ out: 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) { @@ -1498,12 +1545,7 @@ 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()); -- 2.30.2