summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2021-10-14 16:50:04 +0200
committerGiampaolo Rodola <g.rodola@gmail.com>2021-10-14 16:50:04 +0200
commite79d3f07366d03f7a6723e24aae84987ef58d83f (patch)
tree5efd9534551c658d88213d0fd3af900df82859a6
parentd022c5b551eb793ddcded190cc15266d775f69b3 (diff)
downloadpsutil-e79d3f07366d03f7a6723e24aae84987ef58d83f.tar.gz
refactoring
Signed-off-by: Giampaolo Rodola <g.rodola@gmail.com>
-rw-r--r--psutil/_pslinux.py107
-rwxr-xr-xpsutil/tests/test_linux.py2
2 files changed, 68 insertions, 41 deletions
diff --git a/psutil/_pslinux.py b/psutil/_pslinux.py
index df8e2642..a073f051 100644
--- a/psutil/_pslinux.py
+++ b/psutil/_pslinux.py
@@ -1091,46 +1091,6 @@ def net_if_stats():
# =====================================================================
-class RootFsDeviceFinder:
- """Resources:
- https://bootlin.com/blog/find-root-device/
- https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/
- """
-
- def __init__(self):
- dev = os.stat("/").st_dev
- self.major = os.major(dev)
- self.minor = os.minor(dev)
-
- def use_proc_partitions(self):
- with open_text("%s/partitions" % get_procfs_path()) as f:
- for line in f.readlines()[2:]:
- fields = line.split()
- major = int(fields[0])
- minor = int(fields[1])
- name = fields[3]
- if major == self.major and minor == self.minor:
- return "/dev/%s" % name
-
- def use_sys_class_block(self):
- needle = "%d:%d" % (self.major, self.minor)
- files = glob.glob("/sys/class/block/*/dev")
- for file in files:
- with open_text(file) as f:
- data = f.read().strip()
- if data == needle:
- name = os.path.basename(os.path.dirname(file))
- return "/dev/%s" % name
-
- def use_sys_block_uevent(self):
- path = "/sys/dev/block/%s:%s/uevent" % (self.major, self.minor)
- with open_text(path) as f:
- for line in f:
- if line.startswith("DEVNAME="):
- name = line.strip().rpartition("DEVNAME=")[2]
- return "/dev/%s" % name
-
-
disk_usage = _psposix.disk_usage
@@ -1229,6 +1189,71 @@ def disk_io_counters(perdisk=False):
return retdict
+class RootFsDeviceFinder:
+ """disk_partitions() may return partitions with device == "/dev/root"
+ or "rootfs". This container class uses different strategies to
+ obtain the real device path. Resources:
+ https://bootlin.com/blog/find-root-device/
+ https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/
+ """
+
+ def __init__(self):
+ dev = os.stat("/").st_dev
+ self.major = os.major(dev)
+ self.minor = os.minor(dev)
+
+ def use_proc_partitions(self):
+ with open_text("%s/partitions" % get_procfs_path()) as f:
+ for line in f.readlines()[2:]:
+ fields = line.split()
+ if len(fields) < 4: # just for extra safety
+ continue
+ major = int(fields[0]) if fields[0].isdigit() else None
+ minor = int(fields[1]) if fields[1].isdigit() else None
+ name = fields[3]
+ if major == self.major and minor == self.minor:
+ if name: # just for extra safety
+ return "/dev/%s" % name
+
+ def use_sys_dev_block(self):
+ path = "/sys/dev/block/%s:%s/uevent" % (self.major, self.minor)
+ with open_text(path) as f:
+ for line in f:
+ if line.startswith("DEVNAME="):
+ name = line.strip().rpartition("DEVNAME=")[2]
+ if name: # just for extra safety
+ return "/dev/%s" % name
+
+ def use_sys_class_block(self):
+ needle = "%d:%d" % (self.major, self.minor)
+ files = glob.glob("/sys/class/block/*/dev")
+ for file in files:
+ with open_text(file) as f:
+ data = f.read().strip()
+ if data == needle:
+ name = os.path.basename(os.path.dirname(file))
+ return "/dev/%s" % name
+
+ def find(self):
+ path = None
+ if path is None:
+ try:
+ path = self.use_proc_partitions()
+ except FileNotFoundError as err:
+ debug(err)
+ if path is None:
+ try:
+ path = self.use_sys_dev_block()
+ except FileNotFoundError as err:
+ debug(err)
+ if path is None:
+ try:
+ path = self.use_sys_class_block()
+ except FileNotFoundError as err:
+ debug(err)
+ return path
+
+
def disk_partitions(all=False):
"""Return mounted disk partitions as a list of namedtuples."""
fstypes = set()
@@ -1256,6 +1281,8 @@ def disk_partitions(all=False):
device, mountpoint, fstype, opts = partition
if device == 'none':
device = ''
+ if device in ("/dev/root", "rootfs"):
+ device = RootFsDeviceFinder().find() or device
if not all:
if device == '' or fstype not in fstypes:
continue
diff --git a/psutil/tests/test_linux.py b/psutil/tests/test_linux.py
index 03524460..a54cd9ea 100755
--- a/psutil/tests/test_linux.py
+++ b/psutil/tests/test_linux.py
@@ -1269,7 +1269,7 @@ class TestRootFsDeviceFinder(PsutilTestCase):
a = finder.use_proc_partitions()
b = finder.use_sys_class_block()
self.assertEqual(a, b)
- c = finder.use_sys_block_uevent()
+ c = finder.use_sys_dev_block()
self.assertEqual(b, c)