diff options
| author | Daiderd Jordan <daiderd@gmail.com> | 2016-11-30 23:12:06 +0100 |
|---|---|---|
| committer | Daiderd Jordan <daiderd@gmail.com> | 2016-11-30 23:12:06 +0100 |
| commit | 7ac68a8629db70770f0c1086bb656c62725d05d8 (patch) | |
| tree | 580922f5140accf9dda5eec40712401dbef86781 /modules | |
| parent | 4322078270dc54cfda8287a41ac9d6ee38ddb667 (diff) | |
launchd: properly generate plist files
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/launchd/default.nix | 51 | ||||
| -rw-r--r-- | modules/launchd/lib.nix | 69 |
2 files changed, 50 insertions, 70 deletions
diff --git a/modules/launchd/default.nix b/modules/launchd/default.nix index dccddd0..8ff6933 100644 --- a/modules/launchd/default.nix +++ b/modules/launchd/default.nix @@ -35,56 +35,7 @@ let config = { serviceConfig.Label = mkDefault "org.nixos.${name}"; - plist = pkgs.writeText "${config.serviceConfig.Label}.plist" ('' - <?xml version="1.0" encoding="UTF-8"?> - <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> - <plist version="1.0"> - <dict> - '' + xmlMapAttr xmlString "Label" config.serviceConfig.Label - + xmlMapAttr xmlBool "Disabled" config.serviceConfig.Disabled - + xmlMapAttr xmlString "UserName" config.serviceConfig.UserName - + xmlMapAttr xmlString "GroupName" config.serviceConfig.GroupName - + xmlMapAttr (xmlMapAttrs xmlBool) "inetdCompatibility" config.serviceConfig.inetdCompatibility - + xmlMapAttr (xmlMap xmlString) "LimitLoadToHosts" config.serviceConfig.LimitLoadToHosts - + xmlMapAttr (xmlMap xmlString) "LimitLoadFromHosts" config.serviceConfig.LimitLoadFromHosts - + xmlMapAttr xmlString "LimitLoadToSessionType" config.serviceConfig.LimitLoadToSessionType - + xmlMapAttr xmlString "Program" config.serviceConfig.Program - + xmlMapAttr (xmlMap xmlString) "ProgramArguments" config.serviceConfig.ProgramArguments - + xmlMapAttr xmlBool "EnableGlobbing" config.serviceConfig.EnableGlobbing - + xmlMapAttr xmlBool "EnableTransactions" config.serviceConfig.EnableTransactions - + xmlMapAttr xmlBool "OnDemand" config.serviceConfig.OnDemand - + xmlMapAttr xmlBool "KeepAlive" config.serviceConfig.KeepAlive - + xmlMapAttr xmlBool "RunAtLoad" config.serviceConfig.RunAtLoad - + xmlMapAttr xmlString "RootDirectory" config.serviceConfig.RootDirectory - + xmlMapAttr xmlString "WorkingDirectory" config.serviceConfig.WorkingDirectory - + xmlMapAttr (xmlMapAttrs xmlString) "EnvironmentVariables" config.serviceConfig.EnvironmentVariables - + xmlMapAttr xmlInt "Umask" config.serviceConfig.Umask - + xmlMapAttr xmlInt "TimeOut" config.serviceConfig.TimeOut - + xmlMapAttr xmlInt "ExitTimeOut" config.serviceConfig.ExitTimeOut - + xmlMapAttr xmlInt "ThrottleInterval" config.serviceConfig.ThrottleInterval - + xmlMapAttr xmlBool "InitGroups" config.serviceConfig.InitGroups - + xmlMapAttr (xmlMap xmlString) "WatchPaths" config.serviceConfig.WatchPaths - + xmlMapAttr (xmlMap xmlString) "QueueDirectories" config.serviceConfig.QueueDirectories - + xmlMapAttr xmlBool "StartOnMount" config.serviceConfig.StartOnMount - + xmlMapAttr xmlInt "StartInterval" config.serviceConfig.StartInterval - + xmlMapAttr (xmlMapAttrs xmlInt) "StartCalendarInterval" config.serviceConfig.StartCalendarInterval - + xmlMapAttr xmlString "StandardInPath" config.serviceConfig.StandardInPath - + xmlMapAttr xmlString "StandardOutPath" config.serviceConfig.StandardOutPath - + xmlMapAttr xmlString "StandardErrorPath" config.serviceConfig.StandardErrorPath - + xmlMapAttr xmlBool "Debug" config.serviceConfig.Debug - + xmlMapAttr xmlBool "WaitForDebugger" config.serviceConfig.WaitForDebugger - + xmlMapAttr (xmlMapAttrs xmlInt) "SoftResourceLimits" config.serviceConfig.SoftResourceLimits - + xmlMapAttr (xmlMapAttrs xmlInt) "HardResourceLimits" config.serviceConfig.HardResourceLimits - + xmlMapAttr xmlInt "Nice" config.serviceConfig.Nice - + xmlMapAttr xmlString "ProcessType" config.serviceConfig.ProcessType - + xmlMapAttr xmlBool "AbandonProcessGroup" config.serviceConfig.AbandonProcessGroup - + xmlMapAttr xmlBool "LowPriorityIO" config.serviceConfig.LowPriorityIO - + xmlMapAttr xmlBool "LaunchOnlyOnce" config.serviceConfig.LaunchOnlyOnce - + xmlMapAttr (xmlMapAttrs xmlBool) "MachServices" config.serviceConfig.MachServices - + '' - </dict> - </plist> - ''); + plist = pkgs.writeText "${config.serviceConfig.Label}.plist" (toPLIST config.serviceConfig); }; }; diff --git a/modules/launchd/lib.nix b/modules/launchd/lib.nix index 483a0d1..65fc036 100644 --- a/modules/launchd/lib.nix +++ b/modules/launchd/lib.nix @@ -2,27 +2,56 @@ with lib; +let + + attrFilter = name: value: name != "_module" && value != null; + +in + rec { - xmlMap = f: xs: '' - <array> - ${concatMapStringsSep "\n" f xs} - </array> - ''; - - xmlMapAttrs = f: attr: '' - <dict> - ${concatStringsSep "\n" (mapAttrsFlatten (xmlMapAttr f) attr)} - </dict> - ''; - - xmlMapAttr = f: n: v: optionalString (v != null) '' - <key>${n}</key> - ${f v} - ''; - - xmlBool = x: if x then "<true/>" else "<false/>"; - xmlInt = x: "<integer>${toString x}</integer>"; - xmlString = x: "<string>${x}</string>"; + toPLIST = x: '' + <?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> + <plist version="1.0"> + '' + pprExpr "" x + + "\n</plist>"; + + pprExpr = ind: x: + if isNull x then "" else + if isBool x then pprBool ind x else + if isInt x then pprInt ind x else + if isString x then pprStr ind x else + if isList x then pprList ind x else + if isAttrs x then pprAttrs ind x else + throw "invalid plist type"; + + pprLiteral = ind: x: ind + x; + + pprBool = ind: x: pprLiteral ind (if x then "<true/>" else "<false/>"); + pprInt = ind: x: pprLiteral ind "<integer>${toString x}</integer>"; + pprStr = ind: x: pprLiteral ind "<string>${x}</string>"; + pprKey = ind: x: pprLiteral ind "<key>${x}</key>"; + + pprIndent = ind: (pprExpr "\t${ind}"); + + pprItem = ind: concatMapStringsSep "\n" (pprIndent ind); + + pprList = ind: x: concatStringsSep "\n" [ + (pprLiteral ind "<array>") + (pprItem ind x) + (pprLiteral ind "</array>") + ]; + + pprAttrs = ind: x: concatStringsSep "\n" [ + (pprLiteral ind "<dict>") + (pprAttr ind x) + (pprLiteral ind "</dict>") + ]; + + pprAttr = ind: x: concatStringsSep "\n" (flatten (mapAttrsToList (name: value: optional (attrFilter name value) [ + (pprKey "\t${ind}" name) + (pprExpr "\t${ind}" value) + ]) x)); } |
