Merge 64359a39a1 into haskell-updates

This commit is contained in:
nixpkgs-ci[bot]
2026-01-20 00:23:09 +00:00
committed by GitHub
445 changed files with 16779 additions and 4822 deletions
+12
View File
@@ -168,6 +168,7 @@ jobs:
needs: [eval]
if: ${{ !cancelled() && !failure() }}
permissions:
pull-requests: write
statuses: write
timeout-minutes: 5
steps:
@@ -254,6 +255,17 @@ jobs:
description,
target_url
})
- name: Request changes if PR is against an inappropriate branch
if: ${{ github.event_name == 'pull_request_target' }}
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: |
require('./nixpkgs/trusted/ci/github-script/check-target-branch.js')({
github,
context,
core,
dry: context.eventName == 'pull_request',
})
# Creates a matrix of Eval performance for various versions and systems.
report:
+1
View File
@@ -84,6 +84,7 @@ jobs:
# even though they are unused when working with the merge queue.
permissions:
# compare
pull-requests: write
statuses: write
secrets:
CACHIX_AUTH_TOKEN_GHA: ${{ secrets.CACHIX_AUTH_TOKEN_GHA }}
@@ -81,6 +81,7 @@ jobs:
uses: ./.github/workflows/eval.yml
permissions:
# compare
pull-requests: write
statuses: write
with:
artifact-prefix: ${{ inputs.artifact-prefix }}
+135
View File
@@ -0,0 +1,135 @@
/// @ts-check
// TODO: should this be combined with the branch checks in prepare.js?
// They do seem quite similar, but this needs to run after eval,
// and prepare.js obviously doesn't.
const { classify, split } = require('../supportedBranches.js')
const { readFile } = require('node:fs/promises')
const { postReview } = require('./reviews.js')
/**
* @param {{
* github: InstanceType<import('@actions/github/lib/utils').GitHub>,
* context: import('@actions/github/lib/context').Context
* core: import('@actions/core')
* dry: boolean
* }} CheckTargetBranchProps
*/
async function checkTargetBranch({ github, context, core, dry }) {
const changed = JSON.parse(
await readFile('comparison/changed-paths.json', 'utf-8'),
)
const pull_number = context.payload.pull_request?.number
if (!pull_number) {
core.warning(
'Skipping checkTargetBranch: no pull_request number (is this being run as part of a merge group?)',
)
return
}
const prInfo = (
await github.rest.pulls.get({
...context.repo,
pull_number,
})
).data
const base = prInfo.base.ref
const head = prInfo.head.ref
const baseClassification = classify(base)
const headClassification = classify(head)
// Don't run on, e.g., staging-nixos to master merges.
if (headClassification.type.includes('development')) {
core.info(
`Skipping checkTargetBranch: PR is from a development branch (${head})`,
)
return
}
// Don't run on PRs against staging branches, wip branches, haskell-updates, etc.
if (!baseClassification.type.includes('primary')) {
core.info(
`Skipping checkTargetBranch: PR is against a non-primary base branch (${base})`,
)
return
}
const maxRebuildCount = Math.max(
...Object.values(changed.rebuildCountByKernel),
)
const rebuildsAllTests =
changed.attrdiff.changed.includes('nixosTests.simple') ?? false
core.info(
`checkTargetBranch: PR causes ${maxRebuildCount} rebuilds and ${rebuildsAllTests ? 'does' : 'does not'} rebuild all NixOS tests.`,
)
if (maxRebuildCount >= 1000) {
const desiredBranch =
base === 'master' ? 'staging' : `staging-${split(base).version}`
const body = [
`The PR's base branch is set to \`${base}\`, but this PR causes ${maxRebuildCount} rebuilds.`,
'It is therefore considered a mass rebuild.',
`Please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) (probably \`${desiredBranch}\`).`,
].join('\n')
await postReview({
github,
context,
core,
dry,
body,
event: 'REQUEST_CHANGES',
})
throw new Error('This PR is against the wrong branch.')
} else if (rebuildsAllTests) {
let branchText
if (base === 'master' && maxRebuildCount >= 500) {
branchText = '(probably either `staging-nixos` or `staging`)'
} else if (base === 'master') {
branchText = '(probably `staging-nixos`)'
} else {
branchText = `(probably \`staging-${split(base).version}\`)`
}
const body = [
`The PR's base branch is set to \`${base}\`, but this PR rebuilds all NixOS tests.`,
base === 'master' && maxRebuildCount >= 500
? `Since this PR also causes ${maxRebuildCount} rebuilds, it may also be considered a mass rebuild.`
: '',
`Please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) ${branchText}.`,
].join('\n')
await postReview({
github,
context,
core,
dry,
body,
event: 'REQUEST_CHANGES',
})
throw new Error('This PR is against the wrong branch.')
} else if (maxRebuildCount >= 500) {
const stagingBranch =
base === 'master' ? 'staging' : `staging-${split(base).version}`
const body = [
`The PR's base branch is set to \`${base}\`, and this PR causes ${maxRebuildCount} rebuilds.`,
`Please consider whether this PR causes a mass rebuild according to [our conventions](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions).`,
`If it does cause a mass rebuild, please [change the base branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-base-branch-of-a-pull-request) to [the right base branch for your changes](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#branch-conventions) (probably \`${stagingBranch}\`).`,
`If it does not cause a mass rebuild, this message can be ignored.`,
].join('\n')
await postReview({
github,
context,
core,
dry,
body,
event: 'COMMENT',
})
} else {
// Any existing reviews were dismissed by commits.js
core.info('checkTargetBranch: this PR is against an appropriate branch.')
}
}
module.exports = checkTargetBranch
+25 -8
View File
@@ -1,3 +1,16 @@
const eventToState = {
COMMENT: 'COMMENTED',
REQUEST_CHANGES: 'CHANGES_REQUESTED',
}
/**
* @param {{
* github: InstanceType<import('@actions/github/lib/utils').GitHub>,
* context: import('@actions/github/lib/context').Context
* core: import('@actions/core')
* dry: boolean
* }} CheckTargetBranchProps
*/
async function dismissReviews({ github, context, dry }) {
const pull_number = context.payload.pull_request.number
@@ -19,13 +32,13 @@ async function dismissReviews({ github, context, dry }) {
...context.repo,
pull_number,
review_id: review.id,
message: 'All good now, thank you!',
message: 'Review dismissed automatically',
})
}
await github.graphql(
`mutation($node_id:ID!) {
minimizeComment(input: {
classifier: RESOLVED,
classifier: OUTDATED,
subjectId: $node_id
})
{ clientMutationId }
@@ -36,7 +49,14 @@ async function dismissReviews({ github, context, dry }) {
)
}
async function postReview({ github, context, core, dry, body }) {
async function postReview({
github,
context,
core,
dry,
body,
event = 'REQUEST_CHANGES',
}) {
const pull_number = context.payload.pull_request.number
const pendingReview = (
@@ -49,10 +69,7 @@ async function postReview({ github, context, core, dry, body }) {
review.user?.login === 'github-actions[bot]' &&
// If a review is still pending, we can just update this instead
// of posting a new one.
(review.state === 'CHANGES_REQUESTED' ||
// No need to post a new review, if an older one with the exact
// same content had already been dismissed.
review.body === body),
review.state === eventToState[event],
)
if (dry) {
@@ -72,7 +89,7 @@ async function postReview({ github, context, core, dry, body }) {
await github.rest.pulls.createReview({
...context.repo,
pull_number,
event: 'REQUEST_CHANGES',
event,
body,
})
}
+11
View File
@@ -105,4 +105,15 @@ program
await run(checkCommitMessages, owner, repo, pr, options)
})
program
.command('check-target-branch')
.description('Check that the PR is made against the correct branch')
.argument('<owner>', 'Owner of the GitHub repository to run on (Example: NixOS)')
.argument('<repo>', 'Name of the GitHub repository to run on (Example: nixpkgs)')
.argument('<pr>', 'Number of the Pull Request to run on')
.action(async (owner, repo, pr, options) => {
const checkCommitMessages = (await import('./check-target-branch.js')).default
await run(checkCommitMessages, owner, repo, pr, options)
})
await program.parse()
+1 -1
View File
@@ -44,7 +44,7 @@ function classify(branch) {
}
}
module.exports = { classify }
module.exports = { classify, split }
// If called directly via CLI, runs the following tests:
if (!module.parent) {
+63 -1
View File
@@ -672,11 +672,30 @@ rec {
is necessary for complex values, e.g. functions, or values that depend on
other values or packages.
# Examples
:::{.example}
## `literalExpression` usage example
```nix
llvmPackages = mkOption {
type = types.str;
description = ''
Version of llvm packages to use for
this module
'';
example = literalExpression ''
llvmPackages = pkgs.llvmPackages_20;
'';
};
```
:::
# Inputs
`text`
: 1\. Function argument
: The text to render as a Nix expression
*/
literalExpression =
text:
@@ -688,6 +707,49 @@ rec {
inherit text;
};
/**
For use in the `defaultText` and `example` option attributes. Causes the
given string to be rendered verbatim in the documentation as a code
block with the language bassed on the provided input tag.
If you wish to render Nix code, please see `literalExpression`.
# Examples
:::{.example}
## `literalCode` usage example
```nix
myPythonScript = mkOption {
type = types.str;
description = ''
Example python script used by a module
'';
example = literalCode "python" ''
print("Hello world!")
'';
};
```
:::
# Inputs
`languageTag`
: The language tag to use when producing the code block (i.e. `js`, `rs`, etc).
`text`
: The text to render as a Nix expression
*/
literalCode =
languageTag: text:
lib.literalMD ''
```${languageTag}
${text}
```
'';
/**
For use in the `defaultText` and `example` option attributes. Causes the
given MD text to be inserted verbatim in the documentation, for when
+1551 -1550
View File
File diff suppressed because it is too large Load Diff
+4 -2
View File
@@ -422,10 +422,10 @@
"maintainers": {
"Mic92": 96200,
"kalbasit": 87115,
"katexochen": 49727155,
"zowoq": 59103226
},
"members": {
"katexochen": 49727155,
"mfrw": 4929861,
"qbit": 68368
},
@@ -730,7 +730,9 @@
"philiptaron": 43863,
"zowoq": 59103226
},
"members": {},
"members": {
"mdaniels5757": 8762511
},
"name": "Nixpkgs CI"
},
"nixpkgs-core": {
+7 -6
View File
@@ -8623,6 +8623,13 @@
githubId = 52276064;
name = "figboy9";
};
figsoda = {
email = "figsoda@pm.me";
matrix = "@figsoda:matrix.org";
github = "figsoda";
githubId = 40620903;
name = "figsoda";
};
fionera = {
email = "nix@fionera.de";
github = "fionera";
@@ -19099,12 +19106,6 @@
github = "0xnook";
githubId = 88323754;
};
noreferences = {
email = "norkus@norkus.net";
github = "jozuas";
githubId = 13085275;
name = "Juozas Norkus";
};
norfair = {
email = "syd@cs-syd.eu";
github = "NorfairKing";
@@ -34,6 +34,8 @@
- [Ente Auth](https://ente.io/auth/), an open source 2FA authenticator, with end-to-end encrypted backups. Available as [programs.ente-auth](#opt-programs.ente-auth.enable).
- [Dawarich](https://dawarich.app/), a self-hostable location history tracker. Available as [services.dawarich](#opt-services.dawarich.enable).
- [udp-over-tcp](https://github.com/mullvad/udp-over-tcp), a tunnel for proxying UDP traffic over a TCP stream. Available as `services.udp-over-tcp`.
- [Komodo Periphery](https://github.com/moghtech/komodo), a multi-server Docker and Git deployment agent by Komodo. Available as [services.komodo-periphery](#opt-services.komodo-periphery.enable).
+5 -5
View File
@@ -94,16 +94,16 @@ in
boot.extraModulePackages = [ tuxedo-drivers ];
services.udev.packages = [
tuxedo-drivers
lib.mkIf
(lib.any (v: v != null) cfg.settings)
(pkgs.writeTextDir "etc/udev/rules.d/90-tuxedo.rules" (
]
++ lib.optional (lib.any (v: v != null) (lib.attrValues cfg.settings)) (
pkgs.writeTextDir "etc/udev/rules.d/90-tuxedo.rules" (
lib.concatLines (
[ "# Custom rules for TUXEDO laptops" ]
++ (optUdevRule "charging_profile/charging_profile" cfg.settings.charging-profile)
++ (optUdevRule "charging_priority/charging_prio" cfg.settings.charging-priority)
++ (optUdevRule "fn_lock" cfg.settings.fn-lock)
)
))
];
)
);
};
}
+1
View File
@@ -1597,6 +1597,7 @@
./services/web-apps/cryptpad.nix
./services/web-apps/dashy.nix
./services/web-apps/davis.nix
./services/web-apps/dawarich.nix
./services/web-apps/dependency-track.nix
./services/web-apps/dex.nix
./services/web-apps/discourse.nix
+1 -1
View File
@@ -36,8 +36,8 @@ in
wants = [ "graphical-session.target" ];
after = [ "graphical-session.target" ];
script = lib.getExe cfg.package;
serviceConfig = {
ExecStart = lib.getExe cfg.package;
Type = "simple";
Restart = "on-failure";
RestartSec = 1;
@@ -206,6 +206,43 @@ in
after = [ "network.target" ];
serviceConfig = {
ExecStart =
let
args = lib.cli.toCommandLineShellGNU { } {
inherit (cfg)
syncmode
gcmode
port
maxpeers
;
nousb = true;
ipcdisable = true;
datadir = dataDir;
${cfg.network} = true;
http = cfg.http.enable;
"http.addr" = if cfg.http.enable then cfg.http.address else null;
"http.port" = if cfg.http.enable then cfg.http.port else null;
"http.api" = if cfg.http.apis != null then lib.concatStringsSep "," cfg.http.apis else null;
ws = cfg.websocket.enable;
"ws.addr" = if cfg.websocket.enable then cfg.websocket.address else null;
"ws.port" = if cfg.websocket.enable then cfg.websocket.port else null;
"ws.api" = if cfg.websocket.apis != null then lib.concatStringsSep "," cfg.websocket.apis else null;
metrics = cfg.metrics.enable;
"metrics.addr" = if cfg.metrics.enable then cfg.metrics.address else null;
"metrics.port" = if cfg.metrics.enable then cfg.metrics.port else null;
"authrpc.addr" = cfg.authrpc.address;
"authrpc.port" = cfg.authrpc.port;
"authrpc.vhosts" = lib.concatStringsSep "," cfg.authrpc.vhosts;
"authrpc.jwtsecret" =
if cfg.authrpc.jwtsecret != "" then cfg.authrpc.jwtsecret else "${dataDir}/geth/jwtsecret";
};
in
"${lib.getExe cfg.package} ${args} ${lib.escapeShellArgs cfg.extraArgs}";
DynamicUser = true;
Restart = "always";
StateDirectory = stateDir;
@@ -217,37 +254,6 @@ in
PrivateDevices = "true";
MemoryDenyWriteExecute = "true";
};
script = ''
${cfg.package}/bin/geth \
--nousb \
--ipcdisable \
${lib.optionalString (cfg.network != null) ''--${cfg.network}''} \
--syncmode ${cfg.syncmode} \
--gcmode ${cfg.gcmode} \
--port ${toString cfg.port} \
--maxpeers ${toString cfg.maxpeers} \
${lib.optionalString cfg.http.enable ''--http --http.addr ${cfg.http.address} --http.port ${toString cfg.http.port}''} \
${
lib.optionalString (cfg.http.apis != null) ''--http.api ${lib.concatStringsSep "," cfg.http.apis}''
} \
${lib.optionalString cfg.websocket.enable ''--ws --ws.addr ${cfg.websocket.address} --ws.port ${toString cfg.websocket.port}''} \
${
lib.optionalString (
cfg.websocket.apis != null
) ''--ws.api ${lib.concatStringsSep "," cfg.websocket.apis}''
} \
${lib.optionalString cfg.metrics.enable ''--metrics --metrics.addr ${cfg.metrics.address} --metrics.port ${toString cfg.metrics.port}''} \
--authrpc.addr ${cfg.authrpc.address} --authrpc.port ${toString cfg.authrpc.port} --authrpc.vhosts ${lib.concatStringsSep "," cfg.authrpc.vhosts} \
${
if (cfg.authrpc.jwtsecret != "") then
''--authrpc.jwtsecret ${cfg.authrpc.jwtsecret}''
else
''--authrpc.jwtsecret ${dataDir}/geth/jwtsecret''
} \
${lib.escapeShellArgs cfg.extraArgs} \
--datadir ${dataDir}
'';
}
))
) eachGeth;
@@ -49,312 +49,327 @@ in
];
###### interface
options.services.kubernetes.apiserver = with lib.types; {
options.services.kubernetes.apiserver =
let
inherit (lib.types)
nullOr
str
bool
listOf
enum
attrs
path
separatedString
attrsOf
int
;
in
{
advertiseAddress = lib.mkOption {
description = ''
Kubernetes apiserver IP address on which to advertise the apiserver
to members of the cluster. This address must be reachable by the rest
of the cluster.
'';
default = null;
type = nullOr str;
};
allowPrivileged = lib.mkOption {
description = "Whether to allow privileged containers on Kubernetes.";
default = false;
type = bool;
};
authorizationMode = lib.mkOption {
description = ''
Kubernetes apiserver authorization mode (AlwaysAllow/AlwaysDeny/ABAC/Webhook/RBAC/Node). See
<https://kubernetes.io/docs/reference/access-authn-authz/authorization/>
'';
default = [
"RBAC"
"Node"
]; # Enabling RBAC by default, although kubernetes default is AllowAllow
type = listOf (enum [
"AlwaysAllow"
"AlwaysDeny"
"ABAC"
"Webhook"
"RBAC"
"Node"
]);
};
authorizationPolicy = lib.mkOption {
description = ''
Kubernetes apiserver authorization policy file. See
<https://kubernetes.io/docs/reference/access-authn-authz/authorization/>
'';
default = [ ];
type = listOf attrs;
};
basicAuthFile = lib.mkOption {
description = ''
Kubernetes apiserver basic authentication file. See
<https://kubernetes.io/docs/reference/access-authn-authz/authentication>
'';
default = null;
type = nullOr path;
};
bindAddress = lib.mkOption {
description = ''
The IP address on which to listen for the --secure-port port.
The associated interface(s) must be reachable by the rest
of the cluster, and by CLI/web clients.
'';
default = "0.0.0.0";
type = str;
};
clientCaFile = lib.mkOption {
description = "Kubernetes apiserver CA file for client auth.";
default = top.caFile;
defaultText = lib.literalExpression "config.${otop.caFile}";
type = nullOr path;
};
disableAdmissionPlugins = lib.mkOption {
description = ''
Kubernetes admission control plugins to disable. See
<https://kubernetes.io/docs/admin/admission-controllers/>
'';
default = [ ];
type = listOf str;
};
enable = lib.mkEnableOption "Kubernetes apiserver";
enableAdmissionPlugins = lib.mkOption {
description = ''
Kubernetes admission control plugins to enable. See
<https://kubernetes.io/docs/admin/admission-controllers/>
'';
default = [
"NamespaceLifecycle"
"LimitRanger"
"ServiceAccount"
"ResourceQuota"
"DefaultStorageClass"
"DefaultTolerationSeconds"
"NodeRestriction"
];
example = [
"NamespaceLifecycle"
"NamespaceExists"
"LimitRanger"
"SecurityContextDeny"
"ServiceAccount"
"ResourceQuota"
"PodSecurityPolicy"
"NodeRestriction"
"DefaultStorageClass"
];
type = listOf str;
};
etcd = {
servers = lib.mkOption {
description = "List of etcd servers.";
default = [ "http://127.0.0.1:2379" ];
type = types.listOf types.str;
};
keyFile = lib.mkOption {
description = "Etcd key file.";
advertiseAddress = lib.mkOption {
description = ''
Kubernetes apiserver IP address on which to advertise the apiserver
to members of the cluster. This address must be reachable by the rest
of the cluster.
'';
default = null;
type = types.nullOr types.path;
type = nullOr str;
};
certFile = lib.mkOption {
description = "Etcd cert file.";
allowPrivileged = lib.mkOption {
description = "Whether to allow privileged containers on Kubernetes.";
default = false;
type = bool;
};
authorizationMode = lib.mkOption {
description = ''
Kubernetes apiserver authorization mode (AlwaysAllow/AlwaysDeny/ABAC/Webhook/RBAC/Node). See
<https://kubernetes.io/docs/reference/access-authn-authz/authorization/>
'';
default = [
"RBAC"
"Node"
]; # Enabling RBAC by default, although kubernetes default is AllowAllow
type = listOf (enum [
"AlwaysAllow"
"AlwaysDeny"
"ABAC"
"Webhook"
"RBAC"
"Node"
]);
};
authorizationPolicy = lib.mkOption {
description = ''
Kubernetes apiserver authorization policy file. See
<https://kubernetes.io/docs/reference/access-authn-authz/authorization/>
'';
default = [ ];
type = listOf attrs;
};
basicAuthFile = lib.mkOption {
description = ''
Kubernetes apiserver basic authentication file. See
<https://kubernetes.io/docs/reference/access-authn-authz/authentication>
'';
default = null;
type = types.nullOr types.path;
type = nullOr path;
};
caFile = lib.mkOption {
description = "Etcd ca file.";
bindAddress = lib.mkOption {
description = ''
The IP address on which to listen for the --secure-port port.
The associated interface(s) must be reachable by the rest
of the cluster, and by CLI/web clients.
'';
default = "0.0.0.0";
type = str;
};
clientCaFile = lib.mkOption {
description = "Kubernetes apiserver CA file for client auth.";
default = top.caFile;
defaultText = lib.literalExpression "config.${otop.caFile}";
type = types.nullOr types.path;
type = nullOr path;
};
};
extraOpts = lib.mkOption {
description = "Kubernetes apiserver extra command line options.";
default = "";
type = separatedString " ";
};
disableAdmissionPlugins = lib.mkOption {
description = ''
Kubernetes admission control plugins to disable. See
<https://kubernetes.io/docs/admin/admission-controllers/>
'';
default = [ ];
type = listOf str;
};
extraSANs = lib.mkOption {
description = "Extra x509 Subject Alternative Names to be added to the kubernetes apiserver tls cert.";
default = [ ];
type = listOf str;
};
enable = lib.mkEnableOption "Kubernetes apiserver";
featureGates = lib.mkOption {
description = "Attribute set of feature gates.";
default = top.featureGates;
defaultText = lib.literalExpression "config.${otop.featureGates}";
type = attrsOf bool;
};
enableAdmissionPlugins = lib.mkOption {
description = ''
Kubernetes admission control plugins to enable. See
<https://kubernetes.io/docs/admin/admission-controllers/>
'';
default = [
"NamespaceLifecycle"
"LimitRanger"
"ServiceAccount"
"ResourceQuota"
"DefaultStorageClass"
"DefaultTolerationSeconds"
"NodeRestriction"
];
example = [
"NamespaceLifecycle"
"NamespaceExists"
"LimitRanger"
"SecurityContextDeny"
"ServiceAccount"
"ResourceQuota"
"PodSecurityPolicy"
"NodeRestriction"
"DefaultStorageClass"
];
type = listOf str;
};
kubeletClientCaFile = lib.mkOption {
description = "Path to a cert file for connecting to kubelet.";
default = top.caFile;
defaultText = lib.literalExpression "config.${otop.caFile}";
type = nullOr path;
};
etcd = {
servers = lib.mkOption {
description = "List of etcd servers.";
default = [ "http://127.0.0.1:2379" ];
type = listOf str;
};
kubeletClientCertFile = lib.mkOption {
description = "Client certificate to use for connections to kubelet.";
default = null;
type = nullOr path;
};
keyFile = lib.mkOption {
description = "Etcd key file.";
default = null;
type = nullOr path;
};
kubeletClientKeyFile = lib.mkOption {
description = "Key to use for connections to kubelet.";
default = null;
type = nullOr path;
};
certFile = lib.mkOption {
description = "Etcd cert file.";
default = null;
type = nullOr path;
};
preferredAddressTypes = lib.mkOption {
description = "List of the preferred NodeAddressTypes to use for kubelet connections.";
type = nullOr str;
default = null;
};
caFile = lib.mkOption {
description = "Etcd ca file.";
default = top.caFile;
defaultText = lib.literalExpression "config.${otop.caFile}";
type = nullOr path;
};
};
proxyClientCertFile = lib.mkOption {
description = "Client certificate to use for connections to proxy.";
default = null;
type = nullOr path;
};
extraOpts = lib.mkOption {
description = "Kubernetes apiserver extra command line options.";
default = "";
type = separatedString " ";
};
proxyClientKeyFile = lib.mkOption {
description = "Key to use for connections to proxy.";
default = null;
type = nullOr path;
};
extraSANs = lib.mkOption {
description = "Extra x509 Subject Alternative Names to be added to the kubernetes apiserver tls cert.";
default = [ ];
type = listOf str;
};
runtimeConfig = lib.mkOption {
description = ''
Api runtime configuration. See
<https://kubernetes.io/docs/tasks/administer-cluster/cluster-management/>
'';
default = "authentication.k8s.io/v1beta1=true";
example = "api/all=false,api/v1=true";
type = str;
};
featureGates = lib.mkOption {
description = "Attribute set of feature gates.";
default = top.featureGates;
defaultText = lib.literalExpression "config.${otop.featureGates}";
type = attrsOf bool;
};
storageBackend = lib.mkOption {
description = ''
Kubernetes apiserver storage backend.
'';
default = "etcd3";
type = enum [
"etcd2"
"etcd3"
];
};
kubeletClientCaFile = lib.mkOption {
description = "Path to a cert file for connecting to kubelet.";
default = top.caFile;
defaultText = lib.literalExpression "config.${otop.caFile}";
type = nullOr path;
};
securePort = lib.mkOption {
description = "Kubernetes apiserver secure port.";
default = 6443;
type = int;
};
kubeletClientCertFile = lib.mkOption {
description = "Client certificate to use for connections to kubelet.";
default = null;
type = nullOr path;
};
apiAudiences = lib.mkOption {
description = ''
Kubernetes apiserver ServiceAccount issuer.
'';
default = "api,https://kubernetes.default.svc";
type = str;
};
kubeletClientKeyFile = lib.mkOption {
description = "Key to use for connections to kubelet.";
default = null;
type = nullOr path;
};
serviceAccountIssuer = lib.mkOption {
description = ''
Kubernetes apiserver ServiceAccount issuer.
'';
default = "https://kubernetes.default.svc";
type = str;
};
preferredAddressTypes = lib.mkOption {
description = "List of the preferred NodeAddressTypes to use for kubelet connections.";
type = nullOr str;
default = null;
};
serviceAccountSigningKeyFile = lib.mkOption {
description = ''
Path to the file that contains the current private key of the service
account token issuer. The issuer will sign issued ID tokens with this
private key.
'';
type = path;
};
proxyClientCertFile = lib.mkOption {
description = "Client certificate to use for connections to proxy.";
default = null;
type = nullOr path;
};
serviceAccountKeyFile = lib.mkOption {
description = ''
File containing PEM-encoded x509 RSA or ECDSA private or public keys,
used to verify ServiceAccount tokens. The specified file can contain
multiple keys, and the flag can be specified multiple times with
different files. If unspecified, --tls-private-key-file is used.
Must be specified when --service-account-signing-key is provided
'';
type = path;
};
proxyClientKeyFile = lib.mkOption {
description = "Key to use for connections to proxy.";
default = null;
type = nullOr path;
};
serviceClusterIpRange = lib.mkOption {
description = ''
A CIDR notation IP range from which to assign service cluster IPs.
This must not overlap with any IP ranges assigned to nodes for pods.
'';
default = "10.0.0.0/24";
type = str;
};
runtimeConfig = lib.mkOption {
description = ''
Api runtime configuration. See
<https://kubernetes.io/docs/tasks/administer-cluster/cluster-management/>
'';
default = "authentication.k8s.io/v1beta1=true";
example = "api/all=false,api/v1=true";
type = str;
};
tlsCertFile = lib.mkOption {
description = "Kubernetes apiserver certificate file.";
default = null;
type = nullOr path;
};
storageBackend = lib.mkOption {
description = ''
Kubernetes apiserver storage backend.
'';
default = "etcd3";
type = enum [
"etcd2"
"etcd3"
];
};
tlsKeyFile = lib.mkOption {
description = "Kubernetes apiserver private key file.";
default = null;
type = nullOr path;
};
securePort = lib.mkOption {
description = "Kubernetes apiserver secure port.";
default = 6443;
type = int;
};
tokenAuthFile = lib.mkOption {
description = ''
Kubernetes apiserver token authentication file. See
<https://kubernetes.io/docs/reference/access-authn-authz/authentication>
'';
default = null;
type = nullOr path;
};
apiAudiences = lib.mkOption {
description = ''
Kubernetes apiserver ServiceAccount issuer.
'';
default = "api,https://kubernetes.default.svc";
type = str;
};
verbosity = lib.mkOption {
description = ''
Optional glog verbosity level for logging statements. See
<https://github.com/kubernetes/community/blob/master/contributors/devel/logging.md>
'';
default = null;
type = nullOr int;
};
serviceAccountIssuer = lib.mkOption {
description = ''
Kubernetes apiserver ServiceAccount issuer.
'';
default = "https://kubernetes.default.svc";
type = str;
};
webhookConfig = lib.mkOption {
description = ''
Kubernetes apiserver Webhook config file. It uses the kubeconfig file format.
See <https://kubernetes.io/docs/reference/access-authn-authz/webhook/>
'';
default = null;
type = nullOr path;
};
serviceAccountSigningKeyFile = lib.mkOption {
description = ''
Path to the file that contains the current private key of the service
account token issuer. The issuer will sign issued ID tokens with this
private key.
'';
type = path;
};
};
serviceAccountKeyFile = lib.mkOption {
description = ''
File containing PEM-encoded x509 RSA or ECDSA private or public keys,
used to verify ServiceAccount tokens. The specified file can contain
multiple keys, and the flag can be specified multiple times with
different files. If unspecified, --tls-private-key-file is used.
Must be specified when --service-account-signing-key is provided
'';
type = path;
};
serviceClusterIpRange = lib.mkOption {
description = ''
A CIDR notation IP range from which to assign service cluster IPs.
This must not overlap with any IP ranges assigned to nodes for pods.
'';
default = "10.0.0.0/24";
type = str;
};
tlsCertFile = lib.mkOption {
description = "Kubernetes apiserver certificate file.";
default = null;
type = nullOr path;
};
tlsKeyFile = lib.mkOption {
description = "Kubernetes apiserver private key file.";
default = null;
type = nullOr path;
};
tokenAuthFile = lib.mkOption {
description = ''
Kubernetes apiserver token authentication file. See
<https://kubernetes.io/docs/reference/access-authn-authz/authentication>
'';
default = null;
type = nullOr path;
};
verbosity = lib.mkOption {
description = ''
Optional glog verbosity level for logging statements. See
<https://github.com/kubernetes/community/blob/master/contributors/devel/logging.md>
'';
default = null;
type = nullOr int;
};
webhookConfig = lib.mkOption {
description = ''
Kubernetes apiserver Webhook config file. It uses the kubeconfig file format.
See <https://kubernetes.io/docs/reference/access-authn-authz/webhook/>
'';
default = null;
type = nullOr path;
};
};
###### implementation
config = lib.mkMerge [
@@ -99,10 +99,8 @@ in
description = "BOINC Client";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
script = ''
exec ${fhsEnvExecutable} --dir ${cfg.dataDir} ${allowRemoteGuiRpcFlag}
'';
serviceConfig = {
ExecStart = "${fhsEnvExecutable} --dir ${cfg.dataDir} ${allowRemoteGuiRpcFlag}";
User = "boinc";
Nice = 10;
};
+32 -29
View File
@@ -431,39 +431,42 @@ in
};
};
config = lib.mkIf cfg.enable {
config = lib.mkMerge [
(lib.mkIf cfg.enable {
services.udev.packages = [ pkgs.libinput.out ];
})
services.xserver.modules = [ pkgs.xorg.xf86inputlibinput ];
(lib.mkIf (cfg.enable && config.services.xserver.enable) {
services.xserver.modules = [ pkgs.xorg.xf86inputlibinput ];
environment.systemPackages = [ pkgs.xorg.xf86inputlibinput ];
# for man pages
environment.systemPackages = [ pkgs.xorg.xf86inputlibinput ];
environment.etc =
let
cfgPath = "X11/xorg.conf.d/40-libinput.conf";
in
{
${cfgPath} = {
source = pkgs.xorg.xf86inputlibinput.out + "/share/" + cfgPath;
};
};
services.udev.packages = [ pkgs.libinput.out ];
services.xserver.inputClassSections = [
(mkX11ConfigForDevice "mouse" "Pointer")
(mkX11ConfigForDevice "touchpad" "Touchpad")
];
assertions = [
# already present in synaptics.nix
/*
environment.etc =
let
cfgPath = "X11/xorg.conf.d/40-libinput.conf";
in
{
assertion = !config.services.xserver.synaptics.enable;
message = "Synaptics and libinput are incompatible, you cannot enable both (in services.xserver).";
}
*/
];
${cfgPath} = {
source = pkgs.xorg.xf86inputlibinput.out + "/share/" + cfgPath;
};
};
};
services.xserver.inputClassSections = [
(mkX11ConfigForDevice "mouse" "Pointer")
(mkX11ConfigForDevice "touchpad" "Touchpad")
];
assertions = [
# already present in synaptics.nix
/*
{
assertion = !config.services.xserver.synaptics.enable;
message = "Synaptics and libinput are incompatible, you cannot enable both (in services.xserver).";
}
*/
];
})
];
}
+1 -1
View File
@@ -51,7 +51,7 @@ in
systemd.services.pommed = {
description = "Pommed Apple Hotkeys Daemon";
wantedBy = [ "multi-user.target" ];
script = "${pkgs.pommed_light}/bin/pommed -f";
serviceConfig.ExecStart = "${lib.getExe pkgs.pommed_light} -f";
};
};
}
@@ -79,6 +79,7 @@ in
after = [ "network.target" ];
environment.ZIGBEE2MQTT_DATA = cfg.dataDir;
serviceConfig = {
ExecStartPre = "${lib.getExe' pkgs.coreutils "cp"} --no-preserve=mode ${configFile} '${cfg.dataDir}/configuration.yaml'";
ExecStart = "${cfg.package}/bin/zigbee2mqtt";
User = "zigbee2mqtt";
Group = "zigbee2mqtt";
@@ -130,9 +131,6 @@ in
];
UMask = "0077";
};
preStart = ''
cp --no-preserve=mode ${configFile} "${cfg.dataDir}/configuration.yaml"
'';
};
users.users.zigbee2mqtt = {
+1 -3
View File
@@ -67,12 +67,10 @@ in
systemd.services.heartbeat = {
description = "heartbeat log shipper";
wantedBy = [ "multi-user.target" ];
preStart = ''
mkdir -p "${cfg.stateDir}"/{data,logs}
'';
serviceConfig = {
User = "nobody";
AmbientCapabilities = "cap_net_raw";
ExecStartPre = "${lib.getExe' pkgs.coreutils "mkdir"} -p '${cfg.stateDir}'/data '${cfg.stateDir}'/logs";
ExecStart = "${cfg.package}/bin/heartbeat -c \"${heartbeatYml}\" -path.data \"${cfg.stateDir}/data\" -path.logs \"${cfg.stateDir}/logs\"";
};
};
@@ -71,12 +71,12 @@ in
wantedBy = [ "multi-user.target" ];
wants = [ "elasticsearch.service" ];
after = [ "elasticsearch.service" ];
preStart = ''
mkdir -p ${cfg.stateDir}/data
mkdir -p ${cfg.stateDir}/logs
'';
serviceConfig = {
StateDirectory = cfg.stateDir;
ExecStartPre = [
"${lib.getExe' pkgs.coreutils "mkdir"} -p ${cfg.stateDir}/data"
"${lib.getExe' pkgs.coreutils "mkdir"} -p ${cfg.stateDir}/logs"
];
ExecStart = ''
${cfg.package}/bin/journalbeat \
-c ${journalbeatYml} \
@@ -91,12 +91,12 @@ in
config = mkIf cfg.enable {
systemd.services.journaldriver = {
description = "Stackdriver Logging journal forwarder";
script = "${pkgs.journaldriver}/bin/journaldriver";
wants = [ "network-online.target" ];
after = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = lib.getExe pkgs.journaldriver;
Restart = "always";
DynamicUser = true;
+1 -4
View File
@@ -66,14 +66,11 @@ in
wantedBy = [ "multi-user.target" ];
stopIfChanged = false;
preStart = ''
${lib.getExe pkgs.promtail} -config.file=${configFile} -check-syntax
'';
serviceConfig = {
Restart = "on-failure";
TimeoutStopSec = 10;
ExecStartPre = "${lib.getExe pkgs.promtail} -config.file=${configFile} -check-syntax";
ExecStart = "${pkgs.promtail}/bin/promtail -config.file=${configFile} ${escapeShellArgs cfg.extraFlags}";
ProtectSystem = "strict";
+1 -1
View File
@@ -79,7 +79,6 @@ in
config = lib.mkIf cfg.enable {
systemd.services.syslog-ng = {
description = "syslog-ng daemon";
preStart = "mkdir -p /{var,run}/syslog-ng";
wantedBy = [ "multi-user.target" ];
after = [ "multi-user.target" ]; # makes sure hostname etc is set
serviceConfig = {
@@ -87,6 +86,7 @@ in
PIDFile = pidFile;
StandardOutput = "null";
Restart = "on-failure";
ExecStartPre = "${lib.getExe' pkgs.coreutils "mkdir"} -p /var/syslog-ng /run/syslog-ng";
ExecStart = "${cfg.package}/sbin/syslog-ng ${lib.concatStringsSep " " syslogngOptions}";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
};
+1 -3
View File
@@ -342,6 +342,7 @@ in
User = if (cfg.user == null) then "cyrus" else cfg.user;
Group = if (cfg.group == null) then "cyrus" else cfg.group;
Type = "simple";
ExecStartPre = "${lib.getExe' pkgs.coreutils "mkdir"} -p '${cfg.imapdSettings.configdirectory}/socket' '${cfg.tmpDBDir}' /run/cyrus/proc /run/cyrus/lock";
ExecStart = "${cyrus-imapdPkg}/libexec/master -l $LISTENQUEUE -C /etc/imapd.conf -M /etc/cyrus.conf -p /run/cyrus/master.pid -D";
Restart = "on-failure";
RestartSec = "1s";
@@ -367,9 +368,6 @@ in
RestrictNamespaces = true;
RestrictRealtime = true;
};
preStart = ''
mkdir -p '${cfg.imapdSettings.configdirectory}/socket' '${cfg.tmpDBDir}' /run/cyrus/proc /run/cyrus/lock
'';
};
environment.systemPackages = [ cyrus-imapdPkg ];
};
@@ -109,10 +109,8 @@ in
chown -R dkimproxy-out:dkimproxy-out "${keydir}"
fi
'';
script = ''
exec ${pkgs.dkimproxy}/bin/dkimproxy.out --conf_file=${configfile}
'';
serviceConfig = {
ExecStart = "${pkgs.dkimproxy}/bin/dkimproxy.out --conf_file=${configfile}";
User = "dkimproxy-out";
PermissionsStartOnly = true;
};
+4 -4
View File
@@ -245,13 +245,13 @@
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
preStart = ''
rm -f /var/spool/nullmailer/trigger && mkfifo -m 660 /var/spool/nullmailer/trigger
'';
serviceConfig = {
User = cfg.user;
Group = cfg.group;
ExecStartPre = [
"${lib.getExe' pkgs.coreutils "rm"} -f /var/spool/nullmailer/trigger"
"${lib.getExe' pkgs.coreutils "mkfifo"} -m 660 /var/spool/nullmailer/trigger"
];
ExecStart = "${pkgs.nullmailer}/bin/nullmailer-send";
Restart = "always";
};
+5 -5
View File
@@ -210,13 +210,13 @@ in
description = "Postfix Greylisting Service";
wantedBy = [ "multi-user.target" ];
before = [ "postfix.service" ];
preStart = ''
mkdir -p /var/postgrey
chown postgrey:postgrey /var/postgrey
chmod 0770 /var/postgrey
'';
serviceConfig = {
Type = "simple";
ExecStartPre = [
"${lib.getExe' pkgs.coreutils "mkdir"} -p /var/postgrey"
"${lib.getExe' pkgs.coreutils "chown"} postgrey:postgrey /var/postgrey"
"${lib.getExe' pkgs.coreutils "chmod"} 0770 /var/postgrey"
];
ExecStart = ''
${pkgs.postgrey}/bin/postgrey \
${bind-flag} \
+9 -10
View File
@@ -162,16 +162,6 @@ in
"network.target"
];
preStart =
if useLegacyStorage then
''
mkdir -p ${cfg.dataDir}/data/blobs
''
else
''
mkdir -p ${cfg.dataDir}/db
'';
serviceConfig = {
# Upstream service config
Type = "simple";
@@ -182,6 +172,15 @@ in
RestartSec = 5;
SyslogIdentifier = "stalwart-mail";
ExecStartPre =
if useLegacyStorage then
''
${lib.getExe' pkgs.coreutils "mkdir"} -p ${cfg.dataDir}/data/blobs
''
else
''
${lib.getExe' pkgs.coreutils "mkdir"} -p ${cfg.dataDir}/db
'';
ExecStart = [
""
"${lib.getExe cfg.package} --config=${configFile}"
+2 -5
View File
@@ -88,14 +88,11 @@ in
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
preStart = ''
# There should be only one autofs service managed by systemd, so this should be safe.
rm -f /tmp/autofs-running
'';
serviceConfig = {
Type = "forking";
PIDFile = "/run/autofs.pid";
# There should be only one autofs service managed by systemd, so this should be safe.
ExecStartPre = "${lib.getExe' pkgs.coreutils "rm"} -f /tmp/autofs-running";
ExecStart = "${pkgs.autofs5}/bin/automount ${lib.optionalString cfg.debug "-d"} -p /run/autofs.pid -t ${toString cfg.timeout} ${autoMaster}";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
};
+1 -1
View File
@@ -78,7 +78,7 @@ in
# with code 143 instead of exiting with code 0.
serviceConfig.SuccessExitStatus = [ 143 ];
serviceConfig.Type = "forking";
script = "${pkgs.dict}/sbin/dictd -s -c ${dictdb}/share/dictd/dictd.conf --locale en_US.UTF-8";
serviceConfig.ExecStart = "${pkgs.dict}/sbin/dictd -s -c ${dictdb}/share/dictd/dictd.conf --locale en_US.UTF-8";
};
};
}
@@ -143,11 +143,9 @@ in
description = "Docker Container Registry";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
script = ''
${cfg.package}/bin/registry serve ${configFile}
'';
serviceConfig = {
ExecStart = "${lib.getExe cfg.package} serve ${configFile}";
User = "docker-registry";
WorkingDirectory = cfg.storagePath;
AmbientCapabilities = lib.mkIf (cfg.port < 1024) "cap_net_bind_service";
+4 -4
View File
@@ -100,13 +100,13 @@ in
{
after = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
preStart = ''
mkdir -p ${dataDir}
chown -R errbot:errbot ${dataDir}
'';
serviceConfig = {
User = "errbot";
Restart = "on-failure";
ExecStartPre = [
"${lib.getExe' pkgs.coreutils "mkdir"} -p ${dataDir}"
"${lib.getExe' pkgs.coreutils "chown"} -R errbot:errbot ${dataDir}"
];
ExecStart = "${pkgs.errbot}/bin/errbot -c ${mkConfigDir instanceCfg dataDir}/config.py";
PermissionsStartOnly = true;
};
@@ -0,0 +1,706 @@
{
lib,
pkgs,
config,
options,
...
}:
let
cfg = config.services.dawarich;
opt = options.services.dawarich;
dataDir = "/var/lib/dawarich";
isRedisUnixSocket = lib.hasPrefix "/" cfg.redis.host;
redisEnv =
if isRedisUnixSocket then
{
REDIS_URL = "unix://${config.services.redis.servers.dawarich.unixSocket}";
}
else
{
# Does not support passwords, but upstream does not provide an adequate env variable
# Perhaps patch or make a PR upstream in the future
REDIS_URL = "redis://${cfg.redis.host}:${toString cfg.redis.port}";
};
env = {
RAILS_ENV = "production";
NODE_ENV = "production";
BUNDLE_USER_HOME = "/tmp/bundle"; # will use private tmp inside systemd unit
SELF_HOSTED = "true";
STORE_GEODATA = "true";
APPLICATION_PROTOCOL = "http";
TIME_ZONE = config.time.timeZone; # otherwise upstream forces it to Europe/London
DOMAIN = cfg.localDomain;
APPLICATION_HOSTS = "127.0.0.1,::1,${cfg.localDomain}";
BOOTSNAP_CACHE_DIR = "/var/cache/dawarich/precompile";
LD_PRELOAD = "${lib.getLib pkgs.jemalloc}/lib/libjemalloc.so";
DATABASE_USER = cfg.database.user;
DATABASE_HOST = cfg.database.host;
DATABASE_NAME = cfg.database.name;
DATABASE_PORT = toString cfg.database.port;
SMTP_SERVER = cfg.smtp.host;
SMTP_PORT = toString cfg.smtp.port;
SMTP_FROM = cfg.smtp.fromAddress;
SMTP_USERNAME = cfg.smtp.user;
PORT = toString cfg.webPort;
}
// redisEnv
// cfg.environment;
systemCallFilter =
let
allowedSystemCalls = [
"@cpu-emulation"
"@debug"
"@keyring"
"@ipc"
"@mount"
"@obsolete"
"@privileged"
"@setuid"
];
in
[
("~" + lib.concatStringsSep " " allowedSystemCalls)
"@chown"
"pipe"
"pipe2"
];
cfgService = {
User = cfg.user;
Group = cfg.group;
WorkingDirectory = cfg.package;
CacheDirectory = "dawarich";
CacheDirectoryMode = "0750";
StateDirectory = "dawarich";
StateDirectoryMode = "0750";
LogsDirectory = "dawarich";
LogsDirectoryMode = "0750";
ProcSubset = "pid";
ProtectProc = "invisible";
UMask = "0027";
CapabilityBoundingSet = "";
NoNewPrivileges = true;
ProtectSystem = "strict";
ProtectHome = true;
PrivateTmp = true;
PrivateDevices = true;
PrivateUsers = true;
ProtectClock = true;
ProtectHostname = true;
ProtectKernelLogs = true;
ProtectKernelModules = true;
ProtectKernelTunables = true;
ProtectControlGroups = true;
RestrictAddressFamilies = [
"AF_UNIX"
"AF_INET"
"AF_INET6"
"AF_NETLINK"
];
RestrictNamespaces = true;
LockPersonality = true;
MemoryDenyWriteExecute = false;
RestrictRealtime = true;
RestrictSUIDSGID = true;
RemoveIPC = true;
PrivateMounts = true;
SystemCallArchitectures = "native";
SystemCallFilter = systemCallFilter;
# ensure permissions to connect to the redis socket
SupplementaryGroups = lib.mkIf (cfg.redis.createLocally && isRedisUnixSocket) [
config.services.redis.servers.dawarich.group
];
};
# Units that all Dawarich units After= and Requires= on
commonUnits =
lib.optional cfg.redis.createLocally "redis-dawarich.service"
++ lib.optional cfg.database.createLocally "postgresql.target"
++ lib.optional cfg.automaticMigrations "dawarich-init-db.service";
defaultSecretKeyBaseFile = "${dataDir}/secrets/secret-key-base";
needsGenCredentialsUnit = cfg.secretKeyBaseFile == null;
credentials = {
SECRET_KEY_BASE = lib.defaultTo defaultSecretKeyBaseFile cfg.secretKeyBaseFile;
}
// lib.optionalAttrs (cfg.database.passwordFile != null) {
DATABASE_PASSWORD = cfg.database.passwordFile;
}
// lib.optionalAttrs (cfg.smtp.passwordFile != null) {
SMTP_PASSWORD = cfg.smtp.passwordFile;
};
loadCredentialsIntoEnv = lib.concatMapAttrsStringSep "\n" (
name: _: ''export ${name}="$(systemd-creds cat ${name})"''
) credentials;
loadCredentials = lib.mapAttrsToList (name: path: "${name}:${path}") credentials;
dawarichRails = pkgs.writeShellApplication {
name = "dawarich-rails";
text =
let
sourceExtraEnv = lib.concatMapStrings (p: "source ${p}\n") cfg.extraEnvFiles;
command = pkgs.writeShellScript "dawarich-rails-unwrapped" ''
${sourceExtraEnv}
${loadCredentialsIntoEnv}
export RAILS_ROOT="${cfg.package}"
exec ${lib.getExe' cfg.package "rails"} "$@"
'';
env' = lib.filterAttrs (_: value: value != null) env;
supplementaryGroups = lib.optionalString (cfg.redis.createLocally && isRedisUnixSocket) (
lib.escapeShellArg "--property=SupplementaryGroups=${config.services.redis.servers.dawarich.group}"
);
in
''
exec ${lib.getExe' config.systemd.package "systemd-run"} \
${
lib.escapeShellArgs (map (credential: "--property=LoadCredential=${credential}") loadCredentials)
} \
${
lib.escapeShellArgs (lib.mapAttrsToList (name: value: "--setenv=${name}=${toString value}") env')
} \
--uid=${lib.escapeShellArg cfg.user} \
--gid=${lib.escapeShellArg cfg.group} \
${supplementaryGroups} \
--working-directory=${lib.escapeShellArg cfg.package} \
--property=PrivateTmp=yes \
--pty \
--wait \
--collect \
--service-type=exec \
--quiet \
-- \
${command} "$@"
'';
};
dawarichConsole = pkgs.writeShellScriptBin "dawarich-console" ''
exec ${lib.getExe dawarichRails} console "$@"
'';
sidekiqUnits = lib.attrsets.mapAttrs' (
name: processCfg:
lib.nameValuePair "dawarich-sidekiq-${name}" (
let
jobClassArgs = lib.concatMapStringsSep " " (c: "-q ${c}") processCfg.jobClasses;
jobClassLabel = lib.optionalString (
processCfg.jobClasses != [ ]
) " (${lib.concatStringsSep ", " processCfg.jobClasses})";
threads = toString (if processCfg.threads == null then cfg.sidekiqThreads else processCfg.threads);
in
{
after = [
"network.target"
]
++ lib.optional needsGenCredentialsUnit "dawarich-init-credentials.service"
++ commonUnits;
requires = lib.optional needsGenCredentialsUnit "dawarich-init-credentials.service" ++ commonUnits;
description = "Dawarich sidekiq${jobClassLabel}";
wantedBy = [ "dawarich.target" ];
environment = env // {
RAILS_MAX_THREADS = threads;
};
script = ''
${loadCredentialsIntoEnv}
${lib.getExe' cfg.package "sidekiq"} ${jobClassArgs} -c ${threads} -r ${cfg.package}
'';
serviceConfig = {
Restart = "always";
RestartSec = 20;
LoadCredential = loadCredentials;
EnvironmentFile = cfg.extraEnvFiles;
LimitNOFILE = "1024000";
}
// cfgService;
}
)
) cfg.sidekiqProcesses;
in
{
options = {
services.dawarich = {
enable = lib.mkEnableOption "Dawarich, a self-hostable alternative to Google Location History";
configureNginx = lib.mkOption {
description = ''
Configure nginx as a reverse proxy for dawarich.
Alternatively you can configure a reverse-proxy of your choice to serve these paths:
`/ -> ''${pkgs.dawarich}/public`
`/ -> 127.0.0.1:{{ webPort }} `(If there was no file in the directory above.)
Make sure that websockets are forwarded properly. You might want to set up caching
of some requests. Take a look at dawarich's provided reverse proxy configurations at
`https://dawarich.app/docs/tutorials/reverse-proxy`.
'';
type = lib.types.bool;
default = true;
};
user = lib.mkOption {
description = ''
User under which dawarich runs. If it is set to "dawarich",
that user will be created, otherwise it should be set to the
name of a user created elsewhere.
'';
type = lib.types.str;
default = "dawarich";
};
group = lib.mkOption {
description = ''
Group under which dawarich runs.
'';
type = lib.types.str;
default = "dawarich";
};
webPort = lib.mkOption {
description = "TCP port used by the dawarich web service.";
type = lib.types.port;
default = 3000;
};
sidekiqThreads = lib.mkOption {
description = ''
Worker threads used by the dawarich-sidekiq-all service.
If `sidekiqProcesses` is configured and any processes specify null `threads`, this value is used.
'';
type = lib.types.int;
default = 5;
};
sidekiqProcesses = lib.mkOption {
description = ''
How many Sidekiq processes should be used to handle background jobs, and which job classes they handle.
Can be used to [speed up](https://dawarich.app/docs/FAQ/#how-to-speed-up-the-import-process) the import process.
'';
type =
with lib.types;
attrsOf (submodule {
options = {
jobClasses = lib.mkOption {
# https://github.com/Freika/dawarich/blob/0.37.2/config/sidekiq.yml
type = listOf (enum [
"app_version_checking"
"archival"
"cache"
"data_migrations"
"default"
"digests"
"exports"
"families"
"imports"
"mailers"
"places"
"points"
"reverse_geocoding"
"stats"
"tracks"
"trips"
"visit_suggesting"
]);
description = ''
If not empty, which job classes should be executed by this process.
*If left empty, all job classes will be executed by this process.*
'';
};
threads = lib.mkOption {
type = nullOr int;
description = ''
Number of threads this process should use for executing jobs.
If null, the configured `sidekiqThreads` are used.
'';
};
};
});
default = {
all = {
jobClasses = [ ];
threads = null;
};
};
example = {
all = {
jobClasses = [ ];
threads = null;
};
geocoding = {
jobClasses = [ "reverse_geocoding" ];
threads = 10;
};
};
};
localDomain = lib.mkOption {
description = "The domain serving your Dawarich instance.";
example = "dawarich.example.org";
type = lib.types.str;
};
secretKeyBaseFile = lib.mkOption {
description = ''
Path to file containing the secret key base.
A new secret key base can be generated by running:
`nix build -f '<nixpkgs>' dawarich; cd result; bin/bundle exec rails secret`
This file is loaded using systemd credentials, and therefore does not need to be
owned by the dawarich user.
If this option is null, it will be created at ${defaultSecretKeyBaseFile}
with a new secret key base.
'';
default = null;
type = lib.types.nullOr lib.types.str;
};
redis = {
createLocally = lib.mkOption {
description = ''
Whether to configure a local Redis server for Dawarich.
The connection is performed via Unix sockets by default,
but that can be changed by configuring {option}`${opt.redis.host}` and {option}`${opt.redis.port}`.
'';
type = lib.types.bool;
default = true;
};
host = lib.mkOption {
description = "The redis host Dawarich will connect to.";
type = lib.types.str;
default = config.services.redis.servers.dawarich.unixSocket;
defaultText = lib.literalExpression "config.services.redis.servers.dawarich.unixSocket";
};
port = lib.mkOption {
description = "The port of the redis server Dawarich will connect to. Set to zero to disable TCP and use Unix sockets instead.";
type = lib.types.port;
default = 0;
};
};
database = {
createLocally = lib.mkOption {
description = ''
Whether to configure a local PostgreSQL server and database for Dawarich.
The connection is performed via Unix sockets.
'';
type = lib.types.bool;
default = true;
};
host = lib.mkOption {
type = lib.types.str;
default = "/run/postgresql";
example = "127.0.0.1";
description = "Hostname or address of the postgresql server. If an absolute path is given here, it will be interpreted as a unix socket path.";
};
port = lib.mkOption {
type = lib.types.nullOr lib.types.port;
default = 5432;
description = "Port of the postgresql server.";
};
name = lib.mkOption {
type = lib.types.str;
default = "dawarich";
description = "The name of the dawarich database.";
};
user = lib.mkOption {
type = lib.types.str;
default = "dawarich";
description = "The database user for dawarich.";
};
passwordFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/run/keys/dawarich-db-password";
description = ''
A file containing the password corresponding to {option}`${opt.database.user}`.
'';
};
};
smtp = {
host = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = "SMTP host used when sending emails to users.";
};
port = lib.mkOption {
type = lib.types.port;
default = 25;
description = "SMTP port used when sending emails to users.";
};
fromAddress = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
example = "dawarich@example.com";
description = ''"From" address used when sending emails to users.'';
};
user = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
example = "dawarich@example.com";
description = "SMTP login name.";
};
passwordFile = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
example = "/run/keys/dawarich-smtp-password";
description = ''
Path to file containing the SMTP password.
'';
};
};
package = lib.mkPackageOption pkgs "dawarich" { };
environment = lib.mkOption {
type =
with lib.types;
attrsOf (
nullOr (oneOf [
str
path
package
])
);
default = { };
description = ''
Extra environment variables to pass to all dawarich services.
'';
};
extraEnvFiles = lib.mkOption {
type = with lib.types; listOf path;
default = [ ];
description = ''
Extra environment files to pass to all Dawarich services. Useful for passing down environment secrets.
'';
example = [ "/etc/dawarich/secret.env" ];
};
automaticMigrations = lib.mkOption {
description = "Whether to perform database migrations automatically";
type = lib.types.bool;
default = true;
};
};
};
config = lib.mkIf cfg.enable (
lib.mkMerge [
{
assertions = [
{
assertion = !isRedisUnixSocket -> cfg.redis.port != 0;
message = ''
`services.dawarich.redis.port` needs to be configured if `services.dawarich.redis.host` is not a unix socket.
'';
}
];
environment.systemPackages = [
dawarichConsole
dawarichRails
];
systemd.targets.dawarich = {
description = "Target for all Dawarich services";
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
};
systemd.services.dawarich-init-credentials = lib.mkIf needsGenCredentialsUnit {
script = ''
umask 077
''
+ lib.optionalString (cfg.secretKeyBaseFile == null) ''
if ! test -f ${defaultSecretKeyBaseFile}; then
mkdir -p $(dirname ${defaultSecretKeyBaseFile})
bin/bundle exec rails secret > ${defaultSecretKeyBaseFile}
fi
'';
environment = env;
serviceConfig = {
Type = "oneshot";
SyslogIdentifier = "dawarich-init-dirs";
# System Call Filtering
SystemCallFilter = [ "~@resources" ] ++ systemCallFilter;
}
// cfgService;
after = [ "network.target" ];
};
systemd.services.dawarich-init-db = lib.mkIf cfg.automaticMigrations {
script = ''
${loadCredentialsIntoEnv}
# Run primary database migrations first (needed before other migrations)
echo "Running primary database migrations..."
rails db:migrate
# Run data migrations
echo "Running DATA migrations..."
rake data:migrate
echo "Running seeds..."
rails db:seed
'';
path = [ cfg.package ];
environment = env;
serviceConfig = {
Type = "oneshot";
LoadCredential = loadCredentials;
EnvironmentFile = cfg.extraEnvFiles;
WorkingDirectory = cfg.package;
# System Call Filtering
SystemCallFilter = [ "~@resources" ] ++ systemCallFilter;
}
// cfgService;
# both postgres and redis are needed for the migrations to work
after = [
"network.target"
]
++ lib.optional needsGenCredentialsUnit "dawarich-init-credentials.service"
++ lib.optional cfg.database.createLocally "postgresql.target"
++ lib.optional cfg.redis.createLocally "redis-dawarich.service";
requires =
lib.optional needsGenCredentialsUnit "dawarich-init-credentials.service"
++ lib.optional cfg.database.createLocally "postgresql.target"
++ lib.optional cfg.redis.createLocally "redis-dawarich.service";
};
systemd.services.dawarich-web = {
after = [
"network.target"
]
++ lib.optional needsGenCredentialsUnit "dawarich-init-credentials.service"
++ commonUnits;
requires = lib.optional needsGenCredentialsUnit "dawarich-init-credentials.service" ++ commonUnits;
wantedBy = [ "dawarich.target" ];
description = "Dawarich web";
environment = env;
script = ''
${loadCredentialsIntoEnv}
${lib.getExe' cfg.package "rails"} server
'';
serviceConfig = {
Restart = "always";
RestartSec = 20;
LoadCredential = loadCredentials;
EnvironmentFile = cfg.extraEnvFiles;
WorkingDirectory = cfg.package;
# Runtime directory and mode
RuntimeDirectory = "dawarich-web";
RuntimeDirectoryMode = "0750";
}
// cfgService;
};
systemd.tmpfiles.settings."dawarich"."${dataDir}/imports/watched".d = {
group = "dawarich";
mode = "700";
user = "dawarich";
};
services.nginx = lib.mkIf cfg.configureNginx {
enable = true;
virtualHosts."${cfg.localDomain}" = {
root = "${cfg.package}/public/";
locations."/" = {
tryFiles = "$uri @proxy";
};
locations."@proxy" = {
proxyPass = "http://127.0.0.1:${toString cfg.webPort}";
recommendedProxySettings = true;
proxyWebsockets = true;
};
};
};
services.redis.servers = lib.mkIf cfg.redis.createLocally {
dawarich = {
enable = true;
port = cfg.redis.port;
bind = lib.mkIf (!isRedisUnixSocket) cfg.redis.host;
};
};
services.postgresql = lib.mkIf cfg.database.createLocally {
enable = true;
extensions = ps: with ps; [ postgis ];
ensureUsers = [
{
inherit (cfg.database) name;
ensureDBOwnership = true;
}
];
ensureDatabases = [ cfg.database.name ];
};
systemd.services.postgresql-setup.serviceConfig.ExecStartPost =
let
# https://github.com/Freika/dawarich/blob/0.30.6/db/schema.rb#L15-L16
# https://postgis.net/documentation/getting_started/
sqlFile = pkgs.writeText "dawarich-postgres-setup.sql" ''
CREATE EXTENSION IF NOT EXISTS postgis;
SELECT postgis_extensions_upgrade();
'';
in
lib.mkIf cfg.database.createLocally [
''
${lib.getExe' config.services.postgresql.package "psql"} -d "${cfg.database.name}" -f "${sqlFile}"
''
];
users.users = lib.mkIf (cfg.user == "dawarich") {
dawarich = {
isSystemUser = true;
home = cfg.package;
inherit (cfg) group;
};
};
users.groups = lib.mkIf (cfg.group == "dawarich") { ${cfg.group} = { }; };
}
{
systemd.services = lib.mkMerge [
sidekiqUnits
];
}
]
);
meta.maintainers = with lib.maintainers; [
diogotcorreia
];
}
+1
View File
@@ -855,6 +855,7 @@ in
"resilver_finish-start-scrub.sh"
"scrub_finish-notify.sh"
"statechange-notify.sh"
"zed-functions.sh"
]
++ lib.optionals (lib.versionOlder cfgZfs.package.version "2.4") [
"deadman-slot_off.sh"
+1
View File
@@ -446,6 +446,7 @@ in
darling-dmg = runTest ./darling-dmg.nix;
dashy = runTest ./web-apps/dashy.nix;
davis = runTest ./davis.nix;
dawarich = runTest ./web-apps/dawarich.nix;
db-rest = runTest ./db-rest.nix;
dconf = runTest ./dconf.nix;
ddns-updater = runTest ./ddns-updater.nix;
+1 -1
View File
@@ -91,7 +91,7 @@
machine.sleep(10)
machine.send_key("alt-f10")
machine.sleep(2)
machine.wait_for_text(r"(Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|Sonntag)")
machine.wait_for_text(r"(Termine|Tag|Woche|Monat|Jahr|Montag|Dienstag|Mittwoch|Donnerstag|Freitag|Samstag|Sonntag)")
machine.screenshot("lomiri-calendar_localised")
'';
}
+11 -6
View File
@@ -6,7 +6,7 @@
}:
{
name = "ringboard";
meta = { inherit (pkgs.ringboard.meta) maintainers; };
meta.maintainers = pkgs.ringboard.meta.maintainers ++ (with lib.maintainers; [ h7x4 ]);
nodes.machine = {
imports = [
@@ -17,12 +17,14 @@
test-support.displayManager.auto.user = "alice";
services.xserver.displayManager.sessionCommands = ''
'${lib.getExe pkgs.gedit}' &
'${lib.getExe pkgs.gedit}' my_document &
'';
services.ringboard.x11.enable = true;
};
enableOCR = true;
testScript =
{ nodes, ... }:
let
@@ -31,7 +33,8 @@
''
@polling_condition
def gedit_running():
machine.succeed("pgrep gedit")
"Check that gedit is running and visible to the user"
machine.wait_for_text("my_document")
with subtest("Wait for service startup"):
machine.wait_for_unit("graphical.target")
@@ -40,10 +43,12 @@
with subtest("Ensure clipboard is monitored"):
with gedit_running: # type: ignore[union-attr]
machine.send_chars("Hello world!")
machine.send_chars("Hello world!", delay=0.1)
machine.sleep(1)
machine.send_key("ctrl-a")
machine.sleep(1)
machine.send_key("ctrl-c")
machine.wait_for_console_text("Small selection transfer complete")
machine.succeed("su - '${user}' -c 'ringboard search Hello | grep world!'")
machine.wait_until_succeeds("su - '${user}' -c 'journalctl --user -u ringboard-listener.service --grep \'Small selection transfer complete\'''", timeout=60)
machine.succeed("su - '${user}' -c 'ringboard search Hello | grep world!'")
'';
}
+77
View File
@@ -0,0 +1,77 @@
{ ... }:
{
name = "dawarich-nixos";
nodes.machine =
{ pkgs, ... }:
{
services.dawarich = {
enable = true;
localDomain = "localhost";
};
environment.etc.geojson.source = pkgs.fetchurl {
url = "https://github.com/Freika/dawarich/raw/8c24764aa56a084e980e21bc2ffd13a72fd611db/spec/fixtures/files/geojson/export.json";
hash = "sha256-qI00E5ixKTRJduAD+qB3JzvrpoJmC55llNtSiPVyxz4=";
};
};
testScript = ''
import json
machine.wait_for_unit("dawarich.target")
machine.wait_for_open_port(3000) # Web
machine.succeed("curl --fail http://localhost/")
# Get API key via ruby console
api_key = machine.succeed("dawarich-rails runner \"puts User.find_by(email: 'demo@dawarich.app').api_key\"").strip().split("\n")[-1]
res = machine.succeed(f"curl -f -H 'Authorization: Bearer {api_key}' http://localhost/api/v1/users/me")
user_data = json.loads(res)
assert user_data['user']['email'] == 'demo@dawarich.app'
example_point = {
"locations": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
-122.40530871,
37.74430413
]
},
"properties": {
"battery_state": "full",
"battery_level": 0.7,
"wifi": "dawarich_home",
"timestamp": "2025-01-17T21:03:01Z",
"horizontal_accuracy": 5,
"vertical_accuracy": -1,
"altitude": 0,
"speed": 92.088,
"speed_accuracy": 0,
"course": 27.07,
"course_accuracy": 0,
"track_id": "799F32F5-89BB-45FB-A639-098B1B95B09F",
"device_id": "8D5D4197-245B-4619-A88B-2049100ADE46"
}
}
]
}
machine.succeed(f"curl -f -H 'Authorization: Bearer {api_key}' --json '{json.dumps(example_point)}' http://localhost/api/v1/points")
res = machine.succeed(f"curl -f -H 'Authorization: Bearer {api_key}' http://localhost/api/v1/points")
assert len(json.loads(res)) == 1
# Test watcher job import
import_dir = "/var/lib/dawarich/imports/watched/demo@dawarich.app"
machine.succeed(f"mkdir -p {import_dir} && cp /etc/geojson {import_dir}/example.json")
machine.succeed('dawarich-rails runner "Import::WatcherJob.perform_now"')
# job runs in the background so doesn't update immediately
res = machine.wait_until_succeeds(f"curl -f -H 'Authorization: Bearer {api_key}' http://localhost/api/v1/points | grep '\"id\":2'")
assert len(json.loads(res)) == 11
'';
}
@@ -6,63 +6,24 @@
lib,
}:
melpaBuild rec {
melpaBuild {
pname = "elpaca";
version = "0-unstable-2025-11-06";
version = "0-unstable-2025-02-16";
src = fetchFromGitHub {
owner = "progfolio";
repo = "elpaca";
rev = "b5ef5f19ac1224853234c9acdac0ec9ea1c440a1";
hash = "sha256-EZ9emYTweRZzMKxZu9nbAaGgE2tInaL7KCKvJ5TaD0g=";
rev = "07b3a653e2411f4d4b5902af1c9b3f159e07bec5";
hash = "sha256-+YJX2BJxH3D5u7YC/yJskZu0F4Nlat3ZROe+RCZGq9w=";
};
nativeBuildInputs = [ git ];
# Moves extensions into the source root directory to install them.
# Disables warnings related to being used with package.el and not matching the installer
# Points the elpaca-repos-directory to the installed package in the nix store
postPatch =
let
siteVersion = lib.concatStrings (lib.drop 2 (lib.splitVersion version));
in
''
mv extensions/* .
substituteInPlace elpaca.el \
--replace-fail "lwarn '(elpaca installer)" \
"ignore '(elpaca installer)" \
--replace-fail "warn \"Package.el" \
"ignore \"Package.el" \
--replace-fail "(expand-file-name \"elpaca/\" elpaca-repos-directory)" \
"\"${placeholder "out"}/share/emacs/site-lisp/elpa/elpaca-${siteVersion}.0\""
'';
passthru.updateScript = unstableGitUpdater { };
meta = {
description = "Elisp package manager and replacement for package.el";
longDescription = ''
Elpaca is an elisp package manager. It allows users to find,
install, update, and remove third-party packages for Emacs. It
is a replacement for the built-in Emacs package manager,
package.el.
Elpaca:
- Installs packages asynchronously, in parallel for fast, non-blocking installations.
- Includes a flexible UI for finding and operating on packages.
- Downloads packages from their sources for convenient elisp development.
- Supports thousands of elisp packages out of the box (MELPA, NonGNU/GNU ELPA, Org/org-contrib).
- Makes it easy for users to create their own ELPAs.
Elpaca has been adapted for Emacs managed via Nix. To activate
Elpaca, this snippet can be used within your init.el:
```elisp
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca-use-package-mode) ;; Optional, for use-package support
```
'';
homepage = "https://github.com/progfolio/elpaca";
description = "Elisp package manager";
license = lib.licenses.gpl3Plus;
maintainers = with lib.maintainers; [
abhisheksingh0x558
@@ -16184,6 +16184,20 @@ final: prev: {
meta.hydraPlatforms = [ ];
};
tuis-nvim = buildVimPlugin {
pname = "tuis.nvim";
version = "0-unstable-2026-01-15";
src = fetchFromGitHub {
owner = "jrop";
repo = "tuis.nvim";
rev = "3f3daa725cf1faffe07287cfe347e054d2f80470";
hash = "sha256-IJIqWD6XNzoAVr75WLzBf1Ut35RxSHzZ0//hTskEdSA=";
fetchSubmodules = true;
};
meta.homepage = "https://github.com/jrop/tuis.nvim/";
meta.hydraPlatforms = [ ];
};
tv-nvim = buildVimPlugin {
pname = "tv.nvim";
version = "0-unstable-2026-01-10";
@@ -1,10 +1,9 @@
with import <localpkgs> { };
let
inherit (vimUtils.override { inherit vim; }) buildVimPlugin;
inherit (neovimUtils) buildNeovimPlugin;
generated = callPackage <localpkgs/pkgs/applications/editors/vim/plugins/generated.nix> {
inherit buildNeovimPlugin buildVimPlugin;
inherit buildVimPlugin;
} { } { };
hasChecksum =
@@ -15,16 +14,15 @@ let
"outputHash"
] value;
parse = name: value: {
pname = value.pname;
version = value.version;
parse = _name: value: {
inherit (value) pname version;
homePage = value.meta.homepage;
checksum =
if hasChecksum value then
{
submodules = value.src.fetchSubmodules or false;
sha256 = value.src.outputHash;
rev = value.src.rev;
inherit (value.src) rev;
}
else
null;
@@ -1242,6 +1242,7 @@ https://github.com/dmmulroy/tsc.nvim/,HEAD,
https://github.com/jgdavey/tslime.vim/,,
https://github.com/mtrajano/tssorter.nvim/,HEAD,
https://github.com/Quramy/tsuquyomi/,,
https://github.com/jrop/tuis.nvim/,HEAD,
https://github.com/alexpasmantier/tv.nvim/,HEAD,
https://github.com/folke/twilight.nvim/,,
https://github.com/pmizio/typescript-tools.nvim/,,
@@ -968,8 +968,8 @@ let
mktplcRef = {
name = "chatgpt-reborn";
publisher = "chris-hayes";
version = "3.27.0";
sha256 = "sha256-52SvGb9TsvDQey5cjw+ZIQBP/1dyWcHKNjqCCCyM6k4=";
version = "3.28.0";
sha256 = "sha256-YOaOBDGoLg/bWB/Yw6CCbJ/J7s6qA8QlbM3wiknCTGQ=";
};
};
@@ -1268,8 +1268,8 @@ let
mktplcRef = {
publisher = "denoland";
name = "vscode-deno";
version = "3.47.0";
hash = "sha256-T8RJi2SiFf6rMTpDQx9VuBv0zNwvusZrwybHeFe5/KQ=";
version = "3.48.0";
hash = "sha256-AWnX4toFJnIhflc039fN31lrrTaKKXUSrePanWoZnJI=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/denoland.vscode-deno/changelog";
@@ -2611,8 +2611,8 @@ let
mktplcRef = {
name = "language-julia";
publisher = "julialang";
version = "1.171.2";
hash = "sha256-XELIrqcyd6DEpJjbSlE17noiYa8CZvDwnodA1QALewM=";
version = "1.174.2";
hash = "sha256-nlMuWnJOtUlCB9RGWUngB8KgIiNxoQTHkjI6ZtO/Gjs=";
};
meta = {
changelog = "https://marketplace.visualstudio.com/items/julialang.language-julia/changelog";
@@ -4469,8 +4469,8 @@ let
mktplcRef = {
name = "vscode-stylelint";
publisher = "stylelint";
version = "1.6.0";
hash = "sha256-t0zS4+UZePViqkGgVezy/2CyyqilUKb6byTYukbxqr8=";
version = "2.0.1";
hash = "sha256-TYUDm+i7Chuybbx91AUxH/oIyZYWpZ5XnYxjhjXGP88=";
};
meta = {
description = "Official Stylelint extension for Visual Studio Code";
@@ -7,8 +7,8 @@ vscode-utils.buildVscodeMarketplaceExtension {
mktplcRef = {
publisher = "sourcegraph";
name = "amp";
version = "0.0.1768263519";
hash = "sha256-uOvvkzXvyHiJP3ZxHBJhXW/M8Ju1DjSXpwflAkKjgxs=";
version = "0.0.1768796962";
hash = "sha256-uZb5QI6JDv8FdLU0yZzFsJ43J0P0X5c16dl5Poa8n/w=";
};
meta = {
@@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "mednafen-pce-fast";
version = "0-unstable-2025-11-14";
version = "0-unstable-2026-01-16";
src = fetchFromGitHub {
owner = "libretro";
repo = "beetle-pce-fast-libretro";
rev = "7e9b257b8a591cb7e00f9e55371edba19db9799c";
hash = "sha256-LBx4bSnE3XeQw/Bc5EID8U6Dxj7uc6JBrV8vSwO/jEM=";
rev = "6d182b22f6b9430c76ea71579ffb2eee0e2e9521";
hash = "sha256-QHkG5CSZgaakblOgp5HxGvtWg8K4Nbag481nhG4UjoY=";
};
makefile = "Makefile";
@@ -8,13 +8,13 @@
}:
mkLibretroCore {
core = "mednafen-psx" + lib.optionalString withHw "-hw";
version = "0-unstable-2026-01-12";
version = "0-unstable-2026-01-16";
src = fetchFromGitHub {
owner = "libretro";
repo = "beetle-psx-libretro";
rev = "254285de247db71ac25a4392c159dc1114940794";
hash = "sha256-RDUyTGlrouttC9V4irOC8U1zcNsCxnTIdm6wrAECY2E=";
rev = "5965c585abcaf6b5205a1347de82471e22aaabe3";
hash = "sha256-Mks6xJre1gaxBqWfAzVTNp6Ooy5VDc86HAoj3wlHYRw=";
};
extraBuildInputs = lib.optionals withHw [
@@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "bsnes";
version = "0-unstable-2025-12-19";
version = "0-unstable-2026-01-16";
src = fetchFromGitHub {
owner = "libretro";
repo = "bsnes-libretro";
rev = "d9b7c292cfb15959c9928e3b76bb1047b8499938";
hash = "sha256-FzYe6p3+knxcoIcQW00p3C3+rMEsAWI+ZFdy5mvDhoY=";
rev = "d0a61b2c679bc73286be5471b222b1f1ebfb67b9";
hash = "sha256-1C+c0cQqFSRDGBhNr4s4xD/THbyDP/iVUJpAmHFQfiE=";
};
makefile = "Makefile";
@@ -5,13 +5,13 @@
}:
mkLibretroCore {
core = "fbneo";
version = "0-unstable-2026-01-11";
version = "0-unstable-2026-01-18";
src = fetchFromGitHub {
owner = "libretro";
repo = "fbneo";
rev = "aaecfedbb206a79d0e35a0dfe922622b921a66f7";
hash = "sha256-Xn3lxXFf7EEism9CIGYhvP83oCpOTrpgnBAwkkB4TDM=";
rev = "3faea4f9c678bad8063f3a2774b051f42848c856";
hash = "sha256-tH9XMBfg3O2oKIUeKWi2hl4yQuHa9BMgvkWjIxv/KIo=";
};
makefile = "Makefile";
@@ -62,19 +62,20 @@ mkChromiumDerivation (base: rec {
$out/share/applications/chromium-browser.desktop
substituteInPlace $out/share/applications/chromium-browser.desktop \
--replace "@@MENUNAME@@" "Chromium" \
--replace "@@PACKAGE@@" "chromium" \
--replace "Exec=/usr/bin/@@USR_BIN_SYMLINK_NAME@@" "Exec=chromium"
# Append more mime types to the end
sed -i '/^MimeType=/ s,$,x-scheme-handler/webcal;x-scheme-handler/mailto;x-scheme-handler/about;x-scheme-handler/unknown,' \
$out/share/applications/chromium-browser.desktop
--replace-fail "@@MENUNAME@@" "Chromium" \
--replace-fail "@@PACKAGE@@" "chromium" \
--replace-fail "/usr/bin/@@USR_BIN_SYMLINK_NAME@@" "chromium" \
--replace-fail "@@URI_SCHEME@@" "x-scheme-handler/chromium;" \
--replace-fail "@@EXTRA_DESKTOP_ENTRIES@@" ""
# See https://github.com/NixOS/nixpkgs/issues/12433
sed -i \
-e '/\[Desktop Entry\]/a\' \
-e 'StartupWMClass=chromium-browser' \
$out/share/applications/chromium-browser.desktop
substituteInPlace $out/share/applications/chromium-browser.desktop \
--replace-fail "[Desktop Entry]" "[Desktop Entry]''\nStartupWMClass=chromium-browser"
if grep -F '@@' $out/share/applications/chromium-browser.desktop ; then
echo "error: chromium-browser.desktop contains unsubstituted placeholders" >&2
exit 1
fi
'';
passthru = { inherit sandboxExecutableName; };
@@ -0,0 +1,138 @@
{
"images-calico-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-calico.linux-amd64.tar.gz",
"sha256": "d9184c1907c6a07328db80bc9787d9473874f99387997eb75712b3f109c28a95"
},
"images-calico-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-calico.linux-amd64.tar.zst",
"sha256": "3b0fab246141f52418b0e8944ad0edac46e512ae837a6846d6685bd2ca934562"
},
"images-calico-linux-arm64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-calico.linux-arm64.tar.gz",
"sha256": "9ffb3e4607f44d5dde2e5fd17e4c317fb2f232174cd9b4fc1b5979ec8f0f0fa8"
},
"images-calico-linux-arm64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-calico.linux-arm64.tar.zst",
"sha256": "c1531be737cb6dc2819f35e8e63d095b05db9dcd0698416a60b786a9e3d69bbf"
},
"images-canal-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-canal.linux-amd64.tar.gz",
"sha256": "dc6c2a3f22739fac02272372fc7eadb27809721ee921669203d46ec551fbb8a2"
},
"images-canal-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-canal.linux-amd64.tar.zst",
"sha256": "f039d8feabd264aa6a6d684560bd05e764e748292649736d436b28974b86668e"
},
"images-canal-linux-arm64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-canal.linux-arm64.tar.gz",
"sha256": "6560ef5589c30afe63195d23a27ffcf4492a2e5135bb715c4c7818cd625a244e"
},
"images-canal-linux-arm64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-canal.linux-arm64.tar.zst",
"sha256": "8085686ffb57b508198916cd8ebdaec2a90b1e2f1592caeb0c4a55ae1ab4d223"
},
"images-cilium-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-cilium.linux-amd64.tar.gz",
"sha256": "bf4fff99097f8bdf14d1ce51884e062140e311a08ad3661cd5455d966781d8ea"
},
"images-cilium-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-cilium.linux-amd64.tar.zst",
"sha256": "755338043246a0d167a16ff63ec53651ce9e837d39625d06bbbcd2c63004ec1c"
},
"images-cilium-linux-arm64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-cilium.linux-arm64.tar.gz",
"sha256": "f1b3dd87ee96aa022a73d535163bb066ae75b038188cd7937809e56d7896cd93"
},
"images-cilium-linux-arm64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-cilium.linux-arm64.tar.zst",
"sha256": "decc80c50fd887ec299ff9b5ec5e7853be71c49f337cd5bb806c377e9e6f75ce"
},
"images-core-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-core.linux-amd64.tar.gz",
"sha256": "0fcbac0cfe2b7df25a677686408da84f960f292573d29341779191a981a1cd58"
},
"images-core-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-core.linux-amd64.tar.zst",
"sha256": "4a715e8cc723a5b6b602b223c6609b1407ff837f6d31b203e23d2c53d9d7c85b"
},
"images-core-linux-arm64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-core.linux-arm64.tar.gz",
"sha256": "006b3603ca45d69897f47ac0e32b43eed3354a38fb3ed6d12b82f27c924f444d"
},
"images-core-linux-arm64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-core.linux-arm64.tar.zst",
"sha256": "f2ee745a844902404623a4e45f0ecbcb7753547e199c93f87b750a9c3b7d32ff"
},
"images-flannel-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-flannel.linux-amd64.tar.gz",
"sha256": "63751fc22b0e35c44224c0ff053d6606ec63b885d1f8bde659e931b3de17815e"
},
"images-flannel-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-flannel.linux-amd64.tar.zst",
"sha256": "1107c8a8c5aa90d5a8351340ac0a54862bd720f265f1b48742d55289d20c299f"
},
"images-flannel-linux-arm64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-flannel.linux-arm64.tar.gz",
"sha256": "337cdc528527e804e82cccdca4eb9d8a211b79b2a7839f280f285db1eabce22f"
},
"images-flannel-linux-arm64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-flannel.linux-arm64.tar.zst",
"sha256": "bbb4c7627e3d449284f20d79cf8392686fca7066043777092a455fabbaaf9ad7"
},
"images-harvester-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-harvester.linux-amd64.tar.gz",
"sha256": "add464ba1af538d9ac0e4a5b739ede0ec5601e0fb380a07b6695d69fd95fa166"
},
"images-harvester-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-harvester.linux-amd64.tar.zst",
"sha256": "3623423261a3db1d58750d98cc71950f21ebdab355103eab192f60db90834f29"
},
"images-harvester-linux-arm64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-harvester.linux-arm64.tar.gz",
"sha256": "d593f160508714b5d2e4c194c354daf16064d36505ae8e75b86fa9e8eae1c8ab"
},
"images-harvester-linux-arm64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-harvester.linux-arm64.tar.zst",
"sha256": "2d0ad2cb9bf5c0e6497e4a1f7602b7868653b303c249f2034fd6b3b95e0db194"
},
"images-multus-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-multus.linux-amd64.tar.gz",
"sha256": "2b4368fae7354431fbb66906a703f3c519bbcc71f46dd7e01d4874c911219990"
},
"images-multus-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-multus.linux-amd64.tar.zst",
"sha256": "778b48e8e451f3440fb02dda27e87a3a1c2fc8b5e1ae1386398e30fb698fc808"
},
"images-multus-linux-arm64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-multus.linux-arm64.tar.gz",
"sha256": "849f717627cc42919480bb35650e5e47c74fe39da40d1fe173f3b789abf5e3fc"
},
"images-multus-linux-arm64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-multus.linux-arm64.tar.zst",
"sha256": "b570507f05e25379e0e3cd9f0bd9562d2fc87c8cba4eada865cfd22a94abab1b"
},
"images-traefik-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-traefik.linux-amd64.tar.gz",
"sha256": "d28e86d1aba3274a7ed13278d9852956f454c4bc1da30a1df9c0b1184aa41ed1"
},
"images-traefik-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-traefik.linux-amd64.tar.zst",
"sha256": "d7364c02738d90b1f9aaf48c5dfd17d0393333fe1a67002e522fe4cf429118e7"
},
"images-traefik-linux-arm64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-traefik.linux-arm64.tar.gz",
"sha256": "973358a62e4cbdd955097e9bdcbec7aacc439123486439aafcd1bb5af5828571"
},
"images-traefik-linux-arm64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-traefik.linux-arm64.tar.zst",
"sha256": "aaee9b9bf92cf42bbcb2862dd0bfaa217730ebfe69947926a6fd624b9ba19dcf"
},
"images-vsphere-linux-amd64-tar-gz": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-vsphere.linux-amd64.tar.gz",
"sha256": "4eeb361e1946f56d6fa2dd0a0beee094d0818a4f4278b1531c3a481c349ac4a1"
},
"images-vsphere-linux-amd64-tar-zst": {
"url": "https://github.com/rancher/rke2/releases/download/v1.35.0%2Brke2r1/rke2-images-vsphere.linux-amd64.tar.zst",
"sha256": "be8b6a4d3823c2e4f22df991236227415a771794e3631ce228f89f9f3363cdaf"
}
}
@@ -0,0 +1,13 @@
{
rke2Version = "1.35.0+rke2r1";
rke2Commit = "233368982cc7242d3eb01e22112343839e8e8f2d";
rke2TarballHash = "sha256-spnfiv5butC6yh9h3uosS0M5jTbPAuy6N+jzdri9Ano=";
rke2VendorHash = "sha256-DSIhALF+Ic1zm52YntGoBbbJkeq0SX7QkpyOQ9z2+Qo=";
k8sImageTag = "v1.35.0-rke2r1-build20251218";
etcdVersion = "v3.6.6-k3s1-build20251210";
pauseVersion = "3.6";
ccmVersion = "v1.35.0-rc1.0.20251218152248-a6c6cd15c0c4-build20251219";
dockerizedVersion = "v1.35.0-rke2r1";
helmJobVersion = "v0.9.12-build20251215";
imagesVersions = with builtins; fromJSON (readFile ./images-versions.json);
}
@@ -35,7 +35,17 @@ rec {
}
) extraArgs;
rke2_1_35 = common (
(import ./1_35/versions.nix)
// {
updateScript = [
./update-script.sh
"35"
];
}
) extraArgs;
# Automatically set by update script
rke2_stable = rke2_1_34;
rke2_latest = rke2_1_34;
rke2_latest = rke2_1_35;
}
@@ -101,11 +101,11 @@
"vendorHash": "sha256-quoFrJbB1vjz+MdV+jnr7FPACHuUe5Gx9POLubD2IaM="
},
"baidubce_baiducloud": {
"hash": "sha256-BNpBNBxRSKgxwvgIY289MLUf0Eui5/ccY97sAouHjbc=",
"hash": "sha256-r5NPRWjjlLD5qrLmVPe3JFrRRp3mV0NJwT3rOo0k8FA=",
"homepage": "https://registry.terraform.io/providers/baidubce/baiducloud",
"owner": "baidubce",
"repo": "terraform-provider-baiducloud",
"rev": "v1.22.16",
"rev": "v1.22.17",
"spdx": "MPL-2.0",
"vendorHash": null
},
@@ -1049,11 +1049,11 @@
"vendorHash": null
},
"oracle_oci": {
"hash": "sha256-wHNR0U8z0wY878ww2e+yybYYwUCbiGWSkIcEiubfOp4=",
"hash": "sha256-VGf5sCHMhOFm+w3lz2yhH0lw0MSlQYlYK/+lEuXk4vc=",
"homepage": "https://registry.terraform.io/providers/oracle/oci",
"owner": "oracle",
"repo": "terraform-provider-oci",
"rev": "v7.29.0",
"rev": "v7.30.0",
"spdx": "MPL-2.0",
"vendorHash": null
},
+10 -15
View File
@@ -39,21 +39,16 @@ pythonPackages.buildPythonApplication rec {
propagatedBuildInputs = [ qt5.qtwayland ];
dependencies =
with pythonPackages;
[
distro
jsonschema
psutil
pyqt5
sentry-sdk
setuptools
sip
truststore
]
++ lib.optionals (pythonOlder "3.9") [
importlib-resources
];
dependencies = with pythonPackages; [
distro
jsonschema
psutil
pyqt5
sentry-sdk
setuptools
sip
truststore
];
dontWrapQtApps = true;
+17 -22
View File
@@ -35,28 +35,23 @@ python3Packages.buildPythonApplication {
build-system = with python3Packages; [ setuptools ];
dependencies =
with python3Packages;
[
aiofiles
aiohttp
aiohttp-cors
async-generator
distro
jinja2
jsonschema
multidict
platformdirs
prompt-toolkit
psutil
py-cpuinfo
sentry-sdk
truststore
yarl
]
++ lib.optionals (pythonOlder "3.9") [
importlib-resources
];
dependencies = with python3Packages; [
aiofiles
aiohttp
aiohttp-cors
async-generator
distro
jinja2
jsonschema
multidict
platformdirs
prompt-toolkit
psutil
py-cpuinfo
sentry-sdk
truststore
yarl
];
postInstall = lib.optionalString (!stdenv.hostPlatform.isWindows) ''
rm $out/bin/gns3loopback
@@ -100,8 +100,8 @@ rec {
thunderbird-140 = common {
applicationName = "Thunderbird ESR";
version = "140.6.0esr";
sha512 = "817a807381fa0b5e5e2c3f961931855788649ed596b1c6773ec5b0d6715e90df137ab0f755408a9137b5573169c2e2040bf6a01c4ecdb9a8b010e6c43dbb6381";
version = "140.7.0esr";
sha512 = "92746d87ca2d5a59082c25aa3c3a816e5bf24ae3e095f8ec478a60c5cd890faea392ff98b5b510cc9a89b155240dce9d06c7ddd0f17f564722acc65105fb6cd2";
updateScript = callPackage ./update.nix {
attrPath = "thunderbirdPackages.thunderbird-140";
@@ -17,10 +17,17 @@ let
}:
stdenv.mkDerivation {
inherit version pname src;
outputs = [
"out"
"dev"
];
nativeBuildInputs = [
pkg-config
cmake
];
propagatedBuildInputs = [ libusb1 ];
cmakeFlags = lib.optionals stdenv.hostPlatform.isLinux [
+1 -2
View File
@@ -3,7 +3,6 @@
buildPythonApplication,
fetchFromGitHub,
isPyPy,
pythonOlder,
lib,
defusedxml,
packaging,
@@ -31,7 +30,7 @@ buildPythonApplication rec {
version = "4.3.3";
pyproject = true;
disabled = isPyPy || pythonOlder "3.9";
disabled = isPyPy;
src = fetchFromGitHub {
owner = "nicolargo";
@@ -74,6 +74,10 @@ apprun() {
else echo "$(basename "$APPIMAGE")" installed in "$APPDIR"
fi
# Fix potential for the appimages to try to import libraries from QT
# installed on the system, causing a version mismatch
unset QT_PLUGIN_PATH
export PATH="$PATH:$PWD/usr/bin"
}
+5 -3
View File
@@ -17,7 +17,11 @@ in
lib.makeOverridable (
{
name,
name ? lib.throwIf (
pname == null || version == null
) "buildEnv: expect arguments 'pname' and 'version' or 'name'" "${pname}-${version}",
pname ? null,
version ? null,
# The manifest file (if any). A symlink $out/manifest will be
# created to it.
@@ -60,8 +64,6 @@ lib.makeOverridable (
passthru ? { },
meta ? { },
pname ? null,
version ? null,
}:
let
chosenOutputs = map (drv: {
+2 -2
View File
@@ -6,7 +6,7 @@
}:
stdenvNoCC.mkDerivation rec {
pname = "0xproto";
version = "2.501";
version = "2.502";
src =
let
@@ -14,7 +14,7 @@ stdenvNoCC.mkDerivation rec {
in
fetchzip {
url = "https://github.com/0xType/0xProto/releases/download/${version}/0xProto_${underscoreVersion}.zip";
hash = "sha256-l1+fRPMo3k9EEGXiMw+8Z78KxjO3AGgvyqSfsN188vQ=";
hash = "sha256-ffYvfEGMoIJKVEcs2XzhDrq++SkTbQOVvb6X9q+uyu8=";
stripRoot = false;
};
@@ -1,46 +0,0 @@
{
lib,
stdenv,
fetchurl,
}:
stdenv.mkDerivation rec {
pname = "amazon-ecs-cli";
version = "1.21.0";
src =
if stdenv.hostPlatform.system == "x86_64-linux" then
fetchurl {
url = "https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-linux-amd64-v${version}";
sha256 = "sEHwhirU2EYwtBRegiIvN4yr7VKtmy7e6xx5gZOkuY0=";
}
else if stdenv.hostPlatform.system == "x86_64-darwin" then
fetchurl {
url = "https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-darwin-amd64-v${version}";
sha256 = "1viala49sifpcmgn3jw24h5bkrlm4ffadjiqagbxj3lr0r78i9nm";
}
else
throw "Architecture not supported";
dontUnpack = true;
installPhase = ''
mkdir -p $out/bin
cp $src $out/bin/ecs-cli
chmod +x $out/bin/ecs-cli
''; # */
meta = {
homepage = "https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI.html";
description = "Amazon ECS command line interface";
longDescription = "The Amazon Elastic Container Service (Amazon ECS) command line interface (CLI) provides high-level commands to simplify creating, updating, and monitoring clusters and tasks from a local development environment.";
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ Scriptkiddi ];
platforms = [
"x86_64-linux"
"x86_64-darwin"
];
mainProgram = "ecs-cli";
};
}
+4 -4
View File
@@ -5,7 +5,7 @@
"packages": {
"": {
"dependencies": {
"@sourcegraph/amp": "^0.0.1768219292-g8af118"
"@sourcegraph/amp": "^0.0.1768760544-gf06f5a"
}
},
"node_modules/@napi-rs/keyring": {
@@ -228,9 +228,9 @@
}
},
"node_modules/@sourcegraph/amp": {
"version": "0.0.1768219292-g8af118",
"resolved": "https://registry.npmjs.org/@sourcegraph/amp/-/amp-0.0.1768219292-g8af118.tgz",
"integrity": "sha512-GW5MyNOiTu4G4cY29UI/0ttXu4b2QRwjmz4I9pvZqvIFrMmotBKC4wQinj8Dt6jD0ey7284Rhm8xHJ1iRtMoxA==",
"version": "0.0.1768760544-gf06f5a",
"resolved": "https://registry.npmjs.org/@sourcegraph/amp/-/amp-0.0.1768760544-gf06f5a.tgz",
"integrity": "sha512-ECw/n1n3aKERHW8qo5KaFgKgLDj4zJElFsyHnAS10BRv3ON0T6BPbboMvqvtYq1NEeX00QGpBDO2u0Q1+k3oGQ==",
"license": "Amp Commercial License",
"dependencies": {
"@napi-rs/keyring": "1.1.9"
+3 -3
View File
@@ -9,11 +9,11 @@
buildNpmPackage (finalAttrs: {
pname = "amp-cli";
version = "0.0.1768219292-g8af118";
version = "0.0.1768760544-gf06f5a";
src = fetchzip {
url = "https://registry.npmjs.org/@sourcegraph/amp/-/amp-${finalAttrs.version}.tgz";
hash = "sha256-DstiWCfox5CuHKfy3EgLk7N8KK67txuMG/flriiDH3I=";
hash = "sha256-URgYg3SZXeHrw+xXiXC1BDe0/ZUFRu9mDmqtTIA9ObU=";
};
postPatch = ''
@@ -45,7 +45,7 @@ buildNpmPackage (finalAttrs: {
chmod +x bin/amp-wrapper.js
'';
npmDepsHash = "sha256-oB8YPiKoCG6+oNGlE6YdZ6F/6FEq96qJq/tdC164nrM=";
npmDepsHash = "sha256-7r522RT+38rjv1YqjhR9XIhWYoxVHmRUKeYfToCbsHA=";
propagatedBuildInputs = [
ripgrep
+3 -3
View File
@@ -82,13 +82,13 @@ let
in
stdenv.mkDerivation {
pname = "ansel";
version = "0-unstable-2026-01-09";
version = "0-unstable-2026-01-17";
src = fetchFromGitHub {
owner = "aurelienpierreeng";
repo = "ansel";
rev = "1d3af0ff6899a96a4fb916806696e563c1accb80";
hash = "sha256-XLKuQPCXAsH1qpC8Sw6AFSwXhl10pD0X1PSaRIhrnzs=";
rev = "0a6a812ce35f50ff4e2bf6302f1fb1c9d24a6f19";
hash = "sha256-1tvh8ZbEUPRufFN0KHbPDqy7DEod9LRRI0XpxKJDZmU=";
fetchSubmodules = true;
};
+2 -2
View File
@@ -13,7 +13,7 @@ buildGoModule rec {
src = fetchFromGitHub {
owner = "argoproj";
repo = "argo";
repo = "argo-workflows";
tag = "v${version}";
hash = "sha256-TM/eK8biMxKV4SFJ1Lys+NPPeaHVjbBo83k2RH1Xi40=";
};
@@ -55,7 +55,7 @@ buildGoModule rec {
meta = {
description = "Container native workflow engine for Kubernetes";
mainProgram = "argo";
homepage = "https://github.com/argoproj/argo";
homepage = "https://github.com/argoproj/argo-workflows";
changelog = "https://github.com/argoproj/argo-workflows/blob/v${version}/CHANGELOG.md";
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ groodt ];
+2 -2
View File
@@ -14,13 +14,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "astroterm";
version = "1.0.9";
version = "1.0.10";
src = fetchFromGitHub {
owner = "da-luce";
repo = "astroterm";
tag = "v${finalAttrs.version}";
hash = "sha256-3UXFB4NNKn2w1dYlQzhFyxWwa7/1qkCXPNdBqHK+eQ8=";
hash = "sha256-z9KblIAoXk///NnRFHCSAFNDuNiPxDuuiliajcsyJM0=";
};
bsc5File = fetchurl {
@@ -7,16 +7,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "automatic-timezoned";
version = "2.0.106";
version = "2.0.108";
src = fetchFromGitHub {
owner = "maxbrunet";
repo = "automatic-timezoned";
rev = "v${finalAttrs.version}";
sha256 = "sha256-djvRfp1LhkHuDmjDuOErzcD9KXH6fiRrUR73ncldzUc=";
sha256 = "sha256-aizxFWQpiwEo197Oydez2nAChQQ32jPqOEW3wNLnb7c=";
};
cargoHash = "sha256-T8PY/mFvcdXPZeQKEUekBan+0qBQnmsZ5O96EYcxkcI=";
cargoHash = "sha256-gT1pHDYwqVeZ0epGX8v3+B4o6y8jO21rUyz1rLD3eCY=";
nativeInstallCheckInputs = [ versionCheckHook ];
-59
View File
@@ -1,59 +0,0 @@
{
python3Packages,
lib,
fetchFromGitHub,
fetchPypi,
awscli,
writableTmpDirAsHomeHook,
}:
python3Packages.buildPythonApplication rec {
pname = "aws-shell";
version = "0.2.2";
format = "setuptools";
src = fetchFromGitHub {
owner = "awslabs";
repo = "aws-shell";
tag = version;
hash = "sha256-m96XaaFDFQaD2YPjw8D1sGJ5lex4Is4LQ5RhGzVPvH4=";
};
build-system = with python3Packages; [
setuptools
];
dependencies = with python3Packages; [
botocore
pygments
mock
configobj
awscli
(prompt-toolkit.overrideAttrs (old: {
src = fetchPypi {
pname = "prompt_toolkit";
version = "1.0.18";
hash = "sha256-3U/KAsgGlJetkxotCZFMaw0bUBUc6Ha8Fb3kx0cJASY=";
};
postPatch = null;
propagatedBuildInputs = old.propagatedBuildInputs ++ [
wcwidth
six
];
}))
];
nativeCheckInputs = with python3Packages; [
pytestCheckHook
writableTmpDirAsHomeHook
];
meta = {
homepage = "https://github.com/awslabs/aws-shell";
description = "Integrated shell for working with the AWS CLI";
platforms = lib.platforms.unix;
license = lib.licenses.asl20;
maintainers = with lib.maintainers; [ bot-wxt1221 ];
mainProgram = "aws-shell";
};
}
-52
View File
@@ -1,52 +0,0 @@
{
lib,
stdenv,
fetchurl,
jre,
}:
stdenv.mkDerivation rec {
pname = "aws-mturk-clt";
version = "1.3.0";
src = fetchurl {
url = "https://mturk.s3.amazonaws.com/CLTSource/aws-mturk-clt-${version}.tar.gz";
sha256 = "00yyc7k3iygg83cknv9i2dsaxwpwzdkc8a2l9j56lg999hw3mqm3";
};
installPhase = ''
mkdir -p $out
cp -prvd bin $out/
for i in $out/bin/*.sh; do
sed -i "$i" -e "s|^MTURK_CMD_HOME=.*|MTURK_CMD_HOME=$out\nexport JAVA_HOME=${jre}|"
done
mkdir -p $out/lib
cp -prvd lib/* $out/lib/
''; # */
meta = {
homepage = "https://requester.mturk.com/developer";
description = "Command line tools for interacting with the Amazon Mechanical Turk";
license = lib.licenses.amazonsl;
longDescription = ''
The Amazon Mechanical Turk is a crowdsourcing marketplace that
allows users (requesters) to submit tasks to be performed by
other humans (workers) for a small fee. This package
contains command-line tools for submitting tasks, querying
results, and so on.
The command-line tools expect a file
<filename>mturk.properties<filename> in the current directory,
which should contain the following:
<screen>
access_key=[insert your access key here]
secret_key=[insert your secret key here]
service_url=http://mechanicalturk.amazonaws.com/?Service=AWSMechanicalTurkRequester
</screen>
'';
};
}
+11 -26
View File
@@ -18,11 +18,7 @@ let
py = python3 // {
pkgs = python3.pkgs.overrideScope (
final: prev: {
sphinx = prev.sphinx.overridePythonAttrs (prev: {
disabledTests = prev.disabledTests ++ [
"test_check_link_response_only" # fails on hydra https://hydra.nixos.org/build/242624087/nixlog/1
];
});
# https://github.com/NixOS/nixpkgs/issues/449266
prompt-toolkit = prev.prompt-toolkit.overridePythonAttrs (prev: rec {
version = "3.0.51";
src = prev.src.override {
@@ -30,6 +26,9 @@ let
hash = "sha256-pNYmjAgnP9nK40VS/qvPR3g+809Yra2ISASWJDdQKrU=";
};
});
# backends/build_system/utils.py cannot parse PEP 440 version
# for python-dateutil 2.9.0.post0 (eg. post0)
python-dateutil = prev.python-dateutil.overridePythonAttrs (prev: rec {
version = "2.8.2";
format = "setuptools";
@@ -48,24 +47,6 @@ let
];
postPatch = null;
});
ruamel-yaml = prev.ruamel-yaml.overridePythonAttrs (prev: rec {
version = "0.17.21";
src = prev.src.override {
inherit version;
hash = "sha256-i3zml6LyEnUqNcGsQURx3BbEJMlXO+SSa1b/P10jt68=";
};
});
urllib3 = prev.urllib3.overridePythonAttrs (prev: rec {
version = "1.26.18";
build-system = with final; [
setuptools
];
postPatch = null;
src = prev.src.override {
inherit version;
hash = "sha256-+OzBu6VmdBNFfFKauVW/jGe0XbeZ0VkGYmFxnjKFgKA=";
};
});
}
);
};
@@ -73,14 +54,14 @@ let
in
py.pkgs.buildPythonApplication rec {
pname = "awscli2";
version = "2.32.15"; # N.B: if you change this, check if overrides are still up-to-date
version = "2.33.2"; # N.B: if you change this, check if overrides are still up-to-date
pyproject = true;
src = fetchFromGitHub {
owner = "aws";
repo = "aws-cli";
tag = version;
hash = "sha256-TOXoArw33exbMfKBnNSECymYS8hVzPoVOA7PWzbnroc=";
hash = "sha256-dAtcYDdrZASrwBjQfnZ4DUR4F5WhY59/UX92QcILavs=";
};
postPatch = ''
@@ -90,7 +71,8 @@ py.pkgs.buildPythonApplication rec {
--replace-fail 'distro>=1.5.0,<1.9.0' 'distro>=1.5.0' \
--replace-fail 'docutils>=0.10,<0.20' 'docutils>=0.10' \
--replace-fail 'prompt-toolkit>=3.0.24,<3.0.52' 'prompt-toolkit>=3.0.24' \
--replace-fail 'ruamel.yaml.clib>=0.2.0,<=0.2.12' 'ruamel.yaml.clib>=0.2.0' \
--replace-fail 'ruamel.yaml>=0.15.0,<=0.17.21' 'ruamel.yaml>=0.15.0' \
--replace-fail 'ruamel.yaml.clib>=0.2.0,<=0.2.12' 'ruamel.yaml.clib>=0.2.0'
substituteInPlace requirements-base.txt \
--replace-fail "wheel==0.43.0" "wheel>=0.43.0"
@@ -180,6 +162,9 @@ py.pkgs.buildPythonApplication rec {
# Requires networking (socket binding not possible in sandbox)
"test_is_socket"
"test_is_special_file_warning"
# Disable slow tests
"test_details_disabled_for_choice_wo_details"
];
pythonImportsCheck = [
+2 -2
View File
@@ -6,13 +6,13 @@
}:
buildGoModule rec {
pname = "bitrise";
version = "2.36.1";
version = "2.36.3";
src = fetchFromGitHub {
owner = "bitrise-io";
repo = "bitrise";
rev = "v${version}";
hash = "sha256-U5885dS5C+AOF7DbiALy42rVcvr+2T3yE6E1mXrC49Y=";
hash = "sha256-0OwPRRr46JfAAjWyeP3n7pDaFN09U31Tq6cwGE7uKHI=";
};
# many tests rely on writable $HOME/.bitrise and require network access
+43
View File
@@ -0,0 +1,43 @@
{
buildNpmPackage,
fetchFromGitHub,
lib,
nix-update-script,
versionCheckHook,
}:
buildNpmPackage (finalAttrs: {
pname = "biwascheme";
version = "0.8.3";
src = fetchFromGitHub {
owner = "biwascheme";
repo = "biwascheme";
tag = "v${finalAttrs.version}";
hash = "sha256-X3spl/myhcfmnJ1pN7RAoR0rc4kEM9s0DLtrN9RqyhU=";
};
npmDepsHash = "sha256-jVLCR6gIgK5OhH/KQPn3lYdTuNpMAEAQS1EtqIq8jTM=";
postPatch = ''
substituteInPlace rollup.config.js \
--replace-fail "git rev-parse HEAD" "echo ${finalAttrs.version}"
'';
env.PUPPETEER_SKIP_DOWNLOAD = true;
doInstallCheck = true;
nativeInstallCheckInputs = [ versionCheckHook ];
versionCheckProgramArg = "--version";
passthru.updateScript = nix-update-script { };
meta = {
description = "Scheme interpreter written in JavaScript";
homepage = "https://github.com/biwascheme/biwascheme";
changelog = "https://github.com/biwascheme/biwascheme/blob/${finalAttrs.src.tag}/CHANGELOG.md";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ yiyu ];
mainProgram = "biwas";
};
})
+3 -3
View File
@@ -27,13 +27,13 @@ in
stdenv.mkDerivation (finalAttrs: {
pname = "pds";
version = "0.4.193";
version = "0.4.204";
src = fetchFromGitHub {
owner = "bluesky-social";
repo = "pds";
tag = "v${finalAttrs.version}";
hash = "sha256-OCG1YR56k0syIxRVrwUr0teaBJFQXocq0H6j9JaQkh8=";
hash = "sha256-jYCMwHKKFIsfOgGYiKVrWtIT7atPA8NsetvfjDW05yE=";
};
sourceRoot = "${finalAttrs.src.name}/service";
@@ -63,7 +63,7 @@ stdenv.mkDerivation (finalAttrs: {
;
pnpm = pnpm_9;
fetcherVersion = 2;
hash = "sha256-4qKWkINpUHzatiMa7ZNYp1NauU2641W0jHDjmRL9ipI=";
hash = "sha256-G6xZfbfz+jud1N6lxwp5FA5baAkFwmofejsPt/Gaze8=";
};
buildPhase = ''
+2 -2
View File
@@ -14,14 +14,14 @@
python3Packages.buildPythonPackage rec {
pname = "boxflat";
version = "1.35.3";
version = "1.35.5";
pyproject = true;
src = fetchFromGitHub {
owner = "Lawstorant";
repo = "boxflat";
tag = "v${version}";
hash = "sha256-ayreXC73OLNpnwNuJe0ImC/ch5W+O0lnkuD31ztTqso=";
hash = "sha256-R03mQIsa6T1ApV8SMWvilBfiCGcAWvyZ5hDDgAuGd6s=";
};
build-system = [ python3Packages.setuptools ];
+2 -2
View File
@@ -17,13 +17,13 @@
stdenv.mkDerivation (finalAttrs: {
pname = "brainflow";
version = "5.19.0";
version = "5.20.0";
src = fetchFromGitHub {
owner = "brainflow-dev";
repo = "brainflow";
tag = finalAttrs.version;
hash = "sha256-XoTd7pEsY2RuMQFj5zo9NhlYgiG0J0aEMdKuxtDuaFg=";
hash = "sha256-qxITJjO6Rf9cx4XWRguOlohud8gnMSQDb/qgwv3wA+8=";
};
patches = [ ];
-2
View File
@@ -15,8 +15,6 @@ python.pkgs.buildPythonApplication rec {
version = "0.0.74";
pyproject = true;
disabled = python.pythonOlder "3.10";
src = fetchFromGitLab {
owner = "yaal";
repo = "canaille";
+3 -3
View File
@@ -8,13 +8,13 @@
stdenvNoCC.mkDerivation {
pname = "candy-icons";
version = "0-unstable-2025-12-26";
version = "0-unstable-2026-01-13";
src = fetchFromGitHub {
owner = "EliverLara";
repo = "candy-icons";
rev = "1ec7ed314104847d6bffdc89ef67663917a67268";
hash = "sha256-p8WZTNHwYTom0QnWvOU0JLRbEYZlGQq/QPpK3KlwBH8=";
rev = "42f5c4817f47e2ef4b011080ebbb2f50a9a6955b";
hash = "sha256-d7jxoqWPRlNX43CdIEihT6kxvke3k8GG9CJkmlkuRNw=";
};
nativeBuildInputs = [ gtk3 ];
+2 -2
View File
@@ -8,13 +8,13 @@
buildGoModule (finalAttrs: {
pname = "carapace-bridge";
version = "1.4.10";
version = "1.4.11";
src = fetchFromGitHub {
owner = "carapace-sh";
repo = "carapace-bridge";
tag = "v${finalAttrs.version}";
hash = "sha256-6CCLSwbAYkMelaM5ac1I1kwOlWKPSOU9M9/2Dybt55I=";
hash = "sha256-npy20q8Fmi4KKN/q41iG6sWmuQVLhiHyUCGVUwS0FsA=";
};
# buildGoModule tries to run `go mod vendor` instead of `go work vendor` on
+3 -3
View File
@@ -11,16 +11,16 @@
rustPlatform.buildRustPackage rec {
pname = "cargo-binstall";
version = "1.16.6";
version = "1.16.7";
src = fetchFromGitHub {
owner = "cargo-bins";
repo = "cargo-binstall";
tag = "v${version}";
hash = "sha256-6acLC+ufODhCvHn7g+yzaN+qnTDjUrCBIX8uOj0PPgg=";
hash = "sha256-0r7QEGwuIh2mquKFqcf3VjvilhVz25Xpr2rJPQp504E=";
};
cargoHash = "sha256-IPDhTbYRtL4nBdNgaQfZ2M+RwZYC5eJfs/+VNlOXodo=";
cargoHash = "sha256-ZJCIjQm/vbO1Voji143HXT3BwlXRtFq4rFNRUguwouA=";
nativeBuildInputs = [
pkg-config
+3 -3
View File
@@ -6,16 +6,16 @@
rustPlatform.buildRustPackage rec {
pname = "cargo-xwin";
version = "0.20.2";
version = "0.21.2";
src = fetchFromGitHub {
owner = "rust-cross";
repo = "cargo-xwin";
rev = "v${version}";
hash = "sha256-M7OO2yO5BvNTqJLI50g25M5aupdOxmlZ3eealmP51Kc=";
hash = "sha256-GQV8Sy7BCkPGYusojZGQtaazTXONdJIZ4B4toO1Lj/w=";
};
cargoHash = "sha256-DwQGmdSzEjzqfsvqczAMJfi9gJjK2b9FAGmMi7rGKuw=";
cargoHash = "sha256-fVr5W5xpucqUyKpDcubAh6GkB0roJ548EHgaIzqVJl0=";
meta = {
description = "Cross compile Cargo project to Windows MSVC target with ease";
@@ -11,16 +11,13 @@
rustc,
setuptools-rust,
openssl,
Security ? null,
isPyPy,
cffi,
pkg-config,
pytestCheckHook,
pytest-subtests,
pythonOlder,
pretend,
libiconv,
libxcrypt,
iso8601,
py,
pytz,
@@ -90,8 +87,7 @@ buildPythonPackage rec {
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
libiconv
]
++ lib.optionals (pythonOlder "3.9") [ libxcrypt ];
];
propagatedBuildInputs = lib.optionals (!isPyPy) [ cffi ];
+19 -5
View File
@@ -1,22 +1,35 @@
{
lib,
fetchFromGitHub,
fetchpatch,
python3Packages,
withTeXLive ? true,
texliveSmall,
}:
python3Packages.buildPythonApplication rec {
python3Packages.buildPythonApplication (finalAttrs: {
pname = "cgt-calc";
version = "1.13.0";
version = "1.14.0";
pyproject = true;
src = fetchFromGitHub {
owner = "KapJI";
repo = "capital-gains-calculator";
rev = "v${version}";
hash = "sha256-y/Y05wG89nccXyxfjqazyPJhd8dOkfwRJre+Rzx97Hw=";
rev = "v${finalAttrs.version}";
hash = "sha256-6iOlDNlpfCrbRCxEJsRYw6zqOehv/buVN+iU6J6CtIk=";
};
patches = [
# https://github.com/KapJI/capital-gains-calculator/pull/715
(fetchpatch {
url = "https://github.com/KapJI/capital-gains-calculator/commit/ec7155c1256b876d5906a3885656489e9fdd798c.patch";
hash = "sha256-pfGHSKuDRF0T1hP7kpRC285limd1voqLXcXCP7mAD3s=";
})
];
pythonRelaxDeps = [
"defusedxml"
];
build-system = with python3Packages; [
poetry-core
];
@@ -26,6 +39,7 @@ python3Packages.buildPythonApplication rec {
jinja2
pandas
requests
pyrate-limiter
types-requests
yfinance
];
@@ -45,4 +59,4 @@ python3Packages.buildPythonApplication rec {
maintainers = with lib.maintainers; [ ambroisie ];
platforms = lib.platforms.unix;
};
}
})
+2 -2
View File
@@ -6,11 +6,11 @@
}:
let
pname = "chatbox";
version = "1.18.2";
version = "1.18.4";
src = fetchurl {
url = "https://download.chatboxai.app/releases/Chatbox-${version}-x86_64.AppImage";
hash = "sha256-5SDoObRi+Zwq4ZvnPz1dYvjhU5oLHbbAG4X4E8KfFbA=";
hash = "sha256-6BUvwL87ndtI2lFMcNKxpdOpn+EyUhAK9jc+a/zpjpU=";
};
appimageContents = appimageTools.extract { inherit pname version src; };
+3 -3
View File
@@ -11,14 +11,14 @@
python3Packages.buildPythonApplication {
pname = "chirp";
version = "0.4.0-unstable-2026-01-12";
version = "0.4.0-unstable-2026-01-17";
pyproject = true;
src = fetchFromGitHub {
owner = "kk7ds";
repo = "chirp";
rev = "e6100c8a3d4769848db16b9557c585bf9ff5c58c";
hash = "sha256-DpM8agWg0D4PJN7yR2frPCF7nnDt6ksv9PtQwqOJSos=";
rev = "a98aca98ea0aaf8aec1f13b088eaff6bd1ea5632";
hash = "sha256-IjsdKKevGgn0ZyxjlxRPhdnApR8/O3tDdIjQS61aM/s=";
};
nativeBuildInputs = [
+3 -3
View File
@@ -10,16 +10,16 @@
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "clash-rs";
version = "0.9.3";
version = "0.9.4";
src = fetchFromGitHub {
owner = "Watfaq";
repo = "clash-rs";
tag = "v${finalAttrs.version}";
hash = "sha256-MVj+GcSt0Q9bWLz7MpCIj9MtnHh/GRB3p+DapMPLxeY=";
hash = "sha256-WtNnBw0/eAz/uO/dlD2yRZHW38CXIT8zhh4lZ3HaIFs=";
};
cargoHash = "sha256-Ikur9G6oSdKbK7gdZozBkplUjPfSjIABTVHjX7UPPvc=";
cargoHash = "sha256-8SLBsYtO6qVihc/C9R3ZptHCKgl2iXiQrOWqgDBXdTc=";
cargoPatches = [ ./Cargo.patch ];
+103 -52
View File
@@ -20,19 +20,29 @@
jq,
ripgrep,
common-updater-scripts,
xar,
cpio,
headless ? false,
}:
let
version = "2025.9.558";
version = "2025.10.186.0";
sources = {
x86_64-linux = fetchurl {
url = "https://pkg.cloudflareclient.com/pool/noble/main/c/cloudflare-warp/cloudflare-warp_${version}.0_amd64.deb";
hash = "sha256-eYPy8YnP/vvYmvvjvF6Y0gSzdglsvoPW6CJ5npjrtpo=";
url = "https://pkg.cloudflareclient.com/pool/noble/main/c/cloudflare-warp/cloudflare-warp_${version}_amd64.deb";
hash = "sha256-l+csDSBXRAFb2075ciCAlE0bS5F48mAIK/Bv1r3Q8GE=";
};
aarch64-linux = fetchurl {
url = "https://pkg.cloudflareclient.com/pool/noble/main/c/cloudflare-warp/cloudflare-warp_${version}.0_arm64.deb";
hash = "sha256-K8XENo+9n3ChmQ33wAg/KiVHjNOKOXp6UQM2fpntgkE=";
url = "https://pkg.cloudflareclient.com/pool/noble/main/c/cloudflare-warp/cloudflare-warp_${version}_arm64.deb";
hash = "sha256-S6CfWYzcv+1Djj+TX+lrP5eG7oIpM0JrqtSw/UDD9ko=";
};
x86_64-darwin = fetchurl {
url = "https://downloads.cloudflareclient.com/v1/download/macos/version/${version}";
hash = "sha256-nnoOXPSpOJRyNdCC0/YAoBK8SwB+++qVwgZplrjNi2U=";
};
aarch64-darwin = fetchurl {
url = "https://downloads.cloudflareclient.com/v1/download/macos/version/${version}";
hash = "sha256-nnoOXPSpOJRyNdCC0/YAoBK8SwB+++qVwgZplrjNi2U=";
};
};
in
@@ -46,26 +56,34 @@ stdenv.mkDerivation (finalAttrs: {
or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
nativeBuildInputs = [
makeWrapper
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
xar
cpio
]
++ lib.optionals stdenv.hostPlatform.isLinux [
dpkg
autoPatchelfHook
versionCheckHook
makeWrapper
]
++ lib.optionals (!headless) [
++ lib.optionals (!headless && stdenv.hostPlatform.isLinux) [
copyDesktopItems
desktop-file-utils
];
buildInputs = [
dbus
libpcap
openssl
nss
(lib.getLib stdenv.cc.cc)
]
++ lib.optionals (!headless) [
gtk3
];
buildInputs = lib.optionals stdenv.hostPlatform.isLinux (
[
dbus
libpcap
openssl
nss
(lib.getLib stdenv.cc.cc)
]
++ lib.optionals (!headless) [
gtk3
]
);
desktopItems = lib.optionals (!headless) [
(makeDesktopItem {
@@ -88,48 +106,78 @@ stdenv.mkDerivation (finalAttrs: {
"libpcap.so.0.8"
];
installPhase = ''
runHook preInstall
unpackPhase = lib.optionalString stdenv.hostPlatform.isDarwin ''
runHook preUnpack
mv usr $out
mv bin $out
mv etc $out
patchelf --replace-needed libpcap.so.0.8 ${libpcap}/lib/libpcap.so $out/bin/warp-dex
mv lib/systemd/system $out/lib/systemd/
substituteInPlace $out/lib/systemd/system/warp-svc.service \
--replace-fail "ExecStart=" "ExecStart=$out"
${lib.optionalString (!headless) ''
substituteInPlace $out/lib/systemd/user/warp-taskbar.service \
--replace-fail "ExecStart=" "ExecStart=$out" \
--replace-fail "BindsTo=" "PartOf="
xar -xf $src
zcat < Cloudflare_WARP_${version}.pkg/Payload | cpio -i
cat >>$out/lib/systemd/user/warp-taskbar.service <<EOF
[Service]
BindReadOnlyPaths=$out:/usr:
EOF
''}
${lib.optionalString headless ''
# For headless version, remove GUI components
rm $out/bin/warp-taskbar
rm -r $out/lib/systemd/user
rm -r $out/etc
rm -r $out/share/applications
rm -r $out/share/icons
rm -r $out/share/warp
''}
runHook postInstall
runHook postUnpack
'';
postInstall = ''
installPhase =
if stdenv.hostPlatform.isDarwin then
''
runHook preInstall
mkdir -p $out/Applications $out/bin
cp -R "Cloudflare WARP.app" $out/Applications/
for tool in warp-cli warp-dex warp-diag; do
ln -s "$out/Applications/Cloudflare WARP.app/Contents/Resources/$tool" "$out/bin/$tool"
done
runHook postInstall
''
else
''
runHook preInstall
mv usr $out
mv bin $out
mv etc $out
patchelf --replace-needed libpcap.so.0.8 ${libpcap}/lib/libpcap.so $out/bin/warp-dex
mv lib/systemd/system $out/lib/systemd/
substituteInPlace $out/lib/systemd/system/warp-svc.service \
--replace-fail "ExecStart=" "ExecStart=$out"
${lib.optionalString (!headless) ''
substituteInPlace $out/lib/systemd/user/warp-taskbar.service \
--replace-fail "ExecStart=" "ExecStart=$out" \
--replace-fail "BindsTo=" "PartOf="
cat >>$out/lib/systemd/user/warp-taskbar.service <<EOF
[Service]
BindReadOnlyPaths=$out:/usr:
EOF
''}
${lib.optionalString headless ''
# For headless version, remove GUI components
rm $out/bin/warp-taskbar
rm -r $out/lib/systemd/user
rm -r $out/etc
rm -r $out/share/applications
rm -r $out/share/icons
rm -r $out/share/warp
''}
runHook postInstall
'';
postInstall = lib.optionalString stdenv.hostPlatform.isLinux ''
wrapProgram $out/bin/warp-svc --prefix PATH : ${lib.makeBinPath [ nftables ]}
${lib.optionalString (!headless) ''
wrapProgram $out/bin/warp-cli --prefix PATH : ${lib.makeBinPath [ desktop-file-utils ]}
''}
'';
doInstallCheck = true;
doInstallCheck = stdenv.hostPlatform.isLinux;
# The Sparkle.framework in the upstream macOS package contains a broken symlink
# (XPCServices -> Versions/Current/XPCServices) where the target doesn't exist.
# This is present in the official installed app and doesn't affect functionality.
dontCheckForBrokenSymlinks = stdenv.hostPlatform.isDarwin;
passthru = {
inherit sources;
@@ -150,8 +198,8 @@ stdenv.mkDerivation (finalAttrs: {
-H 'Accept: application/vnd.github+json' \
-H 'X-GitHub-Api-Version: 2022-11-28' \
'https://api.github.com/repos/cloudflare/cloudflare-docs/git/trees/production?recursive=true' |
jq 'last(.tree.[] | select(.path | startswith("src/content/warp-releases/linux/ga/"))).path' |
rg '([^/]+)\.0\.yaml\b' --only-matching --replace '$1'
jq -r '[.tree[].path | select(startswith("src/content/warp-releases/linux/ga/"))] | max_by(split("/")[-1] | split(".") | map(tonumber?))' |
rg '([^/]+)\.yaml\b' --only-matching --replace '$1'
)"
for platform in ${lib.escapeShellArgs finalAttrs.meta.platforms}; do
@@ -162,7 +210,7 @@ stdenv.mkDerivation (finalAttrs: {
};
meta = {
changelog = "https://github.com/cloudflare/cloudflare-docs/blob/production/src/content/warp-releases/linux/ga/${finalAttrs.version}.0.yaml";
changelog = "https://github.com/cloudflare/cloudflare-docs/blob/production/src/content/warp-releases/linux/ga/${finalAttrs.version}.yaml";
description =
"Replaces the connection between your device and the Internet with a modern, optimized, protocol"
+ lib.optionalString headless " (headless version)";
@@ -172,10 +220,13 @@ stdenv.mkDerivation (finalAttrs: {
mainProgram = "warp-cli";
maintainers = with lib.maintainers; [
marcusramberg
anish
];
platforms = [
"x86_64-linux"
"aarch64-linux"
"x86_64-darwin"
"aarch64-darwin"
];
};
})
+3 -3
View File
@@ -19,13 +19,13 @@
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "cosmic-reader";
version = "0-unstable-2025-12-30";
version = "0-unstable-2026-01-16";
src = fetchFromGitHub {
owner = "pop-os";
repo = "cosmic-reader";
rev = "4892355d48aa337f73f69aafe6739c6833f99a01";
hash = "sha256-kM6YzKTJkkyEv5DBEkkbmlfpUBLEhjaJ4OIzZ62HeJ0=";
rev = "1b030e2f96dc7a141473f87de3cb1f375298589f";
hash = "sha256-r+QPe7+rvdYm76DLFtOePh9+eIvSbzuqvhe4490ynWk=";
};
cargoHash = "sha256-4ofAtZN3FpYwNahinldALbdEJA5lDwa+CUsVIISnSTc=";
+3 -3
View File
@@ -8,16 +8,16 @@
buildGoModule rec {
pname = "ctlptl";
version = "0.8.44";
version = "0.9.0";
src = fetchFromGitHub {
owner = "tilt-dev";
repo = "ctlptl";
rev = "v${version}";
hash = "sha256-DIVKwfTSA03Yyservf3TK7y9RKi2t6pELyC0cpoUH3I=";
hash = "sha256-y957JaHg2SnDC6yvwI/0fBFjbEKOfKFsNqOOrqQe+TU=";
};
vendorHash = "sha256-bZd2DWQ2utKYctx9KzE5BzF5wkj1rGkka6PsYb7G8Oo=";
vendorHash = "sha256-gJiarW1uYr5vl9nt+JN6/yRyYr9J0sfDVZcNLLcwPJY=";
nativeBuildInputs = [ installShellFiles ];
+20 -5
View File
@@ -6,10 +6,12 @@
git,
pkg-config,
boost,
eigen_3_4_0,
eigen_5,
glm,
gcc,
libGL,
libpng,
makeWrapper,
openexr,
onetbb,
xorg,
@@ -20,14 +22,14 @@
stdenv.mkDerivation {
pname = "curv";
version = "0.5-unstable-2025-01-20";
version = "0.5-unstable-2026-01-17";
src = fetchFromGitea {
domain = "codeberg.org";
owner = "doug-moen";
repo = "curv";
rev = "ef082c6612407dd8abce06015f9a16b1ebf661b8";
hash = "sha256-BGL07ZBA+ao3fg3qp56sVTe+3tM2SOp8TGu/jF7SVlM=";
rev = "1c2eb68e47e3c61a98e39cd3c50f90691c5a268d";
hash = "sha256-PuRBnJswrg+PjtU6ize+PjoBpQSSEzO2CeCx9mQF+3w=";
fetchSubmodules = true;
};
@@ -36,11 +38,12 @@ stdenv.mkDerivation {
cmake
git
pkg-config
makeWrapper
];
buildInputs = [
boost
eigen_3_4_0
eigen_5
glm
libGL
libpng
@@ -75,6 +78,18 @@ stdenv.mkDerivation {
--replace-fail "cmake_minimum_required(VERSION 2.6.2)" "cmake_minimum_required(VERSION 3.10)"
'';
## support runtime compilation with -Ojit
fixupPhase = ''
wrapProgram $out/bin/curv \
--set NIX_CFLAGS_COMPILE_${gcc.suffixSalt} "$NIX_CFLAGS_COMPILE" \
--set NIX_LDFLAGS_${gcc.suffixSalt} "$NIX_LDFLAGS" \
--prefix PATH : "${
lib.makeBinPath [
gcc
]
}"
'';
passthru.updateScript = unstableGitUpdater { };
meta = {
+21 -14
View File
@@ -5,8 +5,13 @@
gnugrep,
python3,
}:
python3.pkgs.buildPythonApplication rec {
let
runtimeDeps = [
coccinelle
gnugrep
];
in
python3.pkgs.buildPythonApplication (finalAttrs: {
pname = "cvehound";
version = "1.2.1";
pyproject = true;
@@ -14,19 +19,10 @@ python3.pkgs.buildPythonApplication rec {
src = fetchFromGitHub {
owner = "evdenis";
repo = "cvehound";
tag = version;
tag = finalAttrs.version;
hash = "sha256-UvjmlAm/8B4KfE9grvvgn37Rui+ZRfs2oTLqYYgqcUQ=";
};
makeWrapperArgs = [
"--prefix PATH : ${
lib.makeBinPath [
coccinelle
gnugrep
]
}"
];
build-system = with python3.pkgs; [
setuptools
];
@@ -45,10 +41,21 @@ python3.pkgs.buildPythonApplication rec {
# Tries to clone the kernel sources
doCheck = false;
makeWrapperArgs = [
"--prefix"
"PATH"
":"
(lib.makeBinPath finalAttrs.passthru.runtimeDeps)
];
passthru = {
inherit runtimeDeps;
};
meta = {
description = "Tool to check linux kernel source dump for known CVEs";
homepage = "https://github.com/evdenis/cvehound";
changelog = "https://github.com/evdenis/cvehound/blob/${src.rev}/ChangeLog";
changelog = "https://github.com/evdenis/cvehound/blob/${finalAttrs.src.rev}/ChangeLog";
# See https://github.com/evdenis/cvehound/issues/22
license = with lib.licenses; [
gpl2Only
@@ -56,4 +63,4 @@ python3.pkgs.buildPythonApplication rec {
];
maintainers = with lib.maintainers; [ ambroisie ];
};
}
})
@@ -0,0 +1,18 @@
diff --git a/Gemfile.lock b/Gemfile.lock
index d45a7657..d0a7b750 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -172,12 +172,7 @@ GEM
railties (>= 6.1.0)
fakeredis (0.1.4)
ffaker (2.25.0)
- ffi (1.17.2-aarch64-linux-gnu)
- ffi (1.17.2-arm-linux-gnu)
- ffi (1.17.2-arm64-darwin)
- ffi (1.17.2-x86-linux-gnu)
- ffi (1.17.2-x86_64-darwin)
- ffi (1.17.2-x86_64-linux-gnu)
+ ffi (1.17.2)
foreman (0.90.0)
thor (~> 1.4)
fugit (1.11.1)
@@ -0,0 +1,32 @@
diff --git a/Gemfile b/Gemfile
index 36cf0d9c..fc914849 100644
--- a/Gemfile
+++ b/Gemfile
@@ -28,6 +28,7 @@ gem 'omniauth-github', '~> 2.0.0'
gem 'omniauth-google-oauth2'
gem 'omniauth_openid_connect'
gem 'omniauth-rails_csrf_protection'
+gem 'openssl'
gem 'parallel'
gem 'pg'
gem 'prometheus_exporter'
diff --git a/Gemfile.lock b/Gemfile.lock
index a32eb801..b2fc45bc 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -348,6 +348,7 @@ GEM
tzinfo
validate_url
webfinger (~> 2.0)
+ openssl (3.3.1)
optimist (3.2.1)
orm_adapter (0.5.0)
ostruct (0.6.1)
@@ -665,6 +666,7 @@ DEPENDENCIES
omniauth-google-oauth2
omniauth-rails_csrf_protection
omniauth_openid_connect
+ openssl
parallel
pg
prometheus_exporter
File diff suppressed because it is too large Load Diff
+142
View File
@@ -0,0 +1,142 @@
{
lib,
applyPatches,
bundlerEnv,
fetchFromGitHub,
fetchNpmDeps,
nixosTests,
nodejs,
npmHooks,
ruby_3_4,
stdenv,
tailwindcss_3,
gemset ? import ./gemset.nix,
sources ? lib.importJSON ./sources.json,
unpatchedSource ? fetchFromGitHub {
owner = "Freika";
repo = "dawarich";
tag = sources.version;
inherit (sources) hash;
},
}:
let
ruby = ruby_3_4;
in
stdenv.mkDerivation (finalAttrs: {
pname = "dawarich";
inherit (sources) version;
# Use `applyPatches` here because bundix in the update script (see ./update.sh)
# needs to run on the already patched Gemfile and Gemfile.lock.
# Only patches changing these two files should be here;
# patches for other parts of the application should go directly into mkDerivation.
src = applyPatches {
src = unpatchedSource;
patches = [
# bundix and bundlerEnv fail with system-specific gems
./0001-build-ffi-gem.diff
# openssl 3.6.0 breaks ruby openssl gem
# See https://github.com/NixOS/nixpkgs/issues/456753
# and https://github.com/ruby/openssl/issues/949#issuecomment-3370358680
./0002-openssl-hotfix.diff
];
postPatch = ''
substituteInPlace ./Gemfile \
--replace-fail "ruby File.read('.ruby-version').strip" "ruby '>= 3.4.0'"
'';
};
postPatch = ''
# move import directory to a more convenient place, otherwise its behind systemd private tmp
substituteInPlace ./app/services/imports/watcher.rb \
--replace-fail 'tmp/imports/watched' 'storage/imports/watched'
'';
dawarichGems = bundlerEnv {
name = "${finalAttrs.pname}-gems-${finalAttrs.version}";
inherit gemset ruby;
inherit (finalAttrs) version;
gemdir = finalAttrs.src;
};
npmDeps = fetchNpmDeps {
inherit (finalAttrs) src;
hash = sources.npmHash;
};
RAILS_ENV = "production";
NODE_ENV = "production";
REDIS_URL = ""; # build error if not defined
TAILWINDCSS_INSTALL_DIR = "${tailwindcss_3}/bin";
nativeBuildInputs = [
nodejs
npmHooks.npmConfigHook
finalAttrs.dawarichGems
finalAttrs.dawarichGems.wrappedRuby
];
propagatedBuildInputs = [
finalAttrs.dawarichGems.wrappedRuby
];
buildInputs = [
finalAttrs.dawarichGems
];
buildPhase = ''
runHook preBuild
patchShebangs bin/
for b in $(ls $dawarichGems/bin/)
do
if [ ! -f bin/$b ]; then
ln -s $dawarichGems/bin/$b bin/$b
fi
done
SECRET_KEY_BASE_DUMMY=1 bundle exec rake assets:precompile
rm -rf node_modules tmp log storage
ln -s /var/log/dawarich log
ln -s /var/lib/dawarich storage
ln -s /tmp tmp
# delete more files unneeded at runtime
rm -rf docker docs screenshots package.json package-lock.json *.md *.example
runHook postBuild
'';
installPhase = ''
runHook preInstall
# tests are not needed at runtime
rm -rf spec e2e
# delete artifacts from patching
rm *.orig
mkdir -p $out
mv .{ruby*,app_version} $out/
mv * $out/
runHook postInstall
'';
passthru = {
tests = {
inherit (nixosTests) dawarich;
};
# run with: nix-shell ./maintainers/scripts/update.nix --argstr package dawarich
updateScript = ./update.sh;
};
meta = {
changelog = "https://github.com/Freika/dawarich/blob/${finalAttrs.version}/CHANGELOG.md";
description = "Self-hostable alternative to Google Location History (Google Maps Timeline)";
homepage = "https://dawarich.app/";
license = lib.licenses.agpl3Only;
maintainers = with lib.maintainers; [
diogotcorreia
];
platforms = lib.platforms.linux;
};
})
+5
View File
@@ -0,0 +1,5 @@
{
"version": "0.37.3",
"hash": "sha256-cZBT3ek5mzHbPr4aVHU47SNstEuBnpBNaCfaAe/IAEw=",
"npmHash": "sha256-wDe1Zx9HyheS76ltLtDQ+f4M7ohu/pyRuRaGGCnhkQI="
}
+40
View File
@@ -0,0 +1,40 @@
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p bundix curl jq nix-update nix-prefetch-github prefetch-npm-deps gnused
set -e
set -o pipefail
OWNER="Freika"
REPO="dawarich"
old_version=$(nix-instantiate --eval -A 'dawarich.version' default.nix | tr -d '"')
version=$(curl -s ${GITHUB_TOKEN:+-u ":$GITHUB_TOKEN"} "https://api.github.com/repos/$OWNER/$REPO/releases/latest" | jq -r ".tag_name")
echo "Updating to $version"
if [[ "$old_version" == "$version" ]]; then
echo "Already up to date!"
exit 0
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
echo "Fetching source code $REVISION"
JSON=$(nix-prefetch-github "$OWNER" "$REPO" --rev "refs/tags/$version" 2>/dev/null)
HASH=$(echo "$JSON" | jq -r .hash)
cat > "$SCRIPT_DIR/sources.json" << EOF
{
"version": "$version",
"hash": "$HASH",
"npmHash": "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
}
EOF
SOURCE_DIR="$(nix-build --no-out-link -A dawarich.src)"
echo "Creating gemset.nix"
bundix --lockfile="$SOURCE_DIR/Gemfile.lock" --gemfile="$SOURCE_DIR/Gemfile" --gemset="$SCRIPT_DIR/gemset.nix"
nixfmt "$SCRIPT_DIR/gemset.nix"
NPM_HASH="$(prefetch-npm-deps "$SOURCE_DIR/package-lock.json" 2>/dev/null)"
sed -i "s;sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=;$NPM_HASH;g" "$SCRIPT_DIR/sources.json"

Some files were not shown because too many files have changed in this diff Show More