2013-09-07 12:06:42 +02:00
|
|
|
--[[
|
2017-09-04 12:43:00 +02:00
|
|
|
|
|
|
|
Licensed under GNU General Public License v2
|
2018-02-16 17:21:09 +01:00
|
|
|
* (c) 2018, Uli Schlacter
|
|
|
|
* (c) 2018, Otto Modinos
|
2017-09-11 06:51:52 +02:00
|
|
|
* (c) 2013, Luca CPZ
|
2017-09-04 12:43:00 +02:00
|
|
|
|
2013-09-07 12:06:42 +02:00
|
|
|
--]]
|
|
|
|
|
2023-09-05 22:29:10 +02:00
|
|
|
local requirePrefix = tostring(...):match(".*lain") or ""
|
|
|
|
if requirePrefix then
|
|
|
|
requirePrefix = requirePrefix .. "."
|
|
|
|
end
|
|
|
|
|
|
|
|
local helpers = require(requirePrefix .. "helpers")
|
2018-02-16 17:21:09 +01:00
|
|
|
local Gio = require("lgi").Gio
|
|
|
|
local focused = require("awful.screen").focused
|
|
|
|
local wibox = require("wibox")
|
|
|
|
local naughty = require("naughty")
|
2020-11-29 14:33:16 +01:00
|
|
|
local gears = require("gears")
|
2018-02-16 17:21:09 +01:00
|
|
|
local math = math
|
2018-03-14 12:17:13 +01:00
|
|
|
local string = string
|
2018-02-16 17:21:09 +01:00
|
|
|
local tconcat = table.concat
|
2019-04-08 12:37:38 +02:00
|
|
|
local type = type
|
2018-02-16 17:21:09 +01:00
|
|
|
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
|
2017-02-08 14:15:48 +01:00
|
|
|
-- lain.widget.fs
|
2017-01-21 00:09:54 +01:00
|
|
|
|
2017-04-02 19:35:03 +02:00
|
|
|
local function factory(args)
|
2020-11-29 22:48:32 +01:00
|
|
|
args = args or {}
|
|
|
|
|
2018-02-16 17:21:09 +01:00
|
|
|
local fs = {
|
2020-10-31 18:11:29 +01:00
|
|
|
widget = args.widget or wibox.widget.textbox(),
|
2018-02-16 17:21:09 +01:00
|
|
|
units = {
|
|
|
|
[1] = "Kb", [2] = "Mb", [3] = "Gb",
|
|
|
|
[4] = "Tb", [5] = "Pb", [6] = "Eb",
|
|
|
|
[7] = "Zb", [8] = "Yb"
|
|
|
|
}
|
|
|
|
}
|
2013-09-07 12:06:42 +02:00
|
|
|
|
2017-04-02 19:35:03 +02:00
|
|
|
function fs.hide()
|
|
|
|
if not fs.notification then return end
|
|
|
|
naughty.destroy(fs.notification)
|
|
|
|
fs.notification = nil
|
|
|
|
end
|
2017-01-24 18:42:44 +01:00
|
|
|
|
2017-04-02 19:35:03 +02:00
|
|
|
function fs.show(seconds, scr)
|
2020-11-29 14:33:16 +01:00
|
|
|
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)
|
2017-04-02 19:35:03 +02:00
|
|
|
end
|
2013-09-07 12:06:42 +02:00
|
|
|
|
2018-02-16 17:21:09 +01:00
|
|
|
local timeout = args.timeout or 600
|
|
|
|
local partition = args.partition
|
2018-12-30 19:12:17 +01:00
|
|
|
local threshold = args.threshold or 99
|
2018-02-16 17:21:09 +01:00
|
|
|
local showpopup = args.showpopup or "on"
|
|
|
|
local settings = args.settings or function() end
|
2015-07-29 13:21:59 +02:00
|
|
|
|
2017-01-08 14:45:20 +01:00
|
|
|
fs.followtag = args.followtag or false
|
2017-01-22 02:13:02 +01:00
|
|
|
fs.notification_preset = args.notification_preset
|
|
|
|
|
|
|
|
if not fs.notification_preset then
|
2017-01-25 18:38:50 +01:00
|
|
|
fs.notification_preset = {
|
|
|
|
font = "Monospace 10",
|
|
|
|
fg = "#FFFFFF",
|
|
|
|
bg = "#000000"
|
|
|
|
}
|
2017-01-22 02:13:02 +01:00
|
|
|
end
|
2013-09-07 12:06:42 +02:00
|
|
|
|
2020-11-14 02:01:40 +01:00
|
|
|
local function update_synced()
|
2018-03-14 12:17:13 +01:00
|
|
|
local pathlen = 10
|
2018-02-16 17:21:09 +01:00
|
|
|
fs_now = {}
|
|
|
|
|
2020-05-23 15:17:15 +02:00
|
|
|
local notifypaths = {}
|
2018-02-16 17:21:09 +01:00
|
|
|
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)
|
|
|
|
|
2018-02-25 23:17:09 +01:00
|
|
|
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
|
2020-05-23 15:17:15 +02:00
|
|
|
size = size / math.pow(1024, units),
|
|
|
|
used = used / math.pow(1024, units),
|
|
|
|
free = free / math.pow(1024, units)
|
2018-02-25 23:17:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if fs_now[path].percentage > 0 then -- don't notify unused file systems
|
2020-05-23 15:17:15 +02:00
|
|
|
notifypaths[#notifypaths+1] = path
|
2018-03-14 12:17:13 +01:00
|
|
|
|
2019-04-09 19:25:02 +02:00
|
|
|
if #path > pathlen then
|
|
|
|
pathlen = #path
|
|
|
|
end
|
2018-02-25 23:17:09 +01:00
|
|
|
end
|
2018-02-16 17:21:09 +01:00
|
|
|
end
|
2017-01-21 00:09:54 +01:00
|
|
|
end
|
2018-02-16 17:21:09 +01:00
|
|
|
end
|
2017-01-21 00:09:54 +01:00
|
|
|
|
2018-02-16 17:21:09 +01:00
|
|
|
widget = fs.widget
|
|
|
|
settings()
|
|
|
|
|
2018-12-30 19:12:17 +01:00
|
|
|
if partition and fs_now[partition] and fs_now[partition].percentage >= threshold then
|
2018-02-16 17:21:09 +01:00
|
|
|
if not helpers.get_map(partition) then
|
|
|
|
naughty.notify {
|
2017-01-23 20:58:19 +01:00
|
|
|
preset = naughty.config.presets.critical,
|
|
|
|
title = "Warning",
|
2018-12-30 19:12:17 +01:00
|
|
|
text = string.format("%s is above %d%% (%d%%)", partition, threshold, fs_now[partition].percentage)
|
2018-02-16 17:21:09 +01:00
|
|
|
}
|
2017-01-21 00:09:54 +01:00
|
|
|
helpers.set_map(partition, true)
|
|
|
|
else
|
|
|
|
helpers.set_map(partition, false)
|
2013-09-07 12:06:42 +02:00
|
|
|
end
|
2018-02-16 17:21:09 +01:00
|
|
|
end
|
2017-01-24 18:42:44 +01:00
|
|
|
|
2020-05-23 15:17:15 +02:00
|
|
|
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)
|
2018-03-14 12:17:13 +01:00
|
|
|
end
|
|
|
|
|
2018-02-16 17:21:09 +01:00
|
|
|
fs.notification_preset.text = tconcat(notifytable)
|
2013-09-07 12:06:42 +02:00
|
|
|
end
|
|
|
|
|
2020-11-29 14:33:16 +01:00
|
|
|
function fs.update(callback)
|
|
|
|
Gio.Async.start(gears.protected_call.call)(function()
|
|
|
|
update_synced()
|
2021-01-13 04:09:47 +01:00
|
|
|
if type(callback) == "function" and callback then
|
2020-11-29 14:33:16 +01:00
|
|
|
callback()
|
|
|
|
end
|
|
|
|
end)
|
2020-11-14 02:01:40 +01:00
|
|
|
end
|
|
|
|
|
2016-07-16 11:24:59 +02:00
|
|
|
if showpopup == "on" then
|
2016-12-10 15:45:50 +01:00
|
|
|
fs.widget:connect_signal('mouse::enter', function () fs.show(0) end)
|
|
|
|
fs.widget:connect_signal('mouse::leave', function () fs.hide() end)
|
2016-07-16 11:24:59 +02:00
|
|
|
end
|
2013-09-07 12:06:42 +02:00
|
|
|
|
2018-02-16 17:21:09 +01:00
|
|
|
helpers.newtimer(partition or "fs", timeout, fs.update)
|
2015-07-09 12:52:18 +02:00
|
|
|
|
2017-01-26 20:53:55 +01:00
|
|
|
return fs
|
2013-09-07 12:06:42 +02:00
|
|
|
end
|
|
|
|
|
2017-04-02 19:35:03 +02:00
|
|
|
return factory
|