Merge remote-tracking branch 'origin/master' into staging-next
This commit is contained in:
		
						commit
						77e81dbfc2
					
				| @ -385,7 +385,6 @@ in | ||||
|         recurseIntoAttrs | ||||
|         removeSuffix | ||||
|         ; | ||||
|       inherit (lib.path) append; | ||||
| 
 | ||||
|       # Generate an attrset corresponding to a given directory. | ||||
|       # This function is outside `packagesFromDirectoryRecursive`'s lambda expression, | ||||
| @ -396,7 +395,7 @@ in | ||||
|           name: type: | ||||
|           # for each directory entry | ||||
|           let | ||||
|             path = append directory name; | ||||
|             path = directory + "/${name}"; | ||||
|           in | ||||
|           if type == "directory" then | ||||
|             { | ||||
| @ -429,7 +428,7 @@ in | ||||
|       directory, | ||||
|     }@args: | ||||
|     let | ||||
|       defaultPath = append directory "package.nix"; | ||||
|       defaultPath = directory + "/package.nix"; | ||||
|     in | ||||
|     if pathExists defaultPath then | ||||
|       # if `${directory}/package.nix` exists, call it directly | ||||
|  | ||||
| @ -4158,6 +4158,34 @@ runTests { | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   # Make sure that passing a string for the `directory` works. | ||||
|   # | ||||
|   # See: https://github.com/NixOS/nixpkgs/pull/361424#discussion_r1934813568 | ||||
|   # See: https://github.com/NixOS/nix/issues/9428 | ||||
|   testPackagesFromDirectoryRecursiveStringDirectory = { | ||||
|     expr = packagesFromDirectoryRecursive { | ||||
|       callPackage = path: overrides: import path overrides; | ||||
|       # Do NOT remove the `builtins.toString` call here!!! | ||||
|       directory = builtins.toString ./packages-from-directory/plain; | ||||
|     }; | ||||
|     expected = { | ||||
|       a = "a"; | ||||
|       b = "b"; | ||||
|       # Note: Other files/directories in `./test-data/c/` are ignored and can be | ||||
|       # used by `package.nix`. | ||||
|       c = "c"; | ||||
|       my-namespace = { | ||||
|         d = "d"; | ||||
|         e = "e"; | ||||
|         f = "f"; | ||||
|         my-sub-namespace = { | ||||
|           g = "g"; | ||||
|           h = "h"; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   # Check that `packagesFromDirectoryRecursive` can process a directory with a | ||||
|   # top-level `package.nix` file into a single package. | ||||
|   testPackagesFromDirectoryRecursiveTopLevelPackageNix = { | ||||
|  | ||||
| @ -222,6 +222,8 @@ Alongside many enhancements to NixOS modules and general system improvements, th | ||||
| 
 | ||||
| - [Limine](https://github.com/limine-bootloader/limine) a modern, advanced, portable, multiprotocol bootloader and boot manager. Available as [boot.loader.limine](#opt-boot.loader.limine.enable). | ||||
| 
 | ||||
| - [tee-supplicant](https://github.com/OP-TEE/optee_client), a userspace supplicant for OP-TEE OS. Available as [services.tee-supplicant](#opt-services.tee-supplicant.enable). | ||||
| 
 | ||||
| - [Orthanc](https://orthanc.uclouvain.be/) a lightweight, RESTful DICOM server for healthcare and medical research. Available as [services.orthanc](#opt-services.orthanc.enable). | ||||
| 
 | ||||
| - [Docling Serve](https://github.com/docling-project/docling-serve) running [Docling](https://github.com/docling-project/docling) as an API service. Available as [services.docling-serve](#opt-services.docling-serve.enable). | ||||
|  | ||||
| @ -930,6 +930,7 @@ | ||||
|   ./services/misc/taskchampion-sync-server.nix | ||||
|   ./services/misc/taskserver | ||||
|   ./services/misc/tautulli.nix | ||||
|   ./services/misc/tee-supplicant | ||||
|   ./services/misc/tiddlywiki.nix | ||||
|   ./services/misc/tp-auto-kbbl.nix | ||||
|   ./services/misc/transfer-sh.nix | ||||
| @ -1413,6 +1414,7 @@ | ||||
|   ./services/search/hound.nix | ||||
|   ./services/search/manticore.nix | ||||
|   ./services/search/meilisearch.nix | ||||
|   ./services/search/nominatim.nix | ||||
|   ./services/search/opensearch.nix | ||||
|   ./services/search/qdrant.nix | ||||
|   ./services/search/quickwit.nix | ||||
|  | ||||
| @ -10,18 +10,9 @@ | ||||
|   nvidia-driver, | ||||
|   runtimeShell, | ||||
|   writeScriptBin, | ||||
|   extraArgs, | ||||
| }: | ||||
| let | ||||
|   mkMount = | ||||
|     { | ||||
|       hostPath, | ||||
|       containerPath, | ||||
|       mountOptions, | ||||
|     }: | ||||
|     { | ||||
|       inherit hostPath containerPath; | ||||
|       options = mountOptions; | ||||
|     }; | ||||
|   mountToCommand = | ||||
|     mount: | ||||
|     "additionalMount \"${mount.hostPath}\" \"${mount.containerPath}\" '${builtins.toJSON mount.mountOptions}'"; | ||||
| @ -48,7 +39,8 @@ writeScriptBin "nvidia-cdi-generator" '' | ||||
|       --device-name-strategy ${device-name-strategy} \ | ||||
|       --ldconfig-path ${lib.getExe' glibc "ldconfig"} \ | ||||
|       --library-search-path ${lib.getLib nvidia-driver}/lib \ | ||||
|       --nvidia-cdi-hook-path ${lib.getExe' nvidia-container-toolkit.tools "nvidia-cdi-hook"} | ||||
|       --nvidia-cdi-hook-path ${lib.getExe' nvidia-container-toolkit.tools "nvidia-cdi-hook"} \ | ||||
|       ${lib.escapeShellArgs extraArgs} | ||||
|   } | ||||
| 
 | ||||
|   function additionalMount { | ||||
|  | ||||
| @ -120,6 +120,14 @@ | ||||
|         }; | ||||
| 
 | ||||
|         package = lib.mkPackageOption pkgs "nvidia-container-toolkit" { }; | ||||
| 
 | ||||
|         extraArgs = lib.mkOption { | ||||
|           type = lib.types.listOf lib.types.str; | ||||
|           default = [ ]; | ||||
|           description = '' | ||||
|             Extra arguments to be passed to nvidia-ctk. | ||||
|           ''; | ||||
|         }; | ||||
|       }; | ||||
| 
 | ||||
|     }; | ||||
| @ -241,6 +249,7 @@ | ||||
|                 device-name-strategy | ||||
|                 discovery-mode | ||||
|                 mounts | ||||
|                 extraArgs | ||||
|                 ; | ||||
|               nvidia-container-toolkit = config.hardware.nvidia-container-toolkit.package; | ||||
|               nvidia-driver = config.hardware.nvidia.package; | ||||
|  | ||||
							
								
								
									
										95
									
								
								nixos/modules/services/misc/tee-supplicant/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								nixos/modules/services/misc/tee-supplicant/default.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | ||||
| { | ||||
|   config, | ||||
|   pkgs, | ||||
|   lib, | ||||
|   ... | ||||
| }: | ||||
| let | ||||
|   inherit (lib) | ||||
|     getExe' | ||||
|     mkEnableOption | ||||
|     mkIf | ||||
|     mkOption | ||||
|     mkPackageOption | ||||
|     types | ||||
|     ; | ||||
| 
 | ||||
|   cfg = config.services.tee-supplicant; | ||||
| 
 | ||||
|   taDir = "optee_armtz"; | ||||
| 
 | ||||
|   trustedApplications = pkgs.linkFarm "runtime-trusted-applications" ( | ||||
|     map ( | ||||
|       ta: | ||||
|       let | ||||
|         # This is safe since we are using it as the path value, so the context | ||||
|         # will still ensure that this nix store path exists on the running | ||||
|         # system. | ||||
|         taFile = builtins.baseNameOf (builtins.unsafeDiscardStringContext ta); | ||||
|       in | ||||
|       { | ||||
|         name = "lib/${taDir}/${taFile}"; | ||||
|         path = ta; | ||||
|       } | ||||
|     ) cfg.trustedApplications | ||||
|   ); | ||||
| in | ||||
| { | ||||
|   options.services.tee-supplicant = { | ||||
|     enable = mkEnableOption "OP-TEE userspace supplicant"; | ||||
| 
 | ||||
|     package = mkPackageOption pkgs "optee-client" { }; | ||||
| 
 | ||||
|     trustedApplications = mkOption { | ||||
|       type = types.listOf types.path; | ||||
|       default = [ ]; | ||||
|       description = '' | ||||
|         A list of full paths to trusted applications that will be loaded at | ||||
|         runtime by tee-supplicant. | ||||
|       ''; | ||||
|     }; | ||||
| 
 | ||||
|     pluginPath = mkOption { | ||||
|       type = types.path; | ||||
|       default = "/run/current-system/sw/lib/tee-supplicant/plugins"; | ||||
|       description = '' | ||||
|         The directory where plugins will be loaded from on startup. | ||||
|       ''; | ||||
|     }; | ||||
| 
 | ||||
|     reeFsParentPath = mkOption { | ||||
|       type = types.path; | ||||
|       default = "/var/lib/tee"; | ||||
|       description = '' | ||||
|         The directory where the secure filesystem will be stored in the rich | ||||
|         execution environment (REE FS). | ||||
|       ''; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   config = mkIf cfg.enable { | ||||
|     environment = mkIf (cfg.trustedApplications != [ ]) { | ||||
|       systemPackages = [ trustedApplications ]; | ||||
|       pathsToLink = [ "/lib/${taDir}" ]; | ||||
|     }; | ||||
| 
 | ||||
|     systemd.services.tee-supplicant = { | ||||
|       description = "Userspace supplicant for OPTEE-OS"; | ||||
| 
 | ||||
|       serviceConfig = { | ||||
|         ExecStart = toString [ | ||||
|           (getExe' cfg.package "tee-supplicant") | ||||
|           "--ta-dir ${taDir}" | ||||
|           "--fs-parent-path ${cfg.reeFsParentPath}" | ||||
|           "--plugin-path ${cfg.pluginPath}" | ||||
|         ]; | ||||
|         Restart = "always"; | ||||
|       }; | ||||
| 
 | ||||
|       after = [ "modprobe@optee.service" ]; | ||||
|       wants = [ "modprobe@optee.service" ]; | ||||
| 
 | ||||
|       wantedBy = [ "multi-user.target" ]; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
| @ -847,7 +847,8 @@ in | ||||
|       ]; | ||||
|     }; | ||||
| 
 | ||||
|     systemd.packages = [ pkgs.syncthing ]; | ||||
|     environment.systemPackages = [ cfg.package ]; | ||||
|     systemd.packages = [ cfg.package ]; | ||||
| 
 | ||||
|     users.users = mkIf (cfg.systemService && cfg.user == defaultUser) { | ||||
|       ${defaultUser} = { | ||||
|  | ||||
							
								
								
									
										324
									
								
								nixos/modules/services/search/nominatim.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										324
									
								
								nixos/modules/services/search/nominatim.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,324 @@ | ||||
| { | ||||
|   lib, | ||||
|   config, | ||||
|   pkgs, | ||||
|   ... | ||||
| }: | ||||
| 
 | ||||
| let | ||||
|   cfg = config.services.nominatim; | ||||
| 
 | ||||
|   localDb = cfg.database.host == "localhost"; | ||||
|   uiPackage = cfg.ui.package.override { customConfig = cfg.ui.config; }; | ||||
| in | ||||
| { | ||||
|   options.services.nominatim = { | ||||
|     enable = lib.mkOption { | ||||
|       type = lib.types.bool; | ||||
|       default = false; | ||||
|       description = '' | ||||
|         Whether to enable nominatim. | ||||
| 
 | ||||
|         Also enables nginx virtual host management. Further nginx configuration | ||||
|         can be done by adapting `services.nginx.virtualHosts.<name>`. | ||||
|         See [](#opt-services.nginx.virtualHosts). | ||||
|       ''; | ||||
|     }; | ||||
| 
 | ||||
|     package = lib.mkPackageOption pkgs.python3Packages "nominatim-api" { }; | ||||
| 
 | ||||
|     hostName = lib.mkOption { | ||||
|       type = lib.types.str; | ||||
|       description = "Hostname to use for the nginx vhost."; | ||||
|       example = "nominatim.example.com"; | ||||
|     }; | ||||
| 
 | ||||
|     settings = lib.mkOption { | ||||
|       default = { }; | ||||
|       type = lib.types.attrsOf lib.types.str; | ||||
|       example = lib.literalExpression '' | ||||
|         { | ||||
|           NOMINATIM_REPLICATION_URL = "https://planet.openstreetmap.org/replication/minute"; | ||||
|           NOMINATIM_REPLICATION_MAX_DIFF = "100"; | ||||
|         } | ||||
|       ''; | ||||
|       description = '' | ||||
|         Nominatim configuration settings. | ||||
|         For the list of available configuration options see | ||||
|         <https://nominatim.org/release-docs/latest/customize/Settings>. | ||||
|       ''; | ||||
|     }; | ||||
| 
 | ||||
|     ui = { | ||||
|       package = lib.mkPackageOption pkgs "nominatim-ui" { }; | ||||
| 
 | ||||
|       config = lib.mkOption { | ||||
|         type = lib.types.nullOr lib.types.str; | ||||
|         default = null; | ||||
|         description = '' | ||||
|           Nominatim UI configuration placed to theme/config.theme.js file. | ||||
| 
 | ||||
|           For the list of available configuration options see | ||||
|           <https://github.com/osm-search/nominatim-ui/blob/master/dist/config.defaults.js>. | ||||
|         ''; | ||||
|         example = '' | ||||
|           Nominatim_Config.Page_Title='My Nominatim instance'; | ||||
|           Nominatim_Config.Nominatim_API_Endpoint='https://localhost/'; | ||||
|         ''; | ||||
|       }; | ||||
|     }; | ||||
| 
 | ||||
|     database = { | ||||
|       host = lib.mkOption { | ||||
|         type = lib.types.str; | ||||
|         default = "localhost"; | ||||
|         description = '' | ||||
|           Host of the postgresql server. If not set to `localhost`, Nominatim | ||||
|           database and postgresql superuser with appropriate permissions must | ||||
|           exist on target host. | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       port = lib.mkOption { | ||||
|         type = lib.types.port; | ||||
|         default = 5432; | ||||
|         description = "Port of the postgresql database."; | ||||
|       }; | ||||
| 
 | ||||
|       dbname = lib.mkOption { | ||||
|         type = lib.types.str; | ||||
|         default = "nominatim"; | ||||
|         description = "Name of the postgresql database."; | ||||
|       }; | ||||
| 
 | ||||
|       superUser = lib.mkOption { | ||||
|         type = lib.types.str; | ||||
|         default = "nominatim"; | ||||
|         description = '' | ||||
|           Postgresql database superuser used to create Nominatim database and | ||||
|           import data. If `database.host` is set to `localhost`, a unix user and | ||||
|           group of the same name will be automatically created. | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       apiUser = lib.mkOption { | ||||
|         type = lib.types.str; | ||||
|         default = "nominatim-api"; | ||||
|         description = '' | ||||
|           Postgresql database user with read-only permissions used for Nominatim | ||||
|           web API service. | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       passwordFile = lib.mkOption { | ||||
|         type = lib.types.nullOr lib.types.path; | ||||
|         default = null; | ||||
|         description = '' | ||||
|           Password file used for Nominatim database connection. | ||||
|           Must be readable only for the Nominatim web API user. | ||||
| 
 | ||||
|           The file must be a valid `.pgpass` file as described in: | ||||
|           <https://www.postgresql.org/docs/current/libpq-pgpass.html> | ||||
| 
 | ||||
|           In most cases, the following will be enough: | ||||
|           ``` | ||||
|           *:*:*:*:<password> | ||||
|           ``` | ||||
|         ''; | ||||
|       }; | ||||
| 
 | ||||
|       extraConnectionParams = lib.mkOption { | ||||
|         type = lib.types.nullOr lib.types.str; | ||||
|         default = null; | ||||
|         description = '' | ||||
|           Extra Nominatim database connection parameters. | ||||
| 
 | ||||
|           Format: | ||||
|           <param1>=<value1>;<param2>=<value2> | ||||
| 
 | ||||
|           See <https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS>. | ||||
|         ''; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   config = | ||||
|     let | ||||
|       nominatimSuperUserDsn = | ||||
|         "pgsql:dbname=${cfg.database.dbname};" | ||||
|         + "user=${cfg.database.superUser}" | ||||
|         + lib.optionalString (cfg.database.extraConnectionParams != null) ( | ||||
|           ";" + cfg.database.extraConnectionParams | ||||
|         ); | ||||
| 
 | ||||
|       nominatimApiDsn = | ||||
|         "pgsql:dbname=${cfg.database.dbname}" | ||||
|         + lib.optionalString (!localDb) ( | ||||
|           ";host=${cfg.database.host};" | ||||
|           + "port=${toString cfg.database.port};" | ||||
|           + "user=${cfg.database.apiUser}" | ||||
|         ) | ||||
|         + lib.optionalString (cfg.database.extraConnectionParams != null) ( | ||||
|           ";" + cfg.database.extraConnectionParams | ||||
|         ); | ||||
|     in | ||||
|     lib.mkIf cfg.enable { | ||||
|       # CLI package | ||||
|       environment.systemPackages = [ pkgs.nominatim ]; | ||||
| 
 | ||||
|       # Database | ||||
|       users.users.${cfg.database.superUser} = lib.mkIf localDb { | ||||
|         group = cfg.database.superUser; | ||||
|         isSystemUser = true; | ||||
|         createHome = false; | ||||
|       }; | ||||
|       users.groups.${cfg.database.superUser} = lib.mkIf localDb { }; | ||||
| 
 | ||||
|       services.postgresql = lib.mkIf localDb { | ||||
|         enable = true; | ||||
|         extensions = ps: with ps; [ postgis ]; | ||||
|         ensureUsers = [ | ||||
|           { | ||||
|             name = cfg.database.superUser; | ||||
|             ensureClauses.superuser = true; | ||||
|           } | ||||
|           { | ||||
|             name = cfg.database.apiUser; | ||||
|           } | ||||
|         ]; | ||||
|       }; | ||||
| 
 | ||||
|       # TODO: add nominatim-update service | ||||
| 
 | ||||
|       systemd.services.nominatim-init = lib.mkIf localDb { | ||||
|         after = [ "postgresql-setup.service" ]; | ||||
|         requires = [ "postgresql-setup.service" ]; | ||||
|         wantedBy = [ "multi-user.target" ]; | ||||
|         serviceConfig = { | ||||
|           Type = "oneshot"; | ||||
|           User = cfg.database.superUser; | ||||
|           RemainAfterExit = true; | ||||
|           PrivateTmp = true; | ||||
|         }; | ||||
|         script = '' | ||||
|           sql="SELECT COUNT(*) FROM pg_database WHERE datname='${cfg.database.dbname}'" | ||||
|           db_exists=$(${pkgs.postgresql}/bin/psql --dbname postgres -tAc "$sql") | ||||
| 
 | ||||
|           if [ "$db_exists" == "0" ]; then | ||||
|             ${lib.getExe pkgs.nominatim} import --prepare-database | ||||
|           else | ||||
|             echo "Database ${cfg.database.dbname} already exists. Skipping ..." | ||||
|           fi | ||||
|         ''; | ||||
|         path = [ | ||||
|           pkgs.postgresql | ||||
|         ]; | ||||
|         environment = { | ||||
|           NOMINATIM_DATABASE_DSN = nominatimSuperUserDsn; | ||||
|           NOMINATIM_DATABASE_WEBUSER = cfg.database.apiUser; | ||||
|         } // cfg.settings; | ||||
|       }; | ||||
| 
 | ||||
|       # Web API service | ||||
|       users.users.${cfg.database.apiUser} = { | ||||
|         group = cfg.database.apiUser; | ||||
|         isSystemUser = true; | ||||
|         createHome = false; | ||||
|       }; | ||||
|       users.groups.${cfg.database.apiUser} = { }; | ||||
| 
 | ||||
|       systemd.services.nominatim = { | ||||
|         after = [ "network.target" ] ++ lib.optionals localDb [ "nominatim-init.service" ]; | ||||
|         requires = lib.optionals localDb [ "nominatim-init.service" ]; | ||||
|         bindsTo = lib.optionals localDb [ "postgresql.service" ]; | ||||
|         wantedBy = [ "multi-user.target" ]; | ||||
|         wants = [ "network.target" ]; | ||||
|         serviceConfig = { | ||||
|           Type = "simple"; | ||||
|           User = cfg.database.apiUser; | ||||
|           ExecStart = '' | ||||
|             ${pkgs.python3Packages.gunicorn}/bin/gunicorn \ | ||||
|               --bind unix:/run/nominatim.sock \ | ||||
|               --workers 4 \ | ||||
|               --worker-class uvicorn.workers.UvicornWorker "nominatim_api.server.falcon.server:run_wsgi()" | ||||
|           ''; | ||||
|           Environment = lib.optional ( | ||||
|             cfg.database.passwordFile != null | ||||
|           ) "PGPASSFILE=${cfg.database.passwordFile}"; | ||||
|           ExecReload = "${pkgs.procps}/bin/kill -s HUP $MAINPID"; | ||||
|           KillMode = "mixed"; | ||||
|           TimeoutStopSec = 5; | ||||
|         }; | ||||
|         environment = { | ||||
|           PYTHONPATH = | ||||
|             with pkgs.python3Packages; | ||||
|             pkgs.python3Packages.makePythonPath [ | ||||
|               cfg.package | ||||
|               falcon | ||||
|               uvicorn | ||||
|             ]; | ||||
|           NOMINATIM_DATABASE_DSN = nominatimApiDsn; | ||||
|           NOMINATIM_DATABASE_WEBUSER = cfg.database.apiUser; | ||||
|         } // cfg.settings; | ||||
|       }; | ||||
| 
 | ||||
|       systemd.sockets.nominatim = { | ||||
|         before = [ "nominatim.service" ]; | ||||
|         wantedBy = [ "sockets.target" ]; | ||||
|         socketConfig = { | ||||
|           ListenStream = "/run/nominatim.sock"; | ||||
|           SocketUser = cfg.database.apiUser; | ||||
|           SocketGroup = config.services.nginx.group; | ||||
|         }; | ||||
|       }; | ||||
| 
 | ||||
|       services.nginx = { | ||||
|         enable = true; | ||||
|         appendHttpConfig = '' | ||||
|           map $args $format { | ||||
|               default                  default; | ||||
|               ~(^|&)format=html(&|$)   html; | ||||
|           } | ||||
| 
 | ||||
|           map $uri/$format $forward_to_ui { | ||||
|               default               0;   # No forwarding by default. | ||||
| 
 | ||||
|               # Redirect to HTML UI if explicitly requested. | ||||
|               ~/reverse.*/html      1; | ||||
|               ~/search.*/html       1; | ||||
|               ~/lookup.*/html       1; | ||||
|               ~/details.*/html      1; | ||||
|           } | ||||
|         ''; | ||||
|         upstreams.nominatim = { | ||||
|           servers = { | ||||
|             "unix:/run/nominatim.sock" = { }; | ||||
|           }; | ||||
|         }; | ||||
|         virtualHosts = { | ||||
|           ${cfg.hostName} = { | ||||
|             forceSSL = lib.mkDefault true; | ||||
|             enableACME = lib.mkDefault true; | ||||
|             locations = { | ||||
|               "= /" = { | ||||
|                 extraConfig = '' | ||||
|                   return 301 $scheme://$http_host/ui/search.html; | ||||
|                 ''; | ||||
|               }; | ||||
|               "/" = { | ||||
|                 proxyPass = "http://nominatim"; | ||||
|                 extraConfig = '' | ||||
|                   if ($forward_to_ui) { | ||||
|                       rewrite ^(/[^/.]*) /ui$1.html redirect; | ||||
|                   } | ||||
|                 ''; | ||||
|               }; | ||||
|               "/ui/" = { | ||||
|                 alias = "${uiPackage}/"; | ||||
|               }; | ||||
|             }; | ||||
|           }; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
| } | ||||
| @ -605,7 +605,7 @@ in | ||||
|   gns3-server = runTest ./gns3-server.nix; | ||||
|   gnupg = runTest ./gnupg.nix; | ||||
|   goatcounter = runTest ./goatcounter.nix; | ||||
|   go-camo = handleTest ./go-camo.nix { }; | ||||
|   go-camo = runTest ./go-camo.nix; | ||||
|   go-neb = runTest ./go-neb.nix; | ||||
|   gobgpd = runTest ./gobgpd.nix; | ||||
|   gocd-agent = runTest ./gocd-agent.nix; | ||||
| @ -649,10 +649,22 @@ in | ||||
|   harmonia = runTest ./harmonia.nix; | ||||
|   headscale = runTest ./headscale.nix; | ||||
|   healthchecks = runTest ./web-apps/healthchecks.nix; | ||||
|   hbase2 = handleTest ./hbase.nix { package = pkgs.hbase2; }; | ||||
|   hbase_2_5 = handleTest ./hbase.nix { package = pkgs.hbase_2_5; }; | ||||
|   hbase_2_4 = handleTest ./hbase.nix { package = pkgs.hbase_2_4; }; | ||||
|   hbase3 = handleTest ./hbase.nix { package = pkgs.hbase3; }; | ||||
|   hbase2 = runTest { | ||||
|     imports = [ ./hbase.nix ]; | ||||
|     _module.args.getPackage = pkgs: pkgs.hbase2; | ||||
|   }; | ||||
|   hbase_2_5 = runTest { | ||||
|     imports = [ ./hbase.nix ]; | ||||
|     _module.args.getPackage = pkgs: pkgs.hbase_2_5; | ||||
|   }; | ||||
|   hbase_2_4 = runTest { | ||||
|     imports = [ ./hbase.nix ]; | ||||
|     _module.args.getPackage = pkgs: pkgs.hbase_2_4; | ||||
|   }; | ||||
|   hbase3 = runTest { | ||||
|     imports = [ ./hbase.nix ]; | ||||
|     _module.args.getPackage = pkgs: pkgs.hbase3; | ||||
|   }; | ||||
|   hedgedoc = runTest ./hedgedoc.nix; | ||||
|   herbstluftwm = runTest ./herbstluftwm.nix; | ||||
|   homebox = runTest ./homebox.nix; | ||||
| @ -1014,6 +1026,7 @@ in | ||||
|   nixseparatedebuginfod = runTest ./nixseparatedebuginfod.nix; | ||||
|   node-red = runTest ./node-red.nix; | ||||
|   nomad = runTest ./nomad.nix; | ||||
|   nominatim = runTest ./nominatim.nix; | ||||
|   non-default-filesystems = handleTest ./non-default-filesystems.nix { }; | ||||
|   non-switchable-system = runTest ./non-switchable-system.nix; | ||||
|   noto-fonts = runTest ./noto-fonts.nix; | ||||
| @ -1067,6 +1080,7 @@ in | ||||
|   openvscode-server = runTest ./openvscode-server.nix; | ||||
|   open-webui = runTest ./open-webui.nix; | ||||
|   openvswitch = runTest ./openvswitch.nix; | ||||
|   optee = handleTestOn [ "aarch64-linux" ] ./optee.nix { }; | ||||
|   orangefs = runTest ./orangefs.nix; | ||||
|   os-prober = handleTestOn [ "x86_64-linux" ] ./os-prober.nix { }; | ||||
|   osquery = handleTestOn [ "x86_64-linux" ] ./osquery.nix { }; | ||||
| @ -1319,7 +1333,7 @@ in | ||||
|   stratis = handleTest ./stratis { }; | ||||
|   strongswan-swanctl = runTest ./strongswan-swanctl.nix; | ||||
|   stub-ld = handleTestOn [ "x86_64-linux" "aarch64-linux" ] ./stub-ld.nix { }; | ||||
|   stunnel = handleTest ./stunnel.nix { }; | ||||
|   stunnel = import ./stunnel.nix { inherit runTest; }; | ||||
|   sudo = runTest ./sudo.nix; | ||||
|   sudo-rs = runTest ./sudo-rs.nix; | ||||
|   sunshine = runTest ./sunshine.nix; | ||||
| @ -1364,7 +1378,7 @@ in | ||||
|   systemd-initrd-luks-tpm2 = runTest ./systemd-initrd-luks-tpm2.nix; | ||||
|   systemd-initrd-luks-unl0kr = runTest ./systemd-initrd-luks-unl0kr.nix; | ||||
|   systemd-initrd-modprobe = runTest ./systemd-initrd-modprobe.nix; | ||||
|   systemd-initrd-networkd = handleTest ./systemd-initrd-networkd.nix { }; | ||||
|   systemd-initrd-networkd = import ./systemd-initrd-networkd.nix { inherit runTest; }; | ||||
|   systemd-initrd-networkd-ssh = runTest ./systemd-initrd-networkd-ssh.nix; | ||||
|   systemd-initrd-networkd-openvpn = handleTestOn [ | ||||
|     "x86_64-linux" | ||||
| @ -1386,9 +1400,7 @@ in | ||||
|   systemd-networkd = runTest ./systemd-networkd.nix; | ||||
|   systemd-networkd-bridge = runTest ./systemd-networkd-bridge.nix; | ||||
|   systemd-networkd-dhcpserver = runTest ./systemd-networkd-dhcpserver.nix; | ||||
|   systemd-networkd-dhcpserver-static-leases = | ||||
|     handleTest ./systemd-networkd-dhcpserver-static-leases.nix | ||||
|       { }; | ||||
|   systemd-networkd-dhcpserver-static-leases = runTest ./systemd-networkd-dhcpserver-static-leases.nix; | ||||
|   systemd-networkd-ipv6-prefix-delegation = | ||||
|     handleTest ./systemd-networkd-ipv6-prefix-delegation.nix | ||||
|       { }; | ||||
| @ -1555,7 +1567,10 @@ in | ||||
|   xterm = runTest ./xterm.nix; | ||||
|   xxh = runTest ./xxh.nix; | ||||
|   yarr = runTest ./yarr.nix; | ||||
|   ydotool = handleTest ./ydotool.nix { }; | ||||
|   ydotool = import ./ydotool.nix { | ||||
|     inherit (pkgs) lib; | ||||
|     inherit runTest; | ||||
|   }; | ||||
|   yggdrasil = runTest ./yggdrasil.nix; | ||||
|   your_spotify = runTest ./your_spotify.nix; | ||||
|   zammad = runTest ./zammad.nix; | ||||
|  | ||||
| @ -1,36 +1,26 @@ | ||||
| { lib, ... }: | ||||
| let | ||||
|   key_val = "12345678"; | ||||
| in | ||||
| { | ||||
|   system ? builtins.currentSystem, | ||||
|   config ? { }, | ||||
|   pkgs ? import ../.. { inherit system config; }, | ||||
| }: | ||||
|   name = "go-camo-file-key"; | ||||
|   meta = { | ||||
|     maintainers = [ lib.maintainers.viraptor ]; | ||||
|   }; | ||||
| 
 | ||||
| with import ../lib/testing-python.nix { inherit system pkgs; }; | ||||
| 
 | ||||
| { | ||||
|   gocamo_file_key = | ||||
|     let | ||||
|       key_val = "12345678"; | ||||
|     in | ||||
|     makeTest { | ||||
|       name = "go-camo-file-key"; | ||||
|       meta = { | ||||
|         maintainers = [ pkgs.lib.maintainers.viraptor ]; | ||||
|   nodes.machine = | ||||
|     { pkgs, ... }: | ||||
|     { | ||||
|       services.go-camo = { | ||||
|         enable = true; | ||||
|         keyFile = pkgs.writeText "foo" key_val; | ||||
|       }; | ||||
| 
 | ||||
|       nodes.machine = | ||||
|         { config, pkgs, ... }: | ||||
|         { | ||||
|           services.go-camo = { | ||||
|             enable = true; | ||||
|             keyFile = pkgs.writeText "foo" key_val; | ||||
|           }; | ||||
|         }; | ||||
| 
 | ||||
|       # go-camo responds to http requests | ||||
|       testScript = '' | ||||
|         machine.wait_for_unit("go-camo.service") | ||||
|         machine.wait_for_open_port(8080) | ||||
|         machine.succeed("curl http://localhost:8080") | ||||
|       ''; | ||||
|     }; | ||||
| 
 | ||||
|   # go-camo responds to http requests | ||||
|   testScript = '' | ||||
|     machine.wait_for_unit("go-camo.service") | ||||
|     machine.wait_for_open_port(8080) | ||||
|     machine.succeed("curl http://localhost:8080") | ||||
|   ''; | ||||
| } | ||||
|  | ||||
| @ -1,39 +1,33 @@ | ||||
| import ./make-test-python.nix ( | ||||
|   { | ||||
|     pkgs, | ||||
|     lib, | ||||
|     package ? pkgs.hbase, | ||||
|     ... | ||||
|   }: | ||||
|   { | ||||
|     name = "hbase-standalone"; | ||||
| { getPackage, lib, ... }: | ||||
| { | ||||
|   name = "hbase-standalone"; | ||||
| 
 | ||||
|     meta = with lib.maintainers; { | ||||
|       maintainers = [ illustris ]; | ||||
|   meta = with lib.maintainers; { | ||||
|     maintainers = [ illustris ]; | ||||
|   }; | ||||
| 
 | ||||
|   nodes.hbase = | ||||
|     { pkgs, ... }: | ||||
|     let | ||||
|       package = getPackage pkgs; | ||||
|     in | ||||
|     { | ||||
|       services.hbase-standalone = { | ||||
|         enable = true; | ||||
|         inherit package; | ||||
|         # Needed for standalone mode in hbase 2+ | ||||
|         # This setting and standalone mode are not suitable for production | ||||
|         settings."hbase.unsafe.stream.capability.enforce" = "false"; | ||||
|       }; | ||||
|       environment.systemPackages = [ | ||||
|         package | ||||
|       ]; | ||||
|     }; | ||||
| 
 | ||||
|     nodes = { | ||||
|       hbase = | ||||
|         { pkgs, ... }: | ||||
|         { | ||||
|           services.hbase-standalone = { | ||||
|             enable = true; | ||||
|             inherit package; | ||||
|             # Needed for standalone mode in hbase 2+ | ||||
|             # This setting and standalone mode are not suitable for production | ||||
|             settings."hbase.unsafe.stream.capability.enforce" = "false"; | ||||
|           }; | ||||
|           environment.systemPackages = with pkgs; [ | ||||
|             package | ||||
|           ]; | ||||
|         }; | ||||
|     }; | ||||
| 
 | ||||
|     testScript = '' | ||||
|       start_all() | ||||
|       hbase.wait_for_unit("hbase.service") | ||||
|       hbase.wait_until_succeeds("echo \"create 't1','f1'\" | sudo -u hbase hbase shell -n") | ||||
|       assert "NAME => 'f1'" in hbase.succeed("echo \"describe 't1'\" | sudo -u hbase hbase shell -n") | ||||
|     ''; | ||||
|   } | ||||
| ) | ||||
|   testScript = '' | ||||
|     start_all() | ||||
|     hbase.wait_for_unit("hbase.service") | ||||
|     hbase.wait_until_succeeds("echo \"create 't1','f1'\" | sudo -u hbase hbase shell -n") | ||||
|     assert "NAME => 'f1'" in hbase.succeed("echo \"describe 't1'\" | sudo -u hbase hbase shell -n") | ||||
|   ''; | ||||
| } | ||||
|  | ||||
							
								
								
									
										187
									
								
								nixos/tests/nominatim.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								nixos/tests/nominatim.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,187 @@ | ||||
| { pkgs, lib, ... }: | ||||
| 
 | ||||
| let | ||||
|   # Andorra - the smallest dataset in Europe (3.1 MB) | ||||
|   osmData = pkgs.fetchurl { | ||||
|     url = "https://web.archive.org/web/20250430211212/https://download.geofabrik.de/europe/andorra-latest.osm.pbf"; | ||||
|     hash = "sha256-Ey+ipTOFUm80rxBteirPW5N4KxmUsg/pCE58E/2rcyE="; | ||||
|   }; | ||||
| in | ||||
| { | ||||
|   name = "nominatim"; | ||||
|   meta = { | ||||
|     maintainers = with lib.teams; [ | ||||
|       geospatial | ||||
|       ngi | ||||
|     ]; | ||||
|   }; | ||||
| 
 | ||||
|   nodes = { | ||||
|     # nominatim - self contained host | ||||
|     nominatim = | ||||
|       { config, pkgs, ... }: | ||||
|       { | ||||
|         # Nominatim | ||||
|         services.nominatim = { | ||||
|           enable = true; | ||||
|           hostName = "nominatim"; | ||||
|           settings = { | ||||
|             NOMINATIM_IMPORT_STYLE = "admin"; | ||||
|           }; | ||||
|           ui = { | ||||
|             config = '' | ||||
|               Nominatim_Config.Page_Title='Test Nominatim instance'; | ||||
|               Nominatim_Config.Nominatim_API_Endpoint='https://localhost/'; | ||||
|             ''; | ||||
|           }; | ||||
|         }; | ||||
| 
 | ||||
|         # Disable SSL | ||||
|         services.nginx.virtualHosts.nominatim = { | ||||
|           forceSSL = false; | ||||
|           enableACME = false; | ||||
|         }; | ||||
| 
 | ||||
|         # Database | ||||
|         services.postgresql = { | ||||
|           enableTCPIP = true; | ||||
|           authentication = lib.mkForce '' | ||||
|             local all all            trust | ||||
|             host  all all 0.0.0.0/0  md5 | ||||
|             host  all all ::0/0      md5 | ||||
|           ''; | ||||
|         }; | ||||
|         systemd.services.postgresql-setup.postStart = '' | ||||
|           psql --command "ALTER ROLE \"nominatim-api\" WITH PASSWORD 'password';" | ||||
|         ''; | ||||
|         networking.firewall.allowedTCPPorts = [ config.services.postgresql.settings.port ]; | ||||
|       }; | ||||
| 
 | ||||
|     # api - web API only | ||||
|     api = | ||||
|       { config, pkgs, ... }: | ||||
|       { | ||||
|         # Database password | ||||
|         system.activationScripts = { | ||||
|           passwordFile.text = with config.services.nominatim.database; '' | ||||
|             mkdir -p /run/secrets | ||||
|             echo "${host}:${toString port}:${dbname}:${apiUser}:password" \ | ||||
|               > /run/secrets/pgpass | ||||
|             chown nominatim-api:nominatim-api /run/secrets/pgpass | ||||
|             chmod 0600 /run/secrets/pgpass | ||||
|           ''; | ||||
|         }; | ||||
| 
 | ||||
|         # Nominatim | ||||
|         services.nominatim = { | ||||
|           enable = true; | ||||
|           hostName = "nominatim"; | ||||
|           settings = { | ||||
|             NOMINATIM_LOG_DB = "yes"; | ||||
|           }; | ||||
|           database = { | ||||
|             host = "nominatim"; | ||||
|             passwordFile = "/run/secrets/pgpass"; | ||||
|             extraConnectionParams = "application_name=nominatim;connect_timeout=2"; | ||||
|           }; | ||||
|         }; | ||||
| 
 | ||||
|         # Disable SSL | ||||
|         services.nginx.virtualHosts.nominatim = { | ||||
|           forceSSL = false; | ||||
|           enableACME = false; | ||||
|         }; | ||||
|       }; | ||||
|   }; | ||||
| 
 | ||||
|   testScript = '' | ||||
|     # Test nominatim host | ||||
|     nominatim.start() | ||||
|     nominatim.wait_for_unit("nominatim.service") | ||||
| 
 | ||||
|     # Import OSM data | ||||
|     nominatim.succeed(""" | ||||
|       cd /tmp | ||||
|       sudo -u nominatim \ | ||||
|         NOMINATIM_DATABASE_WEBUSER=nominatim-api \ | ||||
|         NOMINATIM_IMPORT_STYLE=admin \ | ||||
|         nominatim import --continue import-from-file --osm-file ${osmData} | ||||
|     """) | ||||
|     nominatim.succeed("systemctl restart nominatim.service") | ||||
| 
 | ||||
|     # Test CLI | ||||
|     nominatim.succeed("sudo -u nominatim-api nominatim search --query Andorra") | ||||
| 
 | ||||
|     # Test web API | ||||
|     nominatim.succeed("curl 'http://localhost/status' | grep OK") | ||||
| 
 | ||||
|     nominatim.succeed(""" | ||||
|       curl "http://localhost/search?q=Andorra&format=geojson" | grep "Andorra" | ||||
|       curl "http://localhost/reverse?lat=42.5407167&lon=1.5732033&format=geojson" | ||||
|     """) | ||||
| 
 | ||||
|     # Test UI | ||||
|     nominatim.succeed(""" | ||||
|       curl "http://localhost/ui/search.html" \ | ||||
|       | grep "<title>Nominatim Demo</title>" | ||||
|     """) | ||||
| 
 | ||||
| 
 | ||||
|     # Test api host | ||||
|     api.start() | ||||
|     api.wait_for_unit("nominatim.service") | ||||
| 
 | ||||
|     # Test web API | ||||
|     api.succeed(""" | ||||
|       curl "http://localhost/search?q=Andorra&format=geojson" | grep "Andorra" | ||||
|       curl "http://localhost/reverse?lat=42.5407167&lon=1.5732033&format=geojson" | ||||
|     """) | ||||
| 
 | ||||
| 
 | ||||
|     # Test format rewrites | ||||
|     # Redirect / to search | ||||
|     nominatim.succeed(""" | ||||
|       curl --verbose "http://localhost" 2>&1 \ | ||||
|       | grep "Location: http://localhost/ui/search.html" | ||||
|     """) | ||||
| 
 | ||||
|     # Return text by default | ||||
|     nominatim.succeed(""" | ||||
|       curl --verbose "http://localhost/status" 2>&1 \ | ||||
|       | grep "Content-Type: text/plain" | ||||
|     """) | ||||
| 
 | ||||
|     # Return JSON by default | ||||
|     nominatim.succeed(""" | ||||
|       curl --verbose "http://localhost/search?q=Andorra" 2>&1 \ | ||||
|       | grep "Content-Type: application/json" | ||||
|     """) | ||||
| 
 | ||||
|     # Return XML by default | ||||
|     nominatim.succeed(""" | ||||
|       curl --verbose "http://localhost/lookup" 2>&1 \ | ||||
|       | grep "Content-Type: text/xml" | ||||
| 
 | ||||
|       curl --verbose "http://localhost/reverse?lat=0&lon=0" 2>&1 \ | ||||
|       | grep "Content-Type: text/xml" | ||||
|     """) | ||||
| 
 | ||||
|     # Redirect explicitly requested HTML format | ||||
|     nominatim.succeed(""" | ||||
|       curl --verbose "http://localhost/search?format=html" 2>&1 \ | ||||
|       | grep "Location: http://localhost/ui/search.html" | ||||
| 
 | ||||
|       curl --verbose "http://localhost/reverse?format=html" 2>&1 \ | ||||
|       | grep "Location: http://localhost/ui/reverse.html" | ||||
|     """) | ||||
| 
 | ||||
|     # Return explicitly requested JSON format | ||||
|     nominatim.succeed(""" | ||||
|       curl --verbose "http://localhost/search?format=json" 2>&1 \ | ||||
|       | grep "Content-Type: application/json" | ||||
| 
 | ||||
|       curl --verbose "http://localhost/reverse?format=json" 2>&1 \ | ||||
|       | grep "Content-Type: application/json" | ||||
|     """) | ||||
|   ''; | ||||
| } | ||||
							
								
								
									
										72
									
								
								nixos/tests/optee.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								nixos/tests/optee.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | ||||
| import ./make-test-python.nix ( | ||||
|   { pkgs, lib, ... }: | ||||
|   { | ||||
|     name = "optee"; | ||||
| 
 | ||||
|     meta = with pkgs.lib.maintainers; { | ||||
|       maintainers = [ jmbaur ]; | ||||
|     }; | ||||
| 
 | ||||
|     nodes.machine = | ||||
|       { config, pkgs, ... }: | ||||
|       let | ||||
|         inherit (pkgs) armTrustedFirmwareQemu opteeQemuAarch64 ubootQemuAarch64; | ||||
| 
 | ||||
|         # Default environment for qemu-arm64 uboot does not work well with | ||||
|         # large nixos kernel/initrds. | ||||
|         uboot = ubootQemuAarch64.overrideAttrs (old: { | ||||
|           postPatch = | ||||
|             (old.postPatch or "") | ||||
|             + '' | ||||
|               substituteInPlace board/emulation/qemu-arm/qemu-arm.env \ | ||||
|                 --replace-fail "ramdisk_addr_r=0x44000000" "ramdisk_addr_r=0x46000000" | ||||
|             ''; | ||||
|         }); | ||||
| 
 | ||||
|         bios = armTrustedFirmwareQemu.override { | ||||
|           extraMakeFlags = [ | ||||
|             "SPD=opteed" | ||||
|             "BL32=${opteeQemuAarch64}/tee-header_v2.bin" | ||||
|             "BL32_EXTRA1=${opteeQemuAarch64}/tee-pager_v2.bin" | ||||
|             "BL32_EXTRA2=${opteeQemuAarch64}/tee-pageable_v2.bin" | ||||
|             "BL33=${uboot}/u-boot.bin" | ||||
|             "all" | ||||
|             "fip" | ||||
|           ]; | ||||
|           filesToInstall = [ | ||||
|             "build/qemu/release/bl1.bin" | ||||
|             "build/qemu/release/fip.bin" | ||||
|           ]; | ||||
|           postInstall = '' | ||||
|             dd if=$out/bl1.bin of=$out/bios.bin bs=4096 conv=notrunc | ||||
|             dd if=$out/fip.bin of=$out/bios.bin seek=64 bs=4096 conv=notrunc | ||||
|           ''; | ||||
|         }; | ||||
|       in | ||||
|       { | ||||
|         virtualisation = { | ||||
|           inherit bios; | ||||
|           cores = 2; | ||||
|           qemu.options = [ | ||||
|             "-machine virt,secure=on,accel=tcg,gic-version=2" | ||||
|             "-cpu cortex-a57" | ||||
|           ]; | ||||
|         }; | ||||
| 
 | ||||
|         # VM boots up via qfw | ||||
|         boot.loader.grub.enable = false; | ||||
| 
 | ||||
|         services.tee-supplicant = { | ||||
|           enable = true; | ||||
|           # pkcs11 trusted application | ||||
|           trustedApplications = [ "${opteeQemuAarch64.devkit}/ta/fd02c9da-306c-48c7-a49c-bbd827ae86ee.ta" ]; | ||||
|         }; | ||||
|       }; | ||||
|     testScript = '' | ||||
|       machine.wait_for_unit("tee-supplicant.service") | ||||
|       out = machine.succeed("${pkgs.opensc}/bin/pkcs11-tool --module ${lib.getLib pkgs.optee-client}/lib/libckteec.so --list-token-slots") | ||||
|       if out.find("OP-TEE PKCS11 TA") < 0: | ||||
|           raise Exception("optee pkcs11 token not found") | ||||
|     ''; | ||||
|   } | ||||
| ) | ||||
| @ -1,11 +1,4 @@ | ||||
| { | ||||
|   system ? builtins.currentSystem, | ||||
|   config ? { }, | ||||
|   pkgs ? import ../.. { inherit system config; }, | ||||
| }: | ||||
| 
 | ||||
| with import ../lib/testing-python.nix { inherit system pkgs; }; | ||||
| with pkgs.lib; | ||||
| { runTest }: | ||||
| 
 | ||||
| let | ||||
|   stunnelCommon = { | ||||
| @ -20,7 +13,12 @@ let | ||||
|     }; | ||||
|   }; | ||||
|   makeCert = | ||||
|     { config, pkgs, ... }: | ||||
|     { | ||||
|       config, | ||||
|       lib, | ||||
|       pkgs, | ||||
|       ... | ||||
|     }: | ||||
|     { | ||||
|       systemd.services.create-test-cert = { | ||||
|         wantedBy = [ "sysinit.target" ]; | ||||
| @ -32,14 +30,14 @@ let | ||||
|         unitConfig.DefaultDependencies = false; | ||||
|         serviceConfig.Type = "oneshot"; | ||||
|         script = '' | ||||
|           ${pkgs.openssl}/bin/openssl req -batch -x509 -newkey rsa -nodes -out /test-cert.pem -keyout /test-key.pem -subj /CN=${config.networking.hostName} | ||||
|           ${lib.getExe pkgs.openssl} req -batch -x509 -newkey rsa -nodes -out /test-cert.pem -keyout /test-key.pem -subj /CN=${config.networking.hostName} | ||||
|           ( umask 077; cat /test-key.pem /test-cert.pem > /test-key-and-cert.pem ) | ||||
|           chown stunnel /test-key.pem /test-key-and-cert.pem | ||||
|         ''; | ||||
|       }; | ||||
|     }; | ||||
|   serverCommon = | ||||
|     { pkgs, ... }: | ||||
|     { lib, pkgs, ... }: | ||||
|     { | ||||
|       networking.firewall.allowedTCPPorts = [ 443 ]; | ||||
|       services.stunnel.servers.https = { | ||||
| @ -51,7 +49,7 @@ let | ||||
|         wantedBy = [ "multi-user.target" ]; | ||||
|         script = '' | ||||
|           cd /etc/webroot | ||||
|           ${pkgs.python3}/bin/python -m http.server 80 | ||||
|           ${lib.getExe' pkgs.python3 "python"} -m http.server 80 | ||||
|         ''; | ||||
|       }; | ||||
|     }; | ||||
| @ -61,10 +59,9 @@ let | ||||
|     server_cert = ${src}.succeed("cat /test-cert.pem") | ||||
|     ${dest}.succeed("echo %s > ${filename}" % quote(server_cert)) | ||||
|   ''; | ||||
| 
 | ||||
| in | ||||
| { | ||||
|   basicServer = makeTest { | ||||
|   basicServer = runTest { | ||||
|     name = "basicServer"; | ||||
| 
 | ||||
|     nodes = { | ||||
| @ -92,7 +89,7 @@ in | ||||
|     ''; | ||||
|   }; | ||||
| 
 | ||||
|   serverAndClient = makeTest { | ||||
|   serverAndClient = runTest { | ||||
|     name = "serverAndClient"; | ||||
| 
 | ||||
|     nodes = { | ||||
| @ -150,7 +147,7 @@ in | ||||
|     ''; | ||||
|   }; | ||||
| 
 | ||||
|   mutualAuth = makeTest { | ||||
|   mutualAuth = runTest { | ||||
|     name = "mutualAuth"; | ||||
| 
 | ||||
|     nodes = rec { | ||||
|  | ||||
| @ -1,61 +1,80 @@ | ||||
| { | ||||
|   system ? builtins.currentSystem, | ||||
|   config ? { }, | ||||
|   pkgs ? import ../.. { inherit system config; }, | ||||
|   lib ? pkgs.lib, | ||||
| }: | ||||
| 
 | ||||
| with import ../lib/testing-python.nix { inherit system pkgs; }; | ||||
| { runTest }: | ||||
| 
 | ||||
| let | ||||
|   inherit (lib.maintainers) elvishjerricco; | ||||
| 
 | ||||
|   common = { | ||||
|     boot.initrd.systemd = { | ||||
|       enable = true; | ||||
|       network.wait-online.timeout = 10; | ||||
|       network.wait-online.anyInterface = true; | ||||
|       targets.network-online.requiredBy = [ "initrd.target" ]; | ||||
|       services.systemd-networkd-wait-online.requiredBy = [ "network-online.target" ]; | ||||
|       initrdBin = [ | ||||
|         pkgs.iproute2 | ||||
|         pkgs.iputils | ||||
|         pkgs.gnugrep | ||||
|       ]; | ||||
|   common = | ||||
|     { pkgs, ... }: | ||||
|     { | ||||
|       boot.initrd.systemd = { | ||||
|         enable = true; | ||||
|         network.wait-online.timeout = 10; | ||||
|         network.wait-online.anyInterface = true; | ||||
|         targets.network-online.requiredBy = [ "initrd.target" ]; | ||||
|         services.systemd-networkd-wait-online.requiredBy = [ "network-online.target" ]; | ||||
|         initrdBin = [ | ||||
|           pkgs.iproute2 | ||||
|           pkgs.iputils | ||||
|           pkgs.gnugrep | ||||
|         ]; | ||||
|       }; | ||||
|       testing.initrdBackdoor = true; | ||||
|       boot.initrd.network.enable = true; | ||||
|     }; | ||||
|     testing.initrdBackdoor = true; | ||||
|     boot.initrd.network.enable = true; | ||||
|   }; | ||||
| 
 | ||||
|   mkFlushTest = | ||||
|     flush: script: | ||||
|     makeTest { | ||||
|       name = "systemd-initrd-network-${lib.optionalString (!flush) "no-"}flush"; | ||||
|       meta.maintainers = [ elvishjerricco ]; | ||||
|     runTest ( | ||||
|       { lib, ... }: | ||||
|       { | ||||
|         name = "systemd-initrd-network-${lib.optionalString (!flush) "no-"}flush"; | ||||
|         meta.maintainers = with lib.maintainers; [ elvishjerricco ]; | ||||
| 
 | ||||
|       nodes.machine = { | ||||
|         imports = [ common ]; | ||||
|         nodes.machine = | ||||
|           { pkgs, ... }: | ||||
|           { | ||||
|             imports = [ common ]; | ||||
| 
 | ||||
|         boot.initrd.network.flushBeforeStage2 = flush; | ||||
|         systemd.services.check-flush = { | ||||
|           requiredBy = [ "multi-user.target" ]; | ||||
|           before = [ | ||||
|             "network-pre.target" | ||||
|             "multi-user.target" | ||||
|             "shutdown.target" | ||||
|           ]; | ||||
|           conflicts = [ "shutdown.target" ]; | ||||
|           wants = [ "network-pre.target" ]; | ||||
|           unitConfig.DefaultDependencies = false; | ||||
|           serviceConfig.Type = "oneshot"; | ||||
|           path = [ | ||||
|             pkgs.iproute2 | ||||
|             pkgs.iputils | ||||
|             pkgs.gnugrep | ||||
|           ]; | ||||
|           inherit script; | ||||
|         }; | ||||
|       }; | ||||
|             boot.initrd.network.flushBeforeStage2 = flush; | ||||
|             systemd.services.check-flush = { | ||||
|               requiredBy = [ "multi-user.target" ]; | ||||
|               before = [ | ||||
|                 "network-pre.target" | ||||
|                 "multi-user.target" | ||||
|                 "shutdown.target" | ||||
|               ]; | ||||
|               conflicts = [ "shutdown.target" ]; | ||||
|               wants = [ "network-pre.target" ]; | ||||
|               unitConfig.DefaultDependencies = false; | ||||
|               serviceConfig.Type = "oneshot"; | ||||
|               path = [ | ||||
|                 pkgs.iproute2 | ||||
|                 pkgs.iputils | ||||
|                 pkgs.gnugrep | ||||
|               ]; | ||||
|               inherit script; | ||||
|             }; | ||||
|           }; | ||||
| 
 | ||||
|         testScript = '' | ||||
|           machine.wait_for_unit("network-online.target") | ||||
|           machine.succeed( | ||||
|               "ip addr | grep 10.0.2.15", | ||||
|               "ping -c1 10.0.2.2", | ||||
|           ) | ||||
|           machine.switch_root() | ||||
| 
 | ||||
|           machine.wait_for_unit("multi-user.target") | ||||
|         ''; | ||||
|       } | ||||
|     ); | ||||
| in | ||||
| { | ||||
|   basic = runTest ( | ||||
|     { lib, ... }: | ||||
|     { | ||||
|       name = "systemd-initrd-network"; | ||||
|       meta.maintainers = with lib.maintainers; [ elvishjerricco ]; | ||||
| 
 | ||||
|       nodes.machine = common; | ||||
| 
 | ||||
|       testScript = '' | ||||
|         machine.wait_for_unit("network-online.target") | ||||
| @ -65,33 +84,14 @@ let | ||||
|         ) | ||||
|         machine.switch_root() | ||||
| 
 | ||||
|         # Make sure the systemd-network user was set correctly in initrd | ||||
|         machine.wait_for_unit("multi-user.target") | ||||
|         machine.succeed("[ $(stat -c '%U,%G' /run/systemd/netif/links) = systemd-network,systemd-network ]") | ||||
|         machine.succeed("ip addr show >&2") | ||||
|         machine.succeed("ip route show >&2") | ||||
|       ''; | ||||
|     }; | ||||
| 
 | ||||
| in | ||||
| { | ||||
|   basic = makeTest { | ||||
|     name = "systemd-initrd-network"; | ||||
|     meta.maintainers = [ elvishjerricco ]; | ||||
| 
 | ||||
|     nodes.machine = common; | ||||
| 
 | ||||
|     testScript = '' | ||||
|       machine.wait_for_unit("network-online.target") | ||||
|       machine.succeed( | ||||
|           "ip addr | grep 10.0.2.15", | ||||
|           "ping -c1 10.0.2.2", | ||||
|       ) | ||||
|       machine.switch_root() | ||||
| 
 | ||||
|       # Make sure the systemd-network user was set correctly in initrd | ||||
|       machine.wait_for_unit("multi-user.target") | ||||
|       machine.succeed("[ $(stat -c '%U,%G' /run/systemd/netif/links) = systemd-network,systemd-network ]") | ||||
|       machine.succeed("ip addr show >&2") | ||||
|       machine.succeed("ip route show >&2") | ||||
|     ''; | ||||
|   }; | ||||
|     } | ||||
|   ); | ||||
| 
 | ||||
|   doFlush = mkFlushTest true '' | ||||
|     if ip addr | grep 10.0.2.15; then | ||||
|  | ||||
| @ -1,96 +1,94 @@ | ||||
| # In contrast to systemd-networkd-dhcpserver, this test configures | ||||
| # the router with a static DHCP lease for the client's MAC address. | ||||
| import ./make-test-python.nix ( | ||||
|   { lib, ... }: | ||||
|   { | ||||
|     name = "systemd-networkd-dhcpserver-static-leases"; | ||||
|     meta = with lib.maintainers; { | ||||
|       maintainers = [ veehaitch ]; | ||||
|     }; | ||||
|     nodes = { | ||||
|       router = { | ||||
|         virtualisation.vlans = [ 1 ]; | ||||
|         systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug"; | ||||
|         networking = { | ||||
|           useNetworkd = true; | ||||
|           useDHCP = false; | ||||
|           firewall.enable = false; | ||||
|         }; | ||||
|         systemd.network = { | ||||
|           networks = { | ||||
|             # systemd-networkd will load the first network unit file | ||||
|             # that matches, ordered lexiographically by filename. | ||||
|             # /etc/systemd/network/{40-eth1,99-main}.network already | ||||
|             # exists. This network unit must be loaded for the test, | ||||
|             # however, hence why this network is named such. | ||||
|             "01-eth1" = { | ||||
|               name = "eth1"; | ||||
|               networkConfig = { | ||||
|                 DHCPServer = true; | ||||
|                 Address = "10.0.0.1/24"; | ||||
|               }; | ||||
|               dhcpServerStaticLeases = [ | ||||
|                 { | ||||
|                   MACAddress = "02:de:ad:be:ef:01"; | ||||
|                   Address = "10.0.0.10"; | ||||
|                 } | ||||
|               ]; | ||||
|             }; | ||||
|           }; | ||||
|         }; | ||||
| { lib, ... }: | ||||
| { | ||||
|   name = "systemd-networkd-dhcpserver-static-leases"; | ||||
|   meta = with lib.maintainers; { | ||||
|     maintainers = [ veehaitch ]; | ||||
|   }; | ||||
|   nodes = { | ||||
|     router = { | ||||
|       virtualisation.vlans = [ 1 ]; | ||||
|       systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug"; | ||||
|       networking = { | ||||
|         useNetworkd = true; | ||||
|         useDHCP = false; | ||||
|         firewall.enable = false; | ||||
|       }; | ||||
| 
 | ||||
|       client = { | ||||
|         virtualisation.vlans = [ 1 ]; | ||||
|         systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug"; | ||||
|         systemd.network = { | ||||
|           enable = true; | ||||
|           links."10-eth1" = { | ||||
|             matchConfig.OriginalName = "eth1"; | ||||
|             linkConfig.MACAddress = "02:de:ad:be:ef:01"; | ||||
|           }; | ||||
|           networks."40-eth1" = { | ||||
|             matchConfig.Name = "eth1"; | ||||
|       systemd.network = { | ||||
|         networks = { | ||||
|           # systemd-networkd will load the first network unit file | ||||
|           # that matches, ordered lexiographically by filename. | ||||
|           # /etc/systemd/network/{40-eth1,99-main}.network already | ||||
|           # exists. This network unit must be loaded for the test, | ||||
|           # however, hence why this network is named such. | ||||
|           "01-eth1" = { | ||||
|             name = "eth1"; | ||||
|             networkConfig = { | ||||
|               DHCP = "ipv4"; | ||||
|               IPv6AcceptRA = false; | ||||
|               DHCPServer = true; | ||||
|               Address = "10.0.0.1/24"; | ||||
|             }; | ||||
|             # This setting is important to have the router assign the | ||||
|             # configured lease based on the client's MAC address. Also see: | ||||
|             # https://github.com/systemd/systemd/issues/21368#issuecomment-982193546 | ||||
|             dhcpV4Config.ClientIdentifier = "mac"; | ||||
|             linkConfig.RequiredForOnline = "routable"; | ||||
|             dhcpServerStaticLeases = [ | ||||
|               { | ||||
|                 MACAddress = "02:de:ad:be:ef:01"; | ||||
|                 Address = "10.0.0.10"; | ||||
|               } | ||||
|             ]; | ||||
|           }; | ||||
|         }; | ||||
|         networking = { | ||||
|           useDHCP = false; | ||||
|           firewall.enable = false; | ||||
|           interfaces.eth1 = lib.mkForce { }; | ||||
|         }; | ||||
|       }; | ||||
|     }; | ||||
|     testScript = '' | ||||
|       start_all() | ||||
| 
 | ||||
|       with subtest("check router network configuration"): | ||||
|         router.systemctl("start systemd-networkd-wait-online.service") | ||||
|         router.wait_for_unit("systemd-networkd-wait-online.service") | ||||
|         eth1_status = router.succeed("networkctl status eth1") | ||||
|         assert "Network File: /etc/systemd/network/01-eth1.network" in eth1_status, \ | ||||
|           "The router interface eth1 is not using the expected network file" | ||||
|         assert "10.0.0.1" in eth1_status, "Did not find expected router IPv4" | ||||
|     client = { | ||||
|       virtualisation.vlans = [ 1 ]; | ||||
|       systemd.services.systemd-networkd.environment.SYSTEMD_LOG_LEVEL = "debug"; | ||||
|       systemd.network = { | ||||
|         enable = true; | ||||
|         links."10-eth1" = { | ||||
|           matchConfig.OriginalName = "eth1"; | ||||
|           linkConfig.MACAddress = "02:de:ad:be:ef:01"; | ||||
|         }; | ||||
|         networks."40-eth1" = { | ||||
|           matchConfig.Name = "eth1"; | ||||
|           networkConfig = { | ||||
|             DHCP = "ipv4"; | ||||
|             IPv6AcceptRA = false; | ||||
|           }; | ||||
|           # This setting is important to have the router assign the | ||||
|           # configured lease based on the client's MAC address. Also see: | ||||
|           # https://github.com/systemd/systemd/issues/21368#issuecomment-982193546 | ||||
|           dhcpV4Config.ClientIdentifier = "mac"; | ||||
|           linkConfig.RequiredForOnline = "routable"; | ||||
|         }; | ||||
|       }; | ||||
|       networking = { | ||||
|         useDHCP = false; | ||||
|         firewall.enable = false; | ||||
|         interfaces.eth1 = lib.mkForce { }; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
|   testScript = '' | ||||
|     start_all() | ||||
| 
 | ||||
|       with subtest("check client network configuration"): | ||||
|         client.systemctl("start systemd-networkd-wait-online.service") | ||||
|         client.wait_for_unit("systemd-networkd-wait-online.service") | ||||
|         eth1_status = client.succeed("networkctl status eth1") | ||||
|         assert "Network File: /etc/systemd/network/40-eth1.network" in eth1_status, \ | ||||
|           "The client interface eth1 is not using the expected network file" | ||||
|         assert "10.0.0.10" in eth1_status, "Did not find expected client IPv4" | ||||
|     with subtest("check router network configuration"): | ||||
|       router.systemctl("start systemd-networkd-wait-online.service") | ||||
|       router.wait_for_unit("systemd-networkd-wait-online.service") | ||||
|       eth1_status = router.succeed("networkctl status eth1") | ||||
|       assert "Network File: /etc/systemd/network/01-eth1.network" in eth1_status, \ | ||||
|         "The router interface eth1 is not using the expected network file" | ||||
|       assert "10.0.0.1" in eth1_status, "Did not find expected router IPv4" | ||||
| 
 | ||||
|       with subtest("router and client can reach each other"): | ||||
|         client.wait_until_succeeds("ping -c 5 10.0.0.1") | ||||
|         router.wait_until_succeeds("ping -c 5 10.0.0.10") | ||||
|     ''; | ||||
|   } | ||||
| ) | ||||
|     with subtest("check client network configuration"): | ||||
|       client.systemctl("start systemd-networkd-wait-online.service") | ||||
|       client.wait_for_unit("systemd-networkd-wait-online.service") | ||||
|       eth1_status = client.succeed("networkctl status eth1") | ||||
|       assert "Network File: /etc/systemd/network/40-eth1.network" in eth1_status, \ | ||||
|         "The client interface eth1 is not using the expected network file" | ||||
|       assert "10.0.0.10" in eth1_status, "Did not find expected client IPv4" | ||||
| 
 | ||||
|     with subtest("router and client can reach each other"): | ||||
|       client.wait_until_succeeds("ping -c 5 10.0.0.1") | ||||
|       router.wait_until_succeeds("ping -c 5 10.0.0.10") | ||||
|   ''; | ||||
| } | ||||
|  | ||||
| @ -1,16 +1,12 @@ | ||||
| { | ||||
|   system ? builtins.currentSystem, | ||||
|   config ? { }, | ||||
|   pkgs ? import ../.. { inherit system config; }, | ||||
|   lib ? pkgs.lib, | ||||
| }: | ||||
| { runTest, lib }: | ||||
| let | ||||
|   makeTest = import ./make-test-python.nix; | ||||
|   textInput = "This works."; | ||||
|   inputBoxText = "Enter input"; | ||||
|   inputBox = pkgs.writeShellScript "zenity-input" '' | ||||
|     ${lib.getExe pkgs.zenity} --entry --text '${inputBoxText}:' > /tmp/output & | ||||
|   ''; | ||||
|   inputBox = | ||||
|     pkgs: | ||||
|     pkgs.writeShellScript "zenity-input" '' | ||||
|       ${lib.getExe pkgs.zenity} --entry --text '${inputBoxText}:' > /tmp/output & | ||||
|     ''; | ||||
|   asUser = '' | ||||
|     def as_user(cmd: str): | ||||
|         """ | ||||
| @ -20,124 +16,137 @@ let | ||||
|   ''; | ||||
| in | ||||
| { | ||||
|   headless = makeTest { | ||||
|     name = "headless"; | ||||
|   headless = runTest ( | ||||
|     { lib, ... }: | ||||
|     { | ||||
|       name = "headless"; | ||||
| 
 | ||||
|     enableOCR = true; | ||||
|       enableOCR = true; | ||||
| 
 | ||||
|     nodes.machine = { | ||||
|       imports = [ ./common/user-account.nix ]; | ||||
|       nodes.machine = { | ||||
|         imports = [ ./common/user-account.nix ]; | ||||
| 
 | ||||
|       users.users.alice.extraGroups = [ "ydotool" ]; | ||||
|         users.users.alice.extraGroups = [ "ydotool" ]; | ||||
| 
 | ||||
|       programs.ydotool.enable = true; | ||||
|         programs.ydotool.enable = true; | ||||
| 
 | ||||
|       services.getty.autologinUser = "alice"; | ||||
|     }; | ||||
|         services.getty.autologinUser = "alice"; | ||||
|       }; | ||||
| 
 | ||||
|     testScript = | ||||
|       asUser | ||||
|       + '' | ||||
|         start_all() | ||||
|       testScript = | ||||
|         asUser | ||||
|         + '' | ||||
|           start_all() | ||||
| 
 | ||||
|         machine.wait_for_unit("multi-user.target") | ||||
|         machine.wait_for_text("alice") | ||||
|         machine.succeed(as_user("ydotool type 'echo ${textInput} > /tmp/output'")) # text input | ||||
|         machine.succeed(as_user("ydotool key 28:1 28:0")) # text input | ||||
|         machine.screenshot("headless_input") | ||||
|         machine.wait_for_file("/tmp/output") | ||||
|         machine.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input | ||||
|       ''; | ||||
|           machine.wait_for_unit("multi-user.target") | ||||
|           machine.wait_for_text("alice") | ||||
|           machine.succeed(as_user("ydotool type 'echo ${textInput} > /tmp/output'")) # text input | ||||
|           machine.succeed(as_user("ydotool key 28:1 28:0")) # text input | ||||
|           machine.screenshot("headless_input") | ||||
|           machine.wait_for_file("/tmp/output") | ||||
|           machine.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input | ||||
|         ''; | ||||
| 
 | ||||
|     meta.maintainers = with lib.maintainers; [ | ||||
|       OPNA2608 | ||||
|       quantenzitrone | ||||
|     ]; | ||||
|   }; | ||||
| 
 | ||||
|   x11 = makeTest { | ||||
|     name = "x11"; | ||||
| 
 | ||||
|     enableOCR = true; | ||||
| 
 | ||||
|     nodes.machine = { | ||||
|       imports = [ | ||||
|         ./common/user-account.nix | ||||
|         ./common/auto.nix | ||||
|         ./common/x11.nix | ||||
|       meta.maintainers = with lib.maintainers; [ | ||||
|         OPNA2608 | ||||
|         quantenzitrone | ||||
|       ]; | ||||
|     } | ||||
|   ); | ||||
| 
 | ||||
|       users.users.alice.extraGroups = [ "ydotool" ]; | ||||
|   x11 = runTest ( | ||||
|     { config, lib, ... }: | ||||
|     { | ||||
|       name = "x11"; | ||||
| 
 | ||||
|       programs.ydotool.enable = true; | ||||
|       enableOCR = true; | ||||
| 
 | ||||
|       test-support.displayManager.auto = { | ||||
|         enable = true; | ||||
|         user = "alice"; | ||||
|       }; | ||||
|       nodes.machine = | ||||
|         { lib, ... }: | ||||
|         { | ||||
|           imports = [ | ||||
|             ./common/user-account.nix | ||||
|             ./common/auto.nix | ||||
|             ./common/x11.nix | ||||
|           ]; | ||||
| 
 | ||||
|       services.xserver.windowManager.dwm.enable = true; | ||||
|       services.displayManager.defaultSession = lib.mkForce "none+dwm"; | ||||
|     }; | ||||
|           users.users.alice.extraGroups = [ "ydotool" ]; | ||||
| 
 | ||||
|     testScript = | ||||
|       asUser | ||||
|       + '' | ||||
|           programs.ydotool.enable = true; | ||||
| 
 | ||||
|           test-support.displayManager.auto = { | ||||
|             enable = true; | ||||
|             user = "alice"; | ||||
|           }; | ||||
| 
 | ||||
|           services.xserver.windowManager.dwm.enable = true; | ||||
|           services.displayManager.defaultSession = lib.mkForce "none+dwm"; | ||||
|         }; | ||||
| 
 | ||||
|       testScript = | ||||
|         asUser | ||||
|         + '' | ||||
|           start_all() | ||||
| 
 | ||||
|           machine.wait_for_x() | ||||
|           machine.execute(as_user("${inputBox config.node.pkgs}")) | ||||
|           machine.wait_for_text("${inputBoxText}") | ||||
|           machine.succeed(as_user("ydotool type '${textInput}'")) # text input | ||||
|           machine.screenshot("x11_input") | ||||
|           machine.succeed(as_user("ydotool mousemove -a 400 110")) # mouse input | ||||
|           machine.succeed(as_user("ydotool click 0xC0")) # mouse input | ||||
|           machine.wait_for_file("/tmp/output") | ||||
|           machine.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input | ||||
|         ''; | ||||
| 
 | ||||
|       meta.maintainers = with lib.maintainers; [ | ||||
|         OPNA2608 | ||||
|         quantenzitrone | ||||
|       ]; | ||||
|     } | ||||
|   ); | ||||
| 
 | ||||
|   wayland = runTest ( | ||||
|     { lib, ... }: | ||||
|     { | ||||
|       name = "wayland"; | ||||
| 
 | ||||
|       enableOCR = true; | ||||
| 
 | ||||
|       nodes.machine = | ||||
|         { pkgs, ... }: | ||||
|         { | ||||
|           imports = [ ./common/user-account.nix ]; | ||||
| 
 | ||||
|           services.cage = { | ||||
|             enable = true; | ||||
|             user = "alice"; | ||||
|           }; | ||||
| 
 | ||||
|           programs.ydotool.enable = true; | ||||
| 
 | ||||
|           services.cage.program = inputBox pkgs; | ||||
|         }; | ||||
| 
 | ||||
|       testScript = '' | ||||
|         start_all() | ||||
| 
 | ||||
|         machine.wait_for_x() | ||||
|         machine.execute(as_user("${inputBox}")) | ||||
|         machine.wait_for_unit("graphical.target") | ||||
|         machine.wait_for_text("${inputBoxText}") | ||||
|         machine.succeed(as_user("ydotool type '${textInput}'")) # text input | ||||
|         machine.screenshot("x11_input") | ||||
|         machine.succeed(as_user("ydotool mousemove -a 400 110")) # mouse input | ||||
|         machine.succeed(as_user("ydotool click 0xC0")) # mouse input | ||||
|         machine.succeed("ydotool type '${textInput}'") # text input | ||||
|         machine.screenshot("wayland_input") | ||||
|         machine.succeed("ydotool mousemove -a 100 100") # mouse input | ||||
|         machine.succeed("ydotool click 0xC0") # mouse input | ||||
|         machine.wait_for_file("/tmp/output") | ||||
|         machine.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input | ||||
|       ''; | ||||
| 
 | ||||
|     meta.maintainers = with lib.maintainers; [ | ||||
|       OPNA2608 | ||||
|       quantenzitrone | ||||
|     ]; | ||||
|   }; | ||||
| 
 | ||||
|   wayland = makeTest { | ||||
|     name = "wayland"; | ||||
| 
 | ||||
|     enableOCR = true; | ||||
| 
 | ||||
|     nodes.machine = { | ||||
|       imports = [ ./common/user-account.nix ]; | ||||
| 
 | ||||
|       services.cage = { | ||||
|         enable = true; | ||||
|         user = "alice"; | ||||
|       }; | ||||
| 
 | ||||
|       programs.ydotool.enable = true; | ||||
| 
 | ||||
|       services.cage.program = inputBox; | ||||
|     }; | ||||
| 
 | ||||
|     testScript = '' | ||||
|       start_all() | ||||
| 
 | ||||
|       machine.wait_for_unit("graphical.target") | ||||
|       machine.wait_for_text("${inputBoxText}") | ||||
|       machine.succeed("ydotool type '${textInput}'") # text input | ||||
|       machine.screenshot("wayland_input") | ||||
|       machine.succeed("ydotool mousemove -a 100 100") # mouse input | ||||
|       machine.succeed("ydotool click 0xC0") # mouse input | ||||
|       machine.wait_for_file("/tmp/output") | ||||
|       machine.wait_until_succeeds("grep '${textInput}' /tmp/output") # text input | ||||
|     ''; | ||||
| 
 | ||||
|     meta.maintainers = with lib.maintainers; [ | ||||
|       OPNA2608 | ||||
|       quantenzitrone | ||||
|     ]; | ||||
|   }; | ||||
|       meta.maintainers = with lib.maintainers; [ | ||||
|         OPNA2608 | ||||
|         quantenzitrone | ||||
|       ]; | ||||
|     } | ||||
|   ); | ||||
| 
 | ||||
|   customGroup = | ||||
|     let | ||||
| @ -147,38 +156,41 @@ in | ||||
|       outsideGroupUsername = "other-user"; | ||||
|       groupName = "custom-group"; | ||||
|     in | ||||
|     makeTest { | ||||
|       inherit name; | ||||
|     runTest ( | ||||
|       { lib, ... }: | ||||
|       { | ||||
|         inherit name; | ||||
| 
 | ||||
|       nodes."${nodeName}" = { | ||||
|         programs.ydotool = { | ||||
|           enable = true; | ||||
|           group = groupName; | ||||
|         }; | ||||
| 
 | ||||
|         users.users = { | ||||
|           "${insideGroupUsername}" = { | ||||
|             isNormalUser = true; | ||||
|             extraGroups = [ groupName ]; | ||||
|         nodes."${nodeName}" = { | ||||
|           programs.ydotool = { | ||||
|             enable = true; | ||||
|             group = groupName; | ||||
|           }; | ||||
| 
 | ||||
|           users.users = { | ||||
|             "${insideGroupUsername}" = { | ||||
|               isNormalUser = true; | ||||
|               extraGroups = [ groupName ]; | ||||
|             }; | ||||
|             "${outsideGroupUsername}".isNormalUser = true; | ||||
|           }; | ||||
|           "${outsideGroupUsername}".isNormalUser = true; | ||||
|         }; | ||||
|       }; | ||||
| 
 | ||||
|       testScript = '' | ||||
|         start_all() | ||||
|         testScript = '' | ||||
|           start_all() | ||||
| 
 | ||||
|         # Wait for service to start | ||||
|         ${nodeName}.wait_for_unit("multi-user.target") | ||||
|         ${nodeName}.wait_for_unit("ydotoold.service") | ||||
|           # Wait for service to start | ||||
|           ${nodeName}.wait_for_unit("multi-user.target") | ||||
|           ${nodeName}.wait_for_unit("ydotoold.service") | ||||
| 
 | ||||
|         # Verify that user with the configured group can use the service | ||||
|         ${nodeName}.succeed("sudo --login --user=${insideGroupUsername} ydotool type 'Hello, World!'") | ||||
|           # Verify that user with the configured group can use the service | ||||
|           ${nodeName}.succeed("sudo --login --user=${insideGroupUsername} ydotool type 'Hello, World!'") | ||||
| 
 | ||||
|         # Verify that user without the configured group can't use the service | ||||
|         ${nodeName}.fail("sudo --login --user=${outsideGroupUsername} ydotool type 'Hello, World!'") | ||||
|       ''; | ||||
|           # Verify that user without the configured group can't use the service | ||||
|           ${nodeName}.fail("sudo --login --user=${outsideGroupUsername} ydotool type 'Hello, World!'") | ||||
|         ''; | ||||
| 
 | ||||
|       meta.maintainers = with lib.maintainers; [ l0b0 ]; | ||||
|     }; | ||||
|         meta.maintainers = with lib.maintainers; [ l0b0 ]; | ||||
|       } | ||||
|     ); | ||||
| } | ||||
|  | ||||
| @ -802,7 +802,7 @@ | ||||
|     } | ||||
|   }, | ||||
|   "ungoogled-chromium": { | ||||
|     "version": "138.0.7204.96", | ||||
|     "version": "138.0.7204.100", | ||||
|     "deps": { | ||||
|       "depot_tools": { | ||||
|         "rev": "a8900cc0f023d6a662eb66b317e8ddceeb113490", | ||||
| @ -813,16 +813,16 @@ | ||||
|         "hash": "sha256-UB9a7Fr1W0yYld6WbXyRR8dFqWsj/zx4KumDZ5JQKSM=" | ||||
|       }, | ||||
|       "ungoogled-patches": { | ||||
|         "rev": "138.0.7204.96-1", | ||||
|         "hash": "sha256-tOQSvdwK3lMN/7l23rbw7txJ/ovRguSXe9oMeol63Cs=" | ||||
|         "rev": "138.0.7204.100-1", | ||||
|         "hash": "sha256-zIBOQlW8UAE7n8x6R5LLjiNUquLOiTPvyxx4sM9r85Y=" | ||||
|       }, | ||||
|       "npmHash": "sha256-8d5VTHutv51libabhxv7SqPRcHfhVmGDSOvTSv013rE=" | ||||
|     }, | ||||
|     "DEPS": { | ||||
|       "src": { | ||||
|         "url": "https://chromium.googlesource.com/chromium/src.git", | ||||
|         "rev": "f01343ee86bdb55cc999f82381f038cdbf20db62", | ||||
|         "hash": "sha256-9Ryxv2DvnIKVk4ZvjXegubFDUNzJ3YXGPuYHlntC3RU=", | ||||
|         "rev": "5f45b4744e3d5ba82c2ca6d942f1e7a516110752", | ||||
|         "hash": "sha256-bI75IXPl6YeauK2oTnUURh1ch1H7KKw/QzKYZ/q6htI=", | ||||
|         "recompress": true | ||||
|       }, | ||||
|       "src/third_party/clang-format/script": { | ||||
| @ -1047,8 +1047,8 @@ | ||||
|       }, | ||||
|       "src/third_party/devtools-frontend/src": { | ||||
|         "url": "https://chromium.googlesource.com/devtools/devtools-frontend", | ||||
|         "rev": "f8dfe8b36e516cef8a5a169e88d16480d8abdc68", | ||||
|         "hash": "sha256-7ygnGBAeiLxwbTx5s7LRs9+ZOe06tr8VFcSY5cVHnS4=" | ||||
|         "rev": "a6dbe06dafbad00ef4b0ea139ece1a94a5e2e6d8", | ||||
|         "hash": "sha256-XkyJFRxo3ZTBGfKdTwSIo14SLNPQAKQvY4lEX03j6LM=" | ||||
|       }, | ||||
|       "src/third_party/dom_distiller_js/dist": { | ||||
|         "url": "https://chromium.googlesource.com/chromium/dom-distiller/dist.git", | ||||
|  | ||||
| @ -101,6 +101,7 @@ let | ||||
|     } // sdkSourceBuilders; | ||||
|   }; | ||||
|   packageConfig = generators.linkPackageConfig { | ||||
|     inherit pubspecLock; | ||||
|     packageConfig = pub2nix.generatePackageConfig { | ||||
|       pname = if args.pname != null then "${args.pname}-${args.version}" else null; | ||||
| 
 | ||||
|  | ||||
| @ -49,6 +49,7 @@ let | ||||
|   # Adds the root package to a dependency package_config.json file from pub2nix. | ||||
|   linkPackageConfig = | ||||
|     { | ||||
|       pubspecLock, | ||||
|       packageConfig, | ||||
|       extraSetupCommands ? "", | ||||
|     }: | ||||
| @ -67,15 +68,27 @@ let | ||||
| 
 | ||||
|         dontBuild = true; | ||||
| 
 | ||||
|         installPhase = '' | ||||
|           runHook preInstall | ||||
|         installPhase = | ||||
|           let | ||||
|             m = builtins.match "^[[:space:]]*(\\^|>=|>)?[[:space:]]*([0-9]+\\.[0-9]+)\\.[0-9]+.*$" pubspecLock.sdks.dart; | ||||
|             languageVersion = | ||||
|               if m != null then | ||||
|                 (builtins.elemAt m 1) | ||||
|               else if pubspecLock.sdks.dart == "any" then | ||||
|                 "null" | ||||
|               else | ||||
|                 # https://github.com/dart-lang/pub/blob/15b96589066884300a30bdc356566f3398794857/lib/src/language_version.dart#L109 | ||||
|                 "2.7"; | ||||
|           in | ||||
|           '' | ||||
|             runHook preInstall | ||||
| 
 | ||||
|           packageName="$(yq --raw-output .name pubspec.yaml)" | ||||
|           jq --arg name "$packageName" '.packages |= . + [{ name: $name, rootUri: "../", packageUri: "lib/" }]' '${packageConfig}' > "$out" | ||||
|           ${extraSetupCommands} | ||||
|             packageName="$(yq --raw-output .name pubspec.yaml)" | ||||
|             jq --arg name "$packageName" --arg languageVersion ${languageVersion} '.packages |= . + [{ name: $name, rootUri: "../", packageUri: "lib/", languageVersion: (if $languageVersion == "null" then null else $languageVersion end) }]' '${packageConfig}' > "$out" | ||||
|             ${extraSetupCommands} | ||||
| 
 | ||||
|           runHook postInstall | ||||
|         ''; | ||||
|             runHook postInstall | ||||
|           ''; | ||||
|       } | ||||
|     ); | ||||
| in | ||||
|  | ||||
| @ -30,16 +30,14 @@ lib.extendMkDerivation { | ||||
| 
 | ||||
|       outputHashAlgo = if finalAttrs.hash != null && finalAttrs.hash != "" then null else "sha256"; | ||||
|       outputHashMode = "recursive"; | ||||
|       outputHash = | ||||
|         lib.throwIf (finalAttrs.hash != null && sha256 != null) "Only one of sha256 or hash can be set" | ||||
|           ( | ||||
|             if finalAttrs.hash != null then | ||||
|               finalAttrs.hash | ||||
|             else if sha256 != null then | ||||
|               sha256 | ||||
|             else | ||||
|               "" | ||||
|           ); | ||||
|       outputHash = lib.throwIf (hash != null && sha256 != null) "Only one of sha256 or hash can be set" ( | ||||
|         if finalAttrs.hash != null then | ||||
|           finalAttrs.hash | ||||
|         else if sha256 != null then | ||||
|           sha256 | ||||
|         else | ||||
|           "" | ||||
|       ); | ||||
| 
 | ||||
|       inherit url rev hash; | ||||
|       inherit preferLocalBuild; | ||||
|  | ||||
| @ -8,7 +8,7 @@ | ||||
| }: | ||||
| 
 | ||||
| let | ||||
|   version = "0.2.78"; | ||||
|   version = "0.2.79"; | ||||
| in | ||||
| buildGoModule { | ||||
|   pname = "act"; | ||||
| @ -18,10 +18,10 @@ buildGoModule { | ||||
|     owner = "nektos"; | ||||
|     repo = "act"; | ||||
|     tag = "v${version}"; | ||||
|     hash = "sha256-S4Ev7MszuvlsUstnjOltYnZTuhzeqP/GDqMEWsFLe5Y="; | ||||
|     hash = "sha256-tIp9iG8SCppg+tX/KdvAON5fKAHAlU01GSJEgvm2JSg="; | ||||
|   }; | ||||
| 
 | ||||
|   vendorHash = "sha256-YH5SIZ73VYqg7+sSJpvqkIlBUy1rs3uNEWiEBDRdkQw="; | ||||
|   vendorHash = "sha256-wMtRpFUOMia7ZbuKUUkkcr2Gi88fiZydqFSVSAdiKdo="; | ||||
| 
 | ||||
|   doCheck = false; | ||||
| 
 | ||||
|  | ||||
| @ -10,13 +10,13 @@ | ||||
| }: | ||||
| stdenv.mkDerivation (finalAttrs: { | ||||
|   pname = "aws-lc"; | ||||
|   version = "1.53.1"; | ||||
|   version = "1.55.0"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "aws"; | ||||
|     repo = "aws-lc"; | ||||
|     rev = "v${finalAttrs.version}"; | ||||
|     hash = "sha256-1liZ1xellboNNsL7D6vqYk9sHFpWN5c0o8B1S9B5Gnc="; | ||||
|     hash = "sha256-Ul+PoOItv7FU7v7NkpaCrZrr/ULnI9FSv6T8ePzTMCs="; | ||||
|   }; | ||||
| 
 | ||||
|   outputs = [ | ||||
|  | ||||
| @ -8,18 +8,18 @@ | ||||
| 
 | ||||
| rustPlatform.buildRustPackage rec { | ||||
|   pname = "bibiman"; | ||||
|   version = "0.12.4"; | ||||
|   version = "0.13.1"; | ||||
| 
 | ||||
|   src = fetchFromGitea { | ||||
|     domain = "codeberg.org"; | ||||
|     owner = "lukeflo"; | ||||
|     repo = "bibiman"; | ||||
|     tag = "v${version}"; | ||||
|     hash = "sha256-6duqLBPm6GlBHm3Kr4foHF1MKodYOYKKDITk/BiX6mA="; | ||||
|     hash = "sha256-MdUabJQ5x3/n7dfbIjAqK9hDQ+lLNOtXknY4fTSW67Q="; | ||||
|   }; | ||||
| 
 | ||||
|   useFetchCargoVendor = true; | ||||
|   cargoHash = "sha256-tbgzjTsK88+G4Wxex4Tl0K5Ii99tPNud3UEDzAHaI0M="; | ||||
|   cargoHash = "sha256-FARk/BCssI35aS4yxUnfGoV6C3i4/a/LQcEMIKD29Ac="; | ||||
| 
 | ||||
|   nativeInstallCheckInputs = [ | ||||
|     versionCheckHook | ||||
|  | ||||
| @ -19,20 +19,20 @@ | ||||
| 
 | ||||
| buildNpmPackage rec { | ||||
|   pname = "bruno"; | ||||
|   version = "2.6.1"; | ||||
|   version = "2.7.0"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "usebruno"; | ||||
|     repo = "bruno"; | ||||
|     tag = "v${version}"; | ||||
|     hash = "sha256-GR/TmBuZbt/8cB9gtRPgzSVnzdrB1BKhYjahfJ3ErgQ="; | ||||
|     hash = "sha256-qNZCLd4FixJ+I5xaIIQ9EIKfCXnPOZFGbXHkgagBbFE="; | ||||
| 
 | ||||
|     postFetch = '' | ||||
|       ${lib.getExe npm-lockfile-fix} $out/package-lock.json | ||||
|     ''; | ||||
|   }; | ||||
| 
 | ||||
|   npmDepsHash = "sha256-/u7xyd1+RXNN7khVOglzYGMCI+fPjyiuSF2BSZAqEtI="; | ||||
|   npmDepsHash = "sha256-osdjtn9jn6T1YizQM7I9cfiHvIkrZ8HRDNjsR+FS/DE="; | ||||
|   npmFlags = [ "--legacy-peer-deps" ]; | ||||
| 
 | ||||
|   nativeBuildInputs = | ||||
|  | ||||
| @ -6,13 +6,13 @@ | ||||
| }: | ||||
| stdenv.mkDerivation (finalAttrs: { | ||||
|   pname = "byedpi"; | ||||
|   version = "0.17"; | ||||
|   version = "0.17.1"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "hufrea"; | ||||
|     repo = "byedpi"; | ||||
|     tag = "v${finalAttrs.version}"; | ||||
|     hash = "sha256-JedtEgkj21pDnNM19Oq6asI7iMIHZqf3ZolDlUDhHg8="; | ||||
|     hash = "sha256-an0UmsAZw5DJMuM4WpAWBVVN0ZVBpXhn0cbZ0ZbfBjo="; | ||||
|   }; | ||||
| 
 | ||||
|   installPhase = '' | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| 
 | ||||
| let | ||||
|   pname = "cargo-mobile2"; | ||||
|   version = "0.20.1"; | ||||
|   version = "0.20.2"; | ||||
| in | ||||
| rustPlatform.buildRustPackage { | ||||
|   inherit pname version; | ||||
| @ -18,7 +18,7 @@ rustPlatform.buildRustPackage { | ||||
|     owner = "tauri-apps"; | ||||
|     repo = "cargo-mobile2"; | ||||
|     rev = "cargo-mobile2-v${version}"; | ||||
|     hash = "sha256-gKqGmd34nNKMc3fl5lMH09oOGnmRaMDBwsbHhAeUMBc="; | ||||
|     hash = "sha256-mXedzfAN40IG8ivcSa/tf/Ys/rKcwkCmxU7/ja9ec2U="; | ||||
|   }; | ||||
| 
 | ||||
|   # Manually specify the sourceRoot since this crate depends on other crates in the workspace. Relevant info at | ||||
| @ -26,7 +26,7 @@ rustPlatform.buildRustPackage { | ||||
|   # sourceRoot = "${src.name}/tooling/cli"; | ||||
| 
 | ||||
|   useFetchCargoVendor = true; | ||||
|   cargoHash = "sha256-QEZe+7/i0XygXxs7pwdS9WtYbE2pfrUuRQC0dm+WqTo="; | ||||
|   cargoHash = "sha256-Y1ykz7QU48AJVKBcYdrWEuNcahontkaJyFmrrh4eQs0="; | ||||
| 
 | ||||
|   preBuild = '' | ||||
|     mkdir -p $out/share/ | ||||
|  | ||||
							
								
								
									
										8
									
								
								pkgs/by-name/cl/claude-code/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								pkgs/by-name/cl/claude-code/package-lock.json
									
									
									
										generated
									
									
									
								
							| @ -6,13 +6,13 @@ | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "dependencies": { | ||||
|         "@anthropic-ai/claude-code": "^1.0.44" | ||||
|         "@anthropic-ai/claude-code": "^1.0.48" | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@anthropic-ai/claude-code": { | ||||
|       "version": "1.0.44", | ||||
|       "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-1.0.44.tgz", | ||||
|       "integrity": "sha512-GCX0KeMcyhLlfs/dLWlMiHShAMmjt8d7xcVUS53z7VnV6s3cIIrRPsKQ/xX/Q9rFm5dSVmRnzU88Ku28fb3QKQ==", | ||||
|       "version": "1.0.48", | ||||
|       "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-1.0.48.tgz", | ||||
|       "integrity": "sha512-h63VBAZZ6Pl/DlYW2PjbfUeicZ4r9VSl8dymD3d+1lZEHwCPgfMpu3g+30+FDMs79Xqc7qSDm6CRnMApxhbjqw==", | ||||
|       "hasInstallScript": true, | ||||
|       "license": "SEE LICENSE IN README.md", | ||||
|       "bin": { | ||||
|  | ||||
| @ -7,16 +7,16 @@ | ||||
| 
 | ||||
| buildNpmPackage rec { | ||||
|   pname = "claude-code"; | ||||
|   version = "1.0.44"; | ||||
|   version = "1.0.48"; | ||||
| 
 | ||||
|   nodejs = nodejs_20; # required for sandboxed Nix builds on Darwin | ||||
| 
 | ||||
|   src = fetchzip { | ||||
|     url = "https://registry.npmjs.org/@anthropic-ai/claude-code/-/claude-code-${version}.tgz"; | ||||
|     hash = "sha256-Dnooy0KNfhirTu7hv6DfwL7SHwf++CKtG8VHptNhcxU="; | ||||
|     hash = "sha256-nl7NGiREuFpbr0if273FfbSpjD/BG8a/uMXfYtiZgbE="; | ||||
|   }; | ||||
| 
 | ||||
|   npmDepsHash = "sha256-Q3m4q0g/H5ZWmnMXSipRt3FUFu+SgDAJutVelQsv9ls="; | ||||
|   npmDepsHash = "sha256-ppsyT+VXXaIP1ncuJx1I8M6eLTk7zP1KStf5nnWSwSo="; | ||||
| 
 | ||||
|   postPatch = '' | ||||
|     cp ${./package-lock.json} package-lock.json | ||||
|  | ||||
| @ -8,17 +8,17 @@ | ||||
| 
 | ||||
| rustPlatform.buildRustPackage (finalAttrs: { | ||||
|   pname = "clorinde"; | ||||
|   version = "0.16.0"; | ||||
|   version = "1.0.0"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "halcyonnouveau"; | ||||
|     repo = "clorinde"; | ||||
|     tag = "clorinde-v${finalAttrs.version}"; | ||||
|     hash = "sha256-ze/PEML1buh3HlVgz6ifMPWfZnr6eT3VpIXf7jR68jw="; | ||||
|     hash = "sha256-AYoSs3rDZ5j8Xt6E4X7RmgccM3bng3rgWzVLFjhmfR0="; | ||||
|   }; | ||||
| 
 | ||||
|   useFetchCargoVendor = true; | ||||
|   cargoHash = "sha256-dp5m/PLVG8xUM6LCq48NKK0P8di44keB/YZ9ocfL0Bg="; | ||||
|   cargoHash = "sha256-hxOVocfQvBlaYh227SVLYncfVZ80bDxIvoMtthaqQqc="; | ||||
| 
 | ||||
|   cargoBuildFlags = [ "--package=clorinde" ]; | ||||
| 
 | ||||
|  | ||||
| @ -2,9 +2,9 @@ | ||||
| 
 | ||||
| buildDotnetGlobalTool { | ||||
|   pname = "fantomas"; | ||||
|   version = "7.0.2"; | ||||
|   version = "7.0.3"; | ||||
| 
 | ||||
|   nugetHash = "sha256-BAaENIm/ksTiXrUImRgKoIXTGIlgsX7ch6ayoFjhJXA="; | ||||
|   nugetHash = "sha256-0XlfV7SxXPDnk/CjkUesJSaH0cxlNHJ+Jj86zNUhkNA="; | ||||
| 
 | ||||
|   meta = with lib; { | ||||
|     description = "F# source code formatter"; | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
| }: | ||||
| 
 | ||||
| let | ||||
|   version = "18.1.1"; | ||||
|   version = "18.1.2"; | ||||
|   package_version = "v${lib.versions.major version}"; | ||||
|   gitaly_package = "gitlab.com/gitlab-org/gitaly/${package_version}"; | ||||
| 
 | ||||
| @ -21,7 +21,7 @@ let | ||||
|       owner = "gitlab-org"; | ||||
|       repo = "gitaly"; | ||||
|       rev = "v${version}"; | ||||
|       hash = "sha256-R79UV6QIEO/B7xQ3ds4scm7twHmalziksKBJ97tYVJM="; | ||||
|       hash = "sha256-ErA04W6rWsjSay02bst0ur1mztrdo8SW/mpGtln4unI="; | ||||
|     }; | ||||
| 
 | ||||
|     vendorHash = "sha256-BTpcnaHNyLgdAA9KqqA+mBo18fmQ0+OwLGNOPHRJ/IE="; | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
| 
 | ||||
| buildGoModule rec { | ||||
|   pname = "gitlab-container-registry"; | ||||
|   version = "4.23.1"; | ||||
|   version = "4.24.0"; | ||||
|   rev = "v${version}-gitlab"; | ||||
| 
 | ||||
|   # nixpkgs-update: no auto update | ||||
| @ -14,10 +14,10 @@ buildGoModule rec { | ||||
|     owner = "gitlab-org"; | ||||
|     repo = "container-registry"; | ||||
|     inherit rev; | ||||
|     hash = "sha256-eCuSuQXtzd2jLJf9G8DO1KGXdT8bYGe9tcKw6BZNiiI="; | ||||
|     hash = "sha256-GNL7L6DKIKEgDEZQkeHNOn4R5SnWnHvNoUIs2YLjoR8="; | ||||
|   }; | ||||
| 
 | ||||
|   vendorHash = "sha256-OrdlQp+USRf+Yc7UDjIncDpbuRu5ui6TUoYY2MMc8Ro="; | ||||
|   vendorHash = "sha256-zisadCxyfItD/n7VGbtbvhl8MRHiqdw0Kkrg6ebgS/8="; | ||||
| 
 | ||||
|   checkFlags = | ||||
|     let | ||||
|  | ||||
| @ -6,14 +6,14 @@ | ||||
| 
 | ||||
| buildGoModule rec { | ||||
|   pname = "gitlab-pages"; | ||||
|   version = "18.1.1"; | ||||
|   version = "18.1.2"; | ||||
| 
 | ||||
|   # nixpkgs-update: no auto update | ||||
|   src = fetchFromGitLab { | ||||
|     owner = "gitlab-org"; | ||||
|     repo = "gitlab-pages"; | ||||
|     rev = "v${version}"; | ||||
|     hash = "sha256-tqT+ARebnBhBHzOenkL/o7/tf4/urxKFAOFMwCQSzeA="; | ||||
|     hash = "sha256-XY/WK19nujQPdsicGDHS5gEZf3uJZdW41R4xK9hDML0="; | ||||
|   }; | ||||
| 
 | ||||
|   vendorHash = "sha256-6ZHKwPhC3N813kiw1NnPOMVc2CBSIClwc4MunDi0gCk="; | ||||
|  | ||||
| @ -1,15 +1,15 @@ | ||||
| { | ||||
|   "version": "18.1.1", | ||||
|   "repo_hash": "1agw51d1qvvx6yyzz71sz4mkx04ic8hmql8lggz3x5scnhglnzjq", | ||||
|   "version": "18.1.2", | ||||
|   "repo_hash": "072ib6rc7mw9pdzql8514k4z76i1ahssyj5kypgyvf9qj4naym0b", | ||||
|   "yarn_hash": "0c5pp3dpvw0q0nfl6w1lpdmk7dvkfinwb7z7a3vq22wgzca23x2m", | ||||
|   "owner": "gitlab-org", | ||||
|   "repo": "gitlab", | ||||
|   "rev": "v18.1.1-ee", | ||||
|   "rev": "v18.1.2-ee", | ||||
|   "passthru": { | ||||
|     "GITALY_SERVER_VERSION": "18.1.1", | ||||
|     "GITLAB_PAGES_VERSION": "18.1.1", | ||||
|     "GITALY_SERVER_VERSION": "18.1.2", | ||||
|     "GITLAB_PAGES_VERSION": "18.1.2", | ||||
|     "GITLAB_SHELL_VERSION": "14.42.0", | ||||
|     "GITLAB_ELASTICSEARCH_INDEXER_VERSION": "5.6.0", | ||||
|     "GITLAB_WORKHORSE_VERSION": "18.1.1" | ||||
|     "GITLAB_WORKHORSE_VERSION": "18.1.2" | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -10,7 +10,7 @@ in | ||||
| buildGoModule rec { | ||||
|   pname = "gitlab-workhorse"; | ||||
| 
 | ||||
|   version = "18.1.1"; | ||||
|   version = "18.1.2"; | ||||
| 
 | ||||
|   # nixpkgs-update: no auto update | ||||
|   src = fetchFromGitLab { | ||||
|  | ||||
| @ -648,7 +648,9 @@ gem 'gitaly', '~> 18.1.0.pre.rc1', feature_category: :gitaly | ||||
| # KAS GRPC protocol definitions | ||||
| gem 'gitlab-kas-grpc', '~> 17.11.0', feature_category: :deployment_management | ||||
| 
 | ||||
| gem 'grpc', '~> 1.72.0', feature_category: :shared | ||||
| # Lock until 1.74.0 is available | ||||
| # https://gitlab.com/gitlab-com/gl-infra/production/-/issues/20067 | ||||
| gem 'grpc', '= 1.63.0', feature_category: :shared | ||||
| 
 | ||||
| gem 'google-protobuf', '~> 3.25', '>= 3.25.3', feature_category: :shared | ||||
| 
 | ||||
|  | ||||
| @ -48,7 +48,7 @@ PATH | ||||
|       google-cloud-storage_transfer (~> 1.2.0) | ||||
|       google-protobuf (~> 3.25, >= 3.25.3) | ||||
|       googleauth (~> 1.8.1) | ||||
|       grpc (~> 1.72.0) | ||||
|       grpc (= 1.63.0) | ||||
|       json (~> 2.7) | ||||
|       jwt (~> 2.5) | ||||
|       logger (~> 1.5) | ||||
| @ -956,8 +956,8 @@ GEM | ||||
|       graphql (~> 2.0) | ||||
|       html-pipeline (~> 2.14, >= 2.14.3) | ||||
|       sass-embedded (~> 1.58) | ||||
|     grpc (1.72.0) | ||||
|       google-protobuf (>= 3.25, < 5.0) | ||||
|     grpc (1.63.0) | ||||
|       google-protobuf (~> 3.25) | ||||
|       googleapis-common-protos-types (~> 1.0) | ||||
|     grpc-google-iam-v1 (1.5.0) | ||||
|       google-protobuf (~> 3.18) | ||||
| @ -2210,7 +2210,7 @@ DEPENDENCIES | ||||
|   graphlyte (~> 1.0.0) | ||||
|   graphql (= 2.4.13) | ||||
|   graphql-docs (~> 5.0.0) | ||||
|   grpc (~> 1.72.0) | ||||
|   grpc (= 1.63.0) | ||||
|   gssapi (~> 1.3.1) | ||||
|   guard-rspec | ||||
|   haml_lint (~> 0.58) | ||||
|  | ||||
| @ -3886,10 +3886,10 @@ src: { | ||||
|     platforms = [ ]; | ||||
|     source = { | ||||
|       remotes = [ "https://rubygems.org" ]; | ||||
|       sha256 = "02gakdhvpl777b41i8cgkrj7gk0jlq4fza9hjksp2r7ryji0vyjn"; | ||||
|       sha256 = "11ink0ayf14qgs3msn5a7dpg49vm3ck2415r64nfk1i8xv286hsz"; | ||||
|       type = "gem"; | ||||
|     }; | ||||
|     version = "1.72.0"; | ||||
|     version = "1.63.0"; | ||||
|   }; | ||||
|   grpc-google-iam-v1 = { | ||||
|     dependencies = [ | ||||
|  | ||||
| @ -3,6 +3,7 @@ | ||||
|   buildGo124Module, | ||||
|   fetchFromGitHub, | ||||
|   installShellFiles, | ||||
|   nixosTests, | ||||
|   scdoc, | ||||
| }: | ||||
| 
 | ||||
| @ -43,6 +44,10 @@ buildGo124Module rec { | ||||
|     rm pkg/camo/proxy_{,filter_}test.go | ||||
|   ''; | ||||
| 
 | ||||
|   passthru.tests = { | ||||
|     inherit (nixosTests) go-camo; | ||||
|   }; | ||||
| 
 | ||||
|   meta = { | ||||
|     description = "Camo server is a special type of image proxy that proxies non-secure images over SSL/TLS"; | ||||
|     homepage = "https://github.com/cactus/go-camo"; | ||||
|  | ||||
| @ -11,13 +11,13 @@ | ||||
| 
 | ||||
| buildGoModule rec { | ||||
|   pname = "go-musicfox"; | ||||
|   version = "4.6.2"; | ||||
|   version = "4.6.3"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "go-musicfox"; | ||||
|     repo = "go-musicfox"; | ||||
|     rev = "v${version}"; | ||||
|     hash = "sha256-GpzbHShQvsgPNnUjk52PSDhvmxEuJVXNXI7z8ESv6QQ="; | ||||
|     hash = "sha256-TxBd+Q7tEyJpcUwOWAl2U1gmdNRYrBkGCtT961/8K1E="; | ||||
|   }; | ||||
| 
 | ||||
|   deleteVendor = true; | ||||
|  | ||||
| @ -34,13 +34,13 @@ in | ||||
| 
 | ||||
| stdenv.mkDerivation rec { | ||||
|   pname = "janus-gateway"; | ||||
|   version = "1.3.1"; | ||||
|   version = "1.3.2"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "meetecho"; | ||||
|     repo = "janus-gateway"; | ||||
|     rev = "v${version}"; | ||||
|     sha256 = "sha256-Y4MdbB706aziKPxM9y/3uCKpc60dMDlV0xgugDjfa7A="; | ||||
|     sha256 = "sha256-FvTNe2lpDBchhVLTD+fKtwTcuqsuSEeNWcRAbLibLbc="; | ||||
|   }; | ||||
| 
 | ||||
|   nativeBuildInputs = [ | ||||
|  | ||||
| @ -42,14 +42,14 @@ in | ||||
| # as bootloader for various platforms and corresponding binary and helper files. | ||||
| stdenv.mkDerivation (finalAttrs: { | ||||
|   pname = "limine"; | ||||
|   version = "9.3.4"; | ||||
|   version = "9.4.0"; | ||||
| 
 | ||||
|   # We don't use the Git source but the release tarball, as the source has a | ||||
|   # `./bootstrap` script performing network access to download resources. | ||||
|   # Packaging that in Nix is very cumbersome. | ||||
|   src = fetchurl { | ||||
|     url = "https://github.com/limine-bootloader/limine/releases/download/v${finalAttrs.version}/limine-${finalAttrs.version}.tar.gz"; | ||||
|     hash = "sha256-GXArMxm7vDyUShTIM1O8/4M8h/ol/b8YcsXdodxJqeM="; | ||||
|     hash = "sha256-ddQB0wKMhKSnPrJflgsDfyWCzOiFehf/2CijPiVk65U="; | ||||
|   }; | ||||
| 
 | ||||
|   enableParallelBuilding = true; | ||||
|  | ||||
| @ -72,13 +72,13 @@ let | ||||
| in | ||||
| effectiveStdenv.mkDerivation (finalAttrs: { | ||||
|   pname = "llama-cpp"; | ||||
|   version = "5760"; | ||||
|   version = "5836"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "ggml-org"; | ||||
|     repo = "llama.cpp"; | ||||
|     tag = "b${finalAttrs.version}"; | ||||
|     hash = "sha256-sl1lhj40c546YRuCTn6BlmS60Rd2TBKNx4TaQ0I6110="; | ||||
|     hash = "sha256-fo6wnwN3a4xZamwm68EVLNVfQkk+vSxgEoORQKLzdH8="; | ||||
|     leaveDotGit = true; | ||||
|     postFetch = '' | ||||
|       git -C "$out" rev-parse --short HEAD > $out/COMMIT | ||||
|  | ||||
| @ -108,9 +108,9 @@ def test_flake_from_arg( | ||||
|             return_value=True, | ||||
|         ), | ||||
|         patch( | ||||
|             "pathlib.Path.is_symlink", | ||||
|             "pathlib.Path.resolve", | ||||
|             autospec=True, | ||||
|             return_value=False, | ||||
|             return_value=Path("/etc/nixos/flake.nix"), | ||||
|         ), | ||||
|     ): | ||||
|         assert m.Flake.from_arg(None, None) == m.Flake( | ||||
| @ -123,11 +123,6 @@ def test_flake_from_arg( | ||||
|             autospec=True, | ||||
|             return_value=True, | ||||
|         ), | ||||
|         patch( | ||||
|             "pathlib.Path.is_symlink", | ||||
|             autospec=True, | ||||
|             return_value=True, | ||||
|         ), | ||||
|         patch( | ||||
|             "pathlib.Path.resolve", | ||||
|             autospec=True, | ||||
|  | ||||
| @ -3,6 +3,7 @@ | ||||
|   stdenv, | ||||
|   fetchFromGitHub, | ||||
|   fetchYarnDeps, | ||||
|   nixosTests, | ||||
|   writableTmpDirAsHomeHook, | ||||
|   writeText, | ||||
| 
 | ||||
| @ -10,7 +11,7 @@ | ||||
|   nodejs, | ||||
|   yarn, | ||||
| 
 | ||||
|   # Custom application configuration placed to theme/config.theme.js file | ||||
|   # Custom application configuration placed to theme/config.theme.js file. | ||||
|   # For the list of available configuration options see | ||||
|   # https://github.com/osm-search/nominatim-ui/blob/master/dist/config.defaults.js | ||||
|   customConfig ? null, | ||||
| @ -83,6 +84,10 @@ stdenv.mkDerivation (finalAttrs: { | ||||
|     runHook postInstall | ||||
|   ''; | ||||
| 
 | ||||
|   passthru.tests = { | ||||
|     inherit (nixosTests) nominatim; | ||||
|   }; | ||||
| 
 | ||||
|   meta = { | ||||
|     description = "Debugging user interface for Nominatim geocoder"; | ||||
|     homepage = "https://github.com/osm-search/nominatim-ui"; | ||||
|  | ||||
| @ -7,6 +7,7 @@ | ||||
|   python3Packages, | ||||
| 
 | ||||
|   nominatim, # required for testVersion | ||||
|   nixosTests, | ||||
|   testers, | ||||
| }: | ||||
| 
 | ||||
| @ -64,8 +65,9 @@ python3Packages.buildPythonApplication rec { | ||||
| 
 | ||||
|   pythonImportsCheck = [ "nominatim_db" ]; | ||||
| 
 | ||||
|   passthru = { | ||||
|     tests.version = testers.testVersion { package = nominatim; }; | ||||
|   passthru.tests = { | ||||
|     version = testers.testVersion { package = nominatim; }; | ||||
|     inherit (nixosTests) nominatim; | ||||
|   }; | ||||
| 
 | ||||
|   meta = { | ||||
|  | ||||
							
								
								
									
										72
									
								
								pkgs/by-name/op/optee-client/package.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								pkgs/by-name/op/optee-client/package.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,72 @@ | ||||
| { | ||||
|   fetchFromGitHub, | ||||
|   isNixOS ? true, | ||||
|   lib, | ||||
|   libuuid, | ||||
|   pkg-config, | ||||
|   stdenv, | ||||
|   which, | ||||
| }: | ||||
| 
 | ||||
| stdenv.mkDerivation (finalAttrs: { | ||||
|   pname = "optee-client"; | ||||
|   version = "4.6.0"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "OP-TEE"; | ||||
|     repo = "optee_client"; | ||||
|     rev = finalAttrs.version; | ||||
|     hash = "sha256-hHEIn0WU4XfqwZbOdg9kwSDxDcvK7Tvxtelamfc3IRM="; | ||||
|   }; | ||||
| 
 | ||||
|   outputs = [ | ||||
|     "out" | ||||
|     "lib" | ||||
|     "dev" | ||||
|   ]; | ||||
| 
 | ||||
|   strictDeps = true; | ||||
| 
 | ||||
|   enableParallelBuilding = true; | ||||
| 
 | ||||
|   nativeBuildInputs = [ | ||||
|     which | ||||
|     pkg-config | ||||
|   ]; | ||||
|   buildInputs = [ libuuid ]; | ||||
| 
 | ||||
|   makeFlags = | ||||
|     [ | ||||
|       "CROSS_COMPILE=${stdenv.cc.targetPrefix}" | ||||
|       "DESTDIR=$(out)" | ||||
|       "SBINDIR=/bin" | ||||
|       "INCLUDEDIR=/include" | ||||
|       "LIBDIR=/lib" | ||||
|     ] | ||||
|     ++ | ||||
|     # If we are building for NixOS, change default optee config to use paths | ||||
|     # that will work well with NixOS. | ||||
|     lib.optionals isNixOS [ | ||||
|       "CFG_TEE_CLIENT_LOAD_PATH=/run/current-system/sw/lib" | ||||
|       "CFG_TEE_PLUGIN_LOAD_PATH=/run/current-system/sw/lib/tee-supplicant/plugins" | ||||
|       "CFG_TEE_FS_PARENT_PATH=/var/lib/tee" | ||||
|     ]; | ||||
| 
 | ||||
|   preFixup = '' | ||||
|     mkdir -p "$lib" "$dev" | ||||
|     mv "$out/lib" "$lib" | ||||
|     mv "$out/include" "$dev" | ||||
|   ''; | ||||
| 
 | ||||
|   meta = { | ||||
|     description = "Normal world client for OPTEE OS"; | ||||
|     homepage = "https://github.com/OP-TEE/optee_client"; | ||||
|     changelog = "https://github.com/OP-TEE/optee_client/releases/tag/${finalAttrs.version}"; | ||||
|     license = lib.licenses.bsd2; | ||||
|     maintainers = [ lib.maintainers.jmbaur ]; | ||||
|     platforms = [ | ||||
|       "aarch64-linux" | ||||
|       "armv7l-linux" | ||||
|     ]; | ||||
|   }; | ||||
| }) | ||||
| @ -12,17 +12,17 @@ | ||||
| 
 | ||||
| rustPlatform.buildRustPackage (finalAttrs: { | ||||
|   pname = "pimsync"; | ||||
|   version = "0.4.2"; | ||||
|   version = "0.4.3"; | ||||
| 
 | ||||
|   src = fetchFromSourcehut { | ||||
|     owner = "~whynothugo"; | ||||
|     repo = "pimsync"; | ||||
|     rev = "v${finalAttrs.version}"; | ||||
|     hash = "sha256-6oV9E6Q6FmCh24xT9+lsQ47GVs70sSujsn54dX6CPgY="; | ||||
|     hash = "sha256-VPrEY3aJKhn96oaehJ8MrrUj0XoSOMWC7APbnw6OrsQ="; | ||||
|   }; | ||||
| 
 | ||||
|   useFetchCargoVendor = true; | ||||
|   cargoHash = "sha256-vnBk0uojWDM9PS8v5Qda2UflmIFZ09Qp9l25qTTWGMc="; | ||||
|   cargoHash = "sha256-m5tg50C6DMFuBrCW9sxYfeRRZv6Sncp8X40fzaKEsi0="; | ||||
| 
 | ||||
|   PIMSYNC_VERSION = finalAttrs.version; | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										35
									
								
								pkgs/by-name/ru/rustical/package.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								pkgs/by-name/ru/rustical/package.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| { | ||||
|   lib, | ||||
|   rustPlatform, | ||||
|   fetchFromGitHub, | ||||
|   pkg-config, | ||||
|   openssl, | ||||
| }: | ||||
| 
 | ||||
| rustPlatform.buildRustPackage (finalAttrs: { | ||||
|   pname = "rustical"; | ||||
|   version = "0.4.11"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "lennart-k"; | ||||
|     repo = "rustical"; | ||||
|     tag = "v${finalAttrs.version}"; | ||||
|     hash = "sha256-QWuJKEc6hBA2rdbaqdhrah+WyRwVd91Y8/BIOaKlW28="; | ||||
|   }; | ||||
| 
 | ||||
|   cargoHash = "sha256-dQF+6my+TxZ6niFO5OnLXcPt0LGEymaXE9NqZWU5HJk="; | ||||
| 
 | ||||
|   nativeBuildInputs = [ pkg-config ]; | ||||
|   buildInputs = [ openssl ]; | ||||
| 
 | ||||
|   env.OPENSSL_NO_VENDOR = true; | ||||
| 
 | ||||
|   meta = { | ||||
|     description = "Yet another calendar server aiming to be simple, fast and passwordless"; | ||||
|     homepage = "https://github.com/lennart-k/rustical"; | ||||
|     changelog = "https://github.com/lennart-k/rustical/releases/tag/v${finalAttrs.version}"; | ||||
|     license = lib.licenses.agpl3Plus; | ||||
|     maintainers = with lib.maintainers; [ PopeRigby ]; | ||||
|     mainProgram = "rustical"; | ||||
|   }; | ||||
| }) | ||||
| @ -7,13 +7,13 @@ | ||||
| 
 | ||||
| python3.pkgs.buildPythonApplication rec { | ||||
|   pname = "signal-export"; | ||||
|   version = "3.5.1"; | ||||
|   version = "3.6.0"; | ||||
|   pyproject = true; | ||||
| 
 | ||||
|   src = fetchPypi { | ||||
|     inherit version; | ||||
|     pname = "signal_export"; | ||||
|     hash = "sha256-UhLWSYdJEDhZ1zI3nxhJoqeH8JfR4s9Hdp6fJ4UNROQ="; | ||||
|     hash = "sha256-lflRY6EC9fqgdYwQ9Incc2PJ22okZC9Juu6X7pxGJ8w="; | ||||
|   }; | ||||
| 
 | ||||
|   build-system = with python3.pkgs; [ | ||||
|  | ||||
| @ -8,38 +8,38 @@ | ||||
|   "fetchurlAttrSet": { | ||||
|     "docker-credential-up": { | ||||
|       "aarch64-darwin": { | ||||
|         "hash": "sha256-ByiFy8k6qwKXTp7iLoojUNNKhhZnbqc6ms6g+r4f9u0=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-87.g20595f83/bundle/docker-credential-up/darwin_arm64.tar.gz" | ||||
|         "hash": "sha256-9X6D0WI9Vru/M3oQ/yK0AJjth6MTGfxeEf5Axx2rAlc=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-115.gbdd4b5af/bundle/docker-credential-up/darwin_arm64.tar.gz" | ||||
|       }, | ||||
|       "aarch64-linux": { | ||||
|         "hash": "sha256-qis91nt43HGEfuqcCH5ri/s4QiHiMrRMTinSUjQeI3o=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-87.g20595f83/bundle/docker-credential-up/linux_arm64.tar.gz" | ||||
|         "hash": "sha256-g7AzAp4cdJIsZ3mtkYF2MzlLHgwauFORaIkQ6mdwkuI=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-115.gbdd4b5af/bundle/docker-credential-up/linux_arm64.tar.gz" | ||||
|       }, | ||||
|       "x86_64-darwin": { | ||||
|         "hash": "sha256-s2ORdd3G87Vo9I5zSZXGisjSMr0x86sCu6WOxOZBWTk=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-87.g20595f83/bundle/docker-credential-up/darwin_amd64.tar.gz" | ||||
|         "hash": "sha256-8F7r3o3e3Mo+GDicS+5Hg6qNz5B+Tt8OHcosHzpZUQM=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-115.gbdd4b5af/bundle/docker-credential-up/darwin_amd64.tar.gz" | ||||
|       }, | ||||
|       "x86_64-linux": { | ||||
|         "hash": "sha256-5q/XactXioaOqUYwrojg5xgZg+pKjqnxR9tB8ILaaHg=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-87.g20595f83/bundle/docker-credential-up/linux_amd64.tar.gz" | ||||
|         "hash": "sha256-3TduM86fAb3cIFhb8SNrAFisu9RjQ7H0gtd7csJfSb0=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-115.gbdd4b5af/bundle/docker-credential-up/linux_amd64.tar.gz" | ||||
|       } | ||||
|     }, | ||||
|     "up": { | ||||
|       "aarch64-darwin": { | ||||
|         "hash": "sha256-Rud8CPSlxl08cRjChFsZFG6Mfro8BiRWN7f2+DRwUsE=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-87.g20595f83/bundle/up/darwin_arm64.tar.gz" | ||||
|         "hash": "sha256-xLIdYSR+ILRY2qf5lPMroxZDvDEfDYxrz3cX4ZI0+h0=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-115.gbdd4b5af/bundle/up/darwin_arm64.tar.gz" | ||||
|       }, | ||||
|       "aarch64-linux": { | ||||
|         "hash": "sha256-KN84vzXue9Tc8O9Ci/4emI7GOX8pETcVc/hpFuBJmy4=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-87.g20595f83/bundle/up/linux_arm64.tar.gz" | ||||
|         "hash": "sha256-nUOTdWTUJe8eyHTIF4b/00Q9J0Qb4QaAIdAz90h4yHo=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-115.gbdd4b5af/bundle/up/linux_arm64.tar.gz" | ||||
|       }, | ||||
|       "x86_64-darwin": { | ||||
|         "hash": "sha256-qHN7PSqU5nK5Dh8k4HEjwTmjN/yIoJh7VBoQ/dJS3/s=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-87.g20595f83/bundle/up/darwin_amd64.tar.gz" | ||||
|         "hash": "sha256-qn2cfprwaLP7chMcWN+zw8+G/tHGNlJtPMX6iB9XjCY=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-115.gbdd4b5af/bundle/up/darwin_amd64.tar.gz" | ||||
|       }, | ||||
|       "x86_64-linux": { | ||||
|         "hash": "sha256-mw80qJ+9CRQFFKF7bhWiEYcW1P7Jm4dqkXTN+F8erPM=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-87.g20595f83/bundle/up/linux_amd64.tar.gz" | ||||
|         "hash": "sha256-AAmdDWW0MmLYP5viRJ0BpXIVpmU7R6iSN5hwGm6HIuc=", | ||||
|         "url": "https://cli.upbound.io/main/v0.39.0-115.gbdd4b5af/bundle/up/linux_amd64.tar.gz" | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
| @ -49,5 +49,5 @@ | ||||
|     "x86_64-darwin", | ||||
|     "x86_64-linux" | ||||
|   ], | ||||
|   "version": "0.39.0-87.g20595f83" | ||||
|   "version": "0.39.0-115.gbdd4b5af" | ||||
| } | ||||
|  | ||||
| @ -7,11 +7,11 @@ | ||||
| 
 | ||||
| stdenvNoCC.mkDerivation rec { | ||||
|   pname = "wireless-regdb"; | ||||
|   version = "2025.02.20"; | ||||
|   version = "2025.07.10"; | ||||
| 
 | ||||
|   src = fetchurl { | ||||
|     url = "https://www.kernel.org/pub/software/network/${pname}/${pname}-${version}.tar.xz"; | ||||
|     hash = "sha256-V/jnchz1qIDBOuDCAu27IQkqBg1F+enFm80qgnK/pFY="; | ||||
|     hash = "sha256-qDQLzc0bXbbHkUmHnRIrFw87sHU4FxjU9Cmtgxpvoo0="; | ||||
|   }; | ||||
| 
 | ||||
|   dontBuild = true; | ||||
|  | ||||
| @ -39,14 +39,14 @@ | ||||
| 
 | ||||
| buildPythonPackage rec { | ||||
|   pname = "arviz"; | ||||
|   version = "0.21.0"; | ||||
|   version = "0.22.0"; | ||||
|   pyproject = true; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "arviz-devs"; | ||||
|     repo = "arviz"; | ||||
|     tag = "v${version}"; | ||||
|     hash = "sha256-rrOvdyZE0wo3iiiQ2hHklAtLU38mXs3hLsb+Fwy9eAk="; | ||||
|     hash = "sha256-ZzZZKEtpVy44119H+upU36VLriZjjwPz3gqgKrL+gRI="; | ||||
|   }; | ||||
| 
 | ||||
|   build-system = [ | ||||
|  | ||||
| @ -9,6 +9,7 @@ | ||||
| 
 | ||||
|   # dependencies | ||||
|   addict, | ||||
|   distutils, | ||||
|   matplotlib, | ||||
|   numpy, | ||||
|   opencv4, | ||||
| @ -67,17 +68,13 @@ buildPythonPackage rec { | ||||
|     + '' | ||||
|       substituteInPlace tests/test_config/test_lazy.py \ | ||||
|         --replace-fail "import numpy.compat" "" | ||||
| 
 | ||||
|       substituteInPlace mmengine/utils/dl_utils/collect_env.py \ | ||||
|         --replace-fail \ | ||||
|           "from distutils" \ | ||||
|           "from setuptools._distutils" | ||||
|     ''; | ||||
| 
 | ||||
|   build-system = [ setuptools ]; | ||||
| 
 | ||||
|   dependencies = [ | ||||
|     addict | ||||
|     distutils | ||||
|     matplotlib | ||||
|     numpy | ||||
|     opencv4 | ||||
|  | ||||
| @ -35,14 +35,14 @@ | ||||
| 
 | ||||
| buildPythonPackage rec { | ||||
|   pname = "orbax-checkpoint"; | ||||
|   version = "0.11.18"; | ||||
|   version = "0.11.19"; | ||||
|   pyproject = true; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "google"; | ||||
|     repo = "orbax"; | ||||
|     tag = "v${version}"; | ||||
|     hash = "sha256-Uosd2TfC3KJMp46SnNnodPBc+G1nNdqFOwPQA+aVyrQ="; | ||||
|     hash = "sha256-j15E4jGvxIjEdWG6Lwr9mvPXr9WifrD1zFF6Vj+7wik="; | ||||
|   }; | ||||
| 
 | ||||
|   sourceRoot = "${src.name}/checkpoint"; | ||||
|  | ||||
							
								
								
									
										88
									
								
								pkgs/development/python-modules/sqlite-vec/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								pkgs/development/python-modules/sqlite-vec/default.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | ||||
| { | ||||
|   lib, | ||||
|   buildPythonPackage, | ||||
|   fetchpatch, | ||||
| 
 | ||||
|   # build-system | ||||
|   setuptools, | ||||
|   setuptools-scm, | ||||
| 
 | ||||
|   # dependencies | ||||
|   sqlite-vec-c, # alias for pkgs.sqlite-vec | ||||
| 
 | ||||
|   # optional dependencies | ||||
|   numpy, | ||||
| 
 | ||||
|   # check inputs | ||||
|   openai, | ||||
|   pytestCheckHook, | ||||
| }: | ||||
| 
 | ||||
| buildPythonPackage rec { | ||||
|   inherit (sqlite-vec-c) pname version src; | ||||
|   pyproject = true; | ||||
| 
 | ||||
|   # The actual source root is bindings/python but the patches | ||||
|   # apply to the bindings directory. | ||||
|   # This is a known issue, see https://discourse.nixos.org/t/how-to-apply-patches-with-sourceroot/59727 | ||||
|   sourceRoot = "${src.name}/bindings"; | ||||
| 
 | ||||
|   patches = [ | ||||
|     (fetchpatch { | ||||
|       # https://github.com/asg017/sqlite-vec/pull/233 | ||||
|       name = "add-python-build-files.patch"; | ||||
|       url = "https://github.com/asg017/sqlite-vec/commit/c1917deb11aa79dcac32440679345b93e13b1b86.patch"; | ||||
|       hash = "sha256-4/9QLKuM/1AbD8AQHwJ14rhWVYVc+MILvK6+tWwWQlw="; | ||||
|       stripLen = 1; | ||||
|     }) | ||||
|     (fetchpatch { | ||||
|       # https://github.com/asg017/sqlite-vec/pull/233 | ||||
|       name = "add-python-test.patch"; | ||||
|       url = "https://github.com/asg017/sqlite-vec/commit/608972c9dcbfc7f4583e99fd8de6e5e16da11081.patch"; | ||||
|       hash = "sha256-8dfw7zs7z2FYh8DoAxurMYCDMOheg8Zl1XGcPw1A1BM="; | ||||
|       stripLen = 1; | ||||
|     }) | ||||
|   ]; | ||||
| 
 | ||||
|   # Change into the proper directory for building, move `extra_init.py` into its proper location, | ||||
|   # and supply the path to the library. | ||||
|   postPatch = '' | ||||
|     cd python | ||||
|     mv extra_init.py sqlite_vec/ | ||||
|     substituteInPlace sqlite_vec/__init__.py \ | ||||
|       --replace-fail "@libpath@" "${lib.getLib sqlite-vec-c}/lib/" | ||||
|   ''; | ||||
| 
 | ||||
|   build-system = [ | ||||
|     setuptools | ||||
|     setuptools-scm | ||||
|   ]; | ||||
| 
 | ||||
|   dependencies = [ | ||||
|     sqlite-vec-c | ||||
|   ]; | ||||
| 
 | ||||
|   optional-dependencies = { | ||||
|     numpy = [ | ||||
|       numpy | ||||
|     ]; | ||||
|   }; | ||||
| 
 | ||||
|   nativeCheckInputs = [ | ||||
|     numpy | ||||
|     openai | ||||
|     pytestCheckHook | ||||
|     sqlite-vec-c | ||||
|   ]; | ||||
| 
 | ||||
|   pythonImportsCheck = [ "sqlite_vec" ]; | ||||
| 
 | ||||
|   meta = sqlite-vec-c.meta // { | ||||
|     description = "Python bindings for sqlite-vec"; | ||||
|     maintainers = [ lib.maintainers.sarahec ]; | ||||
|     badPlatforms = [ | ||||
|       # segfaults during test | ||||
|       "x86_64-darwin" | ||||
|     ]; | ||||
|   }; | ||||
| } | ||||
| @ -22,14 +22,14 @@ | ||||
| 
 | ||||
| buildPythonPackage rec { | ||||
|   pname = "timm"; | ||||
|   version = "1.0.16"; | ||||
|   version = "1.0.17"; | ||||
|   pyproject = true; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "huggingface"; | ||||
|     repo = "pytorch-image-models"; | ||||
|     tag = "v${version}"; | ||||
|     hash = "sha256-8z23KQvb+wAlM/IXDC9j6OV8ioZE1dx0xhITSzdHoeY="; | ||||
|     hash = "sha256-NWWKDWcwRrQ2lrNSbkA2xepAoPP7+0G7g7eIjGLZSCw="; | ||||
|   }; | ||||
| 
 | ||||
|   build-system = [ pdm-backend ]; | ||||
|  | ||||
| @ -24,7 +24,7 @@ | ||||
|   hnswlib, | ||||
|   pgvector, | ||||
|   sqlalchemy, | ||||
|   sqlite-vec, | ||||
|   sqlite-vec-c, | ||||
|   # api | ||||
|   aiohttp, | ||||
|   fastapi, | ||||
| @ -103,7 +103,7 @@ let | ||||
|     hnswlib | ||||
|     pgvector | ||||
|     sqlalchemy | ||||
|     sqlite-vec | ||||
|     sqlite-vec-c | ||||
|   ]; | ||||
|   api = [ | ||||
|     aiohttp | ||||
|  | ||||
| @ -7,19 +7,15 @@ | ||||
| 
 | ||||
| stdenv.mkDerivation rec { | ||||
|   pname = "flow"; | ||||
|   version = "0.238.3"; | ||||
|   version = "0.274.2"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "facebook"; | ||||
|     repo = "flow"; | ||||
|     rev = "v${version}"; | ||||
|     hash = "sha256-WlHta/wXTULehopXeIUdNAQb12Lf0SJnm1HIVHTDshA="; | ||||
|     tag = "v${version}"; | ||||
|     hash = "sha256-ZktRFFgPvIfbsAY3C6g3s3zqX3wES+QShu811m183cA="; | ||||
|   }; | ||||
| 
 | ||||
|   postPatch = '' | ||||
|     substituteInPlace src/services/inference/check_cache.ml --replace 'Core_kernel' 'Core' | ||||
|   ''; | ||||
| 
 | ||||
|   makeFlags = [ "FLOW_RELEASE=1" ]; | ||||
| 
 | ||||
|   installPhase = '' | ||||
| @ -39,12 +35,12 @@ stdenv.mkDerivation rec { | ||||
|   buildInputs = ( | ||||
|     with ocamlPackages; | ||||
|     [ | ||||
|       core_kernel | ||||
|       camlp-streams | ||||
|       dtoa | ||||
|       fileutils | ||||
|       lwt_log | ||||
|       lwt_ppx | ||||
|       ocaml_lwt | ||||
|       lwt | ||||
|       ppx_deriving | ||||
|       ppx_gen_rec | ||||
|       ppx_let | ||||
|  | ||||
| @ -18,7 +18,7 @@ | ||||
| }: | ||||
| 
 | ||||
| let | ||||
|   buildArmTrustedFirmware = | ||||
|   buildArmTrustedFirmware = lib.makeOverridable ( | ||||
|     { | ||||
|       filesToInstall, | ||||
|       installDir ? "$out", | ||||
| @ -59,8 +59,11 @@ let | ||||
| 
 | ||||
|         depsBuildBuild = [ buildPackages.stdenv.cc ]; | ||||
| 
 | ||||
|         # For Cortex-M0 firmware in RK3399 | ||||
|         nativeBuildInputs = [ pkgsCross.arm-embedded.stdenv.cc ]; | ||||
|         nativeBuildInputs = [ | ||||
|           pkgsCross.arm-embedded.stdenv.cc # For Cortex-M0 firmware in RK3399 | ||||
|           openssl # For fiptool | ||||
|         ]; | ||||
| 
 | ||||
|         # Make the new toolchain guessing (from 2.11+) happy | ||||
|         # https://github.com/ARM-software/arm-trusted-firmware/blob/4ec2948fe3f65dba2f19e691e702f7de2949179c/make_helpers/toolchains/rk3399-m0.mk#L21-L22 | ||||
|         rk3399-m0-oc = "${pkgsCross.arm-embedded.stdenv.cc.targetPrefix}objcopy"; | ||||
| @ -112,7 +115,8 @@ let | ||||
|           // extraMeta; | ||||
|       } | ||||
|       // builtins.removeAttrs args [ "extraMeta" ] | ||||
|     ); | ||||
|     ) | ||||
|   ); | ||||
| 
 | ||||
| in | ||||
| { | ||||
|  | ||||
							
								
								
									
										127
									
								
								pkgs/misc/optee-os/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								pkgs/misc/optee-os/default.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,127 @@ | ||||
| { | ||||
|   dtc, | ||||
|   fetchFromGitHub, | ||||
|   lib, | ||||
|   pkgsBuildBuild, | ||||
|   stdenv, | ||||
| }: | ||||
| 
 | ||||
| let | ||||
|   defaultVersion = "4.6.0"; | ||||
| 
 | ||||
|   defaultSrc = fetchFromGitHub { | ||||
|     owner = "OP-TEE"; | ||||
|     repo = "optee_os"; | ||||
|     rev = defaultVersion; | ||||
|     hash = "sha256-4z706DNfZE+CAPOa362CNSFhAN1KaNyKcI9C7+MRccs="; | ||||
|   }; | ||||
| 
 | ||||
|   buildOptee = lib.makeOverridable ( | ||||
|     { | ||||
|       version ? null, | ||||
|       src ? null, | ||||
|       platform, | ||||
|       extraMakeFlags ? [ ], | ||||
|       extraMeta ? { }, | ||||
|       ... | ||||
|     }@args: | ||||
| 
 | ||||
|     let | ||||
|       inherit (stdenv.hostPlatform) is32bit is64bit; | ||||
| 
 | ||||
|       taTarget = | ||||
|         { | ||||
|           "arm" = "ta_arm32"; | ||||
|           "arm64" = "ta_arm64"; | ||||
|         } | ||||
|         .${stdenv.hostPlatform.linuxArch}; | ||||
|     in | ||||
|     stdenv.mkDerivation ( | ||||
|       { | ||||
|         pname = "optee-os-${platform}"; | ||||
| 
 | ||||
|         version = if src == null then defaultVersion else version; | ||||
| 
 | ||||
|         src = if src == null then defaultSrc else src; | ||||
| 
 | ||||
|         postPatch = '' | ||||
|           patchShebangs $(find -type d -name scripts -printf '%p ') | ||||
|         ''; | ||||
| 
 | ||||
|         outputs = [ | ||||
|           "out" | ||||
|           "devkit" | ||||
|         ]; | ||||
| 
 | ||||
|         strictDeps = true; | ||||
| 
 | ||||
|         enableParallelBuilding = true; | ||||
| 
 | ||||
|         depsBuildBuild = [ pkgsBuildBuild.stdenv.cc ]; | ||||
| 
 | ||||
|         nativeBuildInputs = [ | ||||
|           dtc | ||||
|           (pkgsBuildBuild.python3.withPackages ( | ||||
|             p: with p; [ | ||||
|               pyelftools | ||||
|               cryptography | ||||
|             ] | ||||
|           )) | ||||
|         ]; | ||||
| 
 | ||||
|         makeFlags = | ||||
|           [ | ||||
|             "O=out" | ||||
|             "PLATFORM=${platform}" | ||||
|             "CFG_USER_TA_TARGETS=${taTarget}" | ||||
|           ] | ||||
|           ++ (lib.optionals (is32bit) [ | ||||
|             "CFG_ARM32_core=y" | ||||
|             "CROSS_COMPILE32=${stdenv.cc.targetPrefix}" | ||||
|           ]) | ||||
|           ++ (lib.optionals (is64bit) [ | ||||
|             "CFG_ARM64_core=y" | ||||
|             "CROSS_COMPILE64=${stdenv.cc.targetPrefix}" | ||||
|           ]) | ||||
|           ++ extraMakeFlags; | ||||
| 
 | ||||
|         installPhase = '' | ||||
|           runHook preInstall | ||||
| 
 | ||||
|           mkdir -p $out | ||||
|           cp out/core/{tee.elf,tee-pageable_v2.bin,tee.bin,tee-header_v2.bin,tee-pager_v2.bin,tee-raw.bin} $out | ||||
|           cp -r out/export-${taTarget} $devkit | ||||
| 
 | ||||
|           runHook postInstall | ||||
|         ''; | ||||
| 
 | ||||
|         meta = | ||||
|           with lib; | ||||
|           { | ||||
|             description = "A Trusted Execution Environment for ARM"; | ||||
|             homepage = "https://github.com/OP-TEE/optee_os"; | ||||
|             changelog = "https://github.com/OP-TEE/optee_os/blob/${defaultVersion}/CHANGELOG.md"; | ||||
|             license = licenses.bsd2; | ||||
|             maintainers = [ maintainers.jmbaur ]; | ||||
|           } | ||||
|           // extraMeta; | ||||
|       } | ||||
|       // removeAttrs args [ "extraMeta" ] | ||||
|     ) | ||||
|   ); | ||||
| in | ||||
| { | ||||
|   inherit buildOptee; | ||||
| 
 | ||||
|   opteeQemuArm = buildOptee { | ||||
|     platform = "vexpress"; | ||||
|     extraMakeFlags = [ "PLATFORM_FLAVOR=qemu_virt" ]; | ||||
|     extraMeta.platforms = [ "armv7l-linux" ]; | ||||
|   }; | ||||
| 
 | ||||
|   opteeQemuAarch64 = buildOptee { | ||||
|     platform = "vexpress"; | ||||
|     extraMakeFlags = [ "PLATFORM_FLAVOR=qemu_armv8a" ]; | ||||
|     extraMeta.platforms = [ "aarch64-linux" ]; | ||||
|   }; | ||||
| } | ||||
| @ -6,16 +6,16 @@ | ||||
| 
 | ||||
| buildNpmPackage rec { | ||||
|   pname = "hourly-weather"; | ||||
|   version = "6.6.1"; | ||||
|   version = "6.7.0"; | ||||
| 
 | ||||
|   src = fetchFromGitHub { | ||||
|     owner = "decompil3d"; | ||||
|     repo = "lovelace-hourly-weather"; | ||||
|     rev = version; | ||||
|     hash = "sha256-D2kCUcUgLyMVeba3xc02q/5PrEzXrBVCX+75F58j8y0="; | ||||
|     hash = "sha256-VrHgFup2hAnoxqJQGw23ZiPFpAwfgSLC97U+KHV3PKQ="; | ||||
|   }; | ||||
| 
 | ||||
|   npmDepsHash = "sha256-gpyqQd4pRF4xKgfT9gRAVnXLSFThjfJV2yu4zOCvVpg="; | ||||
|   npmDepsHash = "sha256-wXL1wLdBp8gkAfY29AS1fM/ZpCCoP1u9PTxDIahy1cg="; | ||||
| 
 | ||||
|   env.CYPRESS_INSTALL_BINARY = "0"; | ||||
| 
 | ||||
|  | ||||
| @ -7232,9 +7232,7 @@ with pkgs; | ||||
|     haskellPackages.callPackage ../tools/misc/fffuu { } | ||||
|   ); | ||||
| 
 | ||||
|   flow = callPackage ../development/tools/analysis/flow { | ||||
|     ocamlPackages = ocaml-ng.ocamlPackages_4_14; | ||||
|   }; | ||||
|   flow = callPackage ../development/tools/analysis/flow { }; | ||||
| 
 | ||||
|   framac = callPackage ../by-name/fr/framac/package.nix { | ||||
|     ocamlPackages = ocaml-ng.ocamlPackages_5_2; | ||||
| @ -7434,6 +7432,12 @@ with pkgs; | ||||
|     libiberty_static = libiberty.override { staticBuild = true; }; | ||||
|   }; | ||||
| 
 | ||||
|   inherit (callPackage ../misc/optee-os { }) | ||||
|     buildOptee | ||||
|     opteeQemuArm | ||||
|     opteeQemuAarch64 | ||||
|     ; | ||||
| 
 | ||||
|   patchelf = callPackage ../development/tools/misc/patchelf { }; | ||||
| 
 | ||||
|   patchelfUnstable = lowPrio (callPackage ../development/tools/misc/patchelf/unstable.nix { }); | ||||
|  | ||||
| @ -17031,6 +17031,10 @@ self: super: with self; { | ||||
| 
 | ||||
|   sqlite-utils = callPackage ../development/python-modules/sqlite-utils { }; | ||||
| 
 | ||||
|   sqlite-vec = callPackage ../development/python-modules/sqlite-vec { | ||||
|     sqlite-vec-c = pkgs.sqlite-vec; | ||||
|   }; | ||||
| 
 | ||||
|   sqlitedict = callPackage ../development/python-modules/sqlitedict { }; | ||||
| 
 | ||||
|   sqliteschema = callPackage ../development/python-modules/sqliteschema { }; | ||||
| @ -18332,7 +18336,7 @@ self: super: with self; { | ||||
| 
 | ||||
|   txrequests = callPackage ../development/python-modules/txrequests { }; | ||||
| 
 | ||||
|   txtai = callPackage ../development/python-modules/txtai { }; | ||||
|   txtai = callPackage ../development/python-modules/txtai { sqlite-vec-c = pkgs.sqlite-vec; }; | ||||
| 
 | ||||
|   txtorcon = callPackage ../development/python-modules/txtorcon { }; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 K900
						K900