nixpkgs/nixos/modules/programs/venus.nix

174 lines
4.2 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.venus;
configFile = pkgs.writeText "venus.ini"
''
[Planet]
name = ${cfg.name}
link = ${cfg.link}
owner_name = ${cfg.ownerName}
owner_email = ${cfg.ownerEmail}
output_theme = ${cfg.cacheDirectory}/theme
output_dir = ${cfg.outputDirectory}
cache_directory = ${cfg.cacheDirectory}
items_per_page = ${toString cfg.itemsPerPage}
${(concatStringsSep "\n\n"
(map ({ name, feedUrl, homepageUrl }:
''
[${feedUrl}]
name = ${name}
link = ${homepageUrl}
'') cfg.feeds))}
'';
in
{
options = {
services.venus = {
enable = mkOption {
default = false;
type = types.bool;
description = ''
Planet Venus is an awesome river of news feed reader. It downloads
news feeds published by web sites and aggregates their content
together into a single combined feed, latest news first.
'';
};
dates = mkOption {
default = "*:0/15";
type = types.str;
description = ''
Specification (in the format described by
<citerefentry><refentrytitle>systemd.time</refentrytitle>
<manvolnum>7</manvolnum></citerefentry>) of the time at
which the Venus will collect feeds.
'';
};
user = mkOption {
default = "root";
type = types.str;
description = ''
User for running venus script.
'';
};
group = mkOption {
default = "root";
type = types.str;
description = ''
Group for running venus script.
'';
};
name = mkOption {
default = "NixOS Planet";
type = types.str;
description = ''
Your planet's name.
'';
};
link = mkOption {
default = "https://planet.nixos.org";
type = types.str;
description = ''
Link to the main page.
'';
};
ownerName = mkOption {
default = "Rok Garbas";
type = types.str;
description = ''
Your name.
'';
};
ownerEmail = mkOption {
default = "some@example.com";
type = types.str;
description = ''
Your e-mail address.
'';
};
outputTheme = mkOption {
default = "${pkgs.venus}/themes/classic_fancy";
type = types.path;
description = ''
Directory containing a config.ini file which is merged with this one.
This is typically used to specify templating and bill of material
information.
'';
};
outputDirectory = mkOption {
type = types.path;
description = ''
Directory to place output files.
'';
};
cacheDirectory = mkOption {
default = "/var/cache/venus";
type = types.path;
description = ''
Where cached feeds are stored.
'';
};
itemsPerPage = mkOption {
default = 15;
type = types.int;
description = ''
How many items to put on each page.
'';
};
feeds = mkOption {
default = [];
example = [
{
name = "Rok Garbas";
feedUrl= "http://url/to/rss/feed.xml";
homepageUrl = "http://garbas.si";
}
];
description = ''
List of feeds.
'';
};
};
};
config = mkIf cfg.enable {
system.activationScripts.venus =
''
mkdir -p ${cfg.outputDirectory}
chown ${cfg.user}:${cfg.group} ${cfg.outputDirectory} -R
rm -rf ${cfg.cacheDirectory}/theme
mkdir -p ${cfg.cacheDirectory}/theme
cp -R ${cfg.outputTheme}/* ${cfg.cacheDirectory}/theme
chown ${cfg.user}:${cfg.group} ${cfg.cacheDirectory} -R
'';
systemd.services.venus =
{ description = "Planet Venus Feed Reader";
path = [ pkgs.venus ];
script = "exec venus-planet ${configFile}";
serviceConfig.User = "${cfg.user}";
serviceConfig.Group = "${cfg.group}";
startAt = cfg.dates;
};
};
}