You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.1 KiB
156 lines
5.1 KiB
--[[ |
|
|
|
Licensed under GNU General Public License v2 |
|
* (c) 2018, Uli Schlacter |
|
* (c) 2018, Otto Modinos |
|
* (c) 2013, Luca CPZ |
|
|
|
--]] |
|
|
|
local helpers = require("lain.helpers") |
|
local Gio = require("lgi").Gio |
|
local focused = require("awful.screen").focused |
|
local wibox = require("wibox") |
|
local naughty = require("naughty") |
|
local gears = require("gears") |
|
local math = math |
|
local string = string |
|
local tconcat = table.concat |
|
local type = type |
|
local query_size = Gio.FILE_ATTRIBUTE_FILESYSTEM_SIZE |
|
local query_free = Gio.FILE_ATTRIBUTE_FILESYSTEM_FREE |
|
local query_used = Gio.FILE_ATTRIBUTE_FILESYSTEM_USED |
|
local query = query_size .. "," .. query_free .. "," .. query_used |
|
|
|
-- File systems info |
|
-- lain.widget.fs |
|
|
|
local function factory(args) |
|
args = args or {} |
|
|
|
local fs = { |
|
widget = args.widget or wibox.widget.textbox(), |
|
units = { |
|
[1] = "Kb", [2] = "Mb", [3] = "Gb", |
|
[4] = "Tb", [5] = "Pb", [6] = "Eb", |
|
[7] = "Zb", [8] = "Yb" |
|
} |
|
} |
|
|
|
function fs.hide() |
|
if not fs.notification then return end |
|
naughty.destroy(fs.notification) |
|
fs.notification = nil |
|
end |
|
|
|
function fs.show(seconds, scr) |
|
fs.hide() |
|
fs.update(function() |
|
fs.notification_preset.screen = fs.followtag and focused() or scr or 1 |
|
fs.notification = naughty.notify { |
|
preset = fs.notification_preset, |
|
timeout = type(seconds) == "number" and seconds or 5 |
|
} |
|
end) |
|
end |
|
|
|
local timeout = args.timeout or 600 |
|
local partition = args.partition |
|
local threshold = args.threshold or 99 |
|
local showpopup = args.showpopup or "on" |
|
local settings = args.settings or function() end |
|
|
|
fs.followtag = args.followtag or false |
|
fs.notification_preset = args.notification_preset |
|
|
|
if not fs.notification_preset then |
|
fs.notification_preset = { |
|
font = "Monospace 10", |
|
fg = "#FFFFFF", |
|
bg = "#000000" |
|
} |
|
end |
|
|
|
local function update_synced() |
|
local pathlen = 10 |
|
fs_now = {} |
|
|
|
local notifypaths = {} |
|
for _, mount in ipairs(Gio.unix_mounts_get()) do |
|
local path = Gio.unix_mount_get_mount_path(mount) |
|
local root = Gio.File.new_for_path(path) |
|
local info = root:query_filesystem_info(query) |
|
|
|
if info then |
|
local size = info:get_attribute_uint64(query_size) |
|
local used = info:get_attribute_uint64(query_used) |
|
local free = info:get_attribute_uint64(query_free) |
|
|
|
if size > 0 then |
|
local units = math.floor(math.log(size)/math.log(1024)) |
|
|
|
fs_now[path] = { |
|
units = fs.units[units], |
|
percentage = math.floor(100 * used / size), -- used percentage |
|
size = size / math.pow(1024, units), |
|
used = used / math.pow(1024, units), |
|
free = free / math.pow(1024, units) |
|
} |
|
|
|
if fs_now[path].percentage > 0 then -- don't notify unused file systems |
|
notifypaths[#notifypaths+1] = path |
|
|
|
if #path > pathlen then |
|
pathlen = #path |
|
end |
|
end |
|
end |
|
end |
|
end |
|
|
|
widget = fs.widget |
|
settings() |
|
|
|
if partition and fs_now[partition] and fs_now[partition].percentage >= threshold then |
|
if not helpers.get_map(partition) then |
|
naughty.notify { |
|
preset = naughty.config.presets.critical, |
|
title = "Warning", |
|
text = string.format("%s is above %d%% (%d%%)", partition, threshold, fs_now[partition].percentage) |
|
} |
|
helpers.set_map(partition, true) |
|
else |
|
helpers.set_map(partition, false) |
|
end |
|
end |
|
|
|
local fmt = "%-" .. tostring(pathlen) .. "s %4s\t%6s\t%6s\n" |
|
local notifytable = { [1] = string.format(fmt, "path", "used", "free", "size") } |
|
fmt = "\n%-" .. tostring(pathlen) .. "s %3s%%\t%6.2f\t%6.2f %s" |
|
for _, path in ipairs(notifypaths) do |
|
notifytable[#notifytable+1] = string.format(fmt, path, fs_now[path].percentage, fs_now[path].free, fs_now[path].size, fs_now[path].units) |
|
end |
|
|
|
fs.notification_preset.text = tconcat(notifytable) |
|
end |
|
|
|
function fs.update(callback) |
|
Gio.Async.start(gears.protected_call.call)(function() |
|
update_synced() |
|
if type(callback) == "function" and callback then |
|
callback() |
|
end |
|
end) |
|
end |
|
|
|
if showpopup == "on" then |
|
fs.widget:connect_signal('mouse::enter', function () fs.show(0) end) |
|
fs.widget:connect_signal('mouse::leave', function () fs.hide() end) |
|
end |
|
|
|
helpers.newtimer(partition or "fs", timeout, fs.update) |
|
|
|
return fs |
|
end |
|
|
|
return factory
|
|
|