57 lines
1.6 KiB
Python
Executable File
57 lines
1.6 KiB
Python
Executable File
#!/usr/bin/python3
|
|
|
|
import os
|
|
import socket
|
|
import time
|
|
|
|
from ltsdb_json import LTS
|
|
|
|
# Use a whitelist since there are a lot of uninteresting file system
|
|
# types on modern linux systems
|
|
interesting_fstypes = {"ext4", "tmpfs", "vfat"}
|
|
|
|
# It's a bit weird that this works.
|
|
hostname = socket.gethostbyaddr(socket.gethostname())[0]
|
|
|
|
|
|
with open("/proc/mounts") as mfh:
|
|
for ln in mfh:
|
|
(dev, mountpoint, fstype, options, _, _) = ln.split()
|
|
if fstype not in interesting_fstypes:
|
|
continue
|
|
st = os.statvfs(mountpoint)
|
|
now = time.time()
|
|
|
|
# We record the capacity usable by unprivileged processes, not the
|
|
# total size of the filesystem. This is more relevant and also what df
|
|
# uses as the "100%" mark.
|
|
blocks_reserved = st.f_bfree - st.f_bavail
|
|
blocks_usable = st.f_blocks - blocks_reserved
|
|
blocks_used = st.f_blocks - st.f_bfree
|
|
|
|
bytes_usable = blocks_usable * st.f_bsize
|
|
bytes_used = blocks_used * st.f_bsize
|
|
|
|
ts = LTS(
|
|
{
|
|
"hostname": hostname,
|
|
"mountpoint": mountpoint,
|
|
"fstype": fstype,
|
|
"measure": "bytes_usable",
|
|
"unit": "bytes",
|
|
}
|
|
)
|
|
ts.add(now, bytes_usable)
|
|
ts.save()
|
|
ts = LTS(
|
|
{
|
|
"hostname": hostname,
|
|
"mountpoint": mountpoint,
|
|
"fstype": fstype,
|
|
"measure": "bytes_used",
|
|
"unit": "bytes",
|
|
}
|
|
)
|
|
ts.add(now, bytes_used)
|
|
ts.save()
|