@ -4,32 +4,34 @@ with lib;
let
cfg = config . services . nzbget ;
dataDir = builtins . dirOf cfg . configFile ;
in {
options = {
services . nzbget = {
enable = mkEnableOption " N Z B G e t " ;
pkg = pkgs . nzbget ;
stateDir = " / v a r / l i b / n z b g e t " ;
configFile = " ${ stateDir } / n z b g e t . c o n f " ;
configOpts = concatStringsSep " " ( mapAttrsToList ( name : value : " - o ${ name } = ${ value } " ) nixosOpts ) ;
package = mkOption {
type = types . package ;
default = pkgs . nzbget ;
defaultText = " p k g s . n z b g e t " ;
description = " T h e N Z B G e t p a c k a g e t o u s e " ;
} ;
nixosOpts = {
# allows nzbget to run as a "simple" service
OutputMode = " l o g g a b l e " ;
# use journald for logging
WriteLog = " n o n e " ;
ErrorTarget = " s c r e e n " ;
WarningTarget = " s c r e e n " ;
InfoTarget = " s c r e e n " ;
DetailTarget = " s c r e e n " ;
# required paths
ConfigTemplate = " ${ pkg } / s h a r e / n z b g e t / n z b g e t . c o n f " ;
WebDir = " ${ pkg } / s h a r e / n z b g e t / w e b u i " ;
# nixos handles package updates
UpdateCheck = " n o n e " ;
} ;
dataDir = mkOption {
type = types . str ;
default = " / v a r / l i b / n z b g e t " ;
description = " T h e d i r e c t o r y w h e r e N Z B G e t s t o r e s i t s c o n f i g u r a t i o n f i l e s . " ;
} ;
in
{
# interface
openFirewall = mkOption {
type = types . bool ;
default = false ;
description = ''
Open ports in the firewall for the NZBGet web interface
'' ;
} ;
options = {
services . nzbget = {
enable = mkEnableOption " N Z B G e t " ;
user = mkOption {
type = types . str ;
@ -42,15 +44,11 @@ in {
default = " n z b g e t " ;
description = " G r o u p u n d e r w h i c h N Z B G e t r u n s " ;
} ;
configFile = mkOption {
type = types . str ;
default = " / v a r / l i b / n z b g e t / n z b g e t . c o n f " ;
description = " P a t h f o r N Z B G e t ' s c o n f i g f i l e . ( I f t h i s d o e s n ' t e x i s t , t h e d e f a u l t c o n f i g t e m p l a t e i s c o p i e d h e r e . ) " ;
} ;
} ;
} ;
# implementation
config = mkIf cfg . enable {
systemd . services . nzbget = {
description = " N Z B G e t D a e m o n " ;
@ -61,50 +59,26 @@ in {
p7zip
] ;
preStart = ''
cfgtemplate = $ { cfg . package } /share/nzbget/nzbget.conf
if [ ! - f $ { cfg . configFile } ] ; then
echo " ${ cfg . configFile } n o t f o u n d . C o p y i n g d e f a u l t c o n f i g $ c f g t e m p l a t e t o ${ cfg . configFile } "
install - m 0700 $ cfgtemplate $ { cfg . configFile }
echo " S e t t i n g t e m p o r a r y \$ M A I N D I R v a r i a b l e i n d e f a u l t c o n f i g r e q u i r e d i n o r d e r t o a l l o w n z b g e t t o c o m p l e t e i n i t i a l s t a r t "
echo " R e m e m b e r t o c h a n g e t h i s t o a p r o p e r v a l u e o n c e N Z B G e t s t a r t u p h a s b e e n c o m p l e t e d "
sed - i - e ' s/MainDir = . * /MainDir = \ /tmp/g ' $ { cfg . configFile }
if [ ! - f $ { configFile } ] ; then
$ { pkgs . coreutils } /bin/install - m 0700 $ { pkg } /share/nzbget/nzbget.conf $ { configFile }
fi
'' ;
script = ''
args = " - - d a e m o n - - c o n f i g f i l e ${ cfg . configFile } "
# The script in preStart (above) copies nzbget's config template to datadir on first run, containing paths that point to the nzbget derivation installed at the time.
# These paths break when nzbget is upgraded & the original derivation is garbage collected. If such broken paths are found in the config file, override them to point to
# the currently installed nzbget derivation.
cfgfallback ( ) {
local hit = ` grep - Po " ( ? < = ^ $ 1 = ) . * + " " ${ cfg . configFile } " | sed ' s / [ \ t ] * $ // ' ` # Strip trailing whitespace
( test $ hit && test - e $ hit ) || {
echo " I n ${ cfg . configFile } , v a l i d $ 1 n o t f o u n d ; f a l l i n g b a c k t o $ 1 = $ 2 "
args + = " - o $ 1 = $ 2 "
}
}
cfgfallback ConfigTemplate $ { cfg . package } /share/nzbget/nzbget.conf
cfgfallback WebDir $ { cfg . package } /share/nzbget/webui
$ { cfg . package } /bin/nzbget $ args
'' ;
serviceConfig = {
StateDirectory = dataDir ;
StateDirectoryMode = " 0 7 0 0 " ;
Type = " f o r k i n g " ;
StateDirectory = " n z b g e t " ;
StateDirectoryMode = " 0 7 5 0 " ;
User = cfg . user ;
Group = cfg . group ;
PermissionsStartOnly = " t r u e " ;
UMask = " 0 0 0 2 " ;
Restart = " o n - f a i l u r e " ;
ExecStart = " ${ pkg } / b i n / n z b g e t - - s e r v e r - - c o n f i g f i l e ${ stateDir } / n z b g e t . c o n f ${ configOpts } " ;
ExecStop = " ${ pkg } / b i n / n z b g e t - - q u i t " ;
} ;
} ;
networking . firewall = mkIf cfg . openFirewall {
allowedTCPPorts = [ 8989 ] ;
} ;
users . users = mkIf ( cfg . user == " n z b g e t " ) {
nzbget = {
home = stateDir ;
group = cfg . group ;
uid = config . ids . uids . nzbget ;
} ;