python.d/nvidia_smi: use `pwd` lib to get username if not inside a container (#10268)
Ilya Mashchenko committed
Nov 23, 2020 at 15:15 UTC
4de1c2e6cca67d8fcd87ebd88879293042aeda8c
1 file changed
+13
-5
collectors/python.d.plugin/nvidia_smi/nvidia_smi.chart.py
+13
-5
@@ -7,6 +7,7 @@
7
import subprocess
8
import threading
9
import os
10
+import pwd
11
12
import xml.etree.ElementTree as et
13
@@ -247,9 +248,12 @@ HOST_PREFIX = os.getenv('NETDATA_HOST_PREFIX')
248
ETC_PASSWD_PATH = '/etc/passwd'
249
PROC_PATH = '/proc'
250
251
+IS_INSIDE_DOCKER = False
252
+
253
if HOST_PREFIX:
254
ETC_PASSWD_PATH = os.path.join(HOST_PREFIX, ETC_PASSWD_PATH[1:])
255
PROC_PATH = os.path.join(HOST_PREFIX, PROC_PATH[1:])
256
+ IS_INSIDE_DOCKER = True
257
258
259
def read_passwd_file():
@@ -271,21 +275,25 @@ def read_passwd_file():
275
276
def read_passwd_file_safe():
277
try:
274
- return read_passwd_file()
278
+ if IS_INSIDE_DOCKER:
279
+ return read_passwd_file()
280
+ return dict((k[2], k) for k in pwd.getpwall())
281
except (OSError, IOError):
282
return dict()
283
284
285
def get_username_by_pid_safe(pid, passwd_file):
280
- if not passwd_file:
281
- return ''
286
path = os.path.join(PROC_PATH, pid)
287
try:
288
uid = os.stat(path).st_uid
285
- return passwd_file[uid][0]
286
- except (OSError, IOError, KeyError):
289
+ except (OSError, IOError):
290
return ''
291
292
+ try:
293
+ return passwd_file[uid][0]
294
+ except KeyError:
295
+ return str(uid)
296
+
297
298
class GPU:
299
def __init__(self, num, root, exclude_zero_memory_users=False):