Actualizacion maquina principal
[dotfiles/.git] / .config / awesome / lain / widget / fs.lua
1 --[[
2
3      Licensed under GNU General Public License v2
4       * (c) 2018, Uli Schlacter
5       * (c) 2018, Otto Modinos
6       * (c) 2013, Luca CPZ
7
8 --]]
9
10 local helpers    = require("lain.helpers")
11 local Gio        = require("lgi").Gio
12 local focused    = require("awful.screen").focused
13 local wibox      = require("wibox")
14 local naughty    = require("naughty")
15 local math       = math
16 local string     = string
17 local tconcat    = table.concat
18 local type       = type
19 local tonumber   = tonumber
20 local query_size = Gio.FILE_ATTRIBUTE_FILESYSTEM_SIZE
21 local query_free = Gio.FILE_ATTRIBUTE_FILESYSTEM_FREE
22 local query_used = Gio.FILE_ATTRIBUTE_FILESYSTEM_USED
23 local query      = query_size .. "," .. query_free .. "," .. query_used
24
25 -- File systems info
26 -- lain.widget.fs
27
28 local function factory(args)
29     local fs = {
30         widget = wibox.widget.textbox(),
31         units = {
32             [1] = "Kb", [2] = "Mb", [3] = "Gb",
33             [4] = "Tb", [5] = "Pb", [6] = "Eb",
34             [7] = "Zb", [8] = "Yb"
35         }
36     }
37
38     function fs.hide()
39         if not fs.notification then return end
40         naughty.destroy(fs.notification)
41         fs.notification = nil
42     end
43
44     function fs.show(seconds, scr)
45         fs.hide(); fs.update()
46         fs.notification_preset.screen = fs.followtag and focused() or scr or 1
47         fs.notification = naughty.notify {
48             preset  = fs.notification_preset,
49             timeout = type(seconds) == "number" and seconds or 5
50         }
51     end
52
53     local args      = args or {}
54     local timeout   = args.timeout or 600
55     local partition = args.partition
56     local threshold = args.threshold or 99
57     local showpopup = args.showpopup or "on"
58     local settings  = args.settings or function() end
59
60     fs.followtag           = args.followtag or false
61     fs.notification_preset = args.notification_preset
62
63     if not fs.notification_preset then
64         fs.notification_preset = {
65             font = "Monospace 10",
66             fg   = "#FFFFFF",
67             bg   = "#000000"
68         }
69     end
70
71     function fs.update()
72         local notifytable = { [1] = string.format("%-10s %4s\t%6s\t%6s\t\n", "path", "used", "free", "size") }
73         local pathlen = 10
74         local maxpathidx = 1
75         fs_now = {}
76
77         for _, mount in ipairs(Gio.unix_mounts_get()) do
78             local path = Gio.unix_mount_get_mount_path(mount)
79             local root = Gio.File.new_for_path(path)
80             local info = root:query_filesystem_info(query)
81
82             if info then
83                 local size = info:get_attribute_uint64(query_size)
84                 local used = info:get_attribute_uint64(query_used)
85                 local free = info:get_attribute_uint64(query_free)
86
87                 if size > 0 then
88                     local units = math.floor(math.log(size)/math.log(1024))
89
90                     fs_now[path] = {
91                         units      = fs.units[units],
92                         percentage = math.floor(100 * used / size), -- used percentage
93                         size       = size / math.pow(1024, math.floor(units)),
94                         used       = used / math.pow(1024, math.floor(units)),
95                         free       = free / math.pow(1024, math.floor(units))
96                     }
97
98                     if fs_now[path].percentage > 0 then -- don't notify unused file systems
99                         notifytable[#notifytable+1] = string.format("\n%-10s %3s%%\t%6.2f\t%6.2f\t%s", path,
100                         math.floor(fs_now[path].percentage), fs_now[path].free, fs_now[path].size,
101                         fs_now[path].units)
102
103                         if #path > pathlen then
104                             pathlen = #path
105                             maxpathidx = #notifytable
106                         end
107                     end
108                 end
109             end
110         end
111
112         widget = fs.widget
113         settings()
114
115         if partition and fs_now[partition] and fs_now[partition].percentage >= threshold then
116             if not helpers.get_map(partition) then
117                 naughty.notify {
118                     preset = naughty.config.presets.critical,
119                     title  = "Warning",
120                     text   = string.format("%s is above %d%% (%d%%)", partition, threshold, fs_now[partition].percentage)
121                 }
122                 helpers.set_map(partition, true)
123             else
124                 helpers.set_map(partition, false)
125             end
126         end
127
128         if pathlen > 10 then -- if are there paths longer than 10 chars, reformat first column accordingly
129             local pathspaces
130             for i = 1, #notifytable do
131                 pathspaces = notifytable[i]:match("[ ]+")
132                 if i ~= maxpathidx and pathspaces then
133                     notifytable[i] = notifytable[i]:gsub(pathspaces, pathspaces .. string.rep(" ", pathlen - 10))
134                 end
135             end
136         end
137
138         fs.notification_preset.text = tconcat(notifytable)
139     end
140
141     if showpopup == "on" then
142        fs.widget:connect_signal('mouse::enter', function () fs.show(0) end)
143        fs.widget:connect_signal('mouse::leave', function () fs.hide() end)
144     end
145
146     helpers.newtimer(partition or "fs", timeout, fs.update)
147
148     return fs
149 end
150
151 return factory