Add Mail card
This commit is contained in:
parent
b94343722f
commit
ca45a90930
29
bin/malpd
29
bin/malpd
@ -4,6 +4,7 @@ require "socket"
|
|||||||
require "fileutils"
|
require "fileutils"
|
||||||
require "json"
|
require "json"
|
||||||
require "shellwords"
|
require "shellwords"
|
||||||
|
require "etc"
|
||||||
|
|
||||||
SOCKET_PATH = "/run/malpd/malpd.sock"
|
SOCKET_PATH = "/run/malpd/malpd.sock"
|
||||||
|
|
||||||
@ -212,6 +213,33 @@ def read_server_info
|
|||||||
info
|
info
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def read_mail
|
||||||
|
users = []
|
||||||
|
|
||||||
|
["root", "josh"].each do |user|
|
||||||
|
begin
|
||||||
|
home = Etc.getpwnam(user).dir
|
||||||
|
rescue ArgumentError
|
||||||
|
next
|
||||||
|
end
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
mbox = ["/var/mail/#{user}", "/var/spool/mail/#{user}"].find { |p| File.exist?(p) }
|
||||||
|
if mbox
|
||||||
|
content = File.read(mbox) rescue ""
|
||||||
|
count = content.scan(/^From /).size
|
||||||
|
end
|
||||||
|
|
||||||
|
users << {
|
||||||
|
"user" => user,
|
||||||
|
"count" => count,
|
||||||
|
"dead_letter" => File.exist?(File.join(home, "dead.letter"))
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
{ "type" => "mail", "users" => users }
|
||||||
|
end
|
||||||
|
|
||||||
def read_ups
|
def read_ups
|
||||||
out = `apcaccess 2>/dev/null`
|
out = `apcaccess 2>/dev/null`
|
||||||
return nil unless $?.success? && !out.empty?
|
return nil unless $?.success? && !out.empty?
|
||||||
@ -279,6 +307,7 @@ def handle_info(conn)
|
|||||||
info.concat(read_virtual_machines)
|
info.concat(read_virtual_machines)
|
||||||
|
|
||||||
info << read_server_info
|
info << read_server_info
|
||||||
|
info << read_mail
|
||||||
|
|
||||||
if (ups = read_ups)
|
if (ups = read_ups)
|
||||||
info << ups
|
info << ups
|
||||||
|
|||||||
@ -369,7 +369,10 @@ if cgi.params.key?("content")
|
|||||||
end
|
end
|
||||||
|
|
||||||
upses = info.select { |e| e["type"] == "ups" }
|
upses = info.select { |e| e["type"] == "ups" }
|
||||||
if drives.any? || upses.any?
|
mail = info.find { |e| e["type"] == "mail" }
|
||||||
|
mail_visible = mail && (mail["users"] || []).any?
|
||||||
|
|
||||||
|
if drives.any? || upses.any? || mail_visible
|
||||||
html << %(<div style="display:grid;grid-template-columns:2fr 1fr;gap:1rem;align-items:start;margin-top:1rem;">)
|
html << %(<div style="display:grid;grid-template-columns:2fr 1fr;gap:1rem;align-items:start;margin-top:1rem;">)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -411,6 +414,9 @@ if cgi.params.key?("content")
|
|||||||
html << %(</div>)
|
html << %(</div>)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if upses.any? || mail_visible
|
||||||
|
html << %(<div>)
|
||||||
|
|
||||||
upses.each do |ups|
|
upses.each do |ups|
|
||||||
status = ups["status"].to_s
|
status = ups["status"].to_s
|
||||||
online = status.include?("ONLINE")
|
online = status.include?("ONLINE")
|
||||||
@ -446,7 +452,6 @@ if cgi.params.key?("content")
|
|||||||
stats_block = stats.empty? ? "" :
|
stats_block = stats.empty? ? "" :
|
||||||
%(<div class="drive-stats" style="margin-top:0.6rem;">#{stats_html}</div>)
|
%(<div class="drive-stats" style="margin-top:0.6rem;">#{stats_html}</div>)
|
||||||
|
|
||||||
html << %(<div>)
|
|
||||||
html << %(<div class="section-label">UPS</div>)
|
html << %(<div class="section-label">UPS</div>)
|
||||||
html << <<~HTML
|
html << <<~HTML
|
||||||
<div class="card #{card_cls}">
|
<div class="card #{card_cls}">
|
||||||
@ -457,10 +462,45 @@ if cgi.params.key?("content")
|
|||||||
#{stats_block}
|
#{stats_block}
|
||||||
</div>
|
</div>
|
||||||
HTML
|
HTML
|
||||||
|
end
|
||||||
|
|
||||||
|
if mail_visible
|
||||||
|
users = mail["users"]
|
||||||
|
has_warn = users.any? { |u| u["count"].to_i > 0 || u["dead_letter"] }
|
||||||
|
mail_card_cls = has_warn ? "warn" : "ok"
|
||||||
|
|
||||||
|
html << %(<div class="section-label">Mail</div>)
|
||||||
|
html << %(<div class="card #{mail_card_cls}"><div class="card-header"><span class="card-title">Local Mail</span></div><div class="subitems">)
|
||||||
|
|
||||||
|
users.each do |u|
|
||||||
|
count = u["count"].to_i
|
||||||
|
cls = count > 0 ? "warn" : "ok"
|
||||||
|
label = count == 1 ? "1 message" : "#{count} messages"
|
||||||
|
html << <<~HTML
|
||||||
|
<div class="subitem">
|
||||||
|
<div class="subitem-left"><div class="dot #{cls}"></div><span class="subitem-name">#{CGI.escapeHTML(u["user"].to_s)}</span></div>
|
||||||
|
<span class="subitem-value #{cls}">#{label}</span>
|
||||||
|
</div>
|
||||||
|
HTML
|
||||||
|
end
|
||||||
|
|
||||||
|
html << %(</div>)
|
||||||
|
|
||||||
|
dead = users.select { |u| u["dead_letter"] }
|
||||||
|
if dead.any?
|
||||||
|
stats_html = dead.map { |u|
|
||||||
|
%(<span class="stat warn">dead.letter in ~#{CGI.escapeHTML(u["user"].to_s)}</span>)
|
||||||
|
}.join
|
||||||
|
html << %(<div class="drive-stats" style="margin-top:0.6rem;">#{stats_html}</div>)
|
||||||
|
end
|
||||||
|
|
||||||
html << %(</div>)
|
html << %(</div>)
|
||||||
end
|
end
|
||||||
|
|
||||||
if drives.any? || upses.any?
|
html << %(</div>)
|
||||||
|
end
|
||||||
|
|
||||||
|
if drives.any? || upses.any? || mail_visible
|
||||||
html << %(</div>)
|
html << %(</div>)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user