mirror of
				https://github.com/Stunkymonkey/nixos.git
				synced 2025-11-04 03:26:57 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			150 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, lib, ... }:
 | 
						|
 | 
						|
{
 | 
						|
  options.webapps = {
 | 
						|
    dashboardCategories = lib.mkOption {
 | 
						|
      type = lib.types.listOf (
 | 
						|
        lib.types.submodule {
 | 
						|
          options = {
 | 
						|
            name = lib.mkOption {
 | 
						|
              type = lib.types.str;
 | 
						|
              description = ''
 | 
						|
                Category name.
 | 
						|
              '';
 | 
						|
              example = "Applications";
 | 
						|
            };
 | 
						|
            tag = lib.mkOption {
 | 
						|
              type = lib.types.str;
 | 
						|
              description = ''
 | 
						|
                Category tag.
 | 
						|
              '';
 | 
						|
              example = "app";
 | 
						|
            };
 | 
						|
          };
 | 
						|
        }
 | 
						|
      );
 | 
						|
      description = ''
 | 
						|
        App categories to display on the dashboard.
 | 
						|
      '';
 | 
						|
      example = [
 | 
						|
        {
 | 
						|
          name = "Application";
 | 
						|
          tag = "app";
 | 
						|
        }
 | 
						|
      ];
 | 
						|
      default = [ ];
 | 
						|
    };
 | 
						|
 | 
						|
    apps = lib.mkOption {
 | 
						|
      type = lib.types.attrsOf (
 | 
						|
        lib.types.submodule {
 | 
						|
          options = {
 | 
						|
            dashboard = {
 | 
						|
              url = lib.mkOption {
 | 
						|
                type = lib.types.nullOr lib.types.str;
 | 
						|
                description = ''
 | 
						|
                  Url to webapp
 | 
						|
                '';
 | 
						|
                example = "http://192.168.1.10:1234";
 | 
						|
                default = null;
 | 
						|
              };
 | 
						|
              name = lib.mkOption {
 | 
						|
                type = lib.types.nullOr lib.types.str;
 | 
						|
                description = ''
 | 
						|
                  Application name.
 | 
						|
                '';
 | 
						|
                example = "App";
 | 
						|
                default = null;
 | 
						|
              };
 | 
						|
              category = lib.mkOption {
 | 
						|
                type = lib.types.nullOr lib.types.str;
 | 
						|
                description = ''
 | 
						|
                  App category tag.
 | 
						|
                '';
 | 
						|
                example = "app";
 | 
						|
                default = null;
 | 
						|
              };
 | 
						|
              icon = lib.mkOption {
 | 
						|
                type = lib.types.nullOr lib.types.str;
 | 
						|
                description = ''
 | 
						|
                  Font Awesome application icon.
 | 
						|
                '';
 | 
						|
                example = "rss";
 | 
						|
                default = null;
 | 
						|
              };
 | 
						|
              type = lib.mkOption {
 | 
						|
                type = lib.types.nullOr lib.types.str;
 | 
						|
                description = ''
 | 
						|
                  application type.
 | 
						|
                '';
 | 
						|
                example = "Ping";
 | 
						|
                default = "Ping";
 | 
						|
              };
 | 
						|
              method = lib.mkOption {
 | 
						|
                type = lib.types.enum [
 | 
						|
                  "get"
 | 
						|
                  "head"
 | 
						|
                ];
 | 
						|
                description = ''
 | 
						|
                  method of request used
 | 
						|
                '';
 | 
						|
                example = "get";
 | 
						|
                default = "head";
 | 
						|
              };
 | 
						|
            };
 | 
						|
          };
 | 
						|
        }
 | 
						|
      );
 | 
						|
      description = ''
 | 
						|
        Defines a web application.
 | 
						|
      '';
 | 
						|
      default = { };
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  config =
 | 
						|
    let
 | 
						|
      cfg = config.webapps;
 | 
						|
      appsWithName = builtins.filter (app: app.dashboard.name != null) (lib.attrValues cfg.apps);
 | 
						|
    in
 | 
						|
    {
 | 
						|
      lib.webapps.homerServices = lib.forEach cfg.dashboardCategories (
 | 
						|
        category:
 | 
						|
        let
 | 
						|
          catTag = category.tag;
 | 
						|
          catApps = lib.sort (a: b: a.dashboard.name < b.dashboard.name) (
 | 
						|
            builtins.filter (
 | 
						|
              app:
 | 
						|
              let
 | 
						|
                cat = app.dashboard.category;
 | 
						|
              in
 | 
						|
              (cat != null && cat == catTag) || (cat == null && catTag == "misc")
 | 
						|
            ) appsWithName
 | 
						|
          );
 | 
						|
        in
 | 
						|
        {
 | 
						|
          inherit (category) name;
 | 
						|
          items = lib.forEach catApps (
 | 
						|
            app:
 | 
						|
            let
 | 
						|
              dash = app.dashboard;
 | 
						|
            in
 | 
						|
            {
 | 
						|
              inherit (dash)
 | 
						|
                method
 | 
						|
                name
 | 
						|
                type
 | 
						|
                url
 | 
						|
                ;
 | 
						|
              icon = lib.optionalString (dash.icon != null) "fas fa-${dash.icon}";
 | 
						|
              target = "_blank";
 | 
						|
            }
 | 
						|
          );
 | 
						|
        }
 | 
						|
      );
 | 
						|
 | 
						|
      my.services.blackbox.http_endpoints = lib.mapAttrsToList (_: app: app.dashboard.url) cfg.apps ++ [
 | 
						|
        "https://${config.networking.domain}/"
 | 
						|
      ];
 | 
						|
    };
 | 
						|
}
 |