@@ -1,4 +1,9 @@
{ config , lib , pkgs , . . . }:
{
config ,
lib ,
pkgs ,
. . .
}:
with lib ;
@@ -15,14 +20,10 @@ let
plugins = " k e y f i l e " ;
inherit ( cfg ) dhcp dns ;
# If resolvconf is disabled that means that resolv.conf is managed by some other module.
rc-manager =
if config . networking . resolvconf . enable then " r e s o l v c o n f "
else " u n m a n a g e d " ;
rc-manager = if config . networking . resolvconf . enable then " r e s o l v c o n f " else " u n m a n a g e d " ;
} ;
keyfile = {
unmanaged-devices =
if cfg . unmanaged = = [ ] then null
else lib . concatStringsSep " ; " cfg . unmanaged ;
unmanaged-devices = if cfg . unmanaged = = [ ] then null else lib . concatStringsSep " ; " cfg . unmanaged ;
} ;
logging = {
audit = config . security . audit . enable ;
@@ -30,8 +31,8 @@ let
} ;
connection = cfg . connectionConfig ;
device = {
" w i f i . s c a n - r a n d - m a c - a d d r e s s " = cfg . wifi . scanRandMacAddress ;
" w i f i . b a c k e n d " = cfg . wifi . backend ;
" w i f i . s c a n - r a n d - m a c - a d d r e s s " = cfg . wifi . scanRandMacAddress ;
" w i f i . b a c k e n d " = cfg . wifi . backend ;
} ;
} cfg . settings ;
configFile = ini . generate " N e t w o r k M a n a g e r . c o n f " configAttrs ;
@@ -43,32 +44,29 @@ let
R e s u l t A n y = y e s
R e s u l t I n a c t i v e = n o
R e s u l t A c t i v e = y e s
[ m o d e m - m a n a g e r ]
I d e n t i t y = u n i x - g r o u p : n e t w o r k m a n a g e r
A c t i o n = o r g . f r e e d e s k t o p . M o d e m M a n a g e r *
R e s u l t A n y = y e s
R e s u l t I n a c t i v e = n o
R e s u l t A c t i v e = y e s
*/
polkitConf = ''
p o l k i t . a d d R u l e ( f u n c t i o n ( a c t i o n , s u b j e c t ) {
i f (
s u b j e c t . i s I n G r o u p ( " n e t w o r k m a n a g e r " )
& & ( a c t i o n . i d . i n d e x O f ( " o r g . f r e e d e s k t o p . N e t w o r k M a n a g e r . " ) = = 0
| | a c t i o n . i d . i n d e x O f ( " o r g . f r e e d e s k t o p . M o d e m M a n a g e r " ) = = 0
) )
& & a c t i o n . i d . i n d e x O f ( " o r g . f r e e d e s k t o p . N e t w o r k M a n a g e r . " ) = = 0
)
{ r e t u r n p o l k i t . R e s u l t . Y E S ; }
} ) ;
'' ;
ns = xs : pkgs . writeText " n a m e s e r v e r s " (
concatStrings ( map ( s : " n a m e s e r v e r ${ s } \n " ) xs )
) ;
ns = xs : pkgs . writeText " n a m e s e r v e r s " ( concatStrings ( map ( s : " n a m e s e r v e r ${ s } \n " ) xs ) ) ;
overrideNameserversScript = pkgs . writeScript " 0 2 o v e r r i d e d n s " ''
# ! / b i n / s h
P A T H = ${ with pkgs ; makeBinPath [ gnused gnugrep coreutils ] }
P A T H = ${
with pkgs ;
makeBinPath [
gnused
gnugrep
coreutils
]
}
t m p = $( m k t e m p )
s e d ' / n a m e s e r v e r / d ' / e t c / r e s o l v . c o n f > $t m p
g r e p ' n a m e s e r v e r ' / e t c / r e s o l v . c o n f | \
@@ -84,7 +82,15 @@ let
} ;
macAddressOptWifi = mkOption {
type = types . either types . str ( types . enum [ " p e r m a n e n t " " p r e s e r v e " " r a n d o m " " s t a b l e " " s t a b l e - s s i d " ] ) ;
type = types . either types . str (
types . enum [
" p e r m a n e n t "
" p r e s e r v e "
" r a n d o m "
" s t a b l e "
" s t a b l e - s s i d "
]
) ;
default = " p r e s e r v e " ;
example = " 0 0 : 1 1 : 2 2 : 3 3 : 4 4 : 5 5 " ;
description = ''
@@ -100,7 +106,14 @@ let
} ;
macAddressOptEth = mkOption {
type = types . either types . str ( types . enum [ " p e r m a n e n t " " p r e s e r v e " " r a n d o m " " s t a b l e " ] ) ;
type = types . either types . str (
types . enum [
" p e r m a n e n t "
" p r e s e r v e "
" r a n d o m "
" s t a b l e "
]
) ;
default = " p r e s e r v e " ;
example = " 0 0 : 1 1 : 2 2 : 3 3 : 4 4 : 5 5 " ;
description = ''
@@ -114,14 +127,14 @@ let
'' ;
} ;
packages = [
pkgs . modemmanager
pkgs . networkmanager
]
++ cfg . plugins
++ lib . optionals ( ! delegateWireless && ! enableIwd ) [
pkgs . wpa_supplicant
] ;
packages =
[
cfg . package
]
++ cfg . plugins
++ lib . optionals ( ! delegateWireless && ! enableIwd ) [
pkgs . wpa_supplicant
] ;
in
{
@@ -148,12 +161,18 @@ in
'' ;
} ;
package = mkPackageOption pkgs " n e t w o r k m a n a g e r " { } ;
connectionConfig = mkOption {
type = with types ; attrsOf ( nullOr ( oneOf [
bool
int
str
] ) ) ;
type =
with types ;
attrsOf (
nullOr ( oneOf [
bool
int
str
] )
) ;
default = { } ;
description = ''
C o n f i g u r a t i o n f o r t h e [ c o n n e c t i o n ] s e c t i o n o f N e t w o r k M a n a g e r . c o n f .
@@ -169,7 +188,7 @@ in
settings = mkOption {
type = ini . type ;
default = { } ;
default = { } ;
description = ''
C o n f i g u r a t i o n a d d e d t o t h e g e n e r a t e d N e t w o r k M a n a g e r . c o n f , n o t e t h a t y o u c a n o v e r w r i t e s e t t i n g s w i t h t h i s .
R e f e r t o
@@ -205,9 +224,7 @@ in
check =
p :
lib . assertMsg
( types . package . check p
&& p ? networkManagerPlugin
&& lib . isString p . networkManagerPlugin )
( types . package . check p && p ? networkManagerPlugin && lib . isString p . networkManagerPlugin )
''
P a c k a g e ‘ ${ p . name } ’ , i s n o t a N e t w o r k M a n a g e r p l u g - i n .
T h o s e n e e d t o h a v e a ‘ n e t w o r k M a n a g e r P l u g i n ’ a t t r i b u t e .
@@ -223,7 +240,10 @@ in
} ;
dhcp = mkOption {
type = types . enum [ " d h c p c d " " i n t e r n a l " ] ;
type = types . enum [
" d h c p c d "
" i n t e r n a l "
] ;
default = " i n t e r n a l " ;
description = ''
W h i c h p r o g r a m ( o r i n t e r n a l l i b r a r y ) s h o u l d b e u s e d f o r D H C P .
@@ -231,7 +251,14 @@ in
} ;
logLevel = mkOption {
type = types . enum [ " O F F " " E R R " " W A R N " " I N F O " " D E B U G " " T R A C E " ] ;
type = types . enum [
" O F F "
" E R R "
" W A R N "
" I N F O "
" D E B U G "
" T R A C E "
] ;
default = " W A R N " ;
description = ''
S e t t h e d e f a u l t l o g g i n g v e r b o s i t y l e v e l .
@@ -262,7 +289,10 @@ in
macAddress = macAddressOptWifi ;
backend = mkOption {
type = types . enum [ " w p a _ s u p p l i c a n t " " i w d " ] ;
type = types . enum [
" w p a _ s u p p l i c a n t "
" i w d "
] ;
default = " w p a _ s u p p l i c a n t " ;
description = ''
S p e c i f y t h e W i - F i b a c k e n d u s e d f o r t h e d e v i c e .
@@ -289,7 +319,12 @@ in
} ;
dns = mkOption {
type = types . enum [ " d e f a u l t " " d n s m a s q " " s y s t e m d - r e s o l v e d " " n o n e " ] ;
type = types . enum [
" d e f a u l t "
" d n s m a s q "
" s y s t e m d - r e s o l v e d "
" n o n e "
] ;
default = " d e f a u l t " ;
description = ''
S e t t h e D N S ( ` r e s o l v . c o n f ` ) p r o c e s s i n g m o d e .
@@ -304,27 +339,29 @@ in
} ;
dispatcherScripts = mkOption {
type = types . listOf ( types . submodule {
options = {
source = mkOption {
type = types . path ;
description = ''
P a t h t o t h e h o o k s c r i p t .
'' ;
} ;
type = types . listOf (
types . submodule {
options = {
source = mkOption {
type = types . path ;
description = ''
P a t h t o t h e h o o k s c r i p t .
'' ;
} ;
type = mkOption {
type = types . enum ( attrNames dispatcherTypesSubdirMap ) ;
default = " b a s i c " ;
description = ''
D i s p a t c h e r h o o k t y p e . L o o k u p t h e h o o k s d e s c r i b e d a t
[ h t t p s : / / d e v e l o p e r . g n o m e . o r g / N e t w o r k M a n a g e r / s t a b l e / N e t w o r k M a n a g e r . h t m l ] ( h t t p s : / / d e v e l o p e r . g n o m e . o r g / N e t w o r k M a n a g e r / s t a b l e / N e t w o r k M a n a g e r . h t m l )
a n d c h o o s e t h e t y p e d e p e n d i n g o n t h e o u t p u t f o l d e r .
Y o u s h o u l d t h e n f i l t e r t h e e v e n t t y p e ( e . g . , " u p " / " d o w n " ) f r o m w i t h i n y o u r s c r i p t .
'' ;
type = mkOption {
type = types . enum ( attrNames dispatcherTypesSubdirMap ) ;
default = " b a s i c " ;
description = ''
D i s p a t c h e r h o o k t y p e . L o o k u p t h e h o o k s d e s c r i b e d a t
[ h t t p s : / / d e v e l o p e r . g n o m e . o r g / N e t w o r k M a n a g e r / s t a b l e / N e t w o r k M a n a g e r . h t m l ] ( h t t p s : / / d e v e l o p e r . g n o m e . o r g / N e t w o r k M a n a g e r / s t a b l e / N e t w o r k M a n a g e r . h t m l )
a n d c h o o s e t h e t y p e d e p e n d i n g o n t h e o u t p u t f o l d e r .
Y o u s h o u l d t h e n f i l t e r t h e e v e n t t y p e ( e . g . , " u p " / " d o w n " ) f r o m w i t h i n y o u r s c r i p t .
'' ;
} ;
} ;
} ;
} ) ;
}
) ;
default = [ ] ;
example = literalExpression ''
[ {
@@ -358,87 +395,69 @@ in
'' ;
} ;
fccUnlockScripts = mkOption {
type = types . listOf ( types . submodule {
options = {
id = mkOption {
type = types . str ;
description = " v i d : p i d o f e i t h e r t h e P C I o r U S B v e n d o r a n d p r o d u c t I D " ;
} ;
path = mkOption {
type = types . path ;
description = " P a t h t o t h e u n l o c k s c r i p t " ;
} ;
} ;
} ) ;
default = [ ] ;
example = literalExpression '' [ { i d = " 0 3 f 0 : 4 e 1 d " ; p a t h = " ''$ { p k g s . m o d e m m a n a g e r } / s h a r e / M o d e m M a n a g e r / f c c - u n l o c k . a v a i l a b l e . d / 0 3 f 0 : 4 e 1 d " ; } ] '' ;
description = ''
L i s t o f F C C u n l o c k s c r i p t s t o e n a b l e o n t h e s y s t e m , b e h a v i n g a s d e s c r i b e d i n
h t t p s : / / m o d e m m a n a g e r . o r g / d o c s / m o d e m m a n a g e r / f c c - u n l o c k / # i n t e g r a t i o n - w i t h - t h i r d - p a r t y - f c c - u n l o c k - t o o l s .
'' ;
} ;
ensureProfiles = {
profiles = with lib . types ; mkOption {
type = attrsOf ( submodule {
freeformType = ini . type ;
profiles =
with lib . types ;
mkOption {
type = attrsOf ( submodule {
freeformType = ini . type ;
options = {
connection = {
id = lib . mkOption {
type = str ;
description = " T h i s i s t h e n a m e t h a t w i l l b e d i s p l a y e d b y N e t w o r k M a n a g e r a n d G U I s . " ;
options = {
connection = {
id = lib . mkOption {
type = str ;
description = " T h i s i s t h e n a m e t h a t w i l l b e d i s p l a y e d b y N e t w o r k M a n a g e r a n d G U I s . " ;
} ;
type = lib . mkOption {
type = str ;
description = " T h e c o n n e c t i o n t y p e d e f i n e s t h e c o n n e c t i o n k i n d , l i k e v p n , w i r e g u a r d , g s m , w i f i a n d m o r e . " ;
example = " v p n " ;
} ;
} ;
type = lib . mkOption {
type = str ;
description = " T h e c o n n e c t i o n t y p e d e f i n e s t h e c o n n e c t i o n k i n d , l i k e v p n , w i r e g u a r d , g s m , w i f i a n d m o r e . " ;
example = " v p n " ;
} ;
} ) ;
apply = ( lib . filterAttrsRecursive ( n : v : v ! = { } ) ) ;
default = { } ;
example = {
home-wifi = {
connection = {
id = " h o m e - w i f i " ;
type = " w i f i " ;
permissions = " " ;
} ;
wifi = {
mac-address-blacklist = " " ;
mode = " i n f r a s t r u c t u r e " ;
ssid = " H o m e W i - F i " ;
} ;
wifi-security = {
auth-alg = " o p e n " ;
key-mgmt = " w p a - p s k " ;
psk = " $ H O M E _ W I F I _ P A S S W O R D " ;
} ;
ipv4 = {
dns-search = " " ;
method = " a u t o " ;
} ;
ipv6 = {
addr-gen-mode = " s t a b l e - p r i v a c y " ;
dns-search = " " ;
method = " a u t o " ;
} ;
} ;
} ;
} ) ;
apply = ( lib . filterAttrsRecursive ( n : v : v != { } ) ) ;
default = { } ;
example = {
home-wifi = {
connection = {
id = " h o m e - w i f i " ;
type = " w i f i " ;
permissions = " " ;
} ;
wifi = {
mac-address-blacklist = " " ;
mode = " i n f r a s t r u c t u r e " ;
ssid = " H o m e W i - F i " ;
} ;
wifi-security = {
auth-alg = " o p e n " ;
key-mgmt = " w p a - p s k " ;
psk = " $ H O M E _ W I F I _ P A S S W O R D " ;
} ;
ipv4 = {
dns-search = " " ;
method = " a u t o " ;
} ;
ipv6 = {
addr-gen-mode = " s t a b l e - p r i v a c y " ;
dns-search = " " ;
method = " a u t o " ;
} ;
} ;
description = ''
D e c l a r a t i v e l y d e f i n e N e t w o r k M a n a g e r p r o f i l e s . Y o u c a n f i n d i n f o r m a t i o n a b o u t t h e g e n e r a t e d f i l e f o r m a t [ h e r e ] ( h t t p s : / / n e t w o r k m a n a g e r . d e v / d o c s / a p i / l a t e s t / n m - s e t t i n g s - k e y f i l e . h t m l ) a n d [ h e r e ] ( h t t p s : / / a c c e s s . r e d h a t . c o m / d o c u m e n t a t i o n / e n - u s / r e d _ h a t _ e n t e r p r i s e _ l i n u x / 8 / h t m l / c o n f i g u r i n g _ a n d _ m a n a g i n g _ n e t w o r k i n g / a s s e m b l y _ n e t w o r k m a n a g e r - c o n n e c t i o n - p r o f i l e s - i n - k e y f i l e - f o r m a t _ c o n f i g u r i n g - a n d - m a n a g i n g - n e t w o r k i n g ) .
Y o u c u r r e n t p r o f i l e s w h i c h a r e m o s t l i k e l y s t o r e d i n ` / e t c / N e t w o r k M a n a g e r / s y s t e m - c o n n e c t i o n s ` a n d t h e r e i s [ a t o o l ] ( h t t p s : / / g i t h u b . c o m / j a n i k - h a a g / n m 2 n i x ) t o c o n v e r t t h e m t o t h e n e e d e d n i x c o d e .
I f y o u a d d a n e w a d - h o c c o n n e c t i o n v i a a G U I o r n m t u i o r a n y t h i n g s i m i l a r i t s h o u l d j u s t w o r k t o g e t h e r w i t h t h e d e c l a r a t i v e o n e s .
A n d i f y o u e d i t a d e c l a r a t i v e p r o f i l e N e t w o r k M a n a g e r w i l l m o v e i t t o t h e p e r s i s t e n t s t o r a g e a n d t r e a t i t l i k e a a d - h o c o n e ,
b u t t h e r e w i l l b e t w o p r o f i l e s a s s o o n a s t h e s y s t e m d u n i t f r o m t h i s o p t i o n r u n s a g a i n w h i c h c a n b e c o n f u s i n g s i n c e N e t w o r k M a n a g e r t o o l s w i l l s t a r t d i s p l a y i n g t w o p r o f i l e s w i t h t h e s a m e n a m e a n d p r o b a b l y a b i t d i f f e r e n t s e t t i n g s d e p e n d i n g o n w h a t y o u e d i t e d .
A p r o f i l e w o n ' t b e d e l e t e d e v e n i f i t ' s r e m o v e d f r o m t h e c o n f i g u n t i l t h e s y s t e m r e b o o t s b e c a u s e t h a t ' s w h e n N e t w o r k M a n a g e r c l e a r s i t ' s t e m p d i r e c t o r y .
I f ` n e t w o r k i n g . r e s o l v c o n f . e n a b l e ` i s t r u e , a t t r i b u t e s a f f e c t i n g t h e n a m e r e s o l u t i o n ( s u c h a s ` i g n o r e - a u t o - d n s ` ) m a y n o t e n d u p c h a n g i n g ` / e t c / r e s o l v . c o n f ` a s e x p e c t e d w h e n o t h e r n a m e s e r v i c e s ( f o r e x a m p l e ` n e t w o r k i n g . d h c p c d ` ) a r e e n a b l e d . R u n ` r e s o l v c o n f - l ` i n t h e t e r m i n a l t o s e e w h a t e a c h s e r v i c e p r o d u c e s .
'' ;
} ;
description = ''
D e c l a r a t i v e l y d e f i n e N e t w o r k M a n a g e r p r o f i l e s . Y o u c a n f i n d i n f o r m a t i o n a b o u t t h e g e n e r a t e d f i l e f o r m a t [ h e r e ] ( h t t p s : / / n e t w o r k m a n a g e r . d e v / d o c s / a p i / l a t e s t / n m - s e t t i n g s - k e y f i l e . h t m l ) a n d [ h e r e ] ( h t t p s : / / a c c e s s . r e d h a t . c o m / d o c u m e n t a t i o n / e n - u s / r e d _ h a t _ e n t e r p r i s e _ l i n u x / 8 / h t m l / c o n f i g u r i n g _ a n d _ m a n a g i n g _ n e t w o r k i n g / a s s e m b l y _ n e t w o r k m a n a g e r - c o n n e c t i o n - p r o f i l e s - i n - k e y f i l e - f o r m a t _ c o n f i g u r i n g - a n d - m a n a g i n g - n e t w o r k i n g ) .
Y o u c u r r e n t p r o f i l e s w h i c h a r e m o s t l i k e l y s t o r e d i n ` / e t c / N e t w o r k M a n a g e r / s y s t e m - c o n n e c t i o n s ` a n d t h e r e i s [ a t o o l ] ( h t t p s : / / g i t h u b . c o m / j a n i k - h a a g / n m 2 n i x ) t o c o n v e r t t h e m t o t h e n e e d e d n i x c o d e .
I f y o u a d d a n e w a d - h o c c o n n e c t i o n v i a a G U I o r n m t u i o r a n y t h i n g s i m i l a r i t s h o u l d j u s t w o r k t o g e t h e r w i t h t h e d e c l a r a t i v e o n e s .
A n d i f y o u e d i t a d e c l a r a t i v e p r o f i l e N e t w o r k M a n a g e r w i l l m o v e i t t o t h e p e r s i s t e n t s t o r a g e a n d t r e a t i t l i k e a a d - h o c o n e ,
b u t t h e r e w i l l b e t w o p r o f i l e s a s s o o n a s t h e s y s t e m d u n i t f r o m t h i s o p t i o n r u n s a g a i n w h i c h c a n b e c o n f u s i n g s i n c e N e t w o r k M a n a g e r t o o l s w i l l s t a r t d i s p l a y i n g t w o p r o f i l e s w i t h t h e s a m e n a m e a n d p r o b a b l y a b i t d i f f e r e n t s e t t i n g s d e p e n d i n g o n w h a t y o u e d i t e d .
A p r o f i l e w o n ' t b e d e l e t e d e v e n i f i t ' s r e m o v e d f r o m t h e c o n f i g u n t i l t h e s y s t e m r e b o o t s b e c a u s e t h a t ' s w h e n N e t w o r k M a n a g e r c l e a r s i t ' s t e m p d i r e c t o r y .
I f ` n e t w o r k i n g . r e s o l v c o n f . e n a b l e ` i s t r u e , a t t r i b u t e s a f f e c t i n g t h e n a m e r e s o l u t i o n ( s u c h a s ` i g n o r e - a u t o - d n s ` ) m a y n o t e n d u p c h a n g i n g ` / e t c / r e s o l v . c o n f ` a s e x p e c t e d w h e n o t h e r n a m e s e r v i c e s ( f o r e x a m p l e ` n e t w o r k i n g . d h c p c d ` ) a r e e n a b l e d . R u n ` r e s o l v c o n f - l ` i n t h e t e r m i n a l t o s e e w h a t e a c h s e r v i c e p r o d u c e s .
'' ;
} ;
environmentFiles = mkOption {
default = [ ] ;
default = [ ] ;
type = types . listOf types . path ;
example = [ " / r u n / s e c r e t s / n e t w o r k - m a n a g e r . e n v " ] ;
description = ''
@@ -473,14 +492,13 @@ in
+ s e t t i n g s . m a i n . n o - a u t o - d e f a u l t = " * " ;
} ;
` ` `
''
)
'' )
( mkRemovedOptionModule [ " n e t w o r k i n g " " n e t w o r k m a n a g e r " " e n a b l e F c c U n l o c k " ] ''
T h i s o p t i o n w a s r e m o v e d , b e c a u s e u s i n g b u n d l e d F C C u n l o c k s c r i p t s i s r i s k y ,
m i g h t c o n f l i c t w i t h v e n d o r - p r o v i d e d u n l o c k s c r i p t s , a n d s h o u l d
b e a c o n s c i o u s d e c i s i o n o n a p e r - d e v i c e b a s i s .
I n s t e a d i t ' s r e c o m m e n d e d t o u s e t h e
` n e t w o r k i n g . n e t w o r k m a n a g e r . f c c U n l o c k S c r i p t s ` o p t i o n .
` n e t w o r k i n g . m o d e m m a n a g e r . f c c U n l o c k S c r i p t s ` o p t i o n .
'' )
( mkRemovedOptionModule [ " n e t w o r k i n g " " n e t w o r k m a n a g e r " " d y n a m i c H o s t s " ] ''
T h i s o p t i o n w a s r e m o v e d b e c a u s e a l l o w i n g ( m u l t i p l e ) r e g u l a r u s e r s t o
@@ -493,9 +511,12 @@ in
( mkRemovedOptionModule [ " n e t w o r k i n g " " n e t w o r k m a n a g e r " " f i r e w a l l B a c k e n d " ] ''
T h i s o p t i o n w a s r e m o v e d a s N i x O S i s n o w u s i n g i p t a b l e s - n f t a b l e s - c o m p a t e v e n w h e n u s i n g i p t a b l e s , t h e r e f o r e N e t w o r k m a n a g e r n o w u s e s t h e n f t a b l e s b a c k e n d u n c o n d i t i o n a l l y .
'' )
( mkRenamedOptionModule
[ " n e t w o r k i n g " " n e t w o r k m a n a g e r " " f c c U n l o c k S c r i p t s " ]
[ " n e t w o r k i n g " " m o d e m m a n a g e r " " f c c U n l o c k S c r i p t s " ]
)
] ;
###### implementation
config = mkIf cfg . enable {
@@ -512,36 +533,38 @@ in
hardware . wirelessRegulatoryDatabase = true ;
environment . etc = {
" N e t w o r k M a n a g e r / N e t w o r k M a n a g e r . c o n f " . source = configFile ;
# The networkmanager-l2tp plugin expects /etc/ipsec.secrets to include /etc/ipsec.d/ipsec.nm-l2tp.secrets;
# see https://github.com/NixOS/nixpkgs/issues/64965
" i p s e c . s e c r e t s " . text = ''
i n c l u d e i p s e c . d / i p s e c . n m - l 2 t p . s e c r e t s
'' ;
}
// builtins . listToAttrs ( map
( pkg : nameValuePair " N e t w o r k M a n a g e r / ${ pkg . networkManagerPlugin } " {
source = " ${ pkg } / l i b / N e t w o r k M a n a g e r / ${ pkg . networkManagerPlugin } " ;
} )
cfg . plugins )
// builtins . listToAttrs ( map
( e : nameValuePair " M o d e m M a n a g e r / f c c - u n l o c k . d / ${ e . id } " {
source = e . path ;
} )
cfg . fccUnlockScripts )
// optionalAttrs ( cfg . appendNameservers != [ ] || cfg . insertNameservers != [ ] )
environment . etc =
{
" N e t w o r k M a n a g e r / N e t w o r k M a n a g e r . c o n f " . source = configFile ;
# The networkmanager-l2tp plugin expects /etc/ipsec.secrets to include /etc/ipsec.d/ipsec.nm-l2tp.secrets;
# see https://github.com/NixOS/nixpkgs/issues/64965
" i p s e c . s e c r e t s " . text = ''
i n c l u d e i p s e c . d / i p s e c . n m - l 2 t p . s e c r e t s
'' ;
}
// builtins . listToAttrs (
map (
pkg :
nameValuePair " N e t w o r k M a n a g e r / ${ pkg . networkManagerPlugin } " {
source = " ${ pkg } / l i b / N e t w o r k M a n a g e r / ${ pkg . networkManagerPlugin } " ;
}
) cfg . plugins
)
// optionalAttrs ( cfg . appendNameservers != [ ] || cfg . insertNameservers != [ ] ) {
" N e t w o r k M a n a g e r / d i s p a t c h e r . d / 0 2 o v e r r i d e d n s " . source = overrideNameserversScript ;
}
// listToAttrs ( lib . imap1
( i : s :
{
name = " N e t w o r k M a n a g e r / d i s p a t c h e r . d / ${ dispatcherTypesSubdirMap . ${ s . type } } 0 3 u s e r s c r i p t ${ lib . fixedWidthNumber 4 i } " ;
value = { mode = " 0 5 4 4 " ; inherit ( s ) source ; } ;
} )
cfg . dispatcherScripts ) ;
// listToAttrs (
lib . imap1 ( i : s : {
name = " N e t w o r k M a n a g e r / d i s p a t c h e r . d / ${
dispatcherTypesSubdirMap . ${ s . type }
} 0 3 u s e r s c r i p t ${ lib . fixedWidthNumber 4 i } " ;
value = {
mode = " 0 5 4 4 " ;
inherit ( s ) source ;
} ;
} ) cfg . dispatcherScripts
) ;
environment . systemPackages = packages ;
@@ -590,17 +613,19 @@ in
wantedBy = [ " n e t w o r k - o n l i n e . t a r g e t " ] ;
} ;
systemd . services . ModemManager = {
aliases = [ " d b u s - o r g . f r e e d e s k t o p . M o d e m M a n a g e r 1 . s e r v i c e " ] ;
path = lib . optionals ( cfg . fccUnlockScripts != [ ] ) [ pkgs . libqmi pkgs . libmbim ] ;
} ;
systemd . services . NetworkManager-dispatcher = {
wantedBy = [ " n e t w o r k . t a r g e t " ] ;
restartTriggers = [ configFile overrideNameserversScript ] ;
restartTriggers = [
configFile
overrideNameserversScript
] ;
# useful binaries for user-specified hooks
path = [ pkgs . iproute2 pkgs . util-linux pkgs . coreutils ] ;
path = [
pkgs . iproute2
pkgs . util-linux
pkgs . coreutils
] ;
aliases = [ " d b u s - o r g . f r e e d e s k t o p . n m - d i s p a t c h e r . s e r v i c e " ] ;
} ;
@@ -609,17 +634,19 @@ in
wantedBy = [ " m u l t i - u s e r . t a r g e t " ] ;
before = [ " n e t w o r k - o n l i n e . t a r g e t " ] ;
after = [ " N e t w o r k M a n a g e r . s e r v i c e " ] ;
script = let
path = id : " / r u n / N e t w o r k M a n a g e r / s y s t e m - c o n n e c t i o n s / ${ id } . n m c o n n e c t i o n " ;
in ''
m k d i r - p / r u n / N e t w o r k M a n a g e r / s y s t e m - c o n n e c t i o n s
'' + lib . concatMapStringsSep " \n "
( profile : ''
script =
let
path = id : " / r u n / N e t w o r k M a n a g e r / s y s t e m - c o n n e c t i o n s / ${ id } . n m c o n n e c t i o n " ;
in
''
m k d i r - p / r u n / N e t w o r k M a n a g e r / s y s t e m - c o n n e c t i o n s
''
+ lib . concatMapStringsSep " \n " ( profile : ''
${ pkgs . envsubst } / b i n / e n v s u b s t - i ${ ini . generate ( lib . escapeShellArg profile . n ) profile . v } > ${ path ( lib . escapeShellArg profile . n ) }
'' ) ( lib . mapAttrsToList ( n : v : { inherit n v ; } ) cfg . ensureProfiles . profiles )
+ ''
${ pkgs . networkmanager } / b i n / n m c l i c o n n e c t i o n r e l o a d
'' ;
+ ''
${ cfg . package } / b i n / n m c l i c o n n e c t i o n r e l o a d
'' ;
serviceConfig = {
EnvironmentFile = cfg . ensureProfiles . environmentFiles ;
UMask = " 0 1 7 7 " ;
@@ -654,13 +681,18 @@ in
} )
{
modemmanager . enable = lib . mkDefault true ;
networkmanager . connectionConfig = {
" e t h e r n e t . c l o n e d - m a c - a d d r e s s " = cfg . ethernet . macAddress ;
" w i f i . c l o n e d - m a c - a d d r e s s " = cfg . wifi . macAddress ;
" w i f i . p o w e r s a v e " =
if cfg . wifi . powersave = = null then null
else if cfg . wifi . powersave then 3
else 2 ;
if cfg . wifi . powersave = = null then
null
else if cfg . wifi . powersave then
3
else
2 ;
} ;
}
] ;
@@ -670,7 +702,8 @@ in
security . polkit . enable = true ;
security . polkit . extraConfig = polkitConf ;
services . dbus . packages = packages
services . dbus . packages =
packages
++ optional cfg . enableStrongSwan pkgs . strongswanNM
++ optional ( cfg . dns = = " d n s m a s q " ) pkgs . dnsmasq ;