94 lines
2.4 KiB
Nix
94 lines
2.4 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
|
|
with lib;
|
|
let
|
|
cfg = config.fudo.netinfo-email;
|
|
|
|
make-script = server: port: target: pkgs.writeText "netinfo-script.rb" ''
|
|
#!${pkgs.ruby}/bin/ruby
|
|
|
|
require 'net/smtp'
|
|
|
|
raise RuntimeError.new("NETINFO_SMTP_USERNAME not set!") if not ENV['NETINFO_SMTP_USERNAME']
|
|
user = ENV['NETINFO_SMTP_USERNAME']
|
|
|
|
raise RuntimeError.new("NETINFO_SMTP_PASSWD not set!") if not ENV['NETINFO_SMTP_PASSWD']
|
|
passwd = ENV['NETINFO_SMTP_PASSWD']
|
|
|
|
hostname = `${pkgs.inetutils}/bin/hostname -f`.strip
|
|
date = `${pkgs.coreutils}/bin/date +%Y-%m-%d`.strip
|
|
email_date = `${pkgs.coreutils}/bin/date`
|
|
ipinfo = `${pkgs.iproute}/bin/ip addr`
|
|
|
|
message = <<EOM
|
|
From: #{user}@fudo.org
|
|
To: ${target}
|
|
Subject: #{hostname} network info for #{date}
|
|
Date: #{email_date}
|
|
|
|
#{ipinfo}
|
|
EOM
|
|
|
|
smtp = Net::SMTP.new("${server}", ${toString port})
|
|
smtp.enable_starttls
|
|
|
|
smtp.start('localhost', user, passwd) do |server|
|
|
server.send_message(message, "#{user}@fudo.org", ["${target}"])
|
|
end
|
|
'';
|
|
|
|
in {
|
|
|
|
options.fudo.netinfo-email = {
|
|
enable = mkEnableOption "Enable netinfo email (hacky way to keep track of a host's IP";
|
|
|
|
smtp-server = mkOption {
|
|
type = types.str;
|
|
default = "mail.fudo.org";
|
|
};
|
|
|
|
smtp-port = mkOption {
|
|
type = types.port;
|
|
default = 587;
|
|
};
|
|
|
|
env-file = mkOption {
|
|
type = types.str;
|
|
description = "Path to file containing NETINFO_SMTP_USERNAME and NETINFO_SMTP_PASSWD";
|
|
};
|
|
|
|
target-email = mkOption {
|
|
type = types.str;
|
|
default = "network-info@fudo.link";
|
|
description = "Email to which to send network info report.";
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
systemd = {
|
|
timers.netinfo = {
|
|
enable = true;
|
|
description = "Send network info to ${cfg.target-email}";
|
|
partOf = ["netinfo.service"];
|
|
wantedBy = [ "timers.target" ];
|
|
requires = [ "network-online.target" ];
|
|
timerConfig = {
|
|
OnCalendar = "daily";
|
|
};
|
|
};
|
|
|
|
services.netinfo = {
|
|
enable = true;
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
StandardOutput = "journal";
|
|
EnvironmentFile = cfg.env-file;
|
|
};
|
|
script = ''
|
|
${pkgs.ruby}/bin/ruby ${make-script cfg.smtp-server cfg.smtp-port cfg.target-email}
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
}
|