Compare commits

...

24 Commits

Author SHA1 Message Date
5801da97f3 feeds: import econlib 2023-01-11 10:47:27 +00:00
3a72295610 feeds: import xkcd, lesswrong, lexfridman 2023-01-11 10:42:05 +00:00
e6d9edf27d feeds: add a script to initialize a feed, as well 2023-01-11 10:41:39 +00:00
78782d5f7e flake: update-feeds now actually does update *all* feeds 2023-01-11 10:31:00 +00:00
91275f3723 flake: make an app which updates one feed 2023-01-11 10:22:25 +00:00
8115edea8d readme: fix some outdated info 2023-01-11 09:53:27 +00:00
4c475bbf9c flake: formatting nit 2023-01-11 09:33:59 +00:00
7040e1f07c flake: rename decl-host -> evalHost 2023-01-11 09:31:05 +00:00
aafa64942c flake: simplify the definition of packages 2023-01-11 09:29:49 +00:00
a44a99e371 flake: simplify the imgs/nixosConfigurations definition 2023-01-11 09:24:24 +00:00
a7ff90c843 flake: nixpkgs can now be built without specifying nixpkgs. as a prefix 2023-01-11 09:21:09 +00:00
d4996d6f31 flake: fix passthru overlays (fixes broken image building) 2023-01-11 09:08:46 +00:00
bd5209c655 move cross compilation out of the flake and into the host definitions 2023-01-11 08:56:06 +00:00
9588108fd5 restructure flake so that nixosConfigurations mostly just references the other flake outputs 2023-01-11 08:45:41 +00:00
942e302afb flake: fix crossFrom.aarch64-linux to actually be compiled from that system 2023-01-11 07:51:19 +00:00
2bd98e6764 flake: clean up nixpkgsFor-related functions 2023-01-11 07:50:32 +00:00
7b9910f287 reorder pkgs.cross definition for better readability 2023-01-11 07:37:01 +00:00
917afe209e try to do cross-compiling in a slightly less hacky way 2023-01-11 07:22:21 +00:00
cc5cf9b6f4 flake: format 2023-01-11 05:58:07 +00:00
57d95dd298 flake: document the weird importing 2023-01-10 17:51:04 +00:00
0b78df53be change the nixpkgs url type so that it hashes stably 2023-01-10 17:44:58 +00:00
c8dcb4ac59 flake: lift the nixpkgs patching out to its own flake
i hope it's a *little* cleaner this way, but tbh i'm not really sure.
2023-01-10 17:00:48 +00:00
241f4ae58f packages: add nano for when things go really wrong 2023-01-10 12:53:54 +00:00
965d7eedbb define a per-feed update script
it currently has to be run manually:
```
./pkgs/feeds/update.sh <...>
```

it looks like `nix-update` might not really support flakes
2023-01-10 10:53:59 +00:00
20 changed files with 486 additions and 173 deletions

40
flake.lock generated
View File

@@ -53,18 +53,20 @@
} }
}, },
"nixpkgs": { "nixpkgs": {
"inputs": {
"nixpkgs": [
"nixpkgs-unpatched"
]
},
"locked": { "locked": {
"lastModified": 1672953546, "lastModified": 1,
"narHash": "sha256-oz757DnJ1ITvwyTovuwG3l9cX6j9j6/DH9eH+cXFJmc=", "narHash": "sha256-5eJxyBRYQCoRt92ZFUOdT237Z0VscuNRd0pktDYWJYE=",
"owner": "NixOS", "path": "nixpatches",
"repo": "nixpkgs", "type": "path"
"rev": "a518c77148585023ff56022f09c4b2c418a51ef5",
"type": "github"
}, },
"original": { "original": {
"id": "nixpkgs", "path": "nixpatches",
"ref": "nixos-unstable", "type": "path"
"type": "indirect"
} }
}, },
"nixpkgs-stable": { "nixpkgs-stable": {
@@ -98,14 +100,30 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs-unpatched": {
"locked": {
"lastModified": 1673226411,
"narHash": "sha256-b6cGb5Ln7Zy80YO66+cbTyGdjZKtkoqB/iIIhDX9gRA=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "aa1d74709f5dac623adb4d48fdfb27cc2c92a4d4",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-unstable",
"type": "indirect"
}
},
"root": { "root": {
"inputs": { "inputs": {
"home-manager": "home-manager", "home-manager": "home-manager",
"mobile-nixos": "mobile-nixos", "mobile-nixos": "mobile-nixos",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"nixpkgs-stable": "nixpkgs-stable", "nixpkgs-stable": "nixpkgs-stable",
"nixpkgs-unpatched": "nixpkgs-unpatched",
"sops-nix": "sops-nix", "sops-nix": "sops-nix",
"uninsane": "uninsane" "uninsane-dot-org": "uninsane-dot-org"
} }
}, },
"sops-nix": { "sops-nix": {
@@ -129,7 +147,7 @@
"type": "github" "type": "github"
} }
}, },
"uninsane": { "uninsane-dot-org": {
"inputs": { "inputs": {
"flake-utils": "flake-utils", "flake-utils": "flake-utils",
"nixpkgs": [ "nixpkgs": [

195
flake.nix
View File

@@ -5,7 +5,11 @@
{ {
inputs = { inputs = {
nixpkgs-stable.url = "nixpkgs/nixos-22.11"; nixpkgs-stable.url = "nixpkgs/nixos-22.11";
nixpkgs.url = "nixpkgs/nixos-unstable"; nixpkgs-unpatched.url = "nixpkgs/nixos-unstable";
nixpkgs = {
url = "path:nixpatches";
inputs.nixpkgs.follows = "nixpkgs-unpatched";
};
mobile-nixos = { mobile-nixos = {
url = "github:nixos/mobile-nixos"; url = "github:nixos/mobile-nixos";
flake = false; flake = false;
@@ -18,7 +22,7 @@
url = "github:Mic92/sops-nix"; url = "github:Mic92/sops-nix";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
uninsane = { uninsane-dot-org = {
url = "git+https://git.uninsane.org/colin/uninsane"; url = "git+https://git.uninsane.org/colin/uninsane";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
@@ -28,59 +32,53 @@
self, self,
nixpkgs, nixpkgs,
nixpkgs-stable, nixpkgs-stable,
nixpkgs-unpatched,
mobile-nixos, mobile-nixos,
home-manager, home-manager,
sops-nix, sops-nix,
uninsane uninsane-dot-org
}: let }:
patchedPkgs = system: nixpkgs.legacyPackages.${system}.applyPatches {
name = "nixpkgs-patched-uninsane";
src = nixpkgs;
patches = import ./nixpatches/list.nix {
inherit (nixpkgs.legacyPackages.${system}) fetchpatch;
inherit (nixpkgs.lib) fakeHash;
};
};
# return something which behaves like `pkgs`, for the provided system
# `local` = architecture of builder. `target` = architecture of the system beying deployed to
nixpkgsFor = local: target: import (patchedPkgs target) { crossSystem = target; localSystem = local; };
# evaluate ONLY our overlay, for the provided system
customPackagesFor = local: target: import ./pkgs/overlay.nix (nixpkgsFor local target) (nixpkgsFor local target);
decl-host = { name, local, target }:
let let
nixosSystem = import ((patchedPkgs target) + "/nixos/lib/eval-config.nix"); nixpkgsCompiledBy = local: nixpkgs.legacyPackages."${local}";
in (nixosSystem {
# by default the local system is the same as the target, employing emulation when they differ
system = target;
modules = [
./modules
(import ./hosts/instantiate.nix name)
home-manager.nixosModule
sops-nix.nixosModules.sops
{
nixpkgs.overlays = [
(import "${mobile-nixos}/overlay/overlay.nix")
uninsane.overlay
(import ./pkgs/overlay.nix)
(next: prev: rec {
# non-emulated packages build *from* local *for* target.
# for large packages like the linux kernel which are expensive to build under emulation,
# the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation.
cross = (nixpkgsFor local target) // (customPackagesFor local target);
stable = import nixpkgs-stable { system = target; };
# cross-compatible packages evalHost = { name, local, target }:
# gocryptfs = cross.gocryptfs; let
# XXX: we'd prefer to use `nixosSystem = (nixpkgsCompiledBy local).nixos`
# but it doesn't propagate config to the underlying pkgs, meaning it doesn't let you use
# non-free packages even after setting nixpkgs.allowUnfree.
nixosSystem = import ((nixpkgsCompiledBy local).path + "/nixos/lib/eval-config.nix");
in
(nixosSystem {
# we use pkgs built for and *by* the target, i.e. emulation, by default.
# cross compilation only happens on explicit access to `pkgs.cross`
system = target;
modules = [
(import ./hosts/instantiate.nix { localSystem = local; hostName = name; })
self.nixosModules.default
self.nixosModules.passthru
{
nixpkgs.overlays = [
self.overlays.default
self.overlays.passthru
];
}
];
});
in {
nixosConfigurations = {
servo = evalHost { name = "servo"; local = "x86_64-linux"; target = "x86_64-linux"; };
desko = evalHost { name = "desko"; local = "x86_64-linux"; target = "x86_64-linux"; };
lappy = evalHost { name = "lappy"; local = "x86_64-linux"; target = "x86_64-linux"; };
moby = evalHost { name = "moby"; local = "aarch64-linux"; target = "aarch64-linux"; };
# special cross-compiled variant, to speed up deploys from an x86 box to the arm target
# note that these *do* produce different store paths, because the closure for the tools used to cross compile
# v.s. emulate differ.
# so deploying foo-cross and then foo incurs some rebuilding.
moby-cross = evalHost { name = "moby"; local = "x86_64-linux"; target = "aarch64-linux"; };
rescue = evalHost { name = "rescue"; local = "x86_64-linux"; target = "x86_64-linux"; };
};
# pinned packages: # unofficial output
})
];
}
];
});
decl-bootable-host = { name, local, target }: rec {
nixosConfiguration = decl-host { inherit name local target; };
# this produces a EFI-bootable .img file (GPT with a /boot partition and a system (/ or /nix) partition). # this produces a EFI-bootable .img file (GPT with a /boot partition and a system (/ or /nix) partition).
# after building this: # after building this:
# - flash it to a bootable medium (SD card, flash drive, HDD) # - flash it to a bootable medium (SD card, flash drive, HDD)
@@ -94,40 +92,75 @@
# - if fs wasn't resized automatically, then `sudo btrfs filesystem resize max /` # - if fs wasn't resized automatically, then `sudo btrfs filesystem resize max /`
# - checkout this flake into /etc/nixos AND UPDATE THE FS UUIDS. # - checkout this flake into /etc/nixos AND UPDATE THE FS UUIDS.
# - `nixos-rebuild --flake './#<host>' switch` # - `nixos-rebuild --flake './#<host>' switch`
img = nixosConfiguration.config.system.build.img; imgs = builtins.mapAttrs (_: host-dfn: host-dfn.config.system.build.img) self.nixosConfigurations;
};
hosts.servo = decl-bootable-host { name = "servo"; local = "x86_64-linux"; target = "x86_64-linux"; }; overlays = rec {
hosts.desko = decl-bootable-host { name = "desko"; local = "x86_64-linux"; target = "x86_64-linux"; }; default = pkgs;
hosts.lappy = decl-bootable-host { name = "lappy"; local = "x86_64-linux"; target = "x86_64-linux"; }; pkgs = import ./pkgs/overlay.nix;
hosts.moby = decl-bootable-host { name = "moby"; local = "aarch64-linux"; target = "aarch64-linux"; }; passthru =
# special cross-compiled variant, to speed up deploys from an x86 box to the arm target let
# note that these *do* produce different store paths, because the closure for the tools used to cross compile stable = next: prev: {
# v.s. emulate differ. stable = nixpkgs-stable.legacyPackages."${prev.stdenv.hostPlatform}";
# so deploying foo-cross and then foo incurs some rebuilding. };
hosts.moby-cross = decl-bootable-host { name = "moby"; local = "x86_64-linux"; target = "aarch64-linux"; }; mobile = (import "${mobile-nixos}/overlay/overlay.nix");
hosts.rescue = decl-bootable-host { name = "rescue"; local = "x86_64-linux"; target = "x86_64-linux"; }; uninsane = uninsane-dot-org.overlay;
in { in
nixosConfigurations = builtins.mapAttrs (name: value: value.nixosConfiguration) hosts; next: prev:
imgs = builtins.mapAttrs (name: value: value.img) hosts; (stable next prev) // (mobile next prev) // (uninsane next prev);
packages = let
allPkgsFor = sys: (customPackagesFor sys sys) // {
nixpkgs = nixpkgsFor sys sys;
uninsane = uninsane.packages."${sys}";
}; };
in {
x86_64-linux = allPkgsFor "x86_64-linux"; nixosModules = rec {
aarch64-linux = allPkgsFor "aarch64-linux"; default = sane;
}; sane = import ./modules;
templates = { passthru = { ... }: {
python-data = { imports = [
# initialize with: home-manager.nixosModule
# - `nix flake init -t '/home/colin/dev/nixos/#python-data'` sops-nix.nixosModules.sops
# then enter with: ];
# - `nix develop` };
path = ./templates/python-data; };
description = "python environment for data processing";
# this includes both our native packages and all the nixpkgs packages.
legacyPackages =
let
allPkgsFor = sys: (nixpkgsCompiledBy sys).appendOverlays [
self.overlays.passthru self.overlays.pkgs
];
in {
x86_64-linux = allPkgsFor "x86_64-linux";
aarch64-linux = allPkgsFor "aarch64-linux";
};
# extract only our own packages from the full set
packages = builtins.mapAttrs
(_: full: full.sane // { inherit (full) sane uninsane-dot-org; })
self.legacyPackages;
apps."x86_64-linux" =
let
pkgs = self.legacyPackages."x86_64-linux";
in {
update-feeds = {
type = "app";
program = "${pkgs.feeds.passthru.updateScript}";
};
init-feed = {
type = "app";
program = "${pkgs.feeds.passthru.initFeedScript}";
};
};
templates = {
python-data = {
# initialize with:
# - `nix flake init -t '/home/colin/dev/nixos/#python-data'`
# then enter with:
# - `nix develop`
path = ./templates/python-data;
description = "python environment for data processing";
};
}; };
}; };
};
} }

15
hosts/common/cross.nix Normal file
View File

@@ -0,0 +1,15 @@
{ ... }:
{
# the configuration of which specific package set `pkgs.cross` refers to happens elsewhere;
# here we just define them all.
nixpkgs.overlays = [
(next: prev: {
# non-emulated packages build *from* local *for* target.
# for large packages like the linux kernel which are expensive to build under emulation,
# the config can explicitly pull such packages from `pkgs.cross` to do more efficient cross-compilation.
crossFrom."x86_64-linux" = (prev.forceSystem "x86_64-linux" null).appendOverlays next.overlays;
crossFrom."aarch64-linux" = (prev.forceSystem "aarch64-linux" null).appendOverlays next.overlays;
})
];
}

View File

@@ -2,6 +2,7 @@
{ {
imports = [ imports = [
./bluetooth.nix ./bluetooth.nix
./cross.nix
./feeds.nix ./feeds.nix
./fs.nix ./fs.nix
./hardware ./hardware

View File

@@ -1,10 +1,23 @@
# trampoline from flake.nix into the specific host definition, while doing a tiny bit of common setup # trampoline from flake.nix into the specific host definition, while doing a tiny bit of common setup
hostName: { ... }: { { hostName, localSystem }:
{ ... }:
{
imports = [ imports = [
./${hostName} ./${hostName}
./common ./common
]; ];
networking.hostName = hostName; networking.hostName = hostName;
nixpkgs.overlays = [
(next: prev: {
# for local != target we by default just emulate the target while building.
# provide a `pkgs.cross.<pkg>` alias that consumers can use instead of `pkgs.<foo>`
# to explicitly opt into non-emulated cross compilation for any specific package.
# this is most beneficial for large packages with few pre-requisites -- like Linux.
cross = next.crossFrom."${localSystem}";
})
];
} }

View File

@@ -2,21 +2,19 @@
let let
inherit (builtins) concatLists concatStringsSep foldl' fromJSON map readDir readFile; inherit (builtins) concatLists concatStringsSep foldl' fromJSON map readDir readFile;
inherit (lib) init mapAttrsToList removePrefix removeSuffix splitString; inherit (lib) hasSuffix listToAttrs mapAttrsToList removeSuffix splitString;
inherit (lib.attrsets) recursiveUpdate setAttrByPath;
inherit (lib.filesystem) listFilesRecursive;
# given a path to a .json file relative to sources, construct the best feed object we can. # given a path to a .json file relative to sources, construct the best feed object we can.
# the .json file could be empty, in which case we make assumptions about the feed based # the .json file could be empty, in which case we make assumptions about the feed based
# on its fs path. # on its fs path.
# Type: feedFromSourcePath :: String -> { path = [String]; value = feed; } # Type: feedFromSourcePath :: String -> { name = String; value = feed; }
feedFromSourcePath = json-path: feedFromSourcePath = json-path:
assert hasSuffix "/default.json" json-path;
let let
canonical-name = removeSuffix "/default" (lib.removeSuffix ".json" json-path); canonical-name = removeSuffix "/default.json" json-path;
default-url = "https://${canonical-name}"; default-url = "https://${canonical-name}";
attr-path = splitString "/" canonical-name;
feed-details = { url = default-url; } // (tryImportJson (./sources/${json-path})); feed-details = { url = default-url; } // (tryImportJson (./sources/${json-path}));
in { path = attr-path; value = mkFeed feed-details; }; in { name = canonical-name; value = mkFeed feed-details; };
# TODO: for now, feeds are just ordinary Attrs. # TODO: for now, feeds are just ordinary Attrs.
# in the future, we'd like to set them up with an update script. # in the future, we'd like to set them up with an update script.
@@ -49,10 +47,5 @@ let
) )
(readDir base) (readDir base)
); );
# like listToAttrs, except takes { path, value } pairs instead of { name, value } pairs.
# Type: listToAttrsByPath :: [{ path = [String]; value = Any; }] -> Attrs
listToAttrsByPath = items:
foldl' (acc: { path, value }: recursiveUpdate acc (setAttrByPath path value)) {} items;
in in
listToAttrsByPath (map feedFromSourcePath sources) listToAttrs (map feedFromSourcePath sources)

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 27184,
"content_type": "application/rss+xml; charset=utf-8",
"description": "The Library of Economics and Liberty",
"favicon": null,
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 10,
"last_seen": "2023-01-11T10:46:38.526754+00:00",
"last_updated": "2023-01-09T11:30:25+00:00",
"score": -18,
"self_url": "http://www.econtalk.org/feed/",
"site_name": null,
"site_url": null,
"title": "EconTalk Podcast Econlib",
"url": "http://www.econtalk.org/feed/",
"velocity": 0.143,
"version": "rss20"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 337440,
"content_type": "application/rss+xml; charset=utf-8",
"description": "A community blog devoted to refining the art of rationality",
"favicon": "https://res.cloudinary.com/lesswrong-2-0/image/upload/v1497915096/favicon_lncumn.ico",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 10,
"last_seen": "2023-01-11T10:39:58.575828+00:00",
"last_updated": "2023-01-11T09:58:49+00:00",
"score": 32,
"self_url": "https://www.lesswrong.com/feed.xml?view=rss&karmaThreshold=2",
"site_name": "LessWrong",
"site_url": "https://www.lesswrong.com",
"title": "LessWrong",
"url": "https://www.lesswrong.com/feed.xml",
"velocity": 12.052,
"version": "rss20"
}

View File

@@ -0,0 +1,23 @@
{
"bozo": 0,
"content_length": 841679,
"content_type": "application/rss+xml; charset=utf-8",
"description": "Conversations about AI, science, technology, history, philosophy and the nature of intelligence, consciousness, love, and power.",
"favicon": "https://lexfridman.com/wordpress/wp-content/uploads/2017/06/cropped-lex-favicon-4-1-32x32.png",
"hubs": [
"https://pubsubhubbub.appspot.com/"
],
"is_podcast": true,
"is_push": true,
"item_count": 300,
"last_seen": "2023-01-08T23:41:32.928322+00:00",
"last_updated": "2022-12-29T17:35:50+00:00",
"score": 20,
"self_url": "https://lexfridman.com/feed/podcast/",
"site_name": "Lex Fridman",
"site_url": "https://lexfridman.com",
"title": "Lex Fridman Podcast",
"url": "https://lexfridman.com/feed/podcast/",
"velocity": 0.265,
"version": "rss20"
}

View File

@@ -0,0 +1,21 @@
{
"bozo": 0,
"content_length": 2302,
"content_type": "text/xml; charset=utf-8",
"description": null,
"favicon": "https://xkcd.com/s/919f27.ico",
"hubs": [],
"is_podcast": false,
"is_push": false,
"item_count": 4,
"last_seen": "2023-01-11T10:29:36.530001+00:00",
"last_updated": "2023-01-09T00:00:00+00:00",
"score": 16,
"self_url": null,
"site_name": "xkcd",
"site_url": "https://xkcd.com",
"title": "xkcd.com",
"url": "https://xkcd.com/atom.xml",
"velocity": 0.429,
"version": "atom10"
}

View File

@@ -82,7 +82,7 @@ in
in in
lib.mkIf cfg.enable lib.mkIf cfg.enable
{ {
system.build.img-without-firmware = with pkgs; imageBuilder.diskImage.makeGPT { system.build.img-without-firmware = with pkgs; pkgs.imageBuilder.diskImage.makeGPT {
name = "nixos"; name = "nixos";
diskID = vfatUuidFromFs bootFs; diskID = vfatUuidFromFs bootFs;
# leave some space for firmware # leave some space for firmware

View File

@@ -212,6 +212,7 @@ let
jq jq
killall killall
lsof lsof
nano
netcat netcat
nethogs nethogs
nmap nmap

26
nixpatches/flake.lock generated Normal file
View File

@@ -0,0 +1,26 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1673163619,
"narHash": "sha256-B33PFBL64ZgTWgMnhFL3jgheAN/DjHPsZ1Ih3z0VE5I=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "8c54d842d9544361aac5f5b212ba04e4089e8efe",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-22.11",
"type": "indirect"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

26
nixpatches/flake.nix Normal file
View File

@@ -0,0 +1,26 @@
{
inputs = {
nixpkgs.url = "nixpkgs/nixos-22.11";
};
outputs = { self, nixpkgs }:
let
patchedPkgsFor = system: nixpkgs.legacyPackages.${system}.applyPatches {
name = "nixpkgs-patched-uninsane";
src = nixpkgs;
patches = import ./list.nix {
inherit (nixpkgs.legacyPackages.${system}) fetchpatch;
inherit (nixpkgs.lib) fakeHash;
};
};
patchedFlakeFor = system: import "${patchedPkgsFor system}/flake.nix";
patchedFlakeOutputsFor = system:
(patchedFlakeFor system).outputs { inherit self; };
in
{
legacyPackages = builtins.mapAttrs
(system: _:
(patchedFlakeOutputsFor system).legacyPackages."${system}"
)
nixpkgs.legacyPackages;
};
}

37
pkgs/feeds/default.nix Normal file
View File

@@ -0,0 +1,37 @@
{ lib
, pkgs
}:
(lib.makeScope pkgs.newScope (self:
let
# TODO: dependency-inject this.
sane-data = import ../../modules/data { inherit lib; };
template = self.callPackage ./template.nix;
feed-pkgs = lib.mapAttrs
(name: feed-details: template {
feedName = name;
jsonPath = "modules/data/feeds/sources/${name}/default.json";
inherit (feed-details) url;
})
sane-data.feeds;
update-scripts = lib.mapAttrsToList
(name: feed: builtins.concatStringsSep " " feed.passthru.updateScript)
feed-pkgs;
in
feed-pkgs // {
passthru.updateScript = pkgs.writeShellScript
"feeds-update"
(builtins.concatStringsSep "\n" update-scripts);
passthru.initFeedScript = pkgs.writeShellScript
"init-feed"
''
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p git
name="$1"
mkdir modules/data/feeds/sources/"$name"
touch modules/data/feeds/sources/"$name"/default.json
git add modules/data/feeds/sources/"$name"/default.json
'';
}
))

28
pkgs/feeds/template.nix Normal file
View File

@@ -0,0 +1,28 @@
{ lib
, stdenv
, callPackage
, fetchurl
# feed-specific args
, feedName
, jsonPath
, url
}:
stdenv.mkDerivation {
pname = feedName;
version = "20230112";
src = fetchurl {
inherit url;
};
passthru.updateScript = [ ./update.sh url jsonPath ];
# passthru.updateScript = callPackage ./update.nix {
# inherit url jsonPath;
# };
meta = {
description = "metadata about any feeds available at ${feedName}";
homepage = feedName;
maintainers = with lib.maintainers; [ colinsane ];
platforms = lib.platforms.all;
};
}

18
pkgs/feeds/update.nix Normal file
View File

@@ -0,0 +1,18 @@
{ lib
, curl
, jq
, runtimeShell
, writeScript
# feed-specific args
, jsonPath
, url
}:
let
apiQuery = "https://feedsearch.dev/api/v1/search?url=${url}";
in
writeScript "update-feed" ''
#!${runtimeShell}
PATH=${lib.makeBinPath [ curl jq ]}
curl -X GET '${apiQuery}' | jq '.[-1]' > '${jsonPath}'
''

10
pkgs/feeds/update.sh Executable file
View File

@@ -0,0 +1,10 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p curl jq
set -xeu -o pipefail
url="$1"
jsonPath="$2"
apiQuery="https://feedsearch.dev/api/v1/search?url=$url"
curl -X GET "$apiQuery" | jq '.[-1]' > "$jsonPath"

View File

@@ -1,55 +1,60 @@
(next: prev: rec { (next: prev:
#### my own, non-upstreamable packages: let
sane-scripts = prev.callPackage ./sane-scripts { }; sane = rec {
tow-boot-pinephone = prev.callPackage ./tow-boot-pinephone { }; #### my own, non-upstreamable packages:
tow-boot-rpi4 = prev.callPackage ./tow-boot-rpi4 { }; sane-scripts = prev.callPackage ./sane-scripts { };
bootpart-uefi-x86_64 = prev.callPackage ./bootpart-uefi-x86_64 { }; feeds = prev.callPackage ./feeds { };
bootpart-tow-boot-rpi-aarch64 = prev.callPackage ./bootpart-tow-boot-rpi-aarch64 { tow-boot-pinephone = prev.callPackage ./tow-boot-pinephone { };
# not sure why i can't just do `next.callPackage` instead tow-boot-rpi4 = prev.callPackage ./tow-boot-rpi4 { };
inherit tow-boot-rpi4; bootpart-uefi-x86_64 = prev.callPackage ./bootpart-uefi-x86_64 { };
}; bootpart-tow-boot-rpi-aarch64 = prev.callPackage ./bootpart-tow-boot-rpi-aarch64 {
bootpart-u-boot-rpi-aarch64 = prev.callPackage ./bootpart-u-boot-rpi-aarch64 { # not sure why i can't just do `next.callPackage` instead
# not sure why i can't just do `next.callPackage` instead inherit tow-boot-rpi4;
inherit ubootRaspberryPi4_64bit; };
}; bootpart-u-boot-rpi-aarch64 = prev.callPackage ./bootpart-u-boot-rpi-aarch64 {
rtl8723cs-firmware = prev.callPackage ./rtl8723cs-firmware { }; # not sure why i can't just do `next.callPackage` instead
linux-megous = prev.callPackage ./linux-megous { inherit ubootRaspberryPi4_64bit;
kernelPatches = [ };
prev.kernelPatches.bridge_stp_helper rtl8723cs-firmware = prev.callPackage ./rtl8723cs-firmware { };
prev.kernelPatches.request_key_helper linux-megous = prev.callPackage ./linux-megous {
]; kernelPatches = [
}; prev.kernelPatches.bridge_stp_helper
prev.kernelPatches.request_key_helper
];
};
sublime-music-mobile = prev.callPackage ./sublime-music-mobile { }; sublime-music-mobile = prev.callPackage ./sublime-music-mobile { };
#### customized packages #### customized packages
fluffychat-moby = prev.callPackage ./fluffychat-moby { }; fluffychat-moby = prev.callPackage ./fluffychat-moby { };
gpodder-configured = prev.callPackage ./gpodder-configured { }; gpodder-configured = prev.callPackage ./gpodder-configured { };
# nixos-unstable pleroma is too far out-of-date for our db # nixos-unstable pleroma is too far out-of-date for our db
pleroma = prev.callPackage ./pleroma { }; pleroma = prev.callPackage ./pleroma { };
# jackett doesn't allow customization of the bind address: this will probably always be here. # jackett doesn't allow customization of the bind address: this will probably always be here.
jackett = prev.callPackage ./jackett { inherit (prev) jackett; }; jackett = prev.callPackage ./jackett { inherit (prev) jackett; };
# mozilla keeps nerfing itself and removing configuration options # mozilla keeps nerfing itself and removing configuration options
firefox-unwrapped = prev.callPackage ./firefox-unwrapped { }; firefox-unwrapped = prev.callPackage ./firefox-unwrapped { };
# patch rpi uboot with something that fixes USB HDD boot # patch rpi uboot with something that fixes USB HDD boot
ubootRaspberryPi4_64bit = prev.callPackage ./ubootRaspberryPi4_64bit { }; ubootRaspberryPi4_64bit = prev.callPackage ./ubootRaspberryPi4_64bit { };
gocryptfs = prev.callPackage ./gocryptfs { inherit (prev) gocryptfs; }; gocryptfs = prev.callPackage ./gocryptfs { inherit (prev) gocryptfs; };
browserpass = prev.callPackage ./browserpass { inherit (prev) browserpass; inherit sane-scripts; }; browserpass = prev.callPackage ./browserpass { inherit (prev) browserpass; inherit sane-scripts; };
fractal-latest = prev.callPackage ./fractal-latest { }; fractal-latest = prev.callPackage ./fractal-latest { };
#### TEMPORARY: PACKAGES WAITING TO BE UPSTREAMED #### TEMPORARY: PACKAGES WAITING TO BE UPSTREAMED
kaiteki = prev.callPackage ./kaiteki { }; kaiteki = prev.callPackage ./kaiteki { };
lightdm-mobile-greeter = prev.callPackage ./lightdm-mobile-greeter { }; lightdm-mobile-greeter = prev.callPackage ./lightdm-mobile-greeter { };
browserpass-extension = prev.callPackage ./browserpass-extension { }; browserpass-extension = prev.callPackage ./browserpass-extension { };
gopass-native-messaging-host = prev.callPackage ./gopass-native-messaging-host { }; gopass-native-messaging-host = prev.callPackage ./gopass-native-messaging-host { };
tokodon = prev.libsForQt5.callPackage ./tokodon { }; tokodon = prev.libsForQt5.callPackage ./tokodon { };
signaldctl = prev.callPackage ./signaldctl { }; signaldctl = prev.callPackage ./signaldctl { };
splatmoji = prev.callPackage ./splatmoji { }; splatmoji = prev.callPackage ./splatmoji { };
# trust-dns = prev.callPackage ./trust-dns { }; # trust-dns = prev.callPackage ./trust-dns { };
# kaiteki = prev.kaiteki; # kaiteki = prev.kaiteki;
}) };
in sane // { inherit sane; }
)

View File

@@ -1,7 +1,7 @@
to deploy: to deploy:
```sh ```sh
nixos-rebuild --flake "./#servo" {build,switch} nixos-rebuild --flake ".#servo" {build,switch}
``` ```
if the target is the same as the host, nix will grab the hostname automatically: if the target is the same as the host, nix will grab the hostname automatically:
@@ -20,7 +20,7 @@ nix flake show
## secrets ## secrets
i use [sops](https://github.com/Mic92/sops-nix) for secrets. i use [sops](https://github.com/Mic92/sops-nix) for secrets.
see `modules/universal/secrets.nix` for some tips. see `hosts/common/secrets.nix` for some tips.
## building images ## building images
@@ -34,31 +34,34 @@ refer to flake.nix for more details.
## building packages ## building packages
to build one of the custom sane packages, just name it: build anything with
```
```sh nix build .#<pkgname>
nix build ./#fluffychat-moby
``` ```
to build a nixpkg: specifically, i pass the full package closure to the `legacyPackages` flake output. that includes both my own packages and upstream packages.
on the other hand the `packages` output contains only my own packages.
in addition, my packages are placed into both the global scope and a `sane` scope.
so use the scoped path when you want to be explicit.
```sh
nix build ./#nixpkgs.curl
``` ```
nix build sane.linux-megous
to build a package for another platform:
```sh
nix build ./#packages.aarch64-linux.nixpkgs.ubootRaspberryPi4_64bit
``` ```
## using this repo in your own config ## using this repo in your own config
i try to ensure everything in the `modules/` directory is hidden behind some enable flag or other. this should be a pretty "standard" flake. just reference it, and import either
it should be possible to copy that whole directory into your own config, and then selectively - `nixosModules.sane` (for the modules)
populate what you want (like the impermenance paths, etc). - `overlays.pkgs` (for the packages)
more practically, a lot of things in there still assume a user named `colin`, so you'll probably
want to patch it for your name -- or just use it as a reference. `nixosModules.sane` corresponds to everything in the `modules/` directory.
it's a mix of broad and narrow scope options.
e.g. `sane.fs` is a completely standalone thing,
whereas `sane.web-browser` is highly personalized and doesn't *really* make sense to export.
regardless of scope, i do try to ensure that everything in `modules/` is hidden behind some enable flag
so that the disorganization isn't that critical.
## contact ## contact