Unverified Commit 11cd4052 authored by Silvan Mosberger's avatar Silvan Mosberger Committed by GitHub
Browse files

Merge pull request #280322 from h7x4/add-hocon-format-generator

pkgs.formats: Add HOCON format generator
parents 12d7391d 7065951e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@
/pkgs/pkgs-lib                                   @infinisil
## Format generators/serializers
/pkgs/pkgs-lib/formats/libconfig                 @ckiee @h7x4
/pkgs/pkgs-lib/formats/hocon                     @h7x4

# pkgs/by-name
/pkgs/test/nixpkgs-check-by-name @infinisil
+5 −10
Original line number Diff line number Diff line
@@ -5,12 +5,7 @@ with lib;
let
  cfg = config.services.jibri;

  # Copied from the jitsi-videobridge.nix file.
  toHOCON = x:
    if isAttrs x && x ? __hocon_envvar then ("\${" + x.__hocon_envvar + "}")
    else if isAttrs x then "{${ concatStringsSep "," (mapAttrsToList (k: v: ''"${k}":${toHOCON v}'') x) }}"
    else if isList x then "[${ concatMapStringsSep "," toHOCON x }]"
    else builtins.toJSON x;
  format = pkgs.formats.hocon { };

  # We're passing passwords in environment variables that have names generated
  # from an attribute name, which may not be a valid bash identifier.
@@ -38,13 +33,13 @@ let
        control-login = {
          domain = env.control.login.domain;
          username = env.control.login.username;
          password.__hocon_envvar = toVarName "${name}_control";
          password = format.lib.mkSubstitution (toVarName "${name}_control");
        };

        call-login = {
          domain = env.call.login.domain;
          username = env.call.login.username;
          password.__hocon_envvar = toVarName "${name}_call";
          password = format.lib.mkSubstitution (toVarName "${name}_call");
        };

        strip-from-room-domain = env.stripFromRoomDomain;
@@ -85,13 +80,13 @@ let
  };
  # Allow overriding leaves of the default config despite types.attrs not doing any merging.
  jibriConfig = recursiveUpdate defaultJibriConfig cfg.config;
  configFile = pkgs.writeText "jibri.conf" (toHOCON { jibri = jibriConfig; });
  configFile = format.generate "jibri.conf" { jibri = jibriConfig; };
in
{
  options.services.jibri = with types; {
    enable = mkEnableOption (lib.mdDoc "Jitsi BRoadcasting Infrastructure. Currently Jibri must be run on a host that is also running {option}`services.jitsi-meet.enable`, so for most use cases it will be simpler to run {option}`services.jitsi-meet.jibri.enable`");
    config = mkOption {
      type = attrs;
      type = format.type;
      default = { };
      description = lib.mdDoc ''
        Jibri configuration.
+5 −10
Original line number Diff line number Diff line
@@ -5,14 +5,9 @@ with lib;
let
  cfg = config.services.jicofo;

  # HOCON is a JSON superset that some jitsi-meet components use for configuration
  toHOCON = x: if isAttrs x && x ? __hocon_envvar then ("\${" + x.__hocon_envvar + "}")
    else if isAttrs x && x ? __hocon_unquoted_string then x.__hocon_unquoted_string
    else if isAttrs x then "{${ concatStringsSep "," (mapAttrsToList (k: v: ''"${k}":${toHOCON v}'') x) }}"
    else if isList x then "[${ concatMapStringsSep "," toHOCON x }]"
    else builtins.toJSON x;

  configFile = pkgs.writeText "jicofo.conf" (toHOCON cfg.config);
  format = pkgs.formats.hocon { };

  configFile = format.generate "jicofo.conf" cfg.config;
in
{
  options.services.jicofo = with types; {
@@ -77,7 +72,7 @@ in
    };

    config = mkOption {
      type = (pkgs.formats.json {}).type;
      type = format.type;
      default = { };
      example = literalExpression ''
        {
@@ -99,7 +94,7 @@ in
            hostname = cfg.xmppHost;
            username = cfg.userName;
            domain = cfg.userDomain;
            password = { __hocon_envvar = "JICOFO_AUTH_PASS"; };
            password = format.lib.mkSubstitution "JICOFO_AUTH_PASS";
            xmpp-domain = if cfg.xmppDomain == null then cfg.xmppHost else cfg.xmppDomain;
          };
          service = client;
+3 −12
Original line number Diff line number Diff line
@@ -6,16 +6,7 @@ let
  cfg = config.services.jitsi-videobridge;
  attrsToArgs = a: concatStringsSep " " (mapAttrsToList (k: v: "${k}=${toString v}") a);

  # HOCON is a JSON superset that videobridge2 uses for configuration.
  # It can substitute environment variables which we use for passwords here.
  # https://github.com/lightbend/config/blob/master/README.md
  #
  # Substitution for environment variable FOO is represented as attribute set
  # { __hocon_envvar = "FOO"; }
  toHOCON = x: if isAttrs x && x ? __hocon_envvar then ("\${" + x.__hocon_envvar + "}")
    else if isAttrs x then "{${ concatStringsSep "," (mapAttrsToList (k: v: ''"${k}":${toHOCON v}'') x) }}"
    else if isList x then "[${ concatMapStringsSep "," toHOCON x }]"
    else builtins.toJSON x;
  format = pkgs.formats.hocon { };

  # We're passing passwords in environment variables that have names generated
  # from an attribute name, which may not be a valid bash identifier.
@@ -38,7 +29,7 @@ let
        hostname = xmppConfig.hostName;
        domain = xmppConfig.domain;
        username = xmppConfig.userName;
        password = { __hocon_envvar = toVarName name; };
        password = format.lib.mkSubstitution (toVarName name);
        muc_jids = xmppConfig.mucJids;
        muc_nickname = xmppConfig.mucNickname;
        disable_certificate_verification = xmppConfig.disableCertificateVerification;
@@ -221,7 +212,7 @@ in
        "-Dnet.java.sip.communicator.SC_HOME_DIR_LOCATION" = "/etc/jitsi";
        "-Dnet.java.sip.communicator.SC_HOME_DIR_NAME" = "videobridge";
        "-Djava.util.logging.config.file" = "/etc/jitsi/videobridge/logging.properties";
        "-Dconfig.file" = pkgs.writeText "jvb.conf" (toHOCON jvbConfig);
        "-Dconfig.file" = format.generate "jvb.conf" jvbConfig;
        # Mitigate CVE-2021-44228
        "-Dlog4j2.formatMsgNoLookups" = true;
      } // (mapAttrs' (k: v: nameValuePair "-D${k}" v) cfg.extraProperties);
+5 −50
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@
let
  cfg = config.services.suwayomi-server;
  inherit (lib) mkOption mdDoc mkEnableOption mkIf types;

  format = pkgs.formats.hocon { };
in
{
  options = {
@@ -48,19 +50,7 @@ in

      settings = mkOption {
        type = types.submodule {
          freeformType =
            let
              recursiveAttrsType = with types; attrsOf (nullOr (oneOf [
                str
                path
                int
                float
                bool
                (listOf str)
                (recursiveAttrsType // { description = "instances of this type recursively"; })
              ]));
            in
            recursiveAttrsType;
          freeformType = format.type;
          options = {
            server = {
              ip = mkOption {
@@ -180,38 +170,7 @@ in

    systemd.services.suwayomi-server =
      let
        flattenConfig = prefix: config:
          lib.foldl'
            lib.mergeAttrs
            { }
            (lib.attrValues
              (lib.mapAttrs
                (k: v:
                  if !(lib.isAttrs v)
                  then { "${prefix}${k}" = v; }
                  else flattenConfig "${prefix}${k}." v
                )
                config
              )
            );

        #  HOCON is a JSON superset that suwayomi-server use for configuration
        toHOCON = attr:
          let
            attrType = builtins.typeOf attr;
          in
          if builtins.elem attrType [ "string" "path" "int" "float" ]
          then ''"${toString attr}"''
          else if attrType == "bool"
          then lib.boolToString attr
          else if attrType == "list"
          then "[\n${lib.concatMapStringsSep ",\n" toHOCON attr}\n]"
          else # attrs, lambda, null
            throw ''
              [suwayomi-server]: invalid config value type '${attrType}'.
            '';

        configFile = pkgs.writeText "server.conf" (lib.pipe cfg.settings [
        configFile = format.generate "server.conf" (lib.pipe cfg.settings [
          (settings: lib.recursiveUpdate settings {
            server.basicAuthPasswordFile = null;
            server.basicAuthPassword =
@@ -219,12 +178,8 @@ in
              then "$TACHIDESK_SERVER_BASIC_AUTH_PASSWORD"
              else null;
          })
          (flattenConfig "")
          (lib.filterAttrs (_: x: x != null))
          (lib.mapAttrsToList (name: value: ''${name} = ${toHOCON value}''))
          lib.concatLines
          (lib.filterAttrsRecursive (_: x: x != null))
        ]);

      in
      {
        description = "A free and open source manga reader server that runs extensions built for Tachiyomi.";
Loading