init
This commit is contained in:
commit
df1ea7ce32
5 changed files with 406 additions and 0 deletions
136
README.md
Normal file
136
README.md
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
# BaseOS
|
||||||
|
|
||||||
|
**BaseOS** is a NixOS flake designed specifically for life and work at the **c-base Space**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **c-base Wi-Fi**:
|
||||||
|
- `c-base-crew` → Members network (EAP/PEAP/MSCHAPv2), requires ISRG Root X1 certificate.
|
||||||
|
- `c-base-public` → Guest network, open, no certificate needed.
|
||||||
|
- **Freifunk Berlin**: `berlin.freifunk.net`, open community Wi-Fi.
|
||||||
|
- **ISRG Root X1 Certificate** as a package (`pkgs.byName.is.isrg-root-x1`) only used for crew Wi-Fi.
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Project Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
flake.nix
|
||||||
|
cbase-wifi.nix
|
||||||
|
pkgs/
|
||||||
|
└── by-name/
|
||||||
|
└── is/
|
||||||
|
└── isrg-root-x1/
|
||||||
|
└── default.nix
|
||||||
|
README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Usage as a Nix Flake
|
||||||
|
|
||||||
|
Here is a fully working example to include in your `flake.nix` or `nixosConfigurations`:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
description = "BaseOS flake for c-base space";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
baseos.url = "https://code.c-base.org/lucy/baseos";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, baseos }: let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
nixosConfigurations.cbase-client = pkgs.lib.nixosSystem {
|
||||||
|
inherit system;
|
||||||
|
modules = [
|
||||||
|
baseos.nixosModules.cbase-wifi.${system}
|
||||||
|
{
|
||||||
|
boot.loader.systemd-boot.enable = true;
|
||||||
|
boot.loader.efi.canTouchEfiVariables = true;
|
||||||
|
networking.hostName = "cbase-client";
|
||||||
|
|
||||||
|
# Enable c-base Wi-Fi
|
||||||
|
networking.wireless.c-base = {
|
||||||
|
crew = true; # Member network
|
||||||
|
usePublic = true; # Guest network (only if crew enabled)
|
||||||
|
useFreifunk = true; # Berlin Freifunk
|
||||||
|
credentialsFile = "/run/secrets/cbase-credentials";
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
devShells.${system}.default = pkgs.mkShell {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
nixos-rebuild
|
||||||
|
git
|
||||||
|
nixpkgs-fmt
|
||||||
|
statix
|
||||||
|
deadnix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
packages.${system}.isrg-root-x1 = baseos.packages.${system}.isrg-root-x1;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Wi-Fi Connection Priorities
|
||||||
|
|
||||||
|
- `c-base-crew` → 20
|
||||||
|
- `c-base-public` → 10
|
||||||
|
- `berlin.freifunk.net` → 5
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Development
|
||||||
|
|
||||||
|
Enter the dev shell:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix develop
|
||||||
|
```
|
||||||
|
|
||||||
|
Run formatter:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix build .#formatter
|
||||||
|
```
|
||||||
|
|
||||||
|
Run formatting checks:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nix build .#checks
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Certificate
|
||||||
|
|
||||||
|
Use the certificate only for the crew network:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
pkgs.byName.is.isrg-root-x1
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Target Audience
|
||||||
|
|
||||||
|
**BaseOS** is for anyone who:
|
||||||
|
- Is a member of the c-base Space.
|
||||||
|
- Wants a reproducible NixOS environment for Wi-Fi, certificates, and dev tools.
|
||||||
|
- Wants to use the flake as a base for other c-base projects.
|
||||||
|
|
||||||
62
flake.lock
generated
Normal file
62
flake.lock
generated
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1758427187,
|
||||||
|
"narHash": "sha256-pHpxZ/IyCwoTQPtFIAG2QaxuSm8jWzrzBGjwQZIttJc=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "554be6495561ff07b6c724047bdd7e0716aa7b46",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1754340878,
|
||||||
|
"narHash": "sha256-lgmUyVQL9tSnvvIvBp7x1euhkkCho7n3TMzgjdvgPoU=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "cab778239e705082fe97bb4990e0d24c50924c04",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"treefmt-nix": "treefmt-nix"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"treefmt-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1758728421,
|
||||||
|
"narHash": "sha256-ySNJ008muQAds2JemiyrWYbwbG+V7S5wg3ZVKGHSFu8=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"rev": "5eda4ee8121f97b218f7cc73f5172098d458f1d1",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
67
flake.nix
Normal file
67
flake.nix
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
{
|
||||||
|
description = "c-base WiFi + Dev Tools flake";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
||||||
|
treefmt-nix.url = "github:numtide/treefmt-nix";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
treefmt-nix,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
systemList = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Helper: map a function over all systems
|
||||||
|
eachSystem =
|
||||||
|
f:
|
||||||
|
nixpkgs.lib.genAttrs systemList (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
pkgs = import nixpkgs { inherit system; };
|
||||||
|
in
|
||||||
|
f pkgs system
|
||||||
|
);
|
||||||
|
|
||||||
|
# ISRG Root X1 Certificate package per system
|
||||||
|
isrgRootX1 = eachSystem (pkgs: system: pkgs.callPackage ./pkgs/by-name/is/isrg-root-x1 { });
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# Packages per system
|
||||||
|
packages = eachSystem (
|
||||||
|
pkgs: system: {
|
||||||
|
isrg-root-x1 = isrgRootX1.${system};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# NixOS Modules per system
|
||||||
|
nixosModules = eachSystem (
|
||||||
|
pkgs: system:
|
||||||
|
import ./nixos-modules/wifi.nix {
|
||||||
|
inherit pkgs;
|
||||||
|
isrgRootX1Cert = isrgRootX1.${system};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
# Dev Shells per system
|
||||||
|
devShells = eachSystem (
|
||||||
|
pkgs: system: {
|
||||||
|
default = pkgs.mkShell {
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
nixos-rebuild
|
||||||
|
git
|
||||||
|
nixpkgs-fmt
|
||||||
|
statix
|
||||||
|
deadnix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
136
nixos-modules/wifi.nix
Normal file
136
nixos-modules/wifi.nix
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
isrgRootX1Cert,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.networking.wireless.c-base;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.networking.wireless.c-base = {
|
||||||
|
crew = mkEnableOption "c-base-crew WLAN access" // {
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
usePublic = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Enable c-base-public WLAN access (guests)";
|
||||||
|
};
|
||||||
|
useFreifunk = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Enable berlin.freifunk.net WLAN access";
|
||||||
|
};
|
||||||
|
credentialsFile = mkOption {
|
||||||
|
type = types.nullOr types.path;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
Path to file containing credentials for crew only:
|
||||||
|
USERNAME=your-username
|
||||||
|
PASSWORD=your-password
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkMerge [
|
||||||
|
{
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = !(cfg.useFreifunk && cfg.usePublic);
|
||||||
|
message = "useFreifunk and usePublic cannot both be enabled";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = !cfg.crew || (cfg.credentialsFile != null);
|
||||||
|
message = "credentialsFile must be set when crew is enabled";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
(mkIf cfg.crew {
|
||||||
|
networking.networkmanager = {
|
||||||
|
enable = true;
|
||||||
|
ensureProfiles = {
|
||||||
|
environmentFiles = [ cfg.credentialsFile ];
|
||||||
|
profiles = {
|
||||||
|
"c-base-crew" = {
|
||||||
|
connection = {
|
||||||
|
id = "c-base-crew";
|
||||||
|
type = "wifi";
|
||||||
|
autoconnect = true;
|
||||||
|
autoconnect-priority = 20;
|
||||||
|
};
|
||||||
|
wifi = {
|
||||||
|
ssid = "c-base-crew";
|
||||||
|
mode = "infrastructure";
|
||||||
|
};
|
||||||
|
wifi-security = {
|
||||||
|
key-mgmt = "wpa-eap";
|
||||||
|
};
|
||||||
|
"802-1x" = {
|
||||||
|
eap = "peap";
|
||||||
|
identity = "$USERNAME";
|
||||||
|
password = "$PASSWORD";
|
||||||
|
phase2-auth = "mschapv2";
|
||||||
|
ca-cert = "${isrgRootX1Cert}";
|
||||||
|
domain-suffix-match = "radius.cbrp3.c-base.org";
|
||||||
|
};
|
||||||
|
ipv4.method = "auto";
|
||||||
|
ipv6.method = "auto";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
security.pki.certificateFiles = [ isrgRootX1Cert ];
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkIf cfg.usePublic {
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
networking.networkmanager.ensureProfiles.profiles = {
|
||||||
|
"c-base-public" = {
|
||||||
|
connection = {
|
||||||
|
id = "c-base-public";
|
||||||
|
type = "wifi";
|
||||||
|
autoconnect = true;
|
||||||
|
autoconnect-priority = 10;
|
||||||
|
};
|
||||||
|
wifi = {
|
||||||
|
ssid = "c-base-public";
|
||||||
|
mode = "infrastructure";
|
||||||
|
};
|
||||||
|
wifi-security = {
|
||||||
|
key-mgmt = "none";
|
||||||
|
};
|
||||||
|
ipv4.method = "auto";
|
||||||
|
ipv6.method = "auto";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkIf cfg.useFreifunk {
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
networking.networkmanager.ensureProfiles.profiles = {
|
||||||
|
"berlin-freifunk" = {
|
||||||
|
connection = {
|
||||||
|
id = "berlin.freifunk.net";
|
||||||
|
type = "wifi";
|
||||||
|
autoconnect = true;
|
||||||
|
autoconnect-priority = 5;
|
||||||
|
};
|
||||||
|
wifi = {
|
||||||
|
ssid = "berlin.freifunk.net";
|
||||||
|
mode = "infrastructure";
|
||||||
|
};
|
||||||
|
wifi-security = {
|
||||||
|
key-mgmt = "none";
|
||||||
|
};
|
||||||
|
ipv4.method = "auto";
|
||||||
|
ipv6.method = "auto";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
||||||
5
tools/treefmt.nix
Normal file
5
tools/treefmt.nix
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
# treefmt.nix
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
projectRootFile = "flake.nix";
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue