| 
									
										
										
										
											2023-11-07 22:00:00 +01:00
										 |  |  | { config, lib, ... }: | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   options.webapps = { | 
					
						
							|  |  |  |     dashboardCategories = lib.mkOption { | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |       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"; | 
					
						
							|  |  |  |             }; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |           }; | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         App categories to display on the dashboard. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |       example = [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           name = "Application"; | 
					
						
							|  |  |  |           tag = "app"; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       ]; | 
					
						
							|  |  |  |       default = [ ]; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     apps = lib.mkOption { | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |       type = lib.types.attrsOf ( | 
					
						
							|  |  |  |         lib.types.submodule { | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |           options = { | 
					
						
							| 
									
										
										
										
											2023-11-12 23:36:30 +01:00
										 |  |  |             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 { | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |                 type = lib.types.enum [ | 
					
						
							|  |  |  |                   "get" | 
					
						
							|  |  |  |                   "head" | 
					
						
							|  |  |  |                 ]; | 
					
						
							| 
									
										
										
										
											2023-11-12 23:36:30 +01:00
										 |  |  |                 description = ''
 | 
					
						
							|  |  |  |                   method of request used | 
					
						
							|  |  |  |                 '';
 | 
					
						
							|  |  |  |                 example = "get"; | 
					
						
							|  |  |  |                 default = "head"; | 
					
						
							|  |  |  |               }; | 
					
						
							| 
									
										
										
										
											2022-12-25 12:26:00 +01:00
										 |  |  |             }; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |           }; | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         Defines a web application. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |       default = { }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = | 
					
						
							|  |  |  |     let | 
					
						
							|  |  |  |       cfg = config.webapps; | 
					
						
							|  |  |  |     in | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       lib.webapps.homerServices = | 
					
						
							|  |  |  |         let | 
					
						
							|  |  |  |           apps = builtins.filter (a: a.dashboard.name != null) (lib.attrValues cfg.apps); | 
					
						
							|  |  |  |         in | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |         lib.forEach cfg.dashboardCategories ( | 
					
						
							|  |  |  |           cat: | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |           let | 
					
						
							|  |  |  |             catApps = lib.sort (a: b: a.dashboard.name < b.dashboard.name) ( | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |               builtins.filter ( | 
					
						
							|  |  |  |                 a: | 
					
						
							|  |  |  |                 a.dashboard.category != null && a.dashboard.category == cat.tag | 
					
						
							|  |  |  |                 || a.dashboard.category == null && cat.tag == "misc" | 
					
						
							|  |  |  |               ) apps | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |           in | 
					
						
							|  |  |  |           { | 
					
						
							| 
									
										
										
										
											2023-11-07 23:13:51 +01:00
										 |  |  |             inherit (cat) name; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |             items = lib.forEach catApps (a: { | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |               inherit (a.dashboard) | 
					
						
							|  |  |  |                 method | 
					
						
							|  |  |  |                 name | 
					
						
							|  |  |  |                 type | 
					
						
							|  |  |  |                 url | 
					
						
							|  |  |  |                 ; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |               icon = lib.optionalString (a.dashboard.icon != null) "fas fa-${a.dashboard.icon}"; | 
					
						
							|  |  |  |               target = "_blank"; | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2024-07-28 21:08:02 +02:00
										 |  |  |       my.services.blackbox.http_endpoints = | 
					
						
							|  |  |  |         lib.mapAttrsToList (_key: value: value.dashboard.url) config.webapps.apps | 
					
						
							|  |  |  |         ++ [ "https://${config.networking.domain}/" ]; | 
					
						
							| 
									
										
										
										
											2022-11-09 22:15:47 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | } |