@cryptotaxi247 / netdata-1 / commits / 4de1c2e6c

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):