Compare commits
168 Commits
3060cbfb77
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
ac664dce9b
|
|||
|
a9d12ea535
|
|||
|
1827e4eebf
|
|||
|
861dd0bab4
|
|||
|
55342f4912
|
|||
|
01e47e808e
|
|||
|
76774565a9
|
|||
|
e288514e33
|
|||
|
4e4b696177
|
|||
|
c83ec90489
|
|||
|
d71af6a1c9
|
|||
|
35d2f5afe0
|
|||
|
d69e4f2d3e
|
|||
|
8300a32027
|
|||
|
9108daaffb
|
|||
|
2a3079f35e
|
|||
|
687fd92a94
|
|||
|
e8c9cd32fd
|
|||
|
675e3cfb86
|
|||
|
9a593ba9a1
|
|||
|
bc7fbcfc7d
|
|||
|
a43fdc77f8
|
|||
|
c2f53e4533
|
|||
|
43cfd4b6d3
|
|||
|
ea0beb9673
|
|||
|
f3063e36d9
|
|||
|
0e48154dec
|
|||
|
8ae9830eba
|
|||
|
23adee92a6
|
|||
|
9c2a801040
|
|||
|
97b66828ca
|
|||
|
d978497b7c
|
|||
|
a9ab9e64ba
|
|||
|
234904c08f
|
|||
|
60b69e0049
|
|||
|
fc71ffdb18
|
|||
|
583dd62731
|
|||
|
9bf0ad396f
|
|||
|
cac8871e58
|
|||
|
9a49312c80
|
|||
|
c5daa6ebcc
|
|||
|
d2000aea1b
|
|||
|
f1a5237eb3
|
|||
|
6d15652b2e
|
|||
|
e48386377e
|
|||
|
1283f7c68e
|
|||
|
2a541c3be1
|
|||
|
8b30475ff7
|
|||
|
ee9662de09
|
|||
|
cd2da22c8a
|
|||
|
efa8d20ee1
|
|||
|
4ba1798f4a
|
|||
|
827de072c7
|
|||
|
b12d78ddee
|
|||
|
393ec69541
|
|||
|
f2fe113e8c
|
|||
|
828e2d0fde
|
|||
|
69733fa69a
|
|||
|
671e3db9cf
|
|||
|
fbeff17bb4
|
|||
|
333d829a6f
|
|||
|
b5bfa3a4b2
|
|||
|
029421bd4b
|
|||
|
6529d08626
|
|||
|
7a85f55a52
|
|||
|
08ed5fa57c
|
|||
|
4a04bece79
|
|||
|
c1587221f7
|
|||
|
126161d083
|
|||
|
764ed27bf3
|
|||
|
c0e0174e21
|
|||
|
77dbece69a
|
|||
|
e6d9ee7618
|
|||
|
0055fb07c4
|
|||
|
53b449206c
|
|||
|
c14d3ebda0
|
|||
|
4e0ae0669d
|
|||
|
7895f0a8b0
|
|||
|
6e1886bafd
|
|||
|
25f7ae62fa
|
|||
|
54242cf3a0
|
|||
|
1f16da64e6
|
|||
|
c20accd28f
|
|||
|
5385dac890
|
|||
|
0dc270abc2
|
|||
|
a33271a8fa
|
|||
|
b824ff3a89
|
|||
|
d05f436d00
|
|||
|
f34f8a78a3
|
|||
|
8963bb3542
|
|||
|
0304d77257
|
|||
|
0058f7c35f
|
|||
|
a3e524de87
|
|||
|
ed0ed35233
|
|||
|
a78df4aec1
|
|||
|
ca6181cba4
|
|||
|
53eef4d211
|
|||
|
7a757e6194
|
|||
|
e433d2ec3f
|
|||
|
040593e28f
|
|||
|
17419cb929
|
|||
|
bdd212d281
|
|||
|
a127be5d2e
|
|||
|
af13b31ce3
|
|||
|
e32e753bce
|
|||
|
f68c0e2daf
|
|||
|
141a9cd704
|
|||
|
8a31f33087
|
|||
|
f365a09d38
|
|||
|
a5585a90e6
|
|||
|
ca12ea728f
|
|||
|
06bf555d1d
|
|||
|
a4ce109c3d
|
|||
|
5e5ff474a6
|
|||
|
0292b3add3
|
|||
|
362d705679
|
|||
|
c64fa5ec25
|
|||
|
9f3ceb8b9e
|
|||
|
95048298ad
|
|||
|
c3a45f7984
|
|||
|
f77140e3f5
|
|||
|
2874a9096d
|
|||
|
716743cdcc
|
|||
|
3740e3401e
|
|||
|
348f67244e
|
|||
|
4032b5d7a0
|
|||
|
a074ac551d
|
|||
|
978f0a537c
|
|||
|
42214c869c
|
|||
|
de75077730
|
|||
|
34570a1ecb
|
|||
|
d4dee15c15
|
|||
|
54dac319db
|
|||
|
820466201f
|
|||
|
f2127568e0
|
|||
|
b3729ed82b
|
|||
|
e0687bcc28
|
|||
|
7a57d2cfec
|
|||
|
fa0d427240
|
|||
|
8f34d20c65
|
|||
|
02272d9ec5
|
|||
|
9440a4c6fa
|
|||
|
37ace64728
|
|||
|
58f1133657
|
|||
|
85eec3b7a5
|
|||
|
fc852aee67
|
|||
|
e590739346
|
|||
|
7ce839e653
|
|||
|
97454dac5b
|
|||
|
67ae6e5e23
|
|||
|
dcb7ac9aa0
|
|||
|
12b581674b
|
|||
|
ab205e1a98
|
|||
|
90f07ad8bd
|
|||
|
3d3b5c9a5f
|
|||
|
7e814bc276
|
|||
|
25a2475b65
|
|||
|
4d890c44c3
|
|||
|
d0ba393447
|
|||
|
5a33c0ee3f
|
|||
|
9d03e1167f
|
|||
|
d2d72a383a
|
|||
|
2969562349
|
|||
|
ba60a3c637
|
|||
|
b25260b71e
|
|||
|
29cc48d499
|
|||
|
1ef405296a
|
|||
|
16c6d9e907
|
@@ -13,7 +13,7 @@
|
||||
content = {
|
||||
type = "filesystem";
|
||||
format = "vfat";
|
||||
extraArgs = [ "-n NIXBOOT" ];
|
||||
extraArgs = [ "-n" "NIXBOOT" ];
|
||||
mountpoint = "/boot";
|
||||
mountOptions = [
|
||||
"defaults"
|
||||
@@ -24,7 +24,7 @@
|
||||
size = "100%";
|
||||
content = {
|
||||
type = "btrfs";
|
||||
extraArgs = [ "-f -L NIXROOT" ];
|
||||
extraArgs = [ "-f" "-L" "NIXROOT" ];
|
||||
subvolumes = {
|
||||
"@" = {
|
||||
mountpoint = "/";
|
||||
|
||||
161
flake.lock
generated
161
flake.lock
generated
@@ -10,11 +10,11 @@
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1723293904,
|
||||
"narHash": "sha256-b+uqzj+Wa6xgMS9aNbX4I+sXeb5biPDi39VgvSFqFvU=",
|
||||
"lastModified": 1762618334,
|
||||
"narHash": "sha256-wyT7Pl6tMFbFrs8Lk/TlEs81N6L+VSybPfiIgzU8lbQ=",
|
||||
"owner": "ryantm",
|
||||
"repo": "agenix",
|
||||
"rev": "f6291c5935fdc4e0bef208cfc0dcab7e3f7a1c41",
|
||||
"rev": "fcdea223397448d35d9b31f798479227e80183f6",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -25,11 +25,11 @@
|
||||
},
|
||||
"crane": {
|
||||
"locked": {
|
||||
"lastModified": 1730652660,
|
||||
"narHash": "sha256-+XVYfmVXAiYA0FZT7ijHf555dxCe+AoAT5A6RU+6vSo=",
|
||||
"lastModified": 1765145449,
|
||||
"narHash": "sha256-aBVHGWWRzSpfL++LubA0CwOOQ64WNLegrYHwsVuVN7A=",
|
||||
"owner": "ipetkov",
|
||||
"repo": "crane",
|
||||
"rev": "a4ca93905455c07cb7e3aca95d4faf7601cba458",
|
||||
"rev": "69f538cdce5955fcd47abfed4395dc6d5194c1c5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -46,11 +46,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1700795494,
|
||||
"narHash": "sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0=",
|
||||
"lastModified": 1744478979,
|
||||
"narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=",
|
||||
"owner": "lnl7",
|
||||
"repo": "nix-darwin",
|
||||
"rev": "4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d",
|
||||
"rev": "43975d782b418ebf4969e9ccba82466728c2851b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -63,11 +63,11 @@
|
||||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1696426674,
|
||||
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||
"lastModified": 1761588595,
|
||||
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -76,27 +76,6 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-parts": {
|
||||
"inputs": {
|
||||
"nixpkgs-lib": [
|
||||
"lanzaboote",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1730504689,
|
||||
"narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"rev": "506278e768c2a08bec68eb62932193e341f55c90",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "flake-parts",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems_2"
|
||||
@@ -119,7 +98,7 @@
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"lanzaboote",
|
||||
"pre-commit-hooks-nix",
|
||||
"pre-commit",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
@@ -145,11 +124,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1703113217,
|
||||
"narHash": "sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE=",
|
||||
"lastModified": 1745494811,
|
||||
"narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "3bfaacf46133c037bb356193bd2f1765d9dc82c1",
|
||||
"rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -165,11 +144,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1734344598,
|
||||
"narHash": "sha256-wNX3hsScqDdqKWOO87wETUEi7a/QlPVgpC/Lh5rFOuA=",
|
||||
"lastModified": 1765606130,
|
||||
"narHash": "sha256-KOP4QnkiRwiD5KEOr6ceF67rfTP1OqPmCCft6xDC3k4=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "83ecd50915a09dca928971139d3a102377a8d242",
|
||||
"rev": "d787ec69c3216ea33be1c0424fe65cb23aa8fb31",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -185,27 +164,27 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1726989464,
|
||||
"narHash": "sha256-Vl+WVTJwutXkimwGprnEtXc/s/s8sMuXzqXaspIGlwM=",
|
||||
"lastModified": 1765605144,
|
||||
"narHash": "sha256-RM2xs+1HdHxesjOelxoA3eSvXShC8pmBvtyTke4Ango=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "2f23fa308a7c067e52dfcc30a0758f47043ec176",
|
||||
"rev": "90b62096f099b73043a747348c11dbfcfbdea949",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"ref": "release-24.05",
|
||||
"ref": "release-25.11",
|
||||
"repo": "home-manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"impermanence": {
|
||||
"locked": {
|
||||
"lastModified": 1734200366,
|
||||
"narHash": "sha256-0NursoP4BUdnc+wy+Mq3icHkXu/RgP1Sjo0MJxV2+Dw=",
|
||||
"lastModified": 1737831083,
|
||||
"narHash": "sha256-LJggUHbpyeDvNagTUrdhe/pRVp4pnS6wVKALS782gRI=",
|
||||
"owner": "nix-community",
|
||||
"repo": "impermanence",
|
||||
"rev": "c6323585fa0035d780e3d8906eb1b24b65d19a48",
|
||||
"rev": "4b3e914cdf97a5b536a889e939fb2fd2b043a170",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -222,11 +201,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1734591594,
|
||||
"narHash": "sha256-7Q4hXE+b9A4DebZ5Q+q3WStuMiWR5bMW0ltpzbY/zMQ=",
|
||||
"lastModified": 1765526639,
|
||||
"narHash": "sha256-4U8crbUT3PDQdqhaMLnVaxnciBlcnDAw8XAJaXiS0pA=",
|
||||
"owner": "Jovian-Experiments",
|
||||
"repo": "Jovian-NixOS",
|
||||
"rev": "ce2abe494524cdb389a5d31c11c41834d4362ac5",
|
||||
"rev": "457a55ed77a105088a47cb55b9eccf7768559451",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -238,20 +217,18 @@
|
||||
"lanzaboote": {
|
||||
"inputs": {
|
||||
"crane": "crane",
|
||||
"flake-compat": "flake-compat",
|
||||
"flake-parts": "flake-parts",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"pre-commit-hooks-nix": "pre-commit-hooks-nix",
|
||||
"pre-commit": "pre-commit",
|
||||
"rust-overlay": "rust-overlay"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1731941836,
|
||||
"narHash": "sha256-zpmAzrvK8KdssBSwiIwwRxaUJ77oWORbW0XFvgCFpTE=",
|
||||
"lastModified": 1765382359,
|
||||
"narHash": "sha256-RJmgVDzjRI18BWVogG6wpsl1UCuV6ui8qr4DJ1LfWZ8=",
|
||||
"owner": "nix-community",
|
||||
"repo": "lanzaboote",
|
||||
"rev": "2f48272f34174fd2a5ab3df4d8a46919247be879",
|
||||
"rev": "e8c096ade12ec9130ff931b0f0e25d2f1bc63607",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -270,11 +247,11 @@
|
||||
"spectrum": "spectrum"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1734041466,
|
||||
"narHash": "sha256-51bhaMe8BZuNAStUHvo07nDO72wmw8PAqkSYH4U31Yo=",
|
||||
"lastModified": 1765456745,
|
||||
"narHash": "sha256-vJ6Ikk9tV7HuDsn/I90y14w+sNtLmAYfdm5S+yBzrCA=",
|
||||
"owner": "astro",
|
||||
"repo": "microvm.nix",
|
||||
"rev": "3910e65c3d92c82ea41ab295c66df4c0b4f9e7b3",
|
||||
"rev": "f5c1bbfd4cf686ec1822ccaeb634a8b93ee5120f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -307,11 +284,11 @@
|
||||
},
|
||||
"nixos-hardware": {
|
||||
"locked": {
|
||||
"lastModified": 1734352517,
|
||||
"narHash": "sha256-mfv+J/vO4nqmIOlq8Y1rRW8hVsGH3M+I2ESMjhuebDs=",
|
||||
"lastModified": 1764440730,
|
||||
"narHash": "sha256-ZlJTNLUKQRANlLDomuRWLBCH5792x+6XUJ4YdFRjtO4=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixos-hardware",
|
||||
"rev": "b12e314726a4226298fe82776b4baeaa7bcf3dcd",
|
||||
"rev": "9154f4569b6cdfd3c595851a6ba51bfaa472d9f3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -323,43 +300,27 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1734529975,
|
||||
"narHash": "sha256-ze3IJksru9dN0keqUxY0WNf8xrwfs8Ty/z9v/keyBbg=",
|
||||
"lastModified": 1765311797,
|
||||
"narHash": "sha256-mSD5Ob7a+T2RNjvPvOA1dkJHGVrNVl8ZOrAwBjKBDQo=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "72d11d40b9878a67c38f003c240c2d2e1811e72a",
|
||||
"rev": "09eb77e94fa25202af8f3e81ddc7353d9970ac1b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-24.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable": {
|
||||
"locked": {
|
||||
"lastModified": 1720386169,
|
||||
"narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "194846768975b7ad2c4988bdb82572c00222c0d7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-24.05",
|
||||
"ref": "nixos-25.11",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-unstable": {
|
||||
"locked": {
|
||||
"lastModified": 1734424634,
|
||||
"narHash": "sha256-cHar1vqHOOyC7f1+tVycPoWTfKIaqkoe1Q6TnKzuti4=",
|
||||
"lastModified": 1765472234,
|
||||
"narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d3c42f187194c26d9f0309a8ecc469d6c878ce33",
|
||||
"rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -369,25 +330,21 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"pre-commit-hooks-nix": {
|
||||
"pre-commit": {
|
||||
"inputs": {
|
||||
"flake-compat": [
|
||||
"lanzaboote",
|
||||
"flake-compat"
|
||||
],
|
||||
"flake-compat": "flake-compat",
|
||||
"gitignore": "gitignore",
|
||||
"nixpkgs": [
|
||||
"lanzaboote",
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-stable": "nixpkgs-stable"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1730302582,
|
||||
"narHash": "sha256-W1MIJpADXQCgosJZT8qBYLRuZls2KSiKdpnTVdKBuvU=",
|
||||
"lastModified": 1765016596,
|
||||
"narHash": "sha256-rhSqPNxDVow7OQKi4qS5H8Au0P4S3AYbawBSmJNUtBQ=",
|
||||
"owner": "cachix",
|
||||
"repo": "pre-commit-hooks.nix",
|
||||
"rev": "af8a16fe5c264f5e9e18bcee2859b40a656876cf",
|
||||
"rev": "548fc44fca28a5e81c5d6b846e555e6b9c2a5a3c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -418,11 +375,11 @@
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1730601085,
|
||||
"narHash": "sha256-Sgax33jGuvVHTjl1P78IwzlhAGyOxtx5Q26inKja8S4=",
|
||||
"lastModified": 1765075567,
|
||||
"narHash": "sha256-KFDCdQcHJ0hE3Nt5Gm5enRIhmtEifAjpxgUQ3mzSJpA=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "8d1b40f8dfd7539aaa3de56e207e22b3cc451825",
|
||||
"rev": "769156779b41e8787a46ca3d7d76443aaf68be6f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -434,11 +391,11 @@
|
||||
"spectrum": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1733308308,
|
||||
"narHash": "sha256-+RcbMAjSxV1wW5UpS9abIG1lFZC8bITPiFIKNnE7RLs=",
|
||||
"lastModified": 1759482047,
|
||||
"narHash": "sha256-H1wiXRQHxxPyMMlP39ce3ROKCwI5/tUn36P8x6dFiiQ=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "80c9e9830d460c944c8f730065f18bb733bc7ee2",
|
||||
"revCount": 792,
|
||||
"rev": "c5d5786d3dc938af0b279c542d1e43bce381b4b9",
|
||||
"revCount": 996,
|
||||
"type": "git",
|
||||
"url": "https://spectrum-os.org/git/spectrum"
|
||||
},
|
||||
|
||||
89
flake.nix
89
flake.nix
@@ -9,10 +9,9 @@
|
||||
{
|
||||
description = "Kabbone's peronal NixOS Flake config";
|
||||
|
||||
inputs = # All flake references used to build my NixOS setup. These are dependencies.
|
||||
{
|
||||
inputs = {
|
||||
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; # Nix Packages
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
|
||||
nixos-hardware.url = "github:NixOS/nixos-hardware/master";
|
||||
|
||||
microvm = {
|
||||
@@ -23,7 +22,7 @@
|
||||
impermanence.url = "github:nix-community/impermanence";
|
||||
|
||||
home-manager = { # User Package Management
|
||||
url = "github:nix-community/home-manager/release-24.05";
|
||||
url = "github:nix-community/home-manager/release-25.11";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
@@ -47,28 +46,64 @@
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
nixpkgs-unstable,
|
||||
nixos-hardware,
|
||||
home-manager,
|
||||
home-manager-unstable,
|
||||
agenix,
|
||||
jovian-nixos,
|
||||
microvm,
|
||||
impermanence,
|
||||
lanzaboote,
|
||||
...
|
||||
} @ inputs: rec {
|
||||
inherit (self) outputs;
|
||||
systems = [
|
||||
"aarch64-linux"
|
||||
"x86_64-linux"
|
||||
];
|
||||
|
||||
forAllSystems = nixpkgs.lib.genAttrs systems;
|
||||
#in {
|
||||
# Your custom packages
|
||||
# Accessible through 'nix build', 'nix shell', etc
|
||||
packages = forAllSystems (system: import ./packages nixpkgs.legacyPackages.${system});
|
||||
# Formatter for your nix files, available through 'nix fmt'
|
||||
# Other options beside 'alejandra' include 'nixpkgs-fmt'
|
||||
formatter = forAllSystems (system: nixpkgs.legacyPackages.${system}.alejandra);
|
||||
|
||||
# Your custom packages and modifications, exported as overlays
|
||||
overlays = import ./overlays {inherit inputs;};
|
||||
# Reusable nixos modules you might want to export
|
||||
# These are usually stuff you would upstream into nixpkgs
|
||||
#nixosModules = import ./modules/kabbone;
|
||||
# Reusable home-manager modules you might want to export
|
||||
# These are usually stuff you would upstream into home-manager
|
||||
#homeManagerModules = import ./modules/home-manager;
|
||||
|
||||
|
||||
nixosConfigurations = ( # NixOS configurations
|
||||
import ./hosts { # Imports ./hosts/default.nix
|
||||
inherit (nixpkgs) lib;
|
||||
inherit inputs nixpkgs nixpkgs-unstable nixos-hardware home-manager home-manager-unstable agenix jovian-nixos microvm impermanence lanzaboote; # Also inherit home-manager so it does not need to be defined here.
|
||||
nix.allowedUsers = [ "@wheel" ];
|
||||
security.sudo.execWheelOnly = true;
|
||||
}
|
||||
);
|
||||
|
||||
hydraJobs = {
|
||||
"steamdeck" = nixosConfigurations.steamdeck.config.system.build.toplevel;
|
||||
"hades" = nixosConfigurations.hades.config.system.build.toplevel;
|
||||
"nasbak" = nixosConfigurations.nasbak.config.system.build.toplevel;
|
||||
"jupiter" = nixosConfigurations.jupiter.config.system.build.toplevel;
|
||||
"lifebook" = nixosConfigurations.lifebook.config.system.build.toplevel;
|
||||
"kabtop" = nixosConfigurations.kabtop.config.system.build.toplevel;
|
||||
"dmz" = nixosConfigurations.dmz.config.system.build.toplevel;
|
||||
};
|
||||
|
||||
outputs = inputs @ { self, nixpkgs, nixpkgs-unstable, nixos-hardware, home-manager, home-manager-unstable, agenix, jovian-nixos, microvm, impermanence, lanzaboote, ... }: # Function that tells my flake which to use and what do what to do with the dependencies.
|
||||
rec {
|
||||
nixosConfigurations = ( # NixOS configurations
|
||||
import ./hosts { # Imports ./hosts/default.nix
|
||||
inherit (nixpkgs) lib;
|
||||
inherit inputs nixpkgs nixpkgs-unstable nixos-hardware home-manager home-manager-unstable agenix jovian-nixos microvm impermanence lanzaboote; # Also inherit home-manager so it does not need to be defined here.
|
||||
nix.allowedUsers = [ "@wheel" ];
|
||||
security.sudo.execWheelOnly = true;
|
||||
}
|
||||
);
|
||||
hydraJobs = {
|
||||
"steamdeck" = nixosConfigurations.steamdeck.config.system.build.toplevel;
|
||||
"hades" = nixosConfigurations.hades.config.system.build.toplevel;
|
||||
"nasbak" = nixosConfigurations.nasbak.config.system.build.toplevel;
|
||||
"jupiter" = nixosConfigurations.jupiter.config.system.build.toplevel;
|
||||
"lifebook" = nixosConfigurations.lifebook.config.system.build.toplevel;
|
||||
"kabtop" = nixosConfigurations.kabtop.config.system.build.toplevel;
|
||||
"dmz" = nixosConfigurations.dmz.config.system.build.toplevel;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
# └─ default.nix
|
||||
#
|
||||
|
||||
{ config, lib, pkgs, inputs, user, location, agenix, ... }:
|
||||
{ config, lib, pkgs, pkgs-stable, inputs, user, location, agenix, ... }:
|
||||
|
||||
{
|
||||
imports = # Import window or display manager.
|
||||
@@ -47,6 +47,7 @@
|
||||
};
|
||||
|
||||
security = {
|
||||
pam.services.login.enableGnomeKeyring = true;
|
||||
rtkit.enable = true;
|
||||
pki.certificateFiles = [
|
||||
./rootCA.pem
|
||||
@@ -83,7 +84,7 @@
|
||||
VISUAL = "nvim";
|
||||
BROWSER = "firefox";
|
||||
};
|
||||
systemPackages = with pkgs; [ # Default packages install system-wide
|
||||
systemPackages = (with pkgs; [ # Default packages install system-wide
|
||||
vim
|
||||
git
|
||||
killall
|
||||
@@ -115,7 +116,13 @@
|
||||
sbctl
|
||||
ausweisapp
|
||||
e2fsprogs
|
||||
];
|
||||
])
|
||||
|
||||
++
|
||||
|
||||
(with pkgs-stable; [
|
||||
orca-slicer
|
||||
]);
|
||||
};
|
||||
|
||||
services = {
|
||||
@@ -141,7 +148,7 @@
|
||||
pcscd.enable = true;
|
||||
yubikey-agent.enable = true;
|
||||
udev.packages = [ pkgs.yubikey-personalization pkgs.nitrokey-udev-rules ];
|
||||
#flatpak.enable = true; # download flatpak file from website - sudo flatpak install <path> - reboot if not showing up
|
||||
flatpak.enable = true; # download flatpak file from website - sudo flatpak install <path> - reboot if not showing up
|
||||
# sudo flatpak uninstall --delete-data <app-id> (> flatpak list --app) - flatpak uninstall --unused
|
||||
# List:
|
||||
# com.obsproject.Studio
|
||||
@@ -157,7 +164,6 @@
|
||||
ssh = {
|
||||
startAgent = true;
|
||||
agentTimeout = "1h";
|
||||
askPassword = "${pkgs.lxqt.lxqt-openssh-askpass}/bin/lxqt-openssh-askpass";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -182,6 +188,10 @@
|
||||
'';
|
||||
};
|
||||
nixpkgs.config.allowUnfree = true; # Allow proprietary software.
|
||||
nixpkgs.config.permittedInsecurePackages = [
|
||||
"olm-3.2.16"
|
||||
"mbedtls-2.28.10"
|
||||
];
|
||||
|
||||
system = { # NixOS settings
|
||||
autoUpgrade = { # Allow auto update
|
||||
|
||||
@@ -114,6 +114,10 @@
|
||||
# sudo flatpak uninstall --delete-data <app-id> (> flatpak list --app) - flatpak uninstall --unused
|
||||
};
|
||||
|
||||
programs = {
|
||||
zsh.enable = true;
|
||||
};
|
||||
|
||||
nix = { # Nix Package Manager settings
|
||||
settings ={
|
||||
auto-optimise-store = true; # Optimise syslinks
|
||||
|
||||
@@ -26,6 +26,21 @@ let
|
||||
config.allowUnfree = true; # Allow proprietary software
|
||||
};
|
||||
|
||||
pkgs-unstable = import nixpkgs-unstable {
|
||||
inherit system;
|
||||
config.allowUnfree = true; # Allow proprietary software
|
||||
};
|
||||
|
||||
pkgs-stable = import nixpkgs {
|
||||
inherit system;
|
||||
config.allowUnfree = true; # Allow proprietary software
|
||||
};
|
||||
|
||||
pkgs-kabbone = import ../packages {
|
||||
inherit system;
|
||||
inherit pkgs;
|
||||
};
|
||||
|
||||
lib = nixpkgs.lib;
|
||||
users.defaultShell = "pkgs.zsh";
|
||||
|
||||
@@ -33,7 +48,7 @@ in
|
||||
{
|
||||
hades = lib.nixosSystem { # Desktop profile
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix microvm nixpkgs lanzaboote; };
|
||||
specialArgs = { inherit inputs pkgs-stable user location nixos-hardware agenix microvm nixpkgs lanzaboote pkgs-kabbone; };
|
||||
modules = [
|
||||
agenix.nixosModules.default
|
||||
microvm.nixosModules.host
|
||||
@@ -60,7 +75,7 @@ in
|
||||
|
||||
lifebook = lib.nixosSystem { # Laptop profile
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix lanzaboote; };
|
||||
specialArgs = { inherit inputs pkgs-stable user location nixos-hardware agenix lanzaboote; };
|
||||
modules = [
|
||||
agenix.nixosModules.default
|
||||
lanzaboote.nixosModules.lanzaboote
|
||||
@@ -83,11 +98,11 @@ in
|
||||
|
||||
nbf5 = lib.nixosSystem { # Laptop profile
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix; };
|
||||
specialArgs = { inherit inputs pkgs-stable user location nixos-hardware agenix; };
|
||||
modules = [
|
||||
agenix.nixosModules.default
|
||||
./nbf5
|
||||
./configuration_desktop.nix
|
||||
./configuration_server.nix
|
||||
../modules/hardware/hydraCache.nix
|
||||
nixos-hardware.nixosModules.common-cpu-intel
|
||||
nixos-hardware.nixosModules.common-pc-ssd
|
||||
@@ -97,7 +112,7 @@ in
|
||||
home-manager.useUserPackages = true;
|
||||
home-manager.extraSpecialArgs = { inherit user; };
|
||||
home-manager.users.${user} = {
|
||||
imports = [(import ./home.nix)] ++ [(import ./nbf5/home.nix)];
|
||||
imports = [(import ./home_server.nix)] ++ [(import ./nbf5/home.nix)];
|
||||
};
|
||||
}
|
||||
];
|
||||
@@ -105,7 +120,7 @@ in
|
||||
|
||||
steamdeck = nixpkgs-unstable.lib.nixosSystem { # steamdeck profile
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix jovian-nixos lanzaboote; };
|
||||
specialArgs = { inherit inputs pkgs-stable user location nixos-hardware agenix jovian-nixos lanzaboote; };
|
||||
modules = [
|
||||
agenix.nixosModules.default
|
||||
jovian-nixos.nixosModules.default
|
||||
@@ -150,7 +165,7 @@ in
|
||||
|
||||
kabtop = lib.nixosSystem { # Desktop profile
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix nixpkgs impermanence; };
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix nixpkgs pkgs-unstable impermanence; };
|
||||
modules = [
|
||||
agenix.nixosModules.default
|
||||
microvm.nixosModules.host
|
||||
@@ -195,7 +210,7 @@ in
|
||||
|
||||
jupiter = lib.nixosSystem { # Desktop profile
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix; };
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix pkgs-kabbone; };
|
||||
modules = [
|
||||
agenix.nixosModules.default
|
||||
./jupiter
|
||||
@@ -237,6 +252,29 @@ in
|
||||
];
|
||||
};
|
||||
|
||||
kubemaster-1 = lib.nixosSystem { # Desktop profile
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix nixpkgs impermanence; };
|
||||
modules = [
|
||||
agenix.nixosModules.default
|
||||
microvm.nixosModules.host
|
||||
./kubemaster-1
|
||||
./configuration_server.nix
|
||||
../modules/hardware/hydraCache.nix
|
||||
nixos-hardware.nixosModules.common-cpu-intel
|
||||
nixos-hardware.nixosModules.common-pc-ssd
|
||||
|
||||
home-manager.nixosModules.home-manager {
|
||||
home-manager.useGlobalPkgs = true;
|
||||
home-manager.useUserPackages = true;
|
||||
home-manager.extraSpecialArgs = { inherit user; };
|
||||
home-manager.users.${user} = {
|
||||
imports = [(import ./home_server.nix)] ++ [(import ./kubemaster-1/home.nix)];
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
dmz = lib.nixosSystem { # Desktop profile
|
||||
inherit system;
|
||||
specialArgs = { inherit inputs user location nixos-hardware agenix nixpkgs impermanence; };
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
# └─ default.nix
|
||||
#
|
||||
|
||||
{ config, nixpkgs, pkgs, user, lib, ... }:
|
||||
{ config, nixpkgs, pkgs, user, lib, pkgs-kabbone, ... }:
|
||||
|
||||
{
|
||||
imports = # For now, if applying to other system, swap files
|
||||
@@ -25,6 +25,7 @@
|
||||
[(import ../../modules/wm/sway/default.nix)] ++ # Window Manager
|
||||
(import ../../modules/wm/virtualisation) ++ # libvirt + Docker
|
||||
[(import ../../modules/wm/virtualisation/kvm-amd.nix)] ++ # kvm module options
|
||||
#[(import ../../modules/kabbone/corosync-qdevice.nix)] ++ # corosync qdevice quorum
|
||||
(import ../../modules/hardware); # Hardware devices
|
||||
|
||||
boot = { # Boot options
|
||||
@@ -53,21 +54,16 @@
|
||||
# nitrokey.enable = true;
|
||||
# };
|
||||
|
||||
# environment = {
|
||||
# systemPackages = with pkgs; [
|
||||
## simple-scan
|
||||
## intel-media-driver
|
||||
## alacritty
|
||||
# ];
|
||||
# };
|
||||
environment = {
|
||||
systemPackages = [
|
||||
pkgs.linux-firmware
|
||||
#pkgs-kabbone.corosync-qdevice
|
||||
];
|
||||
};
|
||||
|
||||
services = {
|
||||
#auto-cpufreq.enable = true;
|
||||
blueman.enable = true;
|
||||
printing = { # Printing and drivers for TS5300
|
||||
enable = true;
|
||||
drivers = [ pkgs.gutenprint ];
|
||||
};
|
||||
avahi = { # Needed to find wireless printer
|
||||
enable = true;
|
||||
nssmdns4 = true;
|
||||
@@ -81,7 +77,29 @@
|
||||
enable = true;
|
||||
motherboard = "amd";
|
||||
};
|
||||
|
||||
syncthing = {
|
||||
enable = true;
|
||||
group = "users";
|
||||
user = "kabbone";
|
||||
dataDir = "/home/${config.services.syncthing.user}/Sync";
|
||||
configDir = "/home/${config.services.syncthing.user}/.config/syncthing";
|
||||
overrideDevices = true; # overrides any devices added or deleted through the WebUI
|
||||
overrideFolders = true; # overrides any folders added or deleted through the WebUI
|
||||
openDefaultPorts = true;
|
||||
settings = {
|
||||
devices = {
|
||||
"jupiter.home.opel-online.de" = { id = "T53WU6Z-3NT74ZE-PZVZB2N-7FBTZ5K-HESC2ZM-W4ABDAS-NWXHTGI-ST4CDQR"; };
|
||||
"lifebook.home.opel-online.de" = { id = "RKPZG3H-BDUZID3-DV26MKR-UOARIQC-JBCAFXP-J5QFM4H-5EGBSM5-VEGXHQ4"; };
|
||||
};
|
||||
folders = {
|
||||
"Sync" = { # Name of folder in Syncthing, also the folder ID
|
||||
path = "/home/${config.services.syncthing.user}/Sync"; # Which folder to add to Syncthing
|
||||
devices = [ "jupiter.home.opel-online.de" "lifebook.home.opel-online.de" ]; # Which devices to share the folder with
|
||||
ignorePerms = false; # By default, Syncthing doesn't sync file permissions. This line enables it for this folder.
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
|
||||
systemd.timers = {
|
||||
btrbk-bak = {
|
||||
after = [ "network-online.target" ];
|
||||
requires = [ "network-online.target" ];
|
||||
};
|
||||
};
|
||||
@@ -153,7 +154,7 @@
|
||||
useDHCP = false; # Deprecated
|
||||
hostName = "hades";
|
||||
networkmanager = {
|
||||
enable = false;
|
||||
enable = true;
|
||||
};
|
||||
firewall = {
|
||||
enable = true;
|
||||
@@ -162,20 +163,20 @@
|
||||
};
|
||||
};
|
||||
|
||||
systemd.network = {
|
||||
enable = true;
|
||||
networks = {
|
||||
"10-lan" = {
|
||||
matchConfig.Name = "eno1";
|
||||
ntp = [ "192.168.2.1" ];
|
||||
domains = [ "home.opel-online.de" ];
|
||||
networkConfig = {
|
||||
DHCP = "yes";
|
||||
IPv6AcceptRA = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
# systemd.network = {
|
||||
# enable = true;
|
||||
# networks = {
|
||||
# "10-lan" = {
|
||||
# matchConfig.Name = "eno1";
|
||||
# ntp = [ "192.168.2.1" ];
|
||||
# domains = [ "home.opel-online.de" ];
|
||||
# networkConfig = {
|
||||
# DHCP = "yes";
|
||||
# IPv6AcceptRA = true;
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
|
||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
#powerManagement.powertop.enable = true;
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
thunderbird
|
||||
streamlink
|
||||
streamlink-twitch-gui-bin
|
||||
element-desktop
|
||||
#nheko
|
||||
pulsemixer
|
||||
#yubioath-flutter
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
enable = true;
|
||||
networks = {
|
||||
"10-lan" = {
|
||||
matchConfig.Name = "enp6s18";
|
||||
matchConfig.Name = "ens18";
|
||||
ntp = [ "192.168.101.1" ];
|
||||
#domains = [ "home.opel-online.de" ];
|
||||
networkConfig = {
|
||||
|
||||
@@ -64,10 +64,6 @@
|
||||
services = {
|
||||
#auto-cpufreq.enable = true;
|
||||
blueman.enable = true;
|
||||
printing = { # Printing and drivers for TS5300
|
||||
enable = true;
|
||||
drivers = [ pkgs.gutenprint ];
|
||||
};
|
||||
avahi = { # Needed to find wireless printer
|
||||
enable = true;
|
||||
nssmdns4 = true;
|
||||
|
||||
@@ -15,8 +15,7 @@
|
||||
# └─ default.nix
|
||||
#
|
||||
|
||||
{ config, lib, pkgs, user, ... }:
|
||||
#{ config, lib, pkgs, user, ... }:
|
||||
{ config, lib, pkgs, user, pkgs-stable, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
@@ -56,24 +55,24 @@
|
||||
|
||||
# Apps
|
||||
galculator
|
||||
tdesktop
|
||||
telegram-desktop
|
||||
hdparm
|
||||
python3Full
|
||||
python3
|
||||
android-tools
|
||||
calibre
|
||||
mtpfs
|
||||
vimiv-qt
|
||||
freecad
|
||||
discord
|
||||
element-desktop
|
||||
|
||||
# Fileanagement
|
||||
#okular # PDF viewer
|
||||
#gnome.file-roller # Archive Manager
|
||||
ark
|
||||
kdePackages.ark
|
||||
pcmanfm # File Manager
|
||||
rsync # Syncer $ rsync -r dir1/ dir2/
|
||||
unzip # Zip files
|
||||
unrar # Rar files
|
||||
epapirus-icon-theme
|
||||
papirus-icon-theme
|
||||
arc-theme
|
||||
|
||||
# General configuration
|
||||
@@ -83,7 +82,6 @@
|
||||
|
||||
# Flatpak
|
||||
prusa-slicer
|
||||
orca-slicer
|
||||
#vscodium
|
||||
(vscode-with-extensions.override {
|
||||
vscode = vscodium;
|
||||
@@ -100,6 +98,7 @@
|
||||
sdkmanager
|
||||
android-tools
|
||||
];
|
||||
|
||||
file.".config/wall".source = ../modules/themes/wall.jpg;
|
||||
file.".config/lockwall".source = ../modules/themes/lockwall.jpg;
|
||||
# pointerCursor = { # This will set cursor systemwide so applications can not choose their own
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
# Apps
|
||||
hdparm
|
||||
python3Full
|
||||
python3
|
||||
|
||||
# File Management
|
||||
rsync # Syncer $ rsync -r dir1/ dir2/
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
# └─ default.nix
|
||||
#
|
||||
|
||||
{ config, pkgs, user, ... }:
|
||||
{ config, pkgs, user, pkgs-kabbone, ... }:
|
||||
|
||||
{
|
||||
imports = # For now, if applying to other ssystem, swap files
|
||||
@@ -40,10 +40,11 @@
|
||||
};
|
||||
|
||||
# environment = {
|
||||
# systemPackages = with pkgs; [
|
||||
## simple-scan
|
||||
## intel-media-driver
|
||||
## alacritty
|
||||
# systemPackages = with pkgs-kabbone; [
|
||||
# corosync-qdevice
|
||||
### simple-scan
|
||||
### intel-media-driver
|
||||
### alacritty
|
||||
# ];
|
||||
# };
|
||||
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
enable = true;
|
||||
networks = {
|
||||
"10-lan" = {
|
||||
matchConfig.Name = "enp6s18";
|
||||
matchConfig.Name = "ens18";
|
||||
ntp = [ "192.168.2.1" ];
|
||||
#domains = [ "home.opel-online.de" ];
|
||||
networkConfig = {
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
# └─ default.nix
|
||||
#
|
||||
|
||||
{ config, pkgs, user, agenix, impermanence, ... }:
|
||||
{ config, pkgs, pkgs-unstable, user, agenix, impermanence, ... }:
|
||||
|
||||
{
|
||||
imports = # For now, if applying to other system, swap files
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
subvolume = {
|
||||
"@" = {};
|
||||
"@home" = {};
|
||||
"@var" = {};
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -113,32 +114,36 @@
|
||||
networkmanager = {
|
||||
enable = false;
|
||||
};
|
||||
interfaces = {
|
||||
ens18 = {
|
||||
useDHCP = false; # For versatility sake, manually edit IP on nm-applet.
|
||||
ipv4.addresses = [ {
|
||||
address = "37.44.215.182";
|
||||
prefixLength = 24;
|
||||
} ];
|
||||
ipv6.addresses = [ {
|
||||
address = "2a13:7e80:0:ef::2";
|
||||
prefixLength = 64;
|
||||
} ];
|
||||
};
|
||||
};
|
||||
defaultGateway = "37.44.215.1";
|
||||
defaultGateway6 = {
|
||||
address = "fe80::1";
|
||||
interface = "ens18";
|
||||
};
|
||||
|
||||
nameservers = [ "9.9.9.9" "2620:fe::fe" ];
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedUDPPorts = [ ];
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
};
|
||||
};
|
||||
systemd.network = {
|
||||
enable = true;
|
||||
networks = {
|
||||
"10-lan" = {
|
||||
matchConfig.Name = "ens18";
|
||||
|
||||
address = [
|
||||
"37.44.215.182/24"
|
||||
"2a13:7e80:0:ef::2/64"
|
||||
];
|
||||
|
||||
routes = [
|
||||
{ Gateway = "37.44.215.1"; }
|
||||
{ Gateway = "fe80::1"; }
|
||||
];
|
||||
|
||||
dns = [
|
||||
"9.9.9.9"
|
||||
"2620:fe::fe"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
||||
|
||||
58
hosts/kubemaster-1/default.nix
Normal file
58
hosts/kubemaster-1/default.nix
Normal file
@@ -0,0 +1,58 @@
|
||||
#
|
||||
# Specific system configuration settings for desktop
|
||||
#
|
||||
# flake.nix
|
||||
# ├─ ./hosts
|
||||
# │ └─ ./laptop
|
||||
# │ ├─ default.nix *
|
||||
# │ └─ hardware-configuration.nix
|
||||
# └─ ./modules
|
||||
# ├─ ./desktop
|
||||
# │ └─ ./hyprland
|
||||
# │ └─ hyprland.nix
|
||||
# ├─ ./modules
|
||||
# │ └─ ./programs
|
||||
# │ └─ waybar.nix
|
||||
# └─ ./hardware
|
||||
# └─ default.nix
|
||||
#
|
||||
|
||||
{ config, pkgs, user, agenix, impermanence, ... }:
|
||||
|
||||
{
|
||||
imports = # For now, if applying to other system, swap files
|
||||
[(import ./hardware-configuration.nix)] ++ # Current system hardware config @ /etc/nixos/hardware-configuration.nix
|
||||
[(import ../../modules/wm/virtualisation/docker.nix)] ++ # Docker
|
||||
[(import ../../modules/wm/virtualisation/kvm-intel.nix)] ++ # Docker
|
||||
(import ../../modules/services/kubemaster); # Server Services
|
||||
|
||||
boot = { # Boot options
|
||||
kernelPackages = pkgs.linuxPackages_latest;
|
||||
|
||||
loader = { # EFI Boot
|
||||
systemd-boot.enable = true;
|
||||
efi = {
|
||||
canTouchEfiVariables = true;
|
||||
efiSysMountPoint = "/boot";
|
||||
};
|
||||
timeout = 1; # Grub auto select time
|
||||
};
|
||||
};
|
||||
|
||||
programs = { # No xbacklight, this is the alterantive
|
||||
zsh.enable = true;
|
||||
};
|
||||
|
||||
services = {
|
||||
avahi = { # Needed to find wireless printer
|
||||
enable = true;
|
||||
nssmdns4 = true;
|
||||
publish = { # Needed for detecting the scanner
|
||||
enable = true;
|
||||
addresses = true;
|
||||
userServices = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
117
hosts/kubemaster-1/hardware-configuration.nix
Normal file
117
hosts/kubemaster-1/hardware-configuration.nix
Normal file
@@ -0,0 +1,117 @@
|
||||
#
|
||||
# Hardware settings for Teclast F5 10" Laptop
|
||||
# NixOS @ sda2
|
||||
#
|
||||
# flake.nix
|
||||
# └─ ./hosts
|
||||
# └─ ./laptop
|
||||
# └─ hardware-configuration.nix *
|
||||
#
|
||||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod" "sr_mod" ];
|
||||
boot.initrd.kernelModules = [ "vfio_pci" "vfio" "vfio_iommu_type1" ];
|
||||
boot.kernelModules = [ "kvm-intel" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
boot.tmp.useTmpfs = false;
|
||||
boot.tmp.cleanOnBoot = true;
|
||||
zramSwap.enable = true;
|
||||
|
||||
services.btrfs.autoScrub = {
|
||||
enable = true;
|
||||
interval = "monthly";
|
||||
fileSystems = [
|
||||
"/"
|
||||
];
|
||||
};
|
||||
|
||||
fileSystems."/" =
|
||||
{ device = "/dev/disk/by-label/NIXROOT";
|
||||
fsType = "btrfs";
|
||||
options = [ "compress=zstd,space_cache=v2,ssd,noatime,subvol=@,discard=async" ];
|
||||
};
|
||||
|
||||
fileSystems."/home" =
|
||||
{ device = "/dev/disk/by-label/NIXROOT";
|
||||
fsType = "btrfs";
|
||||
options = [ "compress=zstd,space_cache=v2,ssd,noatime,subvol=@home,discard=async" ];
|
||||
};
|
||||
|
||||
fileSystems."/srv" =
|
||||
{ device = "/dev/disk/by-label/NIXROOT";
|
||||
fsType = "btrfs";
|
||||
options = [ "compress=zstd,space_cache=v2,ssd,noatime,subvol=@srv,discard=async" ];
|
||||
};
|
||||
|
||||
fileSystems."/var" =
|
||||
{ device = "/dev/disk/by-label/NIXROOT";
|
||||
fsType = "btrfs";
|
||||
options = [ "compress=zstd,space_cache=v2,ssd,noatime,subvol=@var,discard=async" ];
|
||||
};
|
||||
|
||||
fileSystems."/nix" =
|
||||
{ device = "/dev/disk/by-label/NIXROOT";
|
||||
fsType = "btrfs";
|
||||
options = [ "compress=zstd,space_cache=v2,ssd,noatime,subvol=@nix,discard=async" ];
|
||||
};
|
||||
|
||||
fileSystems."/swap" =
|
||||
{ device = "/dev/disk/by-label/NIXROOT";
|
||||
fsType = "btrfs";
|
||||
options = [ "compress=zstd,space_cache=v2,ssd,noatime,subvol=@swap,discard=async" ];
|
||||
};
|
||||
|
||||
fileSystems."/mnt/snapshots/root" =
|
||||
{ device = "/dev/disk/by-label/NIXROOT";
|
||||
fsType = "btrfs";
|
||||
options = [ "compress=zstd,space_cache=v2,ssd,noatime,subvolid=5,discard=async" ];
|
||||
};
|
||||
|
||||
swapDevices = [ ];
|
||||
|
||||
systemd.network = {
|
||||
enable = true;
|
||||
networks = {
|
||||
"10-lan" = {
|
||||
matchConfig.Name = "enp0s31f6";
|
||||
ntp = [ "192.168.2.1" ];
|
||||
#domains = [ "home.opel-online.de" ];
|
||||
networkConfig = {
|
||||
DHCP = "yes";
|
||||
IPv6AcceptRA = true;
|
||||
};
|
||||
dns = [
|
||||
"192.168.2.1"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
networking = {
|
||||
useDHCP = false; # Deprecated
|
||||
hostName = "kubemaster-1";
|
||||
firewall = {
|
||||
enable = true;
|
||||
allowedUDPPorts = [ ];
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
};
|
||||
};
|
||||
|
||||
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
powerManagement = {
|
||||
cpuFreqGovernor = lib.mkDefault "powersave";
|
||||
powertop.enable = true;
|
||||
powerUpCommands = ''
|
||||
${pkgs.hdparm}/sbin/hdparm -S 150 /dev/disk/by-uuid/e036f437-bc91-4398-b182-7cf5724e23a2
|
||||
'';
|
||||
};
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
|
||||
}
|
||||
39
hosts/kubemaster-1/home.nix
Normal file
39
hosts/kubemaster-1/home.nix
Normal file
@@ -0,0 +1,39 @@
|
||||
#
|
||||
# Home-manager configuration for laptop
|
||||
#
|
||||
# flake.nix
|
||||
# ├─ ./hosts
|
||||
# │ └─ ./laptop
|
||||
# │ └─ home.nix *
|
||||
# └─ ./modules
|
||||
# └─ ./desktop
|
||||
# └─ ./hyprland
|
||||
# └─ hyprland.nix
|
||||
#
|
||||
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[
|
||||
../../modules/home.nix # Window Manager
|
||||
];
|
||||
|
||||
home = { # Specific packages for laptop
|
||||
packages = with pkgs; [
|
||||
# Applications
|
||||
|
||||
# Display
|
||||
#light # xorg.xbacklight not supported. Other option is just use xrandr.
|
||||
|
||||
# Power Management
|
||||
#auto-cpufreq # Power management
|
||||
#tlp # Power management
|
||||
];
|
||||
};
|
||||
|
||||
programs = {
|
||||
alacritty.settings.font.size = 11;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -30,6 +30,7 @@
|
||||
|
||||
boot = { # Boot options
|
||||
kernelPackages = pkgs.linuxPackages_latest;
|
||||
initrd.prepend = [ "${./patched-SSDT4}" ];
|
||||
|
||||
loader = { # EFI Boot
|
||||
systemd-boot.enable = lib.mkForce false;
|
||||
@@ -46,10 +47,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
# hardware.sane = { # Used for scanning with Xsane
|
||||
# enable = false;
|
||||
# extraBackends = [ pkgs.sane-airscan ];
|
||||
# };
|
||||
hardware = {
|
||||
nitrokey.enable = true;
|
||||
};
|
||||
@@ -67,12 +64,8 @@
|
||||
|
||||
systemd.sleep.extraConfig = "HibernateDelaySec=1h";
|
||||
services = {
|
||||
logind.lidSwitch = "suspend-then-hibernate"; # Laptop does not go to sleep when lid is closed
|
||||
logind.settings.Login.HandleLidSwitch = "suspend-then-hibernate"; # Laptop does not go to sleep when lid is closed
|
||||
blueman.enable = true;
|
||||
printing = { # Printing and drivers for TS5300
|
||||
enable = true;
|
||||
drivers = [ pkgs.gutenprint ];
|
||||
};
|
||||
avahi = { # Needed to find wireless printer
|
||||
enable = true;
|
||||
nssmdns4 = true;
|
||||
@@ -83,12 +76,28 @@
|
||||
};
|
||||
};
|
||||
#tailscale.enable = true;
|
||||
|
||||
syncthing = {
|
||||
enable = true;
|
||||
group = "users";
|
||||
user = "kabbone";
|
||||
dataDir = "/home/${config.services.syncthing.user}/Sync";
|
||||
configDir = "/home/${config.services.syncthing.user}/.config/syncthing";
|
||||
overrideDevices = true; # overrides any devices added or deleted through the WebUI
|
||||
overrideFolders = true; # overrides any folders added or deleted through the WebUI
|
||||
openDefaultPorts = true;
|
||||
settings = {
|
||||
devices = {
|
||||
"jupiter.home.opel-online.de" = { id = "T53WU6Z-3NT74ZE-PZVZB2N-7FBTZ5K-HESC2ZM-W4ABDAS-NWXHTGI-ST4CDQR"; };
|
||||
"hades.home.opel-online.de" = { id = "3VPCBVW-RH7XKFM-TWJGQHC-ZRAQ575-CQKGGKP-NAB4VXE-KCKJFUT-AMCUQQA"; };
|
||||
};
|
||||
folders = {
|
||||
"Sync" = { # Name of folder in Syncthing, also the folder ID
|
||||
path = "/home/${config.services.syncthing.user}/Sync"; # Which folder to add to Syncthing
|
||||
devices = [ "jupiter.home.opel-online.de" "hades.home.opel-online.de" ]; # Which devices to share the folder with
|
||||
ignorePerms = false; # By default, Syncthing doesn't sync file permissions. This line enables it for this folder.
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
#temporary bluetooth fix
|
||||
# systemd.tmpfiles.rules = [
|
||||
# "d /var/lib/bluetooth 700 root root - -"
|
||||
# ];
|
||||
# systemd.targets."bluetooth".after = ["systemd-tmpfiles-setup.service"];
|
||||
}
|
||||
|
||||
@@ -42,11 +42,6 @@
|
||||
|
||||
zramSwap.enable = true;
|
||||
|
||||
# powerManagement = {
|
||||
# powerDownCommands = "${pkgs.kmod}/bin/rmmod intel_lpss_pci";
|
||||
# resumeCommands = "${pkgs.kmod}/bin/modprobe intel_lpss_pci";
|
||||
# };
|
||||
|
||||
|
||||
services = {
|
||||
btrfs.autoScrub = {
|
||||
@@ -117,6 +112,7 @@
|
||||
|
||||
systemd.timers = {
|
||||
btrbk-bak = {
|
||||
after = [ "network-online.target" ];
|
||||
requires = [ "network-online.target" ];
|
||||
};
|
||||
};
|
||||
@@ -176,13 +172,13 @@
|
||||
|
||||
|
||||
fileSystems."/mnt/Pluto" =
|
||||
{ device = "jupiter:/Pluto";
|
||||
{ device = "jupiter.home.opel-online.de:/Pluto";
|
||||
fsType = "nfs";
|
||||
options = [ "nofail,noauto,users,x-systemd.automount,x-systemd.device-timeout=10,soft,timeo=14,x-systemd.idle-timeout=1min,sec=sys,exec,nfsvers=4.2" ];
|
||||
};
|
||||
|
||||
fileSystems."/mnt/Mars" =
|
||||
{ device = "jupiter:/Mars";
|
||||
{ device = "jupiter.home.opel-online.de:/Mars";
|
||||
fsType = "nfs";
|
||||
options = [ "nofail,noauto,users,x-systemd.automount,x-systemd.device-timeout=10,soft,timeo=14,x-systemd.idle-timeout=1min,sec=sys,exec,nfsvers=4.2" ];
|
||||
};
|
||||
@@ -214,7 +210,7 @@
|
||||
#defaultGateway = "192.168.0.1";
|
||||
#nameservers = [ "192.168.0.4" ];
|
||||
firewall = {
|
||||
#checkReversePath = false;
|
||||
checkReversePath = false;
|
||||
enable = true;
|
||||
allowedUDPPorts = [ 24727 51820 ];
|
||||
allowedTCPPorts = [ 24727 ];
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
thunderbird
|
||||
streamlink
|
||||
streamlink-twitch-gui-bin
|
||||
element-desktop
|
||||
intel-gpu-tools
|
||||
pulsemixer
|
||||
|
||||
|
||||
BIN
hosts/lifebook/patched-SSDT4
Executable file
BIN
hosts/lifebook/patched-SSDT4
Executable file
Binary file not shown.
@@ -134,6 +134,7 @@
|
||||
|
||||
systemd.services = {
|
||||
btrbk-bak = {
|
||||
after = [ "network-online.target" ];
|
||||
requires = [ "network-online.target" ];
|
||||
};
|
||||
};
|
||||
@@ -198,7 +199,7 @@
|
||||
enable = true;
|
||||
networks = {
|
||||
"10-lan" = {
|
||||
matchConfig.Name = "enp6s18";
|
||||
matchConfig.Name = "ens18";
|
||||
ntp = [ "192.168.2.1" ];
|
||||
#domains = [ "home.opel-online.de" ];
|
||||
networkConfig = {
|
||||
|
||||
@@ -23,10 +23,11 @@
|
||||
imports = # For now, if applying to other system, swap files
|
||||
[(import ./hardware-configuration.nix)] ++ # Current system hardware config @ /etc/nixos/hardware-configuration.nix
|
||||
#[(import ../../modules/wm/hyprland/default.nix)] ++ # Window Manager
|
||||
[(import ../../modules/wm/sway/default.nix)] ++ # Window Manager
|
||||
# [(import ../../modules/wm/sway/default.nix)] ++ # Window Manager
|
||||
[(import ../../modules/wm/virtualisation/docker.nix)] ++ # Docker
|
||||
[(import ../../modules/wm/virtualisation/kvm-intel.nix)] ++ # kvm module options
|
||||
(import ../../modules/hardware); # Hardware devices
|
||||
(import ../../modules/hardware) ++
|
||||
(import ../../modules/services/printer); # Hardware devices
|
||||
|
||||
boot = { # Boot options
|
||||
kernelPackages = pkgs.linuxPackages_latest;
|
||||
@@ -41,19 +42,9 @@
|
||||
};
|
||||
};
|
||||
|
||||
# hardware.sane = { # Used for scanning with Xsane
|
||||
# enable = false;
|
||||
# extraBackends = [ pkgs.sane-airscan ];
|
||||
# };
|
||||
hardware = {
|
||||
nitrokey.enable = true;
|
||||
};
|
||||
|
||||
environment = {
|
||||
systemPackages = with pkgs; [
|
||||
# simple-scan
|
||||
intel-media-driver
|
||||
# alacritty
|
||||
];
|
||||
};
|
||||
|
||||
@@ -72,10 +63,6 @@
|
||||
logind.lidSwitch = "suspend-then-hibernate"; # Laptop does not go to sleep when lid is closed
|
||||
#auto-cpufreq.enable = true;
|
||||
blueman.enable = true;
|
||||
printing = { # Printing and drivers for TS5300
|
||||
enable = true;
|
||||
drivers = [ pkgs.gutenprint ];
|
||||
};
|
||||
avahi = { # Needed to find wireless printer
|
||||
enable = true;
|
||||
nssmdns4 = true;
|
||||
@@ -85,8 +72,6 @@
|
||||
userServices = true;
|
||||
};
|
||||
};
|
||||
tailscale.enable = true;
|
||||
|
||||
};
|
||||
|
||||
#temporary bluetooth fix
|
||||
|
||||
@@ -134,30 +134,19 @@
|
||||
networking = {
|
||||
useDHCP = false; # Deprecated
|
||||
hostName = "nbf5";
|
||||
wireless.iwd.enable = true;
|
||||
networkmanager = {
|
||||
enable = true;
|
||||
wifi = {
|
||||
backend = "iwd";
|
||||
powersave = true;
|
||||
};
|
||||
wireless = {
|
||||
iwd.enable = true;
|
||||
interfaces = [ "wlan0" ];
|
||||
};
|
||||
interfaces = {
|
||||
wlan0 = {
|
||||
useDHCP = true; # For versatility sake, manually edit IP on nm-applet.
|
||||
#ipv4.addresses = [ {
|
||||
# address = "192.168.0.51";
|
||||
# prefixLength = 24;
|
||||
#} ];
|
||||
};
|
||||
};
|
||||
#defaultGateway = "192.168.0.1";
|
||||
#nameservers = [ "192.168.0.4" ];
|
||||
firewall = {
|
||||
checkReversePath = "loose";
|
||||
# enable = false;
|
||||
# #allowedUDPPorts = [ 53 67 ];
|
||||
# #allowedTCPPorts = [ 53 80 443 9443 ];
|
||||
enable = true;
|
||||
#allowedUDPPorts = [ 53 67 ];
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -17,20 +17,14 @@
|
||||
imports =
|
||||
[
|
||||
#../../modules/wm/hyprland/home.nix # Window Manager
|
||||
../../modules/wm/sway/home.nix # Window Manager
|
||||
#../../modules/wm/sway/home.nix # Window Manager
|
||||
../../modules/home.nix # Window Manager
|
||||
];
|
||||
|
||||
home = { # Specific packages for laptop
|
||||
packages = with pkgs; [
|
||||
# Applications
|
||||
libreoffice # Office packages
|
||||
#firefox
|
||||
chromium
|
||||
thunderbird
|
||||
streamlink
|
||||
streamlink-twitch-gui-bin
|
||||
element-desktop
|
||||
firefox
|
||||
intel-gpu-tools
|
||||
pulsemixer
|
||||
|
||||
|
||||
@@ -20,12 +20,22 @@
|
||||
{ config, pkgs, user, jovian-nixos, lib, ... }:
|
||||
|
||||
{
|
||||
specialisation = {
|
||||
sway.configuration = {
|
||||
imports =
|
||||
[(import ../../modules/wm/sway)];
|
||||
|
||||
jovian.steam.enable = lib.mkForce false;
|
||||
services.desktopManager.plasma6.enable = lib.mkForce false;
|
||||
};
|
||||
};
|
||||
|
||||
imports = # For now, if applying to other system, swap files
|
||||
[(import ./hardware-configuration.nix)] ++ # Current system hardware config @ /etc/nixos/hardware-configuration.nix
|
||||
[(import ../../modules/wm/steam/default.nix)] ++ # jovian steam
|
||||
[(import ../../modules/wm/kde/default.nix)] ++ # Window Manager
|
||||
(import ../../modules/wm/virtualisation) ++ # libvirt + Docker
|
||||
[(import ../../modules/wm/virtualisation/kvm-amd.nix)] ++ # kvm module options
|
||||
[(import ../../modules/wm/steam)] ++
|
||||
[(import ../../modules/wm/kde)] ++
|
||||
(import ../../modules/hardware); # Hardware devices
|
||||
|
||||
boot = { # Boot options
|
||||
@@ -44,20 +54,10 @@
|
||||
};
|
||||
};
|
||||
|
||||
# hardware.sane = { # Used for scanning with Xsane
|
||||
# enable = false;
|
||||
# extraBackends = [ pkgs.sane-airscan ];
|
||||
# };
|
||||
hardware = {
|
||||
nitrokey.enable = true;
|
||||
};
|
||||
|
||||
# environment = {
|
||||
# systemPackages = with pkgs; [
|
||||
## alacritty
|
||||
# ];
|
||||
# };
|
||||
|
||||
programs = { # No xbacklight, this is the alterantive
|
||||
light.enable = true;
|
||||
};
|
||||
|
||||
@@ -14,12 +14,17 @@
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
specialisation = {
|
||||
sway.configuration = {
|
||||
imports =
|
||||
[(import ../../modules/wm/sway/home.nix)];
|
||||
};
|
||||
};
|
||||
|
||||
imports =
|
||||
[
|
||||
../../modules/wm/steam/home.nix # Window Manager
|
||||
../../modules/wm/kde/home.nix # Window Manager
|
||||
../../modules/home.nix # Window Manager
|
||||
];
|
||||
[(import ../../modules/home.nix)] ++ # Window Manager
|
||||
[(import ../../modules/wm/steam/home.nix)] ++
|
||||
[(import ../../modules/wm/kde/home.nix)];
|
||||
|
||||
home = { # Specific packages for laptop
|
||||
packages = with pkgs; [
|
||||
@@ -30,7 +35,6 @@
|
||||
thunderbird
|
||||
streamlink
|
||||
streamlink-twitch-gui-bin
|
||||
element-desktop
|
||||
pulsemixer
|
||||
#yuzu-early-access
|
||||
|
||||
|
||||
114
modules/hardware/autoaspm.py
Executable file
114
modules/hardware/autoaspm.py
Executable file
@@ -0,0 +1,114 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Original bash script by Luis R. Rodriguez
|
||||
# Re-written in Python by z8
|
||||
# Re-re-written to patch supported devices automatically by notthebee
|
||||
|
||||
import re
|
||||
import subprocess
|
||||
import os
|
||||
import platform
|
||||
from enum import Enum
|
||||
|
||||
class ASPM(Enum):
|
||||
DISABLED = 0b00
|
||||
L0s = 0b01
|
||||
L1 = 0b10
|
||||
L0sL1 = 0b11
|
||||
|
||||
|
||||
def run_prerequisites():
|
||||
if platform.system() != "Linux":
|
||||
raise OSError("This script only runs on Linux-based systems")
|
||||
if not os.environ.get("SUDO_UID") and os.geteuid() != 0:
|
||||
raise PermissionError("This script needs root privileges to run")
|
||||
lspci_detected = subprocess.run(["which", "lspci"], stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL)
|
||||
if lspci_detected.returncode > 0:
|
||||
raise Exception("lspci not detected. Please install pciutils")
|
||||
lspci_detected = subprocess.run(["which", "setpci"], stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL)
|
||||
if lspci_detected.returncode > 0:
|
||||
raise Exception("setpci not detected. Please install pciutils")
|
||||
|
||||
|
||||
def get_device_name(addr):
|
||||
p = subprocess.Popen([
|
||||
"lspci",
|
||||
"-s",
|
||||
addr,
|
||||
], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
return p.communicate()[0].splitlines()[0].decode()
|
||||
|
||||
def read_all_bytes(device):
|
||||
all_bytes = bytearray()
|
||||
device_name = get_device_name(device)
|
||||
p = subprocess.Popen([
|
||||
"lspci",
|
||||
"-s",
|
||||
device,
|
||||
"-xxx"
|
||||
], stdout= subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
ret = p.communicate()
|
||||
ret = ret[0].decode()
|
||||
for line in ret.splitlines():
|
||||
if not device_name in line and ": " in line:
|
||||
all_bytes.extend(bytearray.fromhex(line.split(": ")[1]))
|
||||
if len(all_bytes) < 256:
|
||||
exit()
|
||||
return all_bytes
|
||||
|
||||
def find_byte_to_patch(bytes, pos):
|
||||
pos = bytes[pos]
|
||||
if bytes[pos] != 0x10:
|
||||
pos += 0x1
|
||||
return find_byte_to_patch(bytes, pos)
|
||||
else:
|
||||
pos += 0x10
|
||||
return pos
|
||||
|
||||
def patch_byte(device, position, value):
|
||||
subprocess.Popen([
|
||||
"setpci",
|
||||
"-s",
|
||||
device,
|
||||
f"{hex(position)}.B={hex(value)}"
|
||||
]).communicate()
|
||||
|
||||
def patch_device(addr, aspm_value):
|
||||
endpoint_bytes = read_all_bytes(addr)
|
||||
byte_position_to_patch = find_byte_to_patch(endpoint_bytes, 0x34)
|
||||
if int(endpoint_bytes[byte_position_to_patch]) & 0b11 != aspm_value.value:
|
||||
patched_byte = int(endpoint_bytes[byte_position_to_patch])
|
||||
patched_byte = patched_byte >> 2
|
||||
patched_byte = patched_byte << 2
|
||||
patched_byte = patched_byte | aspm_value.value
|
||||
|
||||
patch_byte(addr, byte_position_to_patch, patched_byte)
|
||||
print(f"{addr}: Enabled ASPM {aspm_value.name}")
|
||||
else:
|
||||
print(f"{addr}: Already has ASPM {aspm_value.name} enabled")
|
||||
|
||||
|
||||
def list_supported_devices():
|
||||
pcie_addr_regex = r"([0-9a-f]{2}:[0-9a-f]{2}.[0-9a-f])"
|
||||
lspci = subprocess.run("lspci -vv", shell=True, capture_output=True).stdout
|
||||
lspci_arr = re.split(pcie_addr_regex, str(lspci))[1:]
|
||||
lspci_arr = [ x+y for x,y in zip(lspci_arr[0::2], lspci_arr[1::2]) ]
|
||||
|
||||
aspm_devices = {}
|
||||
for dev in lspci_arr:
|
||||
device_addr = re.findall(pcie_addr_regex, dev)[0]
|
||||
if "ASPM" not in dev or "ASPM not supported" in dev:
|
||||
continue
|
||||
aspm_support = re.findall(r"ASPM (L[L0-1s ]*),", dev)
|
||||
if aspm_support:
|
||||
aspm_devices.update({device_addr: ASPM[aspm_support[0].replace(" ", "")]})
|
||||
return aspm_devices
|
||||
|
||||
|
||||
def main():
|
||||
run_prerequisites()
|
||||
for device, aspm_mode in list_supported_devices().items():
|
||||
patch_device(device, aspm_mode)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -14,4 +14,7 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
environment.systemPackages = with pkgs; [
|
||||
zmkBATx
|
||||
];
|
||||
}
|
||||
|
||||
@@ -6,8 +6,10 @@
|
||||
settings = {
|
||||
extra-trusted-public-keys = [
|
||||
"hades-builder:AFdPgi6Qq/yKqc2V2imgzMikEkVEFCrDaHyAmOJ3MII="
|
||||
"steamdeck.cachix.org-1:BVoP4TEu3ECgotaO+3J3r9SSn62GkUDBwizOFU/q4Bc="
|
||||
];
|
||||
extra-substituters = [
|
||||
"https://steamdeck.cachix.org"
|
||||
"https://cache.ci.kabtop.de"
|
||||
];
|
||||
#extra-trusted-substituters = [
|
||||
|
||||
75
modules/kabbone/corosync-qdevice.nix
Normal file
75
modules/kabbone/corosync-qdevice.nix
Normal file
@@ -0,0 +1,75 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
pkgs-kabbone,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.services.corosync-qnetd;
|
||||
dataDir = "/var/run/corosync-qnetd";
|
||||
in
|
||||
{
|
||||
# interface
|
||||
options.services.corosync-qnetd = {
|
||||
enable = lib.mkEnableOption "corosync-qnetd";
|
||||
package = lib.mkPackageOption pkgs-kabbone "corosync-qdevice" { };
|
||||
|
||||
extraOptions = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
default = [ ];
|
||||
description = "Additional options with which to start corosync-qnetd.";
|
||||
};
|
||||
};
|
||||
|
||||
# implementation
|
||||
|
||||
# implementation
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = [ cfg.package ];
|
||||
|
||||
users.users.coroqnetd = {
|
||||
isSystemUser = true;
|
||||
group = "coroqnetd";
|
||||
home = dataDir;
|
||||
description = "Corosync-qnetd Service User";
|
||||
};
|
||||
|
||||
users.groups.coroqnetd = { };
|
||||
|
||||
# environment.etc."corosync/corosync-qnetd.conf".text = ''
|
||||
# totem {
|
||||
# version: 2
|
||||
# secauth: on
|
||||
# cluster_name: ${cfg.clusterName}
|
||||
# transport: knet
|
||||
# }
|
||||
|
||||
|
||||
# logging {
|
||||
# to_syslog: yes
|
||||
# }
|
||||
# '';
|
||||
|
||||
systemd.packages = [ cfg.package ];
|
||||
systemd.services.corosync-qnetd = {
|
||||
serviceConfig = {
|
||||
User = "coroqnetd";
|
||||
StateDirectory = "corosync-qnetd";
|
||||
StateDirectoryMode = "0700";
|
||||
};
|
||||
};
|
||||
|
||||
environment.etc."sysconfig/corosync-qnetd".text = lib.optionalString (cfg.extraOptions != [ ]) ''
|
||||
COROSYNC-QNETD_OPTIONS="${lib.escapeShellArgs cfg.extraOptions}"
|
||||
'';
|
||||
};
|
||||
|
||||
meta = {
|
||||
#buildDocsInSandbox = false;
|
||||
#doc = ./mautrix-whatsapp.md;
|
||||
maintainers = with lib.maintainers; [
|
||||
kabbone
|
||||
];
|
||||
};
|
||||
}
|
||||
32
modules/kabbone/mautrix-whatsapp.md
Normal file
32
modules/kabbone/mautrix-whatsapp.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# Mautrix-Whatsapp {#module-services-mautrix-whatsapp}
|
||||
|
||||
[Mautrix-Whatsapp](https://github.com/mautrix/whatsapp) is a Matrix-Whatsapp puppeting bridge.
|
||||
|
||||
## Configuration {#module-services-mautrix-whatsapp-configuration}
|
||||
|
||||
1. Set [](#opt-services.mautrix-whatsapp.enable) to `true`. The service will use
|
||||
SQLite by default.
|
||||
2. To create your configuration check the default configuration for
|
||||
[](#opt-services.mautrix-whatsapp.settings). To obtain the complete default
|
||||
configuration, run
|
||||
`nix-shell -p mautrix-whatsapp --run "mautrix-whatsapp -c default.yaml -e"`.
|
||||
|
||||
::: {.warning}
|
||||
Mautrix-Whatsapp allows for some options like `encryption.pickle_key`,
|
||||
`provisioning.shared_secret`, allow the value `generate` to be set.
|
||||
Since the configuration file is regenerated on every start of the
|
||||
service, the generated values would be discarded and might break your
|
||||
installation. Instead, set those values via
|
||||
[](#opt-services.mautrix-whatsapp.environmentFile).
|
||||
:::
|
||||
|
||||
## Migrating from an older configuration {#module-services-mautrix-whatsapp-migrate-configuration}
|
||||
|
||||
With Mautrix-Whatsapp v0.7.0 the configuration has been rearranged. Mautrix-Whatsapp
|
||||
performs an automatic configuration migration so your pre-0.7.0 configuration
|
||||
should just continue to work.
|
||||
|
||||
In case you want to update your NixOS configuration, compare the migrated configuration
|
||||
at `/var/lib/mautrix-whatsapp/config.yaml` with the default configuration
|
||||
(`nix-shell -p mautrix-whatsapp --run "mautrix-whatsapp -c example.yaml -e"`) and
|
||||
update your module configuration accordingly.
|
||||
280
modules/kabbone/mautrix-whatsapp.nix
Normal file
280
modules/kabbone/mautrix-whatsapp.nix
Normal file
@@ -0,0 +1,280 @@
|
||||
{
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.services.kabbone_mautrix-whatsapp;
|
||||
dataDir = "/var/lib/mautrix-whatsapp";
|
||||
registrationFile = "${dataDir}/whatsapp-registration.yaml";
|
||||
settingsFile = "${dataDir}/config.yaml";
|
||||
settingsFileUnsubstituted = settingsFormat.generate "mautrix-whatsapp-config-unsubstituted.json" cfg.settings;
|
||||
settingsFormat = pkgs.formats.json { };
|
||||
appservicePort = 29318;
|
||||
|
||||
# to be used with a list of lib.mkIf values
|
||||
optOneOf = lib.lists.findFirst (value: value.condition) (lib.mkIf false null);
|
||||
mkDefaults = lib.mapAttrsRecursive (n: v: lib.mkDefault v);
|
||||
defaultConfig = {
|
||||
network = {
|
||||
displayname_template = "{{or .BusinessName .PushName .Phone}} (WA)";
|
||||
identity_change_notices = true;
|
||||
history_sync = {
|
||||
request_full_sync = true;
|
||||
};
|
||||
};
|
||||
bridge = {
|
||||
command_prefix = "!wa";
|
||||
relay.enabled = true;
|
||||
permissions."*" = "relay";
|
||||
};
|
||||
database = {
|
||||
type = "sqlite3";
|
||||
uri = "file:${dataDir}/mautrix-whatsapp.db?_txlock=immediate";
|
||||
};
|
||||
homeserver.address = "http://localhost:8448";
|
||||
appservice = {
|
||||
hostname = "[::]";
|
||||
port = appservicePort;
|
||||
id = "whatsapp";
|
||||
bot = {
|
||||
username = "whatsappbot";
|
||||
displayname = "WhatsApp Bridge Bot";
|
||||
};
|
||||
as_token = "";
|
||||
hs_token = "";
|
||||
username_template = "whatsapp_{{.}}";
|
||||
};
|
||||
double_puppet = {
|
||||
servers = { };
|
||||
secrets = { };
|
||||
};
|
||||
# By default, the following keys/secrets are set to `generate`. This would break when the service
|
||||
# is restarted, since the previously generated configuration will be overwritten everytime.
|
||||
# If encryption is enabled, it's recommended to set those keys via `environmentFile`.
|
||||
encryption.pickle_key = "";
|
||||
provisioning.shared_secret = "";
|
||||
public_media.signing_key = "";
|
||||
direct_media.server_key = "";
|
||||
logging = {
|
||||
min_level = "info";
|
||||
writers = lib.singleton {
|
||||
type = "stdout";
|
||||
format = "pretty-colored";
|
||||
time_format = " ";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
in
|
||||
{
|
||||
options.services.kabbone_mautrix-whatsapp = {
|
||||
enable = lib.mkEnableOption "mautrix-whatsapp, a Matrix-Whatsapp puppeting bridge";
|
||||
|
||||
package = lib.mkPackageOption pkgs "mautrix-whatsapp" { };
|
||||
|
||||
settings = lib.mkOption {
|
||||
apply = lib.recursiveUpdate defaultConfig;
|
||||
type = settingsFormat.type;
|
||||
default = defaultConfig;
|
||||
description = ''
|
||||
{file}`config.yaml` configuration as a Nix attribute set.
|
||||
Configuration options should match those described in the example configuration.
|
||||
Get an example configuration by executing `mautrix-whatsapp -c example.yaml --generate-example-config`
|
||||
Secret tokens should be specified using {option}`environmentFile`
|
||||
instead of this world-readable attribute set.
|
||||
'';
|
||||
example = {
|
||||
bridge = {
|
||||
private_chat_portal_meta = true;
|
||||
mute_only_on_create = false;
|
||||
permissions = {
|
||||
"example.com" = "user";
|
||||
};
|
||||
};
|
||||
database = {
|
||||
type = "postgres";
|
||||
uri = "postgresql:///mautrix_whatsapp?host=/run/postgresql";
|
||||
};
|
||||
homeserver = {
|
||||
address = "http://[::1]:8008";
|
||||
domain = "my-domain.tld";
|
||||
};
|
||||
appservice = {
|
||||
id = "whatsapp";
|
||||
ephemeral_events = false;
|
||||
};
|
||||
matrix.message_status_events = true;
|
||||
provisioning = {
|
||||
shared_secret = "disable";
|
||||
};
|
||||
backfill.enabled = true;
|
||||
encryption = {
|
||||
allow = true;
|
||||
default = true;
|
||||
require = true;
|
||||
pickle_key = "$ENCRYPTION_PICKLE_KEY";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
environmentFile = lib.mkOption {
|
||||
type = lib.types.nullOr lib.types.path;
|
||||
default = null;
|
||||
description = ''
|
||||
File containing environment variables to be passed to the mautrix-signal service.
|
||||
If an environment variable `MAUTRIX_WHATSAPP_BRIDGE_LOGIN_SHARED_SECRET` is set,
|
||||
then its value will be used in the configuration file for the option
|
||||
`double_puppet.secrets` without leaking it to the store, using the configured
|
||||
`homeserver.domain` as key.
|
||||
'';
|
||||
};
|
||||
|
||||
serviceDependencies = lib.mkOption {
|
||||
type = with lib.types; listOf str;
|
||||
default =
|
||||
(lib.optional config.services.matrix-synapse.enable config.services.matrix-synapse.serviceUnit)
|
||||
++ (lib.optional config.services.matrix-conduit.enable "conduit.service");
|
||||
defaultText = lib.literalExpression ''
|
||||
(optional config.services.matrix-synapse.enable config.services.matrix-synapse.serviceUnit)
|
||||
++ (optional config.services.matrix-conduit.enable "conduit.service")
|
||||
'';
|
||||
description = ''
|
||||
List of systemd units to require and wait for when starting the application service.
|
||||
'';
|
||||
};
|
||||
|
||||
registerToSynapse = lib.mkOption {
|
||||
type = lib.types.bool;
|
||||
default = config.services.matrix-synapse.enable;
|
||||
defaultText = lib.literalExpression ''
|
||||
config.services.matrix-synapse.enable
|
||||
'';
|
||||
description = ''
|
||||
Whether to add the bridge's app service registration file to
|
||||
`services.matrix-synapse.settings.app_service_config_files`.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
|
||||
users.users.mautrix-whatsapp = {
|
||||
isSystemUser = true;
|
||||
group = "mautrix-whatsapp";
|
||||
home = dataDir;
|
||||
description = "Mautrix-Whatsapp bridge user";
|
||||
};
|
||||
|
||||
users.groups.mautrix-whatsapp = { };
|
||||
|
||||
services.matrix-synapse = lib.mkIf cfg.registerToSynapse {
|
||||
settings.app_service_config_files = [ registrationFile ];
|
||||
};
|
||||
systemd.services.matrix-synapse = lib.mkIf cfg.registerToSynapse {
|
||||
serviceConfig.SupplementaryGroups = [ "mautrix-whatsapp" ];
|
||||
};
|
||||
|
||||
# Note: this is defined here to avoid the docs depending on `config`
|
||||
services.kabbone_mautrix-whatsapp.settings.homeserver = optOneOf (
|
||||
with config.services;
|
||||
[
|
||||
(lib.mkIf matrix-synapse.enable (mkDefaults {
|
||||
domain = matrix-synapse.settings.server_name;
|
||||
}))
|
||||
(lib.mkIf matrix-conduit.enable (mkDefaults {
|
||||
domain = matrix-conduit.settings.global.server_name;
|
||||
address = "http://localhost:${toString matrix-conduit.settings.global.port}";
|
||||
}))
|
||||
]
|
||||
);
|
||||
|
||||
systemd.services.kabbone_mautrix-whatsapp = {
|
||||
description = "mautrix-whatsapp, a Matrix-Whatsapp puppeting bridge.";
|
||||
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
wants = [ "network-online.target" ] ++ cfg.serviceDependencies;
|
||||
after = [ "network-online.target" ] ++ cfg.serviceDependencies;
|
||||
# ffmpeg is required for conversion of voice messages
|
||||
path = [ pkgs.ffmpeg-headless ];
|
||||
|
||||
preStart = ''
|
||||
# substitute the settings file by environment variables
|
||||
# in this case read from EnvironmentFile
|
||||
test -f '${settingsFile}' && rm -f '${settingsFile}'
|
||||
old_umask=$(umask)
|
||||
umask 0177
|
||||
${pkgs.envsubst}/bin/envsubst \
|
||||
-o '${settingsFile}' \
|
||||
-i '${settingsFileUnsubstituted}'
|
||||
umask $old_umask
|
||||
|
||||
# generate the appservice's registration file if absent
|
||||
if [ ! -f '${registrationFile}' ]; then
|
||||
${cfg.package}/bin/mautrix-whatsapp \
|
||||
--generate-registration \
|
||||
--config='${settingsFile}' \
|
||||
--registration='${registrationFile}'
|
||||
fi
|
||||
chmod 640 ${registrationFile}
|
||||
|
||||
umask 0177
|
||||
# 1. Overwrite registration tokens in config
|
||||
# 2. If environment variable MAUTRIX_SIGNAL_BRIDGE_LOGIN_SHARED_SECRET
|
||||
# is set, set it as the login shared secret value for the configured
|
||||
# homeserver domain.
|
||||
${pkgs.yq}/bin/yq -s '.[0].appservice.as_token = .[1].as_token
|
||||
| .[0].appservice.hs_token = .[1].hs_token
|
||||
| .[0]
|
||||
| if env.MAUTRIX_WHATSAPP_BRIDGE_LOGIN_SHARED_SECRET then .double_puppet.secrets.[.homeserver.domain] = env.MAUTRIX_WHATSAPP_BRIDGE_LOGIN_SHARED_SECRET else . end' \
|
||||
'${settingsFile}' '${registrationFile}' > '${settingsFile}.tmp'
|
||||
mv '${settingsFile}.tmp' '${settingsFile}'
|
||||
umask $old_umask
|
||||
'';
|
||||
|
||||
serviceConfig = {
|
||||
User = "mautrix-whatsapp";
|
||||
Group = "mautrix-whatsapp";
|
||||
EnvironmentFile = cfg.environmentFile;
|
||||
StateDirectory = baseNameOf dataDir;
|
||||
WorkingDirectory = dataDir;
|
||||
ExecStart = ''
|
||||
${cfg.package}/bin/mautrix-whatsapp \
|
||||
--config='${settingsFile}' \
|
||||
--registration='${registrationFile}'
|
||||
'';
|
||||
LockPersonality = true;
|
||||
NoNewPrivileges = true;
|
||||
PrivateDevices = true;
|
||||
PrivateTmp = true;
|
||||
PrivateUsers = true;
|
||||
ProtectClock = true;
|
||||
ProtectControlGroups = true;
|
||||
ProtectHome = true;
|
||||
ProtectHostname = true;
|
||||
ProtectKernelLogs = true;
|
||||
ProtectKernelModules = true;
|
||||
ProtectKernelTunables = true;
|
||||
ProtectSystem = "strict";
|
||||
Restart = "on-failure";
|
||||
RestartSec = "30s";
|
||||
RestrictRealtime = true;
|
||||
RestrictSUIDSGID = true;
|
||||
SystemCallArchitectures = "native";
|
||||
SystemCallErrorNumber = "EPERM";
|
||||
SystemCallFilter = [ "@system-service" ];
|
||||
Type = "simple";
|
||||
UMask = 27;
|
||||
};
|
||||
restartTriggers = [ settingsFileUnsubstituted ];
|
||||
};
|
||||
};
|
||||
meta = {
|
||||
#buildDocsInSandbox = false;
|
||||
#doc = ./mautrix-whatsapp.md;
|
||||
maintainers = with lib.maintainers; [
|
||||
kabbone
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -18,7 +18,7 @@
|
||||
# ExtensionSettings = {};
|
||||
# };
|
||||
#};
|
||||
package = pkgs.firefox-wayland;
|
||||
# package = pkgs.firefox-wayland;
|
||||
# profiles.kabbone = {
|
||||
# #id = 271987;
|
||||
# name = "kabbone";
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#./udiskie.nix
|
||||
#./redshift.nix
|
||||
./kanshi.nix
|
||||
./keyring.nix
|
||||
]
|
||||
|
||||
# picom, polybar and sxhkd are pulled from desktop module
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
[
|
||||
./microvm.nix
|
||||
./hydra.nix
|
||||
# ./hydra.nix
|
||||
]
|
||||
|
||||
# picom, polybar and sxhkd are pulled from desktop module
|
||||
|
||||
@@ -103,7 +103,7 @@ in
|
||||
id = "vm-${name}";
|
||||
mac = "04:00:00:00:00:01";
|
||||
macvtap = {
|
||||
link = "enp6s18";
|
||||
link = "ens18";
|
||||
mode = "bridge";
|
||||
};
|
||||
} ];
|
||||
|
||||
@@ -97,7 +97,6 @@ in
|
||||
hypervisor = "qemu";
|
||||
vcpu = 4;
|
||||
mem = 3096;
|
||||
balloonMem = 3096;
|
||||
#kernel = pkgs.linuxKernel.packages.linux_latest;
|
||||
interfaces = [
|
||||
{
|
||||
|
||||
14
modules/services/keyring.nix
Normal file
14
modules/services/keyring.nix
Normal file
@@ -0,0 +1,14 @@
|
||||
#
|
||||
# Screenshots
|
||||
#
|
||||
|
||||
{ pkgs, user, ... }:
|
||||
|
||||
{
|
||||
services = { # sxhkd shortcut = Printscreen button (Print)
|
||||
gnome-keyring = {
|
||||
enable = true;
|
||||
};
|
||||
};
|
||||
home.packages = with pkgs; [ gcr seahorse ];
|
||||
}
|
||||
19
modules/services/kubemaster/default.nix
Normal file
19
modules/services/kubemaster/default.nix
Normal file
@@ -0,0 +1,19 @@
|
||||
#
|
||||
# Services
|
||||
#
|
||||
# flake.nix
|
||||
# ├─ ./hosts
|
||||
# │ └─ home.nix
|
||||
# └─ ./modules
|
||||
# └─ ./services
|
||||
# └─ default.nix *
|
||||
# └─ ...
|
||||
#
|
||||
|
||||
[
|
||||
# ./microvm.nix
|
||||
# ./hydra.nix
|
||||
]
|
||||
|
||||
# picom, polybar and sxhkd are pulled from desktop module
|
||||
# redshift temporarely disables
|
||||
@@ -14,6 +14,7 @@
|
||||
./nfs.nix
|
||||
./nginx.nix
|
||||
./vaultwarden.nix
|
||||
./syncthing.nix
|
||||
]
|
||||
|
||||
# picom, polybar and sxhkd are pulled from desktop module
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
};
|
||||
# open the firewall
|
||||
networking.firewall = {
|
||||
interfaces.enp6s18 = {
|
||||
interfaces.ens18 = {
|
||||
allowedTCPPorts = [ 2049 ];
|
||||
};
|
||||
};
|
||||
|
||||
53
modules/services/nas/syncthing.nix
Normal file
53
modules/services/nas/syncthing.nix
Normal file
@@ -0,0 +1,53 @@
|
||||
#
|
||||
# System notifications
|
||||
#
|
||||
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
services.syncthing = {
|
||||
enable = true;
|
||||
group = "users";
|
||||
user = "kabbone";
|
||||
dataDir = "/home/${config.services.syncthing.user}/Sync";
|
||||
configDir = "/home/${config.services.syncthing.user}/.config/syncthing";
|
||||
overrideDevices = true; # overrides any devices added or deleted through the WebUI
|
||||
overrideFolders = true; # overrides any folders added or deleted through the WebUI
|
||||
openDefaultPorts = true;
|
||||
settings = {
|
||||
devices = {
|
||||
"hades.home.opel-online.de" = { id = "3VPCBVW-RH7XKFM-TWJGQHC-ZRAQ575-CQKGGKP-NAB4VXE-KCKJFUT-AMCUQQA"; };
|
||||
"lifebook.home.opel-online.de" = { id = "RKPZG3H-BDUZID3-DV26MKR-UOARIQC-JBCAFXP-J5QFM4H-5EGBSM5-VEGXHQ4"; };
|
||||
};
|
||||
folders = {
|
||||
"Sync" = { # Name of folder in Syncthing, also the folder ID
|
||||
path = "/mnt/Mars/${config.services.syncthing.user}/Sync"; # Which folder to add to Syncthing
|
||||
devices = [ "hades.home.opel-online.de" "lifebook.home.opel-online.de" ]; # Which devices to share the folder with
|
||||
ignorePerms = false; # By default, Syncthing doesn't sync file permissions. This line enables it for this folder.
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx = {
|
||||
virtualHosts = {
|
||||
"syncthing.home.opel-online.de" = {
|
||||
useACMEHost = "home.opel-online.de";
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
recommendedProxySettings = false;
|
||||
proxyPass = "http://${toString config.services.syncthing.guiAddress}";
|
||||
extraConfig = ''
|
||||
proxy_set_header Host localhost;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Host $host;
|
||||
proxy_set_header X-Forwarded-Server $host;
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
}
|
||||
50
modules/services/printer/cfgs/CALIBRATION.cfg
Normal file
50
modules/services/printer/cfgs/CALIBRATION.cfg
Normal file
@@ -0,0 +1,50 @@
|
||||
[gcode_macro PID_TEST_BED]
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set TARGETTEMP = params.TEMP|default(70)|int %}
|
||||
|
||||
{% set max_x = printer.configfile.config["stepper_x"]["position_max"]|float %}
|
||||
{% set max_y = printer.configfile.config["stepper_y"]["position_max"]|float %}
|
||||
G28
|
||||
G90
|
||||
G1 X{max_x/2} Y{max_y/2} Z40 F6000
|
||||
PID_CALIBRATE HEATER=heater_bed TARGET={TARGETTEMP}
|
||||
|
||||
[gcode_macro PID_TEST_HOTEND]
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set TARGETTEMP = params.TEMP|default(245)|int %}
|
||||
|
||||
{% set max_x = printer.configfile.config["stepper_x"]["position_max"]|float %}
|
||||
{% set max_y = printer.configfile.config["stepper_y"]["position_max"]|float %}
|
||||
G28
|
||||
G90
|
||||
G1 X{max_x/2} Y{max_y/2} Z10 F6000
|
||||
M106 S64
|
||||
PID_CALIBRATE HEATER=extruder TARGET={TARGETTEMP}
|
||||
M107 ; Turn off print cooling fan
|
||||
|
||||
# TODO test this
|
||||
[gcode_macro PID_TEST_ALL]
|
||||
gcode:
|
||||
PID_TEST_BED
|
||||
PID_TEST_HOTEND
|
||||
SAVE_CONFIG
|
||||
|
||||
[gcode_macro DO_PROBE_CALIBRATE]
|
||||
gcode:
|
||||
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=60
|
||||
SET_HEATER_TEMPERATURE HEATER=extruder TARGET=180
|
||||
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=60
|
||||
TEMPERATURE_WAIT SENSOR=extruder MINIMUM=180
|
||||
G28
|
||||
PROBE_CALIBRATE
|
||||
|
||||
[gcode_macro DO_CREATE_MESH]
|
||||
gcode:
|
||||
SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=60
|
||||
SET_HEATER_TEMPERATURE HEATER=extruder TARGET=180
|
||||
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM=60
|
||||
TEMPERATURE_WAIT SENSOR=extruder MINIMUM=180
|
||||
G28
|
||||
_BED_MESH_CALIBRATE
|
||||
110
modules/services/printer/cfgs/MECHANICAL_GANTRY_CALIBRATION.cfg
Normal file
110
modules/services/printer/cfgs/MECHANICAL_GANTRY_CALIBRATION.cfg
Normal file
@@ -0,0 +1,110 @@
|
||||
###############################################################################
|
||||
# Source https://github.com/strayr/strayr-k-macros/blob/e0807570a66d28735cf05143b105ab4ea6d9798f/mechanical_level_tmc2209.cfg
|
||||
#
|
||||
# Mechanical Gantry Calibration
|
||||
#
|
||||
# Requires TMC2209 drivers with UART control, some tuning and perhaps
|
||||
# some printed endstops.
|
||||
#
|
||||
# Based on on (depricated) M915 and now alternate G34 from Marlin
|
||||
# I beleive Prusa use this, certainly there's older videos advising to just
|
||||
# ram the gantry at full current into the the z-max stops.
|
||||
#
|
||||
# It moves the gantry to the top of the travel, drops the current and then
|
||||
# does a force move to force the steppers to stall against the physical end
|
||||
# stops, transfering the level of the frame to the gantry.
|
||||
#
|
||||
# This is the only way to programatically level a multi-stepper single-driver
|
||||
# gantry. It may also help with a dual-driver gantry on a bed-slinger design
|
||||
# or where the plane of the bed is less trustworthy than the frame.
|
||||
#
|
||||
# It's particularly risky doing Z_TILT_ADJUST and SCREWS_TILT_CALCULATE
|
||||
# without a mechanical reference as if one side of the gantry or bed is prone
|
||||
# to droop, over time both bed and gantry will skew excessively but still read
|
||||
# as level, so this can help transfer "level" from the frame to the gantry and
|
||||
# then to the bed.
|
||||
#
|
||||
# I don't recommend doing this in a START_PRINT, I call this if a
|
||||
# SCREWS_TILT_CALCULATE shows some drift, althoughon an Ender 3 type printer
|
||||
# it's prudent to check the v-slot rollers for correct adjustment if drift is
|
||||
# observed.
|
||||
#
|
||||
# It's probably best to run this and then do SCREWS_TILT_CALCULATE
|
||||
# until the bed is really level. IF you have dual Z steppers you can then
|
||||
# use Z_TILT_ADJUST for subsequent leveling of the gantry but make sure you
|
||||
# use the same points for gantry level as you use in SCREWS_TILT_CALCULATE
|
||||
#
|
||||
# It may damage your printer if you do this at too high a current, or don't
|
||||
# have proper endstops.
|
||||
#
|
||||
# HERE BE DRAGONS!
|
||||
# YOU WERE WARNED!
|
||||
#
|
||||
# Here's a video of this in action
|
||||
# https://www.youtube.com/watch?v=aVdIeIIpUAk
|
||||
# and the endstops for 2020 v-slot
|
||||
# https://www.thingiverse.com/thing:4848479
|
||||
|
||||
[gcode_macro MECHANICAL_GANTRY_CALIBRATION]
|
||||
gcode:
|
||||
### SET THIS DEFAULT CARFULLY - start really low
|
||||
{% set my_current = params.CURRENT|default(0.20)|float %} ; adjust crash current on the fly :D
|
||||
###
|
||||
{% set oldcurrent = printer.configfile.settings["tmc2209 stepper_z"].run_current %}
|
||||
{% set oldhold = printer.configfile.settings["tmc2209 stepper_z"].hold_current %}
|
||||
{% set x_max = printer.toolhead.axis_maximum.x %}
|
||||
{% set y_max = printer.toolhead.axis_maximum.y %}
|
||||
{% set z_max = printer.toolhead.axis_maximum.z %}
|
||||
{% set fast_move_z = printer.configfile.settings["printer"].max_z_velocity %}
|
||||
{% set fast_move = printer.configfile.settings["printer"].max_velocity %}
|
||||
M117 {printer.homed_axes}
|
||||
{% if printer.homed_axes != 'xyz' %}
|
||||
G28 ; Home All Axes
|
||||
{% endif %}
|
||||
G90 ; absolute
|
||||
G0 X{x_max / 2} Y{y_max / 2} F{fast_move * 30 } ;put toolhead in the center of the gantry
|
||||
|
||||
G0 Z{z_max -5} F{fast_move_z * 60 } ; go to the Z-max - 5 at speed max z speed ; CHANGED
|
||||
|
||||
SET_TMC_CURRENT STEPPER=stepper_z CURRENT={my_current} ; drop current on Z stepper
|
||||
|
||||
{% if printer.configfile.settings["stepper_z1"] %} ; test for dual Z
|
||||
SET_TMC_CURRENT STEPPER=stepper_z1 CURRENT={my_current} ; drop current
|
||||
{% endif %}
|
||||
|
||||
CONDITIONAL_BEEP I=1
|
||||
G4 P200 ; Probably not necessary, it is here just for sure
|
||||
|
||||
SET_KINEMATIC_POSITION Z={z_max - 25} ; Trick printer into beleiving the gantry is 25mm lower than it is ; CHANGED
|
||||
|
||||
G1 Z{z_max} F{6 * 60} ; based on above figures, there will be 20mm worth of grinding ; CHANGED
|
||||
CONDITIONAL_BEEP I=2
|
||||
G4 P10000 ; wait 10 seconds
|
||||
G1 Z{z_max -6} F{6 * 60} ; move 4mm down
|
||||
CONDITIONAL_BEEP I=3
|
||||
G4 P200 ; same as the first one
|
||||
|
||||
SET_TMC_CURRENT STEPPER=stepper_z CURRENT={oldcurrent} HOLDCURRENT={oldhold}
|
||||
|
||||
{% if printer.configfile.settings["stepper_z1"] %} ; test for dual Z
|
||||
SET_TMC_CURRENT STEPPER=stepper_z1 CURRENT={oldcurrent} HOLDCURRENT={oldhold} ; reset current
|
||||
{% endif %}
|
||||
|
||||
G1 Z{z_max -30} F{6 * 60} ; move to 30mm below z-max to allow homing movement
|
||||
|
||||
G4 P200 ; same as the first one
|
||||
G28 Z ; we MUST home again as the ganty is really in the wrong place.
|
||||
|
||||
[gcode_macro G34]
|
||||
gcode:
|
||||
MECHANICAL_GANTRY_CALIBRATION
|
||||
|
||||
[menu __main __setup __calib __mech_gantry_calibrate]
|
||||
type: command
|
||||
enable: {not printer.idle_timeout.state == "Printing"}
|
||||
name: G34 Gantry Level
|
||||
gcode:
|
||||
G34
|
||||
|
||||
[force_move]
|
||||
enable_force_move: true ; enable FORCE_MOVE and SET_KINEMATIC_POSITION
|
||||
54
modules/services/printer/cfgs/PARKING.cfg
Normal file
54
modules/services/printer/cfgs/PARKING.cfg
Normal file
@@ -0,0 +1,54 @@
|
||||
# Park front center
|
||||
[gcode_macro PARKFRONT]
|
||||
gcode:
|
||||
{% if "xyz" not in printer.toolhead.homed_axes %}
|
||||
G28 ; home if not already homed
|
||||
{% endif %}
|
||||
SAVE_GCODE_STATE NAME=PARKFRONT
|
||||
G90 ; absolute positioning
|
||||
G0 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_minimum.y+5} Z{printer.toolhead.axis_maximum.z/2} F6000
|
||||
RESTORE_GCODE_STATE NAME=PARKFRONT
|
||||
|
||||
# Park front center, but low down.
|
||||
[gcode_macro PARKFRONTLOW]
|
||||
gcode:
|
||||
{% if "xyz" not in printer.toolhead.homed_axes %}
|
||||
G28 ; home if not already homed
|
||||
{% endif %}
|
||||
SAVE_GCODE_STATE NAME=PARKFRONT
|
||||
G90 ; absolute positioning
|
||||
G0 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_minimum.y+5} Z20 F6000
|
||||
RESTORE_GCODE_STATE NAME=PARKFRONT
|
||||
|
||||
# Park top rear left
|
||||
[gcode_macro PARKREAR]
|
||||
gcode:
|
||||
{% if "xyz" not in printer.toolhead.homed_axes %}
|
||||
G28 ; home if not already homed
|
||||
{% endif %}
|
||||
SAVE_GCODE_STATE NAME=PARKREAR
|
||||
G90 ; absolute positioning
|
||||
G0 X{printer.toolhead.axis_minimum.x+10} Y{printer.toolhead.axis_maximum.y-10} Z{printer.toolhead.axis_maximum.z-50} F6000
|
||||
RESTORE_GCODE_STATE NAME=PARKREAR
|
||||
|
||||
# Park at center of build volume
|
||||
[gcode_macro PARKCENTER]
|
||||
gcode:
|
||||
{% if "xyz" not in printer.toolhead.homed_axes %}
|
||||
G28 ; home if not already homed
|
||||
{% endif %}
|
||||
SAVE_GCODE_STATE NAME=PARKCENTER
|
||||
G90 ; absolute positioning
|
||||
G0 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_maximum.y/2} Z{printer.toolhead.axis_maximum.z/2} F6000
|
||||
RESTORE_GCODE_STATE NAME=PARKCENTER
|
||||
|
||||
# Park 15mm above center of bed
|
||||
[gcode_macro PARKBED]
|
||||
gcode:
|
||||
{% if "xyz" not in printer.toolhead.homed_axes %}
|
||||
G28 ; home if not already homed
|
||||
{% endif %}
|
||||
SAVE_GCODE_STATE NAME=PARKBED
|
||||
G90 ; absolute positioning
|
||||
G0 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_maximum.y/2} Z15 F6000
|
||||
RESTORE_GCODE_STATE NAME=PARKBED
|
||||
124
modules/services/printer/cfgs/TEST_SPEED.cfg
Normal file
124
modules/services/printer/cfgs/TEST_SPEED.cfg
Normal file
@@ -0,0 +1,124 @@
|
||||
[gcode_macro TEST_SPEED]
|
||||
# Home, get position, throw around toolhead, home again.
|
||||
# If MCU stepper positions (first line in GET_POSITION) are greater than a full step different (your number of microsteps), then skipping occured.
|
||||
# We only measure to a full step to accomodate for endstop variance.
|
||||
# Example: TEST_SPEED SPEED=300 ACCEL=5000 ITERATIONS=10
|
||||
|
||||
description: Test for max speed and acceleration parameters for the printer. Procedure: Home -> ReadPositionFromMCU -> MovesToolhead@Vel&Accel -> Home -> ReadPositionfromMCU
|
||||
|
||||
gcode:
|
||||
# Speed
|
||||
{% set speed = params.SPEED|default(printer.configfile.settings.printer.max_velocity)|int %}
|
||||
# Iterations
|
||||
{% set iterations = params.ITERATIONS|default(5)|int %}
|
||||
# Acceleration
|
||||
{% set accel = params.ACCEL|default(printer.configfile.settings.printer.max_accel)|int %}
|
||||
# Minimum Cruise Ratio
|
||||
{% set min_cruise_ratio = params.MIN_CRUISE_RATIO|default(0.5)|float %}
|
||||
# Bounding inset for large pattern (helps prevent slamming the toolhead into the sides after small skips, and helps to account for machines with imperfectly set dimensions)
|
||||
{% set bound = params.BOUND|default(20)|int %}
|
||||
# Size for small pattern box
|
||||
{% set smallpatternsize = SMALLPATTERNSIZE|default(20)|int %}
|
||||
|
||||
# Large pattern
|
||||
# Max positions, inset by BOUND
|
||||
{% set x_min = printer.toolhead.axis_minimum.x + bound %}
|
||||
{% set x_max = printer.toolhead.axis_maximum.x - bound %}
|
||||
{% set y_min = printer.toolhead.axis_minimum.y + bound %}
|
||||
{% set y_max = printer.toolhead.axis_maximum.y - bound %}
|
||||
|
||||
# Small pattern at center
|
||||
# Find X/Y center point
|
||||
{% set x_center = (printer.toolhead.axis_minimum.x|float + printer.toolhead.axis_maximum.x|float ) / 2 %}
|
||||
{% set y_center = (printer.toolhead.axis_minimum.y|float + printer.toolhead.axis_maximum.y|float ) / 2 %}
|
||||
|
||||
# Set small pattern box around center point
|
||||
{% set x_center_min = x_center - (smallpatternsize/2) %}
|
||||
{% set x_center_max = x_center + (smallpatternsize/2) %}
|
||||
{% set y_center_min = y_center - (smallpatternsize/2) %}
|
||||
{% set y_center_max = y_center + (smallpatternsize/2) %}
|
||||
|
||||
# Save current gcode state (absolute/relative, etc)
|
||||
SAVE_GCODE_STATE NAME=TEST_SPEED
|
||||
|
||||
# Output parameters to g-code terminal
|
||||
{ action_respond_info("TEST_SPEED: starting %d iterations at speed %d, accel %d" % (iterations, speed, accel)) }
|
||||
|
||||
# Home and get position for comparison later:
|
||||
M400 # Finish moves - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/66
|
||||
G28
|
||||
# QGL if not already QGLd (only if QGL section exists in config)
|
||||
{% if printer.configfile.settings.quad_gantry_level %}
|
||||
{% if printer.quad_gantry_level.applied == False %}
|
||||
QUAD_GANTRY_LEVEL
|
||||
G28 Z
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
# Move 50mm away from max position and home again (to help with hall effect endstop accuracy - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/24)
|
||||
G90
|
||||
G1 X{printer.toolhead.axis_maximum.x-50} Y{printer.toolhead.axis_maximum.y-50} F{30*60}
|
||||
M400 # Finish moves - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/66
|
||||
G28 X Y
|
||||
G0 X{printer.toolhead.axis_maximum.x-1} Y{printer.toolhead.axis_maximum.y-1} F{30*60}
|
||||
G4 P1000
|
||||
GET_POSITION
|
||||
|
||||
# Go to starting position
|
||||
G0 X{x_min} Y{y_min} Z{bound + 10} F{speed*60}
|
||||
|
||||
# Set new limits
|
||||
{% if printer.configfile.settings.printer.minimum_cruise_ratio is defined %}
|
||||
SET_VELOCITY_LIMIT VELOCITY={speed} ACCEL={accel} MINIMUM_CRUISE_RATIO={min_cruise_ratio}
|
||||
{% else %}
|
||||
SET_VELOCITY_LIMIT VELOCITY={speed} ACCEL={accel} ACCEL_TO_DECEL={accel / 2}
|
||||
{% endif %}
|
||||
|
||||
{% for i in range(iterations) %}
|
||||
# Large pattern diagonals
|
||||
G0 X{x_min} Y{y_min} F{speed*60}
|
||||
G0 X{x_max} Y{y_max} F{speed*60}
|
||||
G0 X{x_min} Y{y_min} F{speed*60}
|
||||
G0 X{x_max} Y{y_min} F{speed*60}
|
||||
G0 X{x_min} Y{y_max} F{speed*60}
|
||||
G0 X{x_max} Y{y_min} F{speed*60}
|
||||
|
||||
# Large pattern box
|
||||
G0 X{x_min} Y{y_min} F{speed*60}
|
||||
G0 X{x_min} Y{y_max} F{speed*60}
|
||||
G0 X{x_max} Y{y_max} F{speed*60}
|
||||
G0 X{x_max} Y{y_min} F{speed*60}
|
||||
|
||||
# Small pattern diagonals
|
||||
G0 X{x_center_min} Y{y_center_min} F{speed*60}
|
||||
G0 X{x_center_max} Y{y_center_max} F{speed*60}
|
||||
G0 X{x_center_min} Y{y_center_min} F{speed*60}
|
||||
G0 X{x_center_max} Y{y_center_min} F{speed*60}
|
||||
G0 X{x_center_min} Y{y_center_max} F{speed*60}
|
||||
G0 X{x_center_max} Y{y_center_min} F{speed*60}
|
||||
|
||||
# Small pattern box
|
||||
G0 X{x_center_min} Y{y_center_min} F{speed*60}
|
||||
G0 X{x_center_min} Y{y_center_max} F{speed*60}
|
||||
G0 X{x_center_max} Y{y_center_max} F{speed*60}
|
||||
G0 X{x_center_max} Y{y_center_min} F{speed*60}
|
||||
{% endfor %}
|
||||
|
||||
# Restore max speed/accel/accel_to_decel to their configured values
|
||||
{% if printer.configfile.settings.printer.minimum_cruise_ratio is defined %}
|
||||
SET_VELOCITY_LIMIT VELOCITY={printer.configfile.settings.printer.max_velocity} ACCEL={printer.configfile.settings.printer.max_accel} MINIMUM_CRUISE_RATIO={printer.configfile.settings.printer.minimum_cruise_ratio}
|
||||
{% else %}
|
||||
SET_VELOCITY_LIMIT VELOCITY={printer.configfile.settings.printer.max_velocity} ACCEL={printer.configfile.settings.printer.max_accel} ACCEL_TO_DECEL={printer.configfile.settings.printer.max_accel_to_decel}
|
||||
{% endif %}
|
||||
|
||||
# Re-home and get position again for comparison:
|
||||
M400 # Finish moves - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/66
|
||||
G28 # This is a full G28 to fix an issue with CoreXZ - https://github.com/AndrewEllis93/Print-Tuning-Guide/issues/12
|
||||
# Go to XY home positions (in case your homing override leaves it elsewhere)
|
||||
G90
|
||||
G0 X{printer.toolhead.axis_maximum.x-1} Y{printer.toolhead.axis_maximum.y-1} F{30*60}
|
||||
G4 P1000
|
||||
GET_POSITION
|
||||
|
||||
# Restore previous gcode state (absolute/relative, etc)
|
||||
RESTORE_GCODE_STATE NAME=TEST_SPEED
|
||||
|
||||
13
modules/services/printer/cfgs/adxl-direct.cfg
Normal file
13
modules/services/printer/cfgs/adxl-direct.cfg
Normal file
@@ -0,0 +1,13 @@
|
||||
# Documentation https://www.klipper3d.org/Measuring_Resonances.html?h=adxl#configure-adxl345-with-rpi
|
||||
# Documentation https://www.klipper3d.org/RPi_microcontroller.html
|
||||
|
||||
[mcu rpi]
|
||||
serial: /tmp/klipper_host_mcu
|
||||
|
||||
[adxl345]
|
||||
cs_pin: rpi:None
|
||||
|
||||
[resonance_tester]
|
||||
accel_chip: adxl345
|
||||
probe_points: 111.5, 111.5, 20
|
||||
max_smoothing: 0.13
|
||||
29
modules/services/printer/cfgs/adxl-rp2040.cfg
Normal file
29
modules/services/printer/cfgs/adxl-rp2040.cfg
Normal file
@@ -0,0 +1,29 @@
|
||||
#####################################################################
|
||||
# Find my instructions here:
|
||||
# https://github.com/bassamanator/rp2040-zero-adxl345-klipper
|
||||
# ADXL345 related Settings
|
||||
# https://www.klipper3d.org/Measuring_Resonances.html#adxl345
|
||||
#####################################################################
|
||||
|
||||
[mcu RP2040]
|
||||
baud: 115200 # 250000
|
||||
restart_method: command
|
||||
# Obtain definition by "ls -l /dev/serial/by-id/"
|
||||
serial: /dev/serial/by-id/usb-Klipper_rp2040_E6614C311B773B36-if00
|
||||
|
||||
[adxl345]
|
||||
cs_pin: RP2040:gpio1
|
||||
spi_bus: spi0a
|
||||
axes_map: x,z,y
|
||||
|
||||
[resonance_tester]
|
||||
accel_chip: adxl345
|
||||
probe_points: 111.5, 111.5, 20
|
||||
|
||||
[output_pin power_mode] # Improve power stability
|
||||
pin: RP2040:gpio23
|
||||
|
||||
[gcode_macro ADX]
|
||||
description: Shortcut to ACCELEROMETER_QUERY
|
||||
gcode:
|
||||
ACCELEROMETER_QUERY
|
||||
43
modules/services/printer/cfgs/adxl-rpi-pico-2x.cfg
Normal file
43
modules/services/printer/cfgs/adxl-rpi-pico-2x.cfg
Normal file
@@ -0,0 +1,43 @@
|
||||
#####################################################################
|
||||
# Config that supports a print head and a bed sensor at the same time
|
||||
# This requires a Raspberry Pi Pico.
|
||||
# Instructions: https://klipper.discourse.group/t/raspberry-pi-pico-adxl345-portable-resonance-measurement/1757/9
|
||||
# TLDR Instructions: The two sensors should use the spi0a (GPIO 0-3) and spi1a (GPIO 9-12) buses, respectively.
|
||||
#
|
||||
# Recommended mounts:
|
||||
# https://www.printables.com/model/385334-sovol-sv06-adxl345-mount-printhead-and-bed
|
||||
#
|
||||
# ADXL345 related Settings
|
||||
# https://www.klipper3d.org/Measuring_Resonances.html#adxl345
|
||||
#####################################################################
|
||||
|
||||
[mcu RP2040]
|
||||
baud: 115200
|
||||
restart_method: command
|
||||
# Obtain definition by "ls -l /dev/serial/by-id/"
|
||||
serial: /dev/serial/by-id/usb-Klipper_rp2040_E66138935F154C28-if00
|
||||
|
||||
[adxl345 head]
|
||||
cs_pin: RP2040:gpio1
|
||||
spi_bus: spi0a
|
||||
# update axes_map if your sensor is oriented differently. Note the print on your sensor.
|
||||
# -y, -z, x means that
|
||||
# - the x axis of your printer corresponds to the sensor's negative y axis
|
||||
# - the y axis of your printer corresponds to the sensor's negative z axis
|
||||
# - the z axis of your printer corresponds to the sensor's x axis
|
||||
axes_map: -y, -z, x
|
||||
|
||||
[adxl345 bed]
|
||||
cs_pin: RP2040:gpio9
|
||||
spi_bus: spi1a
|
||||
|
||||
[resonance_tester]
|
||||
accel_chip_x: adxl345 head
|
||||
accel_chip_y: adxl345 bed
|
||||
probe_points: 111.5, 111.5, 20
|
||||
|
||||
[gcode_macro ADX]
|
||||
description: Shortcut to ACCELEROMETER_QUERY for both sensors
|
||||
gcode:
|
||||
ACCELEROMETER_QUERY CHIP=head
|
||||
ACCELEROMETER_QUERY CHIP=bed
|
||||
120
modules/services/printer/cfgs/kamp/Adaptive_Meshing.cfg
Normal file
120
modules/services/printer/cfgs/kamp/Adaptive_Meshing.cfg
Normal file
@@ -0,0 +1,120 @@
|
||||
# # # Klipper Adaptive Meshing # # #
|
||||
|
||||
# Heads up! If you have any other BED_MESH_CALIBRATE macros defined elsewhere in your config, you will need to comment out / remove them for this to work. (Klicky/Euclid Probe)
|
||||
# You will also need to be sure that [exclude_object] is defined in printer.cfg, and your slicer is labeling objects.
|
||||
# This macro will parse information from objects in your gcode to define a min and max mesh area to probe, creating an adaptive mesh!
|
||||
# This macro will not increase probe_count values in your [bed_mesh] config. If you want richer meshes, be sure to increase probe_count. We recommend at least 5,5.
|
||||
|
||||
[gcode_macro BED_MESH_CALIBRATE]
|
||||
rename_existing: _BED_MESH_CALIBRATE
|
||||
gcode:
|
||||
|
||||
{% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} # Gather all object points
|
||||
{% set bed_mesh_min = printer.configfile.settings.bed_mesh.mesh_min %} # Get bed mesh min from printer.cfg
|
||||
{% set bed_mesh_max = printer.configfile.settings.bed_mesh.mesh_max %} # Get bed mesh max from printer.cfg
|
||||
{% set probe_count = printer.configfile.settings.bed_mesh.probe_count %} # Get probe count from printer.cfg
|
||||
{% set kamp_settings = printer["gcode_macro _KAMP_Settings"] %} # Pull variables from _KAMP_Settings
|
||||
{% set verbose_enable = kamp_settings.verbose_enable | abs %} # Pull verbose setting from _KAMP_Settings
|
||||
{% set probe_dock_enable = kamp_settings.probe_dock_enable | abs %} # Pull probe dockable probe settings from _KAMP_Settings
|
||||
{% set attach_macro = kamp_settings.attach_macro | string %} # Pull attach probe command from _KAMP_Settings
|
||||
{% set detach_macro = kamp_settings.detach_macro | string %} # Pull detach probe command from _KAMP_Settings
|
||||
{% set mesh_margin = kamp_settings.mesh_margin | float %} # Pull mesh margin setting from _KAMP_Settings
|
||||
{% set fuzz_amount = kamp_settings.fuzz_amount | float %} # Pull fuzz amount setting from _KAMP_Settings
|
||||
{% set probe_count = probe_count if probe_count|length > 1 else probe_count * 2 %} # If probe count is only a single number, convert it to 2. E.g. probe_count:7 = 7,7
|
||||
{% set max_probe_point_distance_x = ( bed_mesh_max[0] - bed_mesh_min[0] ) / (probe_count[0] - 1) %} # Determine max probe point distance
|
||||
{% set max_probe_point_distance_y = ( bed_mesh_max[1] - bed_mesh_min[1] ) / (probe_count[1] - 1) %} # Determine max probe point distance
|
||||
{% set x_min = all_points | map(attribute=0) | min | default(bed_mesh_min[0]) %} # Set x_min from smallest object x point
|
||||
{% set y_min = all_points | map(attribute=1) | min | default(bed_mesh_min[1]) %} # Set y_min from smallest object y point
|
||||
{% set x_max = all_points | map(attribute=0) | max | default(bed_mesh_max[0]) %} # Set x_max from largest object x point
|
||||
{% set y_max = all_points | map(attribute=1) | max | default(bed_mesh_max[1]) %} # Set y_max from largest object y point
|
||||
|
||||
{% set fuzz_range = range((0) | int, (fuzz_amount * 100) | int + 1) %} # Set fuzz_range between 0 and fuzz_amount
|
||||
{% set adapted_x_min = x_min - mesh_margin - (fuzz_range | random / 100.0) %} # Adapt x_min to margin and fuzz constraints
|
||||
{% set adapted_y_min = y_min - mesh_margin - (fuzz_range | random / 100.0) %} # Adapt y_min to margin and fuzz constraints
|
||||
{% set adapted_x_max = x_max + mesh_margin + (fuzz_range | random / 100.0) %} # Adapt x_max to margin and fuzz constraints
|
||||
{% set adapted_y_max = y_max + mesh_margin + (fuzz_range | random / 100.0) %} # Adapt y_max to margin and fuzz constraints
|
||||
|
||||
{% set adapted_x_min = [adapted_x_min , bed_mesh_min[0]] | max %} # Compare adjustments to defaults and choose max
|
||||
{% set adapted_y_min = [adapted_y_min , bed_mesh_min[1]] | max %} # Compare adjustments to defaults and choose max
|
||||
{% set adapted_x_max = [adapted_x_max , bed_mesh_max[0]] | min %} # Compare adjustments to defaults and choose min
|
||||
{% set adapted_y_max = [adapted_y_max , bed_mesh_max[1]] | min %} # Compare adjustments to defaults and choose min
|
||||
|
||||
{% set points_x = (((adapted_x_max - adapted_x_min) / max_probe_point_distance_x) | round(method='ceil') | int) + 1 %} # Define probe_count's x point count and round up
|
||||
{% set points_y = (((adapted_y_max - adapted_y_min) / max_probe_point_distance_y) | round(method='ceil') | int) + 1 %} # Define probe_count's y point count and round up
|
||||
|
||||
{% if (([points_x, points_y]|max) > 6) %} #
|
||||
{% set algorithm = "bicubic" %} #
|
||||
{% set min_points = 4 %} #
|
||||
{% else %} # Calculate if algorithm should be bicubic or lagrange
|
||||
{% set algorithm = "lagrange" %} #
|
||||
{% set min_points = 3 %} #
|
||||
{% endif %} #
|
||||
|
||||
{% set points_x = [points_x , min_points]|max %} # Set probe_count's x points to fit the calculated algorithm
|
||||
{% set points_y = [points_y , min_points]|max %} # Set probe_count's y points to fit the calculated algorithm
|
||||
{% set points_x = [points_x , probe_count[0]]|min %}
|
||||
{% set points_y = [points_y , probe_count[1]]|min %}
|
||||
|
||||
{% if verbose_enable == True %} # If verbose is enabled, print information about KAMP's calculations
|
||||
{% if printer.exclude_object.objects != [] %}
|
||||
|
||||
{ action_respond_info( "Algorithm: {}.".format(
|
||||
(algorithm),
|
||||
)) }
|
||||
|
||||
{ action_respond_info("Default probe count: {},{}.".format(
|
||||
(probe_count[0]),
|
||||
(probe_count[1]),
|
||||
)) }
|
||||
|
||||
{ action_respond_info("Adapted probe count: {},{}.".format(
|
||||
(points_x),
|
||||
(points_y),
|
||||
)) }
|
||||
|
||||
{action_respond_info("Default mesh bounds: {}, {}.".format(
|
||||
(bed_mesh_min[0],bed_mesh_min[1]),
|
||||
(bed_mesh_max[0],bed_mesh_max[1]),
|
||||
)) }
|
||||
|
||||
{% if mesh_margin > 0 %}
|
||||
{action_respond_info("Mesh margin is {}, mesh bounds extended by {}mm.".format(
|
||||
(mesh_margin),
|
||||
(mesh_margin),
|
||||
)) }
|
||||
{% else %}
|
||||
{action_respond_info("Mesh margin is 0, margin not increased.")}
|
||||
{% endif %}
|
||||
|
||||
{% if fuzz_amount > 0 %}
|
||||
{action_respond_info("Mesh point fuzzing enabled, points fuzzed up to {}mm.".format(
|
||||
(fuzz_amount),
|
||||
)) }
|
||||
{% else %}
|
||||
{action_respond_info("Fuzz amount is 0, mesh points not fuzzed.")}
|
||||
{% endif %}
|
||||
|
||||
{ action_respond_info("Adapted mesh bounds: {}, {}.".format(
|
||||
(adapted_x_min, adapted_y_min),
|
||||
(adapted_x_max, adapted_y_max),
|
||||
)) }
|
||||
|
||||
{action_respond_info("KAMP adjustments successful. Happy KAMPing!")}
|
||||
|
||||
{% else %}
|
||||
|
||||
{action_respond_info("No objects detected! Check your gcode and make sure that EXCLUDE_OBJECT_DEFINE is happening before BED_MESH_CALIBRATE is called. Defaulting to regular meshing.")}
|
||||
G4 P5000 # Wait 5 seconds to make error more visible
|
||||
{% endif %}
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% if probe_dock_enable == True %}
|
||||
{attach_macro} # Attach/deploy a probe if the probe is stored somewhere outside of the print area
|
||||
{% endif %}
|
||||
|
||||
_BED_MESH_CALIBRATE mesh_min={adapted_x_min},{adapted_y_min} mesh_max={adapted_x_max},{adapted_y_max} ALGORITHM={algorithm} PROBE_COUNT={points_x},{points_y}
|
||||
|
||||
{% if probe_dock_enable == True %}
|
||||
{detach_macro} # Detach/stow a probe if the probe is stored somewhere outside of the print area
|
||||
{% endif %} # End of verbose
|
||||
37
modules/services/printer/cfgs/kamp/KAMP_Settings.cfg
Normal file
37
modules/services/printer/cfgs/kamp/KAMP_Settings.cfg
Normal file
@@ -0,0 +1,37 @@
|
||||
# Below you can include specific configuration files depending on what you want KAMP to do:
|
||||
|
||||
# NOTE bassamanator: uncomment the functionality that you want to use from KAMP
|
||||
[include ./Adaptive_Meshing.cfg] # Include to enable adaptive meshing configuration.
|
||||
[include ./Line_Purge.cfg] # Include to enable adaptive line purging configuration.
|
||||
# [include ./Voron_Purge.cfg] # Include to enable adaptive Voron logo purging configuration.
|
||||
# [include ./Smart_Park.cfg] # Include to enable the Smart Park function, which parks the printhead near the print area for final heating.
|
||||
|
||||
[gcode_macro _KAMP_Settings]
|
||||
description: This macro contains all adjustable settings for KAMP
|
||||
|
||||
# The following variables are settings for KAMP as a whole.
|
||||
variable_verbose_enable: True # Set to True to enable KAMP information output when running. This is useful for debugging.
|
||||
|
||||
# The following variables are for adjusting adaptive mesh settings for KAMP.
|
||||
variable_mesh_margin: 0 # Expands the mesh size in millimeters if desired. Leave at 0 to disable.
|
||||
variable_fuzz_amount: 0 # Slightly randomizes mesh points to spread out wear from nozzle-based probes. Leave at 0 to disable.
|
||||
|
||||
# The following variables are for those with a dockable probe like Klicky, Euclid, etc. # ---------------- Attach Macro | Detach Macro
|
||||
variable_probe_dock_enable: False # Set to True to enable the usage of a dockable probe. # ---------------------------------------------
|
||||
variable_attach_macro: 'Attach_Probe' # The macro that is used to attach the probe. # Klicky Probe: 'Attach_Probe' | 'Dock_Probe'
|
||||
variable_detach_macro: 'Dock_Probe' # The macro that is used to store the probe. # Euclid Probe: 'Deploy_Probe' | 'Stow_Probe'
|
||||
# Legacy Gcode: 'M401' | 'M402'
|
||||
|
||||
# The following variables are for adjusting adaptive purge settings for KAMP.
|
||||
variable_purge_height: 0.8 # Z position of nozzle during purge, default is 0.8.
|
||||
variable_tip_distance: 0 # Distance between tip of filament and nozzle before purge. Should be similar to PRINT_END final retract amount.
|
||||
variable_purge_margin: 10 # Distance the purge will be in front of the print area, default is 10.
|
||||
variable_purge_amount: 30 # Amount of filament to be purged prior to printing.
|
||||
variable_flow_rate: 12 # Flow rate of purge in mm3/s. Default is 12.
|
||||
|
||||
# The following variables are for adjusting the Smart Park feature for KAMP, which will park the printhead near the print area at a specified height.
|
||||
variable_smart_park_height: 10 # Z position for Smart Park, default is 10.
|
||||
|
||||
gcode: # Gcode section left intentionally blank. Do not disturb.
|
||||
|
||||
{action_respond_info(" Running the KAMP_Settings macro does nothing, it is only used for storing KAMP settings. ")}
|
||||
119
modules/services/printer/cfgs/kamp/Line_Purge.cfg
Normal file
119
modules/services/printer/cfgs/kamp/Line_Purge.cfg
Normal file
@@ -0,0 +1,119 @@
|
||||
[gcode_macro LINE_PURGE]
|
||||
description: A purge macro that adapts to be near your actual printed objects
|
||||
gcode:
|
||||
# Get relevant printer params
|
||||
{% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %}
|
||||
{% set cross_section = printer.configfile.settings.extruder.max_extrude_cross_section | float %}
|
||||
|
||||
# Use firmware retraction if it is defined
|
||||
{% if printer.firmware_retraction is defined %}
|
||||
{% set RETRACT = G10 | string %}
|
||||
{% set UNRETRACT = G11 | string %}
|
||||
{% else %}
|
||||
{% set RETRACT = 'G1 E-.5 F2100' | string %}
|
||||
{% set UNRETRACT = 'G1 E.5 F2100' | string %}
|
||||
{% endif %}
|
||||
|
||||
# Get purge settings from _Kamp_Settings
|
||||
{% set verbose_enable = printer["gcode_macro _KAMP_Settings"].verbose_enable | abs %}
|
||||
{% set purge_height = printer["gcode_macro _KAMP_Settings"].purge_height | float %}
|
||||
{% set tip_distance = printer["gcode_macro _KAMP_Settings"].tip_distance | float %}
|
||||
{% set purge_margin = printer["gcode_macro _KAMP_Settings"].purge_margin | float %}
|
||||
{% set purge_amount = printer["gcode_macro _KAMP_Settings"].purge_amount | float %}
|
||||
{% set flow_rate = printer["gcode_macro _KAMP_Settings"].flow_rate | float %}
|
||||
|
||||
|
||||
# Calculate purge origins and centers from objects
|
||||
{% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} # Get all object points
|
||||
{% set purge_x_min = (all_points | map(attribute=0) | min | default(0)) %} # Object x min
|
||||
{% set purge_x_max = (all_points | map(attribute=0) | max | default(0)) %} # Object x max
|
||||
{% set purge_y_min = (all_points | map(attribute=1) | min | default(0)) %} # Object y min
|
||||
{% set purge_y_max = (all_points | map(attribute=1) | max | default(0)) %} # Object y max
|
||||
|
||||
{% set purge_x_center = ([((purge_x_max + purge_x_min) / 2) - (purge_amount / 2), 0] | max) %} # Create center point of purge line relative to print on X axis
|
||||
{% set purge_y_center = ([((purge_y_max + purge_y_min) / 2) - (purge_amount / 2), 0] | max) %} # Create center point of purge line relative to print on Y axis
|
||||
|
||||
{% set purge_x_origin = ([purge_x_min - purge_margin, 0] | max) %} # Add margin to x min, compare to 0, and choose the larger
|
||||
{% set purge_y_origin = ([purge_y_min - purge_margin, 0] | max) %} # Add margin to y min, compare to 0, and choose the larger
|
||||
|
||||
# Calculate purge speed
|
||||
{% set purge_move_speed = (flow_rate / 5.0) * 60 | float %}
|
||||
|
||||
{% if cross_section < 5 %}
|
||||
|
||||
{action_respond_info("[Extruder] max_extrude_cross_section is insufficient for purge, please set it to 5 or greater. Purge skipped.")}
|
||||
|
||||
{% else %}
|
||||
|
||||
{% if verbose_enable == True %}
|
||||
|
||||
{action_respond_info("Moving filament tip {}mms".format(
|
||||
(tip_distance),
|
||||
)) }
|
||||
{% endif %}
|
||||
|
||||
{% if printer.firmware_retraction is defined %}
|
||||
{action_respond_info("KAMP purge is using firmware retraction.")}
|
||||
{% else %}
|
||||
{action_respond_info("KAMP purge is not using firmware retraction, it is recommended to configure it.")}
|
||||
{% endif %}
|
||||
|
||||
{% if purge_y_origin > 0 %}
|
||||
|
||||
{action_respond_info("KAMP purge starting at {}, {} and purging {}mm of filament, requested flow rate is {}mm/s3.".format(
|
||||
(purge_x_center),
|
||||
(purge_y_origin),
|
||||
(purge_amount),
|
||||
(flow_rate),
|
||||
)) }
|
||||
|
||||
{% else %}
|
||||
|
||||
{action_respond_info("KAMP purge starting at {}, {} and purging {}mm of filament, requested flow rate is {}mm/s3.".format(
|
||||
(purge_x_origin),
|
||||
(purge_y_center),
|
||||
(purge_amount),
|
||||
(flow_rate),
|
||||
)) }
|
||||
|
||||
{% endif %}
|
||||
|
||||
SAVE_GCODE_STATE NAME=Prepurge_State # Create gcode state
|
||||
|
||||
{% if purge_y_origin > 0 %} # If there's room on Y, purge along X axis in front of print area
|
||||
|
||||
G92 E0 # Reset extruder
|
||||
G0 F{travel_speed} # Set travel speed
|
||||
G90 # Absolute positioning
|
||||
G0 X{purge_x_center} Y{purge_y_origin} # Move to purge position
|
||||
G0 Z{purge_height} # Move to purge Z height
|
||||
M83 # Relative extrusion mode
|
||||
G1 E{tip_distance} F{purge_move_speed} # Move filament tip
|
||||
G1 X{purge_x_center + purge_amount} E{purge_amount} F{purge_move_speed} # Purge line
|
||||
{RETRACT} # Retract
|
||||
G0 X{purge_x_center + purge_amount + 10} F{travel_speed} # Rapid move to break string
|
||||
G92 E0 # Reset extruder distance
|
||||
M82 # Absolute extrusion mode
|
||||
G0 Z{purge_height * 2} F{travel_speed} # Z hop
|
||||
|
||||
{% else %} # If there's room on X, purge along Y axis to the left of print area
|
||||
|
||||
G92 E0 # Reset extruder
|
||||
G0 F{travel_speed} # Set travel speed
|
||||
G90 # Absolute positioning
|
||||
G0 X{purge_x_origin} Y{purge_y_center} # Move to purge position
|
||||
G0 Z{purge_height} # Move to purge Z height
|
||||
M83 # Relative extrusion mode
|
||||
G1 E{tip_distance} F{purge_move_speed} # Move filament tip
|
||||
G1 Y{purge_y_center + purge_amount} E{purge_amount} F{purge_move_speed} # Purge line
|
||||
{RETRACT} # Retract
|
||||
G0 Y{purge_y_center + purge_amount + 10} F{travel_speed} # Rapid move to break string
|
||||
G92 E0 # Reset extruder distance
|
||||
M82 # Absolute extrusion mode
|
||||
G0 Z{purge_height * 2} F{travel_speed} # Z hop
|
||||
|
||||
{% endif %}
|
||||
|
||||
RESTORE_GCODE_STATE NAME=Prepurge_State # Restore gcode state
|
||||
|
||||
{% endif %}
|
||||
38
modules/services/printer/cfgs/kamp/Smart_Park.cfg
Normal file
38
modules/services/printer/cfgs/kamp/Smart_Park.cfg
Normal file
@@ -0,0 +1,38 @@
|
||||
[gcode_macro SMART_PARK]
|
||||
description: Parks your printhead near the print area for pre-print hotend heating.
|
||||
gcode:
|
||||
|
||||
{% set kamp_settings = printer["gcode_macro _KAMP_Settings"] %} # Pull all variables from _KAMP_Settings
|
||||
{% set z_height = kamp_settings.smart_park_height | float %} # Set Z height variable
|
||||
{% set purge_margin = kamp_settings.purge_margin | float %} # Set purge margin variable
|
||||
{% set verbose_enable = kamp_settings.verbose_enable | abs %} # Set verbosity
|
||||
{% set center_x = printer.toolhead.axis_maximum.x / 2 | float %} # Create center point of x for fallback
|
||||
{% set center_y = printer.toolhead.axis_maximum.y / 2 | float %} # Create center point of y for fallback
|
||||
{% set axis_minimum_x = printer.toolhead.axis_minimum.x | float %}
|
||||
{% set axis_minimum_y = printer.toolhead.axis_minimum.y | float %}
|
||||
{% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} # Gather all object points
|
||||
{% set x_min = all_points | map(attribute=0) | min | default(center_x) %} # Set x_min from smallest object x point
|
||||
{% set y_min = all_points | map(attribute=1) | min | default(center_y) %} # Set y_min from smallest object y point
|
||||
{% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %} # Set travel speed from config
|
||||
|
||||
{% if purge_margin > 0 and x_min != center_x and y_min != center_y %} # If objects are detected and purge margin
|
||||
{% set x_min = [ x_min - purge_margin , x_min ] | min %} # value is greater than 0, move
|
||||
{% set y_min = [ y_min - purge_margin , y_min ] | min %} # to purge location + margin
|
||||
{% set x_min = [ x_min , axis_minimum_x ] | max %}
|
||||
{% set y_min = [ y_min , axis_minimum_y ] | max %}
|
||||
{% endif %}
|
||||
|
||||
{% if verbose_enable == True %} # Verbose park location
|
||||
|
||||
{ action_respond_info("Smart Park location: {},{}.".format(
|
||||
(x_min),
|
||||
(y_min),
|
||||
)) }
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% if printer.toolhead.position.z < z_height %}
|
||||
G0 Z{z_height} # Move Z to park height if current Z position is lower than z_height
|
||||
{% endif %}
|
||||
G0 X{x_min} Y{y_min} F{travel_speed} # Move near object area
|
||||
G0 Z{z_height} # Move Z to park height
|
||||
91
modules/services/printer/cfgs/kamp/Voron_Purge.cfg
Normal file
91
modules/services/printer/cfgs/kamp/Voron_Purge.cfg
Normal file
@@ -0,0 +1,91 @@
|
||||
[gcode_macro VORON_PURGE]
|
||||
description: A purge macro that adapts to be near your actual printed objects
|
||||
gcode:
|
||||
# Get relevant printer params
|
||||
{% set travel_speed = (printer.toolhead.max_velocity) * 60 | float %}
|
||||
{% set cross_section = printer.configfile.settings.extruder.max_extrude_cross_section | float %}
|
||||
|
||||
# Use firmware retraction if it is defined
|
||||
{% if printer.firmware_retraction is defined %}
|
||||
{% set RETRACT = G10 | string %}
|
||||
{% set UNRETRACT = G11 | string %}
|
||||
{% else %}
|
||||
{% set RETRACT = 'G1 E-.5 F2100' | string %}
|
||||
{% set UNRETRACT = 'G1 E.5 F2100' | string %}
|
||||
{% endif %}
|
||||
|
||||
# Get purge settings from _Kamp_Settings
|
||||
{% set kamp_settings = printer["gcode_macro _KAMP_Settings"] %}
|
||||
{% set verbose_enable = kamp_settings.verbose_enable | abs %}
|
||||
{% set purge_height = kamp_settings.purge_height | float %}
|
||||
{% set tip_distance = kamp_settings.tip_distance | float %}
|
||||
{% set purge_margin = kamp_settings.purge_margin | float %}
|
||||
{% set purge_amount = kamp_settings.purge_amount | float %}
|
||||
{% set flow_rate = kamp_settings.flow_rate | float %}
|
||||
{% set size = 10 | float %}
|
||||
|
||||
# Calculate purge origins and centers from objects
|
||||
{% set all_points = printer.exclude_object.objects | map(attribute='polygon') | sum(start=[]) %} # Get all object points
|
||||
{% set purge_x_min = (all_points | map(attribute=0) | min | default(0)) %} # Object x min
|
||||
{% set purge_x_max = (all_points | map(attribute=0) | max | default(0)) %} # Object x max
|
||||
{% set purge_y_min = (all_points | map(attribute=1) | min | default(0)) %} # Object y min
|
||||
{% set purge_y_max = (all_points | map(attribute=1) | max | default(0)) %} # Object y max
|
||||
|
||||
{% set purge_x_center = ([((purge_x_max + purge_x_min) / 2) - (purge_amount / 2), 0] | max) %} # Create center point of purge line relative to print on X axis
|
||||
{% set purge_y_center = ([((purge_y_max + purge_y_min) / 2) - (purge_amount / 2), 0] | max) %} # Create center point of purge line relative to print on Y axis
|
||||
|
||||
{% set purge_x_origin = ([purge_x_min - purge_margin, 0] | max) %} # Add margin to x min, compare to 0, and choose the larger
|
||||
{% set purge_y_origin = ([purge_y_min - purge_margin, 0] | max) %} # Add margin to y min, compare to 0, and choose the larger
|
||||
|
||||
# Calculate purge speed
|
||||
{% set purge_move_speed = (flow_rate / 5.0) * 60 | float %}
|
||||
|
||||
{% if cross_section < 5 %}
|
||||
|
||||
{action_respond_info("[Extruder] max_extrude_cross_section is insufficient for purge, please set it to 5 or greater. Purge skipped.")}
|
||||
|
||||
{% else %}
|
||||
|
||||
{% if verbose_enable == True %}
|
||||
|
||||
{action_respond_info("Moving filament tip {}mms".format(
|
||||
(tip_distance),
|
||||
)) }
|
||||
{% endif %}
|
||||
|
||||
{% if printer.firmware_retraction is defined %}
|
||||
{action_respond_info("KAMP purge is using firmware retraction.")}
|
||||
{% else %}
|
||||
{action_respond_info("KAMP purge is not using firmware retraction, it is recommended to configure it.")}
|
||||
{% endif %}
|
||||
|
||||
SAVE_GCODE_STATE NAME=Prepurge_State # Create gcode state
|
||||
|
||||
G92 E0 # Reset extruder
|
||||
G0 F{travel_speed} # Set travel speed
|
||||
G90 # Absolute positioning
|
||||
G0 X{purge_x_origin} Y{purge_y_origin+size/2} # Move to purge position
|
||||
G0 Z{purge_height} # Move to purge Z height
|
||||
M83 # Relative extrusion mode
|
||||
G1 E{tip_distance} F{purge_move_speed} # Move tip of filament to nozzle
|
||||
G1 X{purge_x_origin+size*0.289} Y{purge_y_origin+size} E{purge_amount/4} F{purge_move_speed} # Purge first line of logo
|
||||
{RETRACT} # Retract
|
||||
G0 Z{purge_height*2} # Z hop
|
||||
G0 X{purge_x_origin+size*0.789} Y{purge_y_origin+size} # Move to second purge line origin
|
||||
G0 Z{purge_height} # Move to purge Z height
|
||||
{UNRETRACT} # Recover
|
||||
G1 X{purge_x_origin+size*0.211} Y{purge_y_origin} E{purge_amount/2} F{purge_move_speed} # Purge second line of logo
|
||||
{RETRACT} # Retract
|
||||
G0 Z{purge_height*2} # Z hop
|
||||
G0 X{purge_x_origin+size*0.711} Y{purge_y_origin} # Move to third purge line origin
|
||||
G0 Z{purge_height} # Move to purge Z height
|
||||
{UNRETRACT} # Recover
|
||||
G1 X{purge_x_origin+size} Y{purge_y_origin+size/2} E{purge_amount/4} F{purge_move_speed} # Purge third line of logo
|
||||
{RETRACT} # Retract
|
||||
G92 E0 # Reset extruder distance
|
||||
M82 # Absolute extrusion mode
|
||||
G0 Z{purge_height*2} F{travel_speed} # Z hop
|
||||
|
||||
RESTORE_GCODE_STATE NAME=Prepurge_State # Restore gcode state
|
||||
|
||||
{% endif %}
|
||||
330
modules/services/printer/cfgs/misc-macros.cfg
Normal file
330
modules/services/printer/cfgs/misc-macros.cfg
Normal file
@@ -0,0 +1,330 @@
|
||||
[force_move]
|
||||
enable_force_move: True
|
||||
|
||||
# NOTE If you're using a Raspberry Pi, you can uncomment the next 2 lines, optionally.
|
||||
#[temperature_sensor raspberry_pi]
|
||||
#sensor_type: temperature_host
|
||||
|
||||
# NOTE If you're using a an Orange Pi, you can uncomment the next 3 lines, optionally.
|
||||
# [temperature_sensor Orange_Pi]
|
||||
# sensor_type: temperature_host
|
||||
# sensor_path: /sys/class/thermal/thermal_zone0/temp
|
||||
|
||||
[virtual_sdcard]
|
||||
path: /var/lib/moonraker/gcodes
|
||||
|
||||
# NOTE Cancel objects feature is enabled. If you're using a low powered device, comment out [exclude_object].
|
||||
# Also see [file_manager] section in moonraker.conf.
|
||||
[exclude_object]
|
||||
|
||||
[pause_resume]
|
||||
[display_status]
|
||||
|
||||
[delayed_gcode DISABLEFILAMENTSENSOR]
|
||||
initial_duration: 1
|
||||
gcode:
|
||||
SET_FILAMENT_SENSOR SENSOR=filament_sensor ENABLE=0
|
||||
|
||||
[gcode_macro _globals]
|
||||
variable_filament_sensor_enabled: 1 # NOTE Enable(1) or disable(0) the filament sensor, if one is connected
|
||||
variable_beeping_enabled: 1 # NOTE Enable(1) or disable(0) beeping everywhere except during gantry calibration
|
||||
variable_bed_temp_over: 10 # NOTE Start print if bed temperature is over by this amount, otherwise wait for temperature drop
|
||||
variable_kamp_enable: 1 # NOTE Enable(1) or disable(0) KAMP (adaptive mesh)
|
||||
variable_pre_purge_prime_length: 1.40
|
||||
gcode:
|
||||
# Don't delete this section
|
||||
|
||||
[gcode_macro CONDITIONAL_BEEP]
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set i = params.I|default(1)|int %} ; Iterations (number of times to beep).
|
||||
{% set dur = params.DUR|default(100)|int %} ; Duration/wait of each beep in ms. Default 100ms.
|
||||
{% set freq = params.FREQ|default(2000)|int %} ; Frequency in Hz. Default 2kHz.
|
||||
|
||||
{% set BEEPING_ENABLED=printer["gcode_macro _globals"].beeping_enabled|default(-1)|int %}
|
||||
|
||||
{% if BEEPING_ENABLED == 1 %}
|
||||
BEEP I={i} DUR={dur} FREQ={freq}
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro ADJUST_FILAMENT_SENSOR_STATUS]
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set NEWSTATUS = params.ENABLE|default(-1)|int %}
|
||||
|
||||
{% set FILAMENT_SENSOR_ENABLED=printer["gcode_macro _globals"].filament_sensor_enabled|default(-1)|int %}
|
||||
|
||||
{% if FILAMENT_SENSOR_ENABLED == 1 and NEWSTATUS != -1 %}
|
||||
SET_FILAMENT_SENSOR SENSOR=filament_sensor ENABLE={NEWSTATUS}
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro M109]
|
||||
rename_existing: M99109
|
||||
gcode:
|
||||
#Parameters
|
||||
{% set s = params.S|float %}
|
||||
|
||||
M104 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} ; Set hotend temp
|
||||
{% if s != 0 %}
|
||||
TEMPERATURE_WAIT SENSOR=extruder MINIMUM={s} MAXIMUM={s+1} ; Wait for hotend temp (within 1 degree)
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro M190]
|
||||
rename_existing: M99190
|
||||
gcode:
|
||||
#Parameters
|
||||
{% set s = params.S|float %}
|
||||
|
||||
M140 {% for p in params %}{'%s%s' % (p, params[p])}{% endfor %} ; Set bed temp
|
||||
{% if s != 0 %}
|
||||
TEMPERATURE_WAIT SENSOR=heater_bed MINIMUM={s} MAXIMUM={s+1} ; Wait for bed temp (within 1 degree)
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro PURGE_LINE]
|
||||
gcode:
|
||||
{% set PRE_PURGE_PRIME_LENGTH=printer["gcode_macro _globals"].pre_purge_prime_length|default(1.40)|float %}
|
||||
ADJUST_FILAMENT_SENSOR_STATUS ENABLE=1
|
||||
|
||||
# Misc variables
|
||||
{% set extrudeAmount = 26.6 %}
|
||||
{% set movementLength = 100.0 %}
|
||||
{% set movementSpeed = 15 * 60 %}
|
||||
{% set xStart = 0.5 %}
|
||||
{% set yStart = 0.5 %}
|
||||
|
||||
# Set safe speeds
|
||||
{% set maxVelocity = printer.configfile.settings.printer.max_velocity|default(200)|int %}
|
||||
{% set maxVelocityAdjusted = (0.95 * maxVelocity * 60)|int %}
|
||||
|
||||
G92 E0.0 ; reset extruder
|
||||
G90 ; Absolute positioning
|
||||
G0 X{xStart} Y{yStart} F{maxVelocityAdjusted} ; move to purge position
|
||||
G1 Z0.4 F500.0 ; move to purge height
|
||||
M83 ; Relative extrusion mode
|
||||
G1 E{PRE_PURGE_PRIME_LENGTH} F500 ; pre-purge prime LENGTH SHOULD MATCH YOUR PRINT_END RETRACT
|
||||
G1 X{xStart + movementLength} E{extrudeAmount} F{movementSpeed} ; intro line 1
|
||||
|
||||
G92 E0.0 ; reset extruder
|
||||
M82 ; Absolute extrusion mode
|
||||
G1 Z5.0 ; move nozzle to prevent scratch
|
||||
|
||||
[gcode_macro CANCEL_PRINT]
|
||||
rename_existing: BASE_CANCEL_PRINT
|
||||
gcode:
|
||||
SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} ; set timeout back to configured value
|
||||
CLEAR_PAUSE
|
||||
SDCARD_RESET_FILE
|
||||
PRINT_END
|
||||
BASE_CANCEL_PRINT
|
||||
|
||||
[gcode_macro PRINT_START]
|
||||
gcode:
|
||||
|
||||
ADJUST_FILAMENT_SENSOR_STATUS ENABLE=1
|
||||
# Parameters
|
||||
{% set bedtemp = params.BED|int %}
|
||||
{% set hotendtemp = params.HOTEND|int %}
|
||||
{% set chambertemp = params.CHAMBER|default(0)|int %}
|
||||
|
||||
# Other variables
|
||||
{% set bedtempSlicer = bedtemp %}
|
||||
{% set bedtempOver = printer["gcode_macro _globals"].bed_temp_over|default(0)|int %}
|
||||
{% set maxVelocity = printer.configfile.settings.printer.max_velocity|default(200)|int %}
|
||||
{% set maxVelocityAdjusted = (0.90 * maxVelocity * 60)|int %}
|
||||
{% set kampEnabled=printer["gcode_macro _globals"].kamp_enable|default(0)|int %}
|
||||
|
||||
{% if printer.configfile.settings.safe_z_home %}
|
||||
{% set startX = printer.configfile.settings.safe_z_home.home_xy_position[0]|float %}
|
||||
{% set startY = printer.configfile.settings.safe_z_home.home_xy_position[1]|float %}
|
||||
{% endif %}
|
||||
|
||||
{% set bedtempAlmost = ((bedtemp - 2, 0, printer.heater_bed.temperature|int)|max, bedtemp)|max %}
|
||||
{% set hotendtempStepOne = ((hotendtemp, printer[printer.toolhead.extruder].temperature|int)|min, 150)|max %}
|
||||
{% set hotendtempStepTwo = ((hotendtemp, printer[printer.toolhead.extruder].temperature|int)|min, 170)|max %}
|
||||
|
||||
# If bed-temp-almost is higher than bed-temp by a maximum of bed-temp-over
|
||||
{% if bedtempAlmost > bedtemp %}
|
||||
{% if (bedtempAlmost - bedtempOver) <= bedtemp %}
|
||||
{% set bedtemp = bedtempAlmost %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
G90 ; absolute positioning
|
||||
M140 S{bedtempAlmost} ; set & don't wait for bed temp
|
||||
M104 S{hotendtempStepOne} ; set & don't wait for hotend temp
|
||||
G28 X Y
|
||||
{% if printer.configfile.settings.safe_z_home %}
|
||||
G1 X{startX} Y{startY} F{maxVelocityAdjusted}
|
||||
{% endif %}
|
||||
|
||||
M190 S{bedtempAlmost} ; set & wait for bed temp
|
||||
{% if kampEnabled == 0 %}
|
||||
M104 S{hotendtempStepTwo} ; set & don't wait for hotend temp
|
||||
{% endif %}
|
||||
M190 S{bedtemp} ; set & wait for bed temp
|
||||
M140 S{bedtempSlicer} ; set & don't wait for bed temp ; set temp to sliced setting regardless
|
||||
|
||||
{% if kampEnabled == 0 %}
|
||||
BED_MESH_PROFILE LOAD=default ; NOTE if not using a mesh, comment out this line
|
||||
SKEW_PROFILE LOAD=CaliFlower
|
||||
M104 S{hotendtemp} ; set & don't wait for hotend temp
|
||||
G28 Z ; final z homing
|
||||
{% else %}
|
||||
G28 Z ; final z homing
|
||||
BED_MESH_CALIBRATE ; KAMP mesh
|
||||
M104 S{hotendtemp} ; set & don't wait for hotend temp
|
||||
{% endif %}
|
||||
|
||||
G1 X0 Y0 F{maxVelocityAdjusted}
|
||||
M109 S{hotendtemp} ; set & wait for hotend temp
|
||||
|
||||
G1 Z20 F3000 ; move nozzle away from bed
|
||||
|
||||
[gcode_macro PRINT_END]
|
||||
gcode:
|
||||
SET_SKEW CLEAR=1
|
||||
ADJUST_FILAMENT_SENSOR_STATUS ENABLE=0
|
||||
CONDITIONAL_BEEP I=2 DUR=30 FREQ=8500
|
||||
{% set PRE_PURGE_PRIME_LENGTH=printer["gcode_macro _globals"].pre_purge_prime_length|default(1.40)|float %}
|
||||
|
||||
M400 ; wait for buffer to clear
|
||||
G92 E0 ; zero the extruder
|
||||
G1 E-{PRE_PURGE_PRIME_LENGTH} F400 ; retract filament
|
||||
G91 ; relative positioning
|
||||
|
||||
# Set safe speeds
|
||||
{% set zVelocity = printer.configfile.settings.printer.max_z_velocity|default(15)|int %}
|
||||
{% set maxVelocity = printer.configfile.settings.printer.max_velocity|default(200)|int %}
|
||||
{% set zVelocityAdjusted = (0.95 * zVelocity * 60)|int %}
|
||||
{% set maxVelocityAdjusted = (0.95 * maxVelocity * 60)|int %}
|
||||
|
||||
# Get Boundaries
|
||||
{% set max_x = printer.configfile.config["stepper_x"]["position_max"]|float %}
|
||||
{% set max_y = printer.configfile.config["stepper_y"]["position_max"]|float %}
|
||||
{% set max_z = printer.configfile.config["stepper_z"]["position_max"]|float %}
|
||||
|
||||
# Check end position to determine safe direction to move
|
||||
{% if printer.toolhead.position.x < (max_x - 20) %}
|
||||
{% set x_safe = 20.0 %}
|
||||
{% else %}
|
||||
{% set x_safe = -20.0 %}
|
||||
{% endif %}
|
||||
|
||||
{% if printer.toolhead.position.y < (max_y - 20) %}
|
||||
{% set y_safe = 20.0 %}
|
||||
{% else %}
|
||||
{% set y_safe = -20.0 %}
|
||||
{% endif %}
|
||||
|
||||
{% set lift_height = 25.0 %}
|
||||
{% if printer.toolhead.position.z < (max_z - lift_height) %}
|
||||
{% set z_safe = lift_height %}
|
||||
{% else %}
|
||||
{% set z_safe = max_z - printer.toolhead.position.z %}
|
||||
{% endif %}
|
||||
|
||||
G0 Z{z_safe} F{zVelocityAdjusted} ; move nozzle up
|
||||
G0 X{x_safe} Y{y_safe} F{maxVelocityAdjusted} ; move nozzle to remove stringing
|
||||
TURN_OFF_HEATERS
|
||||
M107 ; turn off fan
|
||||
G90 ; absolute positioning
|
||||
G0 X60 Y{max_y} F3600 ; park nozzle at rear
|
||||
M84
|
||||
|
||||
[gcode_macro LOAD_FILAMENT]
|
||||
gcode:
|
||||
M83 ; set extruder to relative
|
||||
G1 E30 F300 ; load
|
||||
G1 E15 F150 ; prime nozzle with filament
|
||||
M82 ; set extruder to absolute
|
||||
|
||||
[gcode_macro UNLOAD_FILAMENT]
|
||||
gcode:
|
||||
M83 ; set extruder to relative
|
||||
G1 E10 F300 ; extrude a little to soften tip
|
||||
G1 E-40 F1800 ; retract some, but not too much or it will jam
|
||||
M82 ; set extruder to absolute
|
||||
|
||||
[gcode_macro M600]
|
||||
gcode:
|
||||
CONDITIONAL_BEEP i=1 dur=300
|
||||
CONDITIONAL_BEEP i=1 dur=100
|
||||
CONDITIONAL_BEEP i=1 dur=100
|
||||
PAUSE ; Pause
|
||||
|
||||
[gcode_macro PAUSE]
|
||||
rename_existing: BASE_PAUSE
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set z = params.Z|default(10)|int %} ; z hop amount
|
||||
|
||||
{% if printer['pause_resume'].is_paused|int == 0 %}
|
||||
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=zhop VALUE={z} ; set z hop variable for reference in resume macro
|
||||
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=etemp VALUE={printer['extruder'].target} ; set hotend temp variable for reference in resume macro
|
||||
|
||||
ADJUST_FILAMENT_SENSOR_STATUS ENABLE=0
|
||||
|
||||
SAVE_GCODE_STATE NAME=PAUSE ; save current print position for resume
|
||||
BASE_PAUSE ; pause print
|
||||
{% if (printer.gcode_move.position.z + z) < printer.toolhead.axis_maximum.z %} ; check that zhop doesn't exceed z max
|
||||
G91 ; relative positioning
|
||||
G1 Z{z} F900 ; raise Z up by z hop amount
|
||||
{% else %}
|
||||
{ action_respond_info("Pause zhop exceeds maximum Z height.") } ; if z max is exceeded, show message and set zhop value for resume to 0
|
||||
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=zhop VALUE=0
|
||||
{% endif %}
|
||||
G90 ; absolute positioning
|
||||
G1 X{printer.toolhead.axis_maximum.x/2} Y{printer.toolhead.axis_minimum.y+5} F6000 ; park toolhead at front center
|
||||
SAVE_GCODE_STATE NAME=PAUSEPARK ; save parked position in case toolhead is moved during the pause (otherwise the return zhop can error)
|
||||
M104 S0 ; turn off hotend
|
||||
SET_IDLE_TIMEOUT TIMEOUT=43200 ; set timeout to 12 hours
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro RESUME]
|
||||
rename_existing: BASE_RESUME
|
||||
variable_zhop: 0
|
||||
variable_etemp: 0
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set e = params.E|default(2.5)|int %} ; hotend prime amount (in mm)
|
||||
|
||||
{% if printer['pause_resume'].is_paused|int == 1 %}
|
||||
ADJUST_FILAMENT_SENSOR_STATUS ENABLE=1
|
||||
|
||||
SET_IDLE_TIMEOUT TIMEOUT={printer.configfile.settings.idle_timeout.timeout} ; set timeout back to configured value
|
||||
{% if etemp > 0 %}
|
||||
M109 S{etemp|int} ; wait for hotend to heat back up
|
||||
{% endif %}
|
||||
RESTORE_GCODE_STATE NAME=PAUSEPARK MOVE=1 MOVE_SPEED=100 ; go back to parked position in case toolhead was moved during pause (otherwise the return zhop can error)
|
||||
G91 ; relative positioning
|
||||
M83 ; relative extruder positioning
|
||||
{% if printer[printer.toolhead.extruder].temperature >= printer.configfile.settings.extruder.min_extrude_temp %}
|
||||
G1 Z{zhop * -1} E{e} F900 ; prime nozzle by E, lower Z back down
|
||||
{% else %}
|
||||
G1 Z{zhop * -1} F900 ; lower Z back down without priming (just in case we are testing the macro with cold hotend)
|
||||
{% endif %}
|
||||
RESTORE_GCODE_STATE NAME=PAUSE MOVE=1 MOVE_SPEED=60 ; restore position
|
||||
BASE_RESUME ; resume print
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro _CG28]
|
||||
# Conditional homing
|
||||
gcode:
|
||||
{% if "xyz" not in printer.toolhead.homed_axes %}
|
||||
G28
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro BEEP]
|
||||
description: BEEP I=3 DUR=200 FREQ=2000: Beep 3 times, for 200ms each, at 2kHz frequency.
|
||||
gcode:
|
||||
# Parameters
|
||||
{% set i = params.I|default(1)|int %} ; Iterations (number of times to beep).
|
||||
{% set dur = params.DUR|default(100)|int %} ; Duration/wait of each beep in ms. Default 100ms.
|
||||
{% set freq = params.FREQ|default(2000)|int %} ; Frequency in Hz. Default 2kHz.
|
||||
|
||||
{% for iteration in range(i|int) %}
|
||||
SET_PIN PIN=beeper VALUE=0.8 CYCLE_TIME={ 1.0/freq if freq > 0 else 1 }
|
||||
G4 P{dur}
|
||||
SET_PIN PIN=beeper VALUE=0
|
||||
G4 P{dur}
|
||||
{% endfor %}
|
||||
18
modules/services/printer/default.nix
Normal file
18
modules/services/printer/default.nix
Normal file
@@ -0,0 +1,18 @@
|
||||
#
|
||||
# Services
|
||||
#
|
||||
# flake.nix
|
||||
# ├─ ./hosts
|
||||
# │ └─ home.nix
|
||||
# └─ ./modules
|
||||
# └─ ./services
|
||||
# └─ default.nix *
|
||||
# └─ ...
|
||||
#
|
||||
|
||||
[
|
||||
./klipper.nix
|
||||
]
|
||||
|
||||
# picom, polybar and sxhkd are pulled from desktop module
|
||||
# redshift temporarely disables
|
||||
110
modules/services/printer/firmware.conf
Normal file
110
modules/services/printer/firmware.conf
Normal file
@@ -0,0 +1,110 @@
|
||||
CONFIG_LOW_LEVEL_OPTIONS=y
|
||||
# CONFIG_MACH_AVR is not set
|
||||
# CONFIG_MACH_ATSAM is not set
|
||||
# CONFIG_MACH_ATSAMD is not set
|
||||
# CONFIG_MACH_LPC176X is not set
|
||||
CONFIG_MACH_STM32=y
|
||||
# CONFIG_MACH_HC32F460 is not set
|
||||
# CONFIG_MACH_RP2040 is not set
|
||||
# CONFIG_MACH_PRU is not set
|
||||
# CONFIG_MACH_AR100 is not set
|
||||
# CONFIG_MACH_LINUX is not set
|
||||
# CONFIG_MACH_SIMU is not set
|
||||
CONFIG_BOARD_DIRECTORY="stm32"
|
||||
CONFIG_MCU="stm32f103xe"
|
||||
CONFIG_CLOCK_FREQ=72000000
|
||||
CONFIG_SERIAL=y
|
||||
CONFIG_FLASH_SIZE=0x10000
|
||||
CONFIG_FLASH_BOOT_ADDRESS=0x8000000
|
||||
CONFIG_RAM_START=0x20000000
|
||||
CONFIG_RAM_SIZE=0x5000
|
||||
CONFIG_STACK_SIZE=512
|
||||
CONFIG_FLASH_APPLICATION_ADDRESS=0x8007000
|
||||
CONFIG_STM32_SELECT=y
|
||||
CONFIG_MACH_STM32F103=y
|
||||
# CONFIG_MACH_STM32F207 is not set
|
||||
# CONFIG_MACH_STM32F401 is not set
|
||||
# CONFIG_MACH_STM32F405 is not set
|
||||
# CONFIG_MACH_STM32F407 is not set
|
||||
# CONFIG_MACH_STM32F429 is not set
|
||||
# CONFIG_MACH_STM32F446 is not set
|
||||
# CONFIG_MACH_STM32F765 is not set
|
||||
# CONFIG_MACH_STM32F031 is not set
|
||||
# CONFIG_MACH_STM32F042 is not set
|
||||
# CONFIG_MACH_STM32F070 is not set
|
||||
# CONFIG_MACH_STM32F072 is not set
|
||||
# CONFIG_MACH_STM32G070 is not set
|
||||
# CONFIG_MACH_STM32G071 is not set
|
||||
# CONFIG_MACH_STM32G0B0 is not set
|
||||
# CONFIG_MACH_STM32G0B1 is not set
|
||||
# CONFIG_MACH_STM32G431 is not set
|
||||
# CONFIG_MACH_STM32G474 is not set
|
||||
# CONFIG_MACH_STM32H723 is not set
|
||||
# CONFIG_MACH_STM32H743 is not set
|
||||
# CONFIG_MACH_STM32H750 is not set
|
||||
# CONFIG_MACH_STM32L412 is not set
|
||||
# CONFIG_MACH_N32G452 is not set
|
||||
# CONFIG_MACH_N32G455 is not set
|
||||
# CONFIG_MACH_STM32F103x6 is not set
|
||||
CONFIG_MACH_STM32F1=y
|
||||
CONFIG_HAVE_STM32_USBFS=y
|
||||
CONFIG_HAVE_STM32_CANBUS=y
|
||||
CONFIG_STM32F103GD_DISABLE_SWD=y
|
||||
CONFIG_STM32_DFU_ROM_ADDRESS=0
|
||||
# CONFIG_STM32_FLASH_START_2000 is not set
|
||||
# CONFIG_STM32_FLASH_START_5000 is not set
|
||||
CONFIG_STM32_FLASH_START_7000=y
|
||||
# CONFIG_STM32_FLASH_START_8000 is not set
|
||||
# CONFIG_STM32_FLASH_START_8800 is not set
|
||||
# CONFIG_STM32_FLASH_START_9000 is not set
|
||||
# CONFIG_STM32_FLASH_START_10000 is not set
|
||||
# CONFIG_STM32_FLASH_START_800 is not set
|
||||
# CONFIG_STM32_FLASH_START_1000 is not set
|
||||
# CONFIG_STM32_FLASH_START_4000 is not set
|
||||
# CONFIG_STM32_FLASH_START_0000 is not set
|
||||
CONFIG_STM32_CLOCK_REF_8M=y
|
||||
# CONFIG_STM32_CLOCK_REF_12M is not set
|
||||
# CONFIG_STM32_CLOCK_REF_16M is not set
|
||||
# CONFIG_STM32_CLOCK_REF_20M is not set
|
||||
# CONFIG_STM32_CLOCK_REF_24M is not set
|
||||
# CONFIG_STM32_CLOCK_REF_25M is not set
|
||||
# CONFIG_STM32_CLOCK_REF_INTERNAL is not set
|
||||
CONFIG_CLOCK_REF_FREQ=8000000
|
||||
CONFIG_STM32F0_TRIM=16
|
||||
# CONFIG_STM32_USB_PA11_PA12 is not set
|
||||
CONFIG_STM32_SERIAL_USART1=y
|
||||
# CONFIG_STM32_SERIAL_USART1_ALT_PB7_PB6 is not set
|
||||
# CONFIG_STM32_SERIAL_USART2 is not set
|
||||
# CONFIG_STM32_SERIAL_USART2_ALT_PD6_PD5 is not set
|
||||
# CONFIG_STM32_SERIAL_USART3 is not set
|
||||
# CONFIG_STM32_SERIAL_USART3_ALT_PD9_PD8 is not set
|
||||
# CONFIG_STM32_CANBUS_PA11_PA12 is not set
|
||||
# CONFIG_STM32_CANBUS_PA11_PB9 is not set
|
||||
# CONFIG_STM32_MMENU_CANBUS_PB8_PB9 is not set
|
||||
# CONFIG_STM32_MMENU_CANBUS_PD0_PD1 is not set
|
||||
CONFIG_SERIAL_BAUD=250000
|
||||
CONFIG_USB_VENDOR_ID=0x1d50
|
||||
CONFIG_USB_DEVICE_ID=0x614e
|
||||
CONFIG_USB_SERIAL_NUMBER="12345"
|
||||
CONFIG_WANT_GPIO_BITBANGING=y
|
||||
CONFIG_WANT_DISPLAYS=y
|
||||
CONFIG_WANT_SENSORS=y
|
||||
CONFIG_WANT_LIS2DW=y
|
||||
CONFIG_WANT_LDC1612=y
|
||||
CONFIG_WANT_HX71X=y
|
||||
CONFIG_WANT_ADS1220=y
|
||||
CONFIG_WANT_SOFTWARE_I2C=y
|
||||
CONFIG_WANT_SOFTWARE_SPI=y
|
||||
CONFIG_NEED_SENSOR_BULK=y
|
||||
CONFIG_CANBUS_FREQUENCY=1000000
|
||||
CONFIG_INITIAL_PINS=""
|
||||
CONFIG_HAVE_GPIO=y
|
||||
CONFIG_HAVE_GPIO_ADC=y
|
||||
CONFIG_HAVE_GPIO_SPI=y
|
||||
CONFIG_HAVE_GPIO_I2C=y
|
||||
CONFIG_HAVE_GPIO_HARD_PWM=y
|
||||
CONFIG_HAVE_STRICT_TIMING=y
|
||||
CONFIG_HAVE_CHIPID=y
|
||||
CONFIG_HAVE_STEPPER_BOTH_EDGE=y
|
||||
CONFIG_HAVE_BOOTLOADER_REQUEST=y
|
||||
CONFIG_INLINE_STEPPER_HACK=y
|
||||
101
modules/services/printer/klipper.nix
Normal file
101
modules/services/printer/klipper.nix
Normal file
@@ -0,0 +1,101 @@
|
||||
{ lib, config, pkgs, ... }:
|
||||
|
||||
{
|
||||
environment = {
|
||||
systemPackages = with pkgs; [
|
||||
klipperscreen
|
||||
];
|
||||
};
|
||||
|
||||
services = {
|
||||
klipper = {
|
||||
enable = true;
|
||||
user = "moonraker";
|
||||
group = "moonraker";
|
||||
configFile = ./printer.cfg;
|
||||
mutableConfig = true;
|
||||
configDir = "/var/lib/moonraker/config";
|
||||
firmwares."sovol06" = {
|
||||
serial = "/dev/serial/by-id/usb-1a86_USB_Serial-if00-port0";
|
||||
enableKlipperFlash = true;
|
||||
enable = true;
|
||||
configFile = ./firmware.conf;
|
||||
};
|
||||
};
|
||||
|
||||
mainsail = {
|
||||
enable = true;
|
||||
nginx = {
|
||||
enableACME = false;
|
||||
#useACMEHost = "home.opel-online.de";
|
||||
serverName = "nbf5.home.opel-online.de";
|
||||
#onlySSL = true;
|
||||
#listenAddresses = [ "0.0.0.0" "::" ];
|
||||
#forceSSL = true;
|
||||
};
|
||||
};
|
||||
|
||||
moonraker = {
|
||||
enable = true;
|
||||
allowSystemControl = true;
|
||||
address = "0.0.0.0";
|
||||
settings = {
|
||||
authorization = {
|
||||
force_logins = true;
|
||||
cors_domains = [
|
||||
"*://nbf5.home.opel-online.de"
|
||||
"*.local"
|
||||
];
|
||||
trusted_clients = [
|
||||
"127.0.0.0/8"
|
||||
"192.168.2.0/24"
|
||||
];
|
||||
};
|
||||
file_manager = {
|
||||
enable_object_processing = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# nginx = {
|
||||
# enable = true;
|
||||
# recommendedProxySettings = true;
|
||||
# recommendedTlsSettings = true;
|
||||
# recommendedGzipSettings = true;
|
||||
# recommendedOptimisation = true;
|
||||
# virtualHosts = {
|
||||
# "ci.kabtop.de" = {
|
||||
# enableACME = true;
|
||||
# forceSSL = true;
|
||||
# default = true;
|
||||
# locations."/".return = "503";
|
||||
# };
|
||||
# "hydra.ci.kabtop.de" = {
|
||||
# enableACME = true;
|
||||
# forceSSL = true;
|
||||
# locations."/" = {
|
||||
# proxyPass = "http://localhost:3000";
|
||||
# extraConfig = ''
|
||||
# proxy_set_header X-Forwarded-Port 443;
|
||||
# '';
|
||||
# };
|
||||
# };
|
||||
# "cache.ci.kabtop.de" = {
|
||||
# enableACME = true;
|
||||
# forceSSL = true;
|
||||
# locations."/".proxyPass = "http://${config.services.nix-serve.bindAddress}:${toString config.services.nix-serve.port}";
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
#
|
||||
# security.acme = {
|
||||
# acceptTerms = true;
|
||||
# defaults = {
|
||||
# email = "webmaster@kabtop.de";
|
||||
# webroot = "/var/lib/acme/acme-challenge";
|
||||
# #server = "https://acme-staging-v02.api.letsencrypt.org/directory";
|
||||
# };
|
||||
};
|
||||
|
||||
}
|
||||
313
modules/services/printer/mainsail.cfg
Normal file
313
modules/services/printer/mainsail.cfg
Normal file
@@ -0,0 +1,313 @@
|
||||
## Client klipper macro definitions
|
||||
##
|
||||
## Copyright (C) 2022 Alex Zellner <alexander.zellner@googlemail.com>
|
||||
##
|
||||
## This file may be distributed under the terms of the GNU GPLv3 license
|
||||
##
|
||||
## !!! This file is read-only. Maybe the used editor indicates that. !!!
|
||||
##
|
||||
## Customization:
|
||||
## 1) copy the gcode_macro _CLIENT_VARIABLE (see below) to your printer.cfg
|
||||
## 2) remove the comment mark (#) from all lines
|
||||
## 3) change any value in there to your needs
|
||||
##
|
||||
## Use the PAUSE macro direct in your M600:
|
||||
## e.g. with a different park position front left and a minimal height of 50
|
||||
## [gcode_macro M600]
|
||||
## description: Filament change
|
||||
## gcode: PAUSE X=10 Y=10 Z_MIN=50
|
||||
## Z_MIN will park the toolhead at a minimum of 50 mm above to bed to make it easier for you to swap filament.
|
||||
##
|
||||
## Client variable macro for your printer.cfg
|
||||
#[gcode_macro _CLIENT_VARIABLE]
|
||||
#variable_use_custom_pos : False ; use custom park coordinates for x,y [True/False]
|
||||
#variable_custom_park_x : 0.0 ; custom x position; value must be within your defined min and max of X
|
||||
#variable_custom_park_y : 0.0 ; custom y position; value must be within your defined min and max of Y
|
||||
#variable_custom_park_dz : 2.0 ; custom dz value; the value in mm to lift the nozzle when move to park position
|
||||
#variable_retract : 1.0 ; the value to retract while PAUSE
|
||||
#variable_cancel_retract : 5.0 ; the value to retract while CANCEL_PRINT
|
||||
#variable_speed_retract : 35.0 ; retract speed in mm/s
|
||||
#variable_unretract : 1.0 ; the value to unretract while RESUME
|
||||
#variable_speed_unretract : 35.0 ; unretract speed in mm/s
|
||||
#variable_speed_hop : 15.0 ; z move speed in mm/s
|
||||
#variable_speed_move : 100.0 ; move speed in mm/s
|
||||
#variable_park_at_cancel : False ; allow to move the toolhead to park while execute CANCEL_PRINT [True/False]
|
||||
#variable_park_at_cancel_x : None ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True
|
||||
#variable_park_at_cancel_y : None ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True
|
||||
## !!! Caution [firmware_retraction] must be defined in the printer.cfg if you set use_fw_retract: True !!!
|
||||
#variable_use_fw_retract : False ; use fw_retraction instead of the manual version [True/False]
|
||||
#variable_idle_timeout : 0 ; time in sec until idle_timeout kicks in. Value 0 means that no value will be set or restored
|
||||
#variable_runout_sensor : "" ; If a sensor is defined, it will be used to cancel the execution of RESUME in case no filament is detected.
|
||||
## Specify the config name of the runout sensor e.g "filament_switch_sensor runout". Hint use the same as in your printer.cfg
|
||||
## !!! Custom macros, please use with care and review the section of the corresponding macro.
|
||||
## These macros are for simple operations like setting a status LED. Please make sure your macro does not interfere with the basic macro functions.
|
||||
## Only single line commands are supported, please create a macro if you need more than one command.
|
||||
#variable_user_pause_macro : "" ; Everything inside the "" will be executed after the klipper base pause (PAUSE_BASE) function
|
||||
#variable_user_resume_macro: "" ; Everything inside the "" will be executed before the klipper base resume (RESUME_BASE) function
|
||||
#variable_user_cancel_macro: "" ; Everything inside the "" will be executed before the klipper base cancel (CANCEL_PRINT_BASE) function
|
||||
#gcode:
|
||||
|
||||
[virtual_sdcard]
|
||||
path: ~/printer_data/gcodes
|
||||
on_error_gcode: CANCEL_PRINT
|
||||
|
||||
[pause_resume]
|
||||
#recover_velocity: 50.
|
||||
# When capture/restore is enabled, the speed at which to return to
|
||||
# the captured position (in mm/s). Default is 50.0 mm/s.
|
||||
|
||||
[display_status]
|
||||
|
||||
[respond]
|
||||
|
||||
[gcode_macro CANCEL_PRINT]
|
||||
description: Cancel the actual running print
|
||||
rename_existing: CANCEL_PRINT_BASE
|
||||
gcode:
|
||||
##### get user parameters or use default #####
|
||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||
{% set allow_park = client.park_at_cancel|default(false)|lower == 'true' %}
|
||||
{% set retract = client.cancel_retract|default(5.0)|abs %}
|
||||
##### define park position #####
|
||||
{% set park_x = "" if (client.park_at_cancel_x|default(none) is none)
|
||||
else "X=" ~ client.park_at_cancel_x %}
|
||||
{% set park_y = "" if (client.park_at_cancel_y|default(none) is none)
|
||||
else "Y=" ~ client.park_at_cancel_y %}
|
||||
{% set custom_park = park_x|length > 0 or park_y|length > 0 %}
|
||||
##### end of definitions #####
|
||||
# restore idle_timeout time if needed
|
||||
{% if printer['gcode_macro RESUME'].restore_idle_timeout > 0 %}
|
||||
SET_IDLE_TIMEOUT TIMEOUT={printer['gcode_macro RESUME'].restore_idle_timeout}
|
||||
{% endif %}
|
||||
{% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %}
|
||||
_CLIENT_RETRACT LENGTH={retract}
|
||||
TURN_OFF_HEATERS
|
||||
M106 S0
|
||||
{client.user_cancel_macro|default("")}
|
||||
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False
|
||||
# clear pause_next_layer and pause_at_layer as preparation for next print
|
||||
SET_PAUSE_NEXT_LAYER ENABLE=0
|
||||
SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0
|
||||
CANCEL_PRINT_BASE
|
||||
|
||||
[gcode_macro PAUSE]
|
||||
description: Pause the actual running print
|
||||
rename_existing: PAUSE_BASE
|
||||
gcode:
|
||||
##### get user parameters or use default #####
|
||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||
{% set idle_timeout = client.idle_timeout|default(0) %}
|
||||
{% set temp = printer[printer.toolhead.extruder].target if printer.toolhead.extruder != '' else 0 %}
|
||||
{% set restore = False if printer.toolhead.extruder == ''
|
||||
else True if params.RESTORE|default(1)|int == 1 else False %}
|
||||
##### end of definitions #####
|
||||
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{{'restore': restore, 'temp': temp}}"
|
||||
# set a new idle_timeout value
|
||||
{% if idle_timeout > 0 %}
|
||||
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=restore_idle_timeout VALUE={printer.configfile.settings.idle_timeout.timeout}
|
||||
SET_IDLE_TIMEOUT TIMEOUT={idle_timeout}
|
||||
{% endif %}
|
||||
PAUSE_BASE
|
||||
{client.user_pause_macro|default("")}
|
||||
_TOOLHEAD_PARK_PAUSE_CANCEL {rawparams}
|
||||
|
||||
[gcode_macro RESUME]
|
||||
description: Resume the actual running print
|
||||
rename_existing: RESUME_BASE
|
||||
variable_last_extruder_temp: {'restore': False, 'temp': 0}
|
||||
variable_restore_idle_timeout: 0
|
||||
variable_idle_state: False
|
||||
gcode:
|
||||
##### get user parameters or use default #####
|
||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||
{% set velocity = printer.configfile.settings.pause_resume.recover_velocity %}
|
||||
{% set sp_move = client.speed_move|default(velocity) %}
|
||||
{% set runout_resume = True if client.runout_sensor|default("") == "" # no runout
|
||||
else True if not printer[client.runout_sensor].enabled # sensor is disabled
|
||||
else printer[client.runout_sensor].filament_detected %} # sensor status
|
||||
{% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config
|
||||
else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder
|
||||
{% set do_resume = False %}
|
||||
{% set prompt_txt = [] %}
|
||||
##### end of definitions #####
|
||||
#### Printer comming from timeout idle state ####
|
||||
{% if printer.idle_timeout.state|upper == "IDLE" or idle_state %}
|
||||
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False
|
||||
{% if last_extruder_temp.restore %}
|
||||
# we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise
|
||||
RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }'
|
||||
M109 S{last_extruder_temp.temp}
|
||||
{% set do_resume = True %}
|
||||
{% elif can_extrude %}
|
||||
{% set do_resume = True %}
|
||||
{% else %}
|
||||
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}'
|
||||
{% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %}
|
||||
{% endif %}
|
||||
#### Printer comming out of regular PAUSE state ####
|
||||
{% elif can_extrude %}
|
||||
{% set do_resume = True %}
|
||||
{% else %}
|
||||
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}'
|
||||
{% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %}
|
||||
{% endif %}
|
||||
{% if runout_resume %}
|
||||
{% if do_resume %}
|
||||
{% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time
|
||||
{client.user_resume_macro|default("")}
|
||||
_CLIENT_EXTRUDE
|
||||
RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]}'
|
||||
{% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]) %}
|
||||
{% endif %}
|
||||
##### Generate User Information box in case of abort #####
|
||||
{% if not (runout_resume and do_resume) %}
|
||||
RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!"
|
||||
{% for element in prompt_txt %}
|
||||
RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}'
|
||||
{% endfor %}
|
||||
RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info"
|
||||
RESPOND TYPE=command MSG="action:prompt_show"
|
||||
{% endif %}
|
||||
|
||||
# Usage: SET_PAUSE_NEXT_LAYER [ENABLE=[0|1]] [MACRO=<name>]
|
||||
[gcode_macro SET_PAUSE_NEXT_LAYER]
|
||||
description: Enable a pause if the next layer is reached
|
||||
gcode:
|
||||
{% set pause_next_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_next_layer %}
|
||||
{% set ENABLE = params.ENABLE|default(1)|int != 0 %}
|
||||
{% set MACRO = params.MACRO|default(pause_next_layer.call, True) %}
|
||||
SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_next_layer VALUE="{{ 'enable': ENABLE, 'call': MACRO }}"
|
||||
|
||||
# Usage: SET_PAUSE_AT_LAYER [ENABLE=[0|1]] [LAYER=<number>] [MACRO=<name>]
|
||||
[gcode_macro SET_PAUSE_AT_LAYER]
|
||||
description: Enable/disable a pause if a given layer number is reached
|
||||
gcode:
|
||||
{% set pause_at_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_at_layer %}
|
||||
{% set ENABLE = params.ENABLE|int != 0 if params.ENABLE is defined
|
||||
else params.LAYER is defined %}
|
||||
{% set LAYER = params.LAYER|default(pause_at_layer.layer)|int %}
|
||||
{% set MACRO = params.MACRO|default(pause_at_layer.call, True) %}
|
||||
SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_at_layer VALUE="{{ 'enable': ENABLE, 'layer': LAYER, 'call': MACRO }}"
|
||||
|
||||
# Usage: SET_PRINT_STATS_INFO [TOTAL_LAYER=<total_layer_count>] [CURRENT_LAYER= <current_layer>]
|
||||
[gcode_macro SET_PRINT_STATS_INFO]
|
||||
rename_existing: SET_PRINT_STATS_INFO_BASE
|
||||
description: Overwrite, to get pause_next_layer and pause_at_layer feature
|
||||
variable_pause_next_layer: { 'enable': False, 'call': "PAUSE" }
|
||||
variable_pause_at_layer : { 'enable': False, 'layer': 0, 'call': "PAUSE" }
|
||||
gcode:
|
||||
{% if pause_next_layer.enable %}
|
||||
RESPOND TYPE=echo MSG='{"%s, forced by pause_next_layer" % pause_next_layer.call}'
|
||||
{pause_next_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE
|
||||
SET_PAUSE_NEXT_LAYER ENABLE=0
|
||||
{% elif pause_at_layer.enable and params.CURRENT_LAYER is defined and params.CURRENT_LAYER|int == pause_at_layer.layer %}
|
||||
RESPOND TYPE=echo MSG='{"%s, forced by pause_at_layer [%d]" % (pause_at_layer.call, pause_at_layer.layer)}'
|
||||
{pause_at_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE
|
||||
SET_PAUSE_AT_LAYER ENABLE=0
|
||||
{% endif %}
|
||||
SET_PRINT_STATS_INFO_BASE {rawparams}
|
||||
|
||||
##### internal use #####
|
||||
[gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL]
|
||||
description: Helper: park toolhead used in PAUSE and CANCEL_PRINT
|
||||
gcode:
|
||||
##### get user parameters or use default #####
|
||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||
{% set velocity = printer.configfile.settings.pause_resume.recover_velocity %}
|
||||
{% set use_custom = client.use_custom_pos|default(false)|lower == 'true' %}
|
||||
{% set custom_park_x = client.custom_park_x|default(0.0) %}
|
||||
{% set custom_park_y = client.custom_park_y|default(0.0) %}
|
||||
{% set park_dz = client.custom_park_dz|default(2.0)|abs %}
|
||||
{% set sp_hop = client.speed_hop|default(15) * 60 %}
|
||||
{% set sp_move = client.speed_move|default(velocity) * 60 %}
|
||||
##### get config and toolhead values #####
|
||||
{% set origin = printer.gcode_move.homing_origin %}
|
||||
{% set act = printer.gcode_move.gcode_position %}
|
||||
{% set max = printer.toolhead.axis_maximum %}
|
||||
{% set cone = printer.toolhead.cone_start_z|default(max.z) %} ; height as long the toolhead can reach max and min of an delta
|
||||
{% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch']
|
||||
else False %}
|
||||
##### define park position #####
|
||||
{% set z_min = params.Z_MIN|default(0)|float %}
|
||||
{% set z_park = [[(act.z + park_dz), z_min]|max, (max.z - origin.z)]|min %}
|
||||
{% set x_park = params.X if params.X is defined
|
||||
else custom_park_x if use_custom
|
||||
else 0.0 if round_bed
|
||||
else (max.x - 5.0) %}
|
||||
{% set y_park = params.Y if params.Y is defined
|
||||
else custom_park_y if use_custom
|
||||
else (max.y - 5.0) if round_bed and z_park < cone
|
||||
else 0.0 if round_bed
|
||||
else (max.y - 5.0) %}
|
||||
##### end of definitions #####
|
||||
_CLIENT_RETRACT
|
||||
{% if "xyz" in printer.toolhead.homed_axes %}
|
||||
G90
|
||||
G1 Z{z_park} F{sp_hop}
|
||||
G1 X{x_park} Y{y_park} F{sp_move}
|
||||
{% if not printer.gcode_move.absolute_coordinates %} G91 {% endif %}
|
||||
{% else %}
|
||||
RESPOND TYPE=echo MSG='Printer not homed'
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro _CLIENT_EXTRUDE]
|
||||
description: Extrudes, if the extruder is hot enough
|
||||
gcode:
|
||||
##### get user parameters or use default #####
|
||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||
{% set use_fw_retract = (client.use_fw_retract|default(false)|lower == 'true') and (printer.firmware_retraction is defined) %}
|
||||
{% set length = params.LENGTH|default(client.unretract)|default(1.0)|float %}
|
||||
{% set speed = params.SPEED|default(client.speed_unretract)|default(35) %}
|
||||
{% set absolute_extrude = printer.gcode_move.absolute_extrude %}
|
||||
##### end of definitions #####
|
||||
{% if printer.toolhead.extruder != '' %}
|
||||
{% if printer[printer.toolhead.extruder].can_extrude %}
|
||||
{% if use_fw_retract %}
|
||||
{% if length < 0 %}
|
||||
G10
|
||||
{% else %}
|
||||
G11
|
||||
{% endif %}
|
||||
{% else %}
|
||||
M83
|
||||
G1 E{length} F{(speed|float|abs) * 60}
|
||||
{% if absolute_extrude %}
|
||||
M82
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
RESPOND TYPE=echo MSG='{"\"%s\" not hot enough" % printer.toolhead.extruder}'
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro _CLIENT_RETRACT]
|
||||
description: Retracts, if the extruder is hot enough
|
||||
gcode:
|
||||
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
|
||||
{% set length = params.LENGTH|default(client.retract)|default(1.0)|float %}
|
||||
{% set speed = params.SPEED|default(client.speed_retract)|default(35) %}
|
||||
|
||||
_CLIENT_EXTRUDE LENGTH=-{length|float|abs} SPEED={speed|float|abs}
|
||||
|
||||
[gcode_macro _CLIENT_LINEAR_MOVE]
|
||||
description: Linear move with save and restore of the gcode state
|
||||
gcode:
|
||||
{% set x_move = "X" ~ params.X if params.X is defined else "" %}
|
||||
{% set y_move = "Y" ~ params.Y if params.Y is defined else "" %}
|
||||
{% set z_move = "Z" ~ params.Z if params.Z is defined else "" %}
|
||||
{% set e_move = "E" ~ params.E if params.E is defined else "" %}
|
||||
{% set rate = "F" ~ params.F if params.F is defined else "" %}
|
||||
{% set ABSOLUTE = params.ABSOLUTE | default(0) | int != 0 %}
|
||||
{% set ABSOLUTE_E = params.ABSOLUTE_E | default(0) | int != 0 %}
|
||||
SAVE_GCODE_STATE NAME=_client_movement
|
||||
{% if x_move or y_move or z_move %}
|
||||
G9{ 0 if ABSOLUTE else 1 }
|
||||
{% endif %}
|
||||
{% if e_move %}
|
||||
M8{ 2 if ABSOLUTE_E else 3 }
|
||||
{% endif %}
|
||||
G1 { x_move } { y_move } { z_move } { e_move } { rate }
|
||||
RESTORE_GCODE_STATE NAME=_client_movement
|
||||
53
modules/services/printer/nginx.nix
Normal file
53
modules/services/printer/nginx.nix
Normal file
@@ -0,0 +1,53 @@
|
||||
#
|
||||
# System notifications
|
||||
#
|
||||
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
recommendedProxySettings = true;
|
||||
recommendedTlsSettings = true;
|
||||
recommendedGzipSettings = true;
|
||||
recommendedOptimisation = true;
|
||||
virtualHosts = {
|
||||
"home.opel-online.de" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
default = true;
|
||||
locations."/".return = "503";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
security.acme = {
|
||||
acceptTerms = true;
|
||||
defaults = {
|
||||
email = "webmaster@opel-online.de";
|
||||
# server = "https://acme-staging-v02.api.letsencrypt.org/directory";
|
||||
dnsResolver = "9.9.9.9:53";
|
||||
};
|
||||
certs = {
|
||||
"home.opel-online.de" = {
|
||||
domain = "*.home.opel-online.de";
|
||||
dnsProvider = "netcup";
|
||||
environmentFile = config.age.secrets."services/acme/opel-online".path;
|
||||
webroot = null;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
networking.firewall = {
|
||||
enable = true;
|
||||
allowedUDPPorts = [ ];
|
||||
allowedTCPPorts = [ 80 443 ];
|
||||
};
|
||||
|
||||
age.secrets."services/acme/opel-online" = {
|
||||
file = ../../../secrets/services/acme/opel-online.age;
|
||||
owner = "acme";
|
||||
};
|
||||
|
||||
}
|
||||
11
modules/services/printer/osskc.cfg
Normal file
11
modules/services/printer/osskc.cfg
Normal file
@@ -0,0 +1,11 @@
|
||||
[include ./cfgs/misc-macros.cfg]
|
||||
[include ./cfgs/PARKING.cfg]
|
||||
[include ./cfgs/MECHANICAL_GANTRY_CALIBRATION.cfg]
|
||||
[include ./cfgs/CALIBRATION.cfg]
|
||||
[include ./cfgs/kamp/KAMP_Settings.cfg]
|
||||
[include ./cfgs/TEST_SPEED.cfg]
|
||||
|
||||
# NOTE Uncomment the ONE of the following lines if you're using an adxl345
|
||||
# [include ./cfgs/adxl-rp2040.cfg]
|
||||
# [include ./cfgs/adxl-rpi-pico-2x.cfg]
|
||||
# [include ./cfgs/adxl-direct.cfg]
|
||||
284
modules/services/printer/printer.cfg
Normal file
284
modules/services/printer/printer.cfg
Normal file
@@ -0,0 +1,284 @@
|
||||
# This file contains pin mappings for the stock Sovol SV06.
|
||||
#
|
||||
# Find installation instructions at https://github.com/bassamanator/Sovol-SV06-firmware
|
||||
#
|
||||
# See https://www.klipper3d.org/Config_Reference.html for configuration reference.
|
||||
|
||||
[include ./osskc.cfg]
|
||||
[include ./timelapse.cfg]
|
||||
#[include ./cfgs/adxl-rp2040.cfg]
|
||||
|
||||
[mcu]
|
||||
# NOTE Obtain definition by "ls -l /dev/serial/by-id/"
|
||||
serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0
|
||||
restart_method: command
|
||||
|
||||
[printer]
|
||||
kinematics: cartesian
|
||||
max_velocity: 250
|
||||
max_accel: 2800
|
||||
max_z_velocity: 15
|
||||
max_z_accel: 45
|
||||
square_corner_velocity: 5.0
|
||||
|
||||
[input_shaper]
|
||||
shaper_freq_x: 56.0
|
||||
shaper_type_x: zv
|
||||
shaper_freq_y: 55.4
|
||||
shaper_type_y: 2hump_ei
|
||||
|
||||
#####################################################################
|
||||
# X/Y/Z Stepper Settings
|
||||
#####################################################################
|
||||
|
||||
[stepper_x]
|
||||
step_pin: PC2
|
||||
dir_pin: !PB9
|
||||
enable_pin: !PC3
|
||||
microsteps: 128
|
||||
rotation_distance: 40
|
||||
endstop_pin: tmc2209_stepper_x:virtual_endstop
|
||||
position_endstop: 0
|
||||
position_max: 223 # NOTE You can adjust this if you have more room
|
||||
homing_speed: 40
|
||||
homing_retract_dist: 0
|
||||
|
||||
[tmc2209 stepper_x]
|
||||
uart_pin: PC1
|
||||
run_current: 0.860
|
||||
stealthchop_threshold: 0
|
||||
interpolate: False
|
||||
sense_resistor: 0.150
|
||||
uart_address: 3
|
||||
driver_SGTHRS: 81
|
||||
diag_pin: PA5
|
||||
|
||||
[stepper_y]
|
||||
step_pin: PB8
|
||||
dir_pin: PB7
|
||||
enable_pin: !PC3
|
||||
microsteps: 128
|
||||
rotation_distance: 40
|
||||
endstop_pin: tmc2209_stepper_y:virtual_endstop
|
||||
position_endstop: 0
|
||||
position_max: 223 # NOTE You can adjust this if you have more room
|
||||
homing_speed: 40
|
||||
homing_retract_dist: 0
|
||||
|
||||
[tmc2209 stepper_y]
|
||||
uart_pin: PC0
|
||||
run_current: 0.900
|
||||
stealthchop_threshold: 0
|
||||
interpolate: False
|
||||
sense_resistor: 0.150
|
||||
uart_address: 3
|
||||
driver_SGTHRS: 81
|
||||
diag_pin: PA6
|
||||
|
||||
[stepper_z]
|
||||
step_pin: PB6
|
||||
dir_pin: !PB5
|
||||
enable_pin: !PC3
|
||||
microsteps: 128
|
||||
rotation_distance: 4
|
||||
endstop_pin: probe:z_virtual_endstop
|
||||
position_min: -4
|
||||
position_max: 258 # NOTE You can adjust this if you have more room
|
||||
homing_speed: 5
|
||||
|
||||
[tmc2209 stepper_z]
|
||||
uart_pin: PA15
|
||||
run_current: 1.000
|
||||
stealthchop_threshold: 0
|
||||
interpolate: False
|
||||
sense_resistor: 0.150
|
||||
uart_address: 3
|
||||
diag_pin: PA7
|
||||
|
||||
#####################################################################
|
||||
# Extruder
|
||||
#####################################################################
|
||||
|
||||
[extruder]
|
||||
step_pin: PB4
|
||||
dir_pin: !PB3
|
||||
enable_pin: !PC3
|
||||
microsteps: 128
|
||||
rotation_distance: 4.65 # NOTE Calibrate e-steps https://www.klipper3d.org/Rotation_Distance.html#calibrating-rotation_distance-on-extruders, https://github.com/bassamanator/everything-sovol-sv06/blob/main/howto.md#calibrate-esteps
|
||||
nozzle_diameter: 0.400
|
||||
filament_diameter: 1.750
|
||||
heater_pin: PA1
|
||||
sensor_type: EPCOS 100K B57560G104F
|
||||
sensor_pin: PC5
|
||||
#control: pid
|
||||
#pid_kd: 86.991
|
||||
#pid_kp: 21.479
|
||||
#pid_ki: 1.326
|
||||
min_temp: 0
|
||||
max_temp: 300
|
||||
max_extrude_only_distance: 150.0
|
||||
max_extrude_cross_section: 5 # NOTE Needed for KAMP purge
|
||||
pressure_advance: 0.05
|
||||
|
||||
[tmc2209 extruder]
|
||||
uart_pin: PC14
|
||||
run_current: 0.550
|
||||
stealthchop_threshold: 0
|
||||
interpolate: False
|
||||
sense_resistor: 0.150
|
||||
uart_address: 3
|
||||
|
||||
#####################################################################
|
||||
# Bed Heater
|
||||
#####################################################################
|
||||
|
||||
[heater_bed]
|
||||
heater_pin: PA2
|
||||
sensor_type: EPCOS 100K B57560G104F
|
||||
sensor_pin: PC4
|
||||
#control: pid
|
||||
#pid_kp: 64.440
|
||||
#pid_ki: 0.773
|
||||
#pid_kd: 1343.571
|
||||
min_temp: 0
|
||||
max_temp: 110
|
||||
|
||||
#####################################################################
|
||||
# Probe Related
|
||||
#####################################################################
|
||||
|
||||
[probe]
|
||||
pin: PB1
|
||||
x_offset: 27
|
||||
y_offset: -20
|
||||
#z_offset: 0
|
||||
samples: 3
|
||||
samples_result: median
|
||||
samples_tolerance: 0.01
|
||||
samples_tolerance_retries: 5
|
||||
|
||||
[safe_z_home]
|
||||
home_xy_position: 84.50, 135 # NOTE The probe is at the center of the bed.
|
||||
speed: 100.0
|
||||
z_hop: 10
|
||||
z_hop_speed: 15
|
||||
|
||||
[bed_mesh]
|
||||
speed: 175
|
||||
mesh_min: 27, 6 # probe as close to origin as possible while remaining fully on the bed
|
||||
mesh_max: 222, 203 # (x.position_max - 1), (y.position_max - abs(y_offset)) ; probe as far as possible from the origin while remaining fully on the bed
|
||||
probe_count: 5,5
|
||||
algorithm: bicubic
|
||||
fade_start: 1
|
||||
fade_end: 10
|
||||
fade_target: 0
|
||||
|
||||
[axis_twist_compensation]
|
||||
calibrate_start_x: 27 # probe x coor at furthest left ; abs(x_offset)
|
||||
calibrate_end_x: 195 # probe x coor at furthest right ; (x.position_max - abs(x_offset) - 1)
|
||||
calibrate_y: 115
|
||||
|
||||
#####################################################################
|
||||
# Fans
|
||||
#####################################################################
|
||||
|
||||
[fan]
|
||||
pin: PA0
|
||||
|
||||
#####################################################################
|
||||
# Misc
|
||||
#####################################################################
|
||||
|
||||
[display]
|
||||
lcd_type: st7920
|
||||
cs_pin: PB12
|
||||
sclk_pin: PB13
|
||||
sid_pin: PB15
|
||||
encoder_pins: ^PB14, ^PB10
|
||||
click_pin: ^!PB2
|
||||
|
||||
[bed_screws]
|
||||
screw1_name: front left
|
||||
screw1: 26.5, 31
|
||||
screw2_name: front right
|
||||
screw2: 196.75, 31
|
||||
screw3_name: back right
|
||||
screw3: 196.75, 201
|
||||
screw4_name: back left
|
||||
screw4: 26.5, 201
|
||||
|
||||
[screws_tilt_adjust]
|
||||
screw1_name: center
|
||||
screw1: 84.50, 135
|
||||
screw2_name: front left
|
||||
screw2: 0, 51
|
||||
screw3_name: front right
|
||||
screw3: 169.75, 51
|
||||
screw4_name: back right
|
||||
screw4: 169.75, 221
|
||||
screw5_name: back left
|
||||
screw5: 0, 221
|
||||
horizontal_move_z: 10
|
||||
screw_thread: CCW-M4
|
||||
|
||||
[output_pin beeper]
|
||||
pin: PC6
|
||||
value: 0
|
||||
shutdown_value: 0
|
||||
pwm: True
|
||||
cycle_time: 0.0005 ; Default beeper tone in kHz. 1 / 0.0005 = 2000Hz (2kHz)
|
||||
|
||||
[filament_switch_sensor filament_sensor]
|
||||
switch_pin: PA4 # "Pulled-high"
|
||||
pause_on_runout: True
|
||||
insert_gcode:
|
||||
M117 Insert Detected
|
||||
{ action_respond_info("Insert Detected") }
|
||||
runout_gcode:
|
||||
M117 Runout Detected
|
||||
{ action_respond_info("Runout Detected") }
|
||||
CONDITIONAL_BEEP i=3 dur=300 freq=400
|
||||
|
||||
[skew_correction]
|
||||
|
||||
#*# <---------------------- SAVE_CONFIG ---------------------->
|
||||
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
|
||||
#*#
|
||||
#*# [heater_bed]
|
||||
#*# control = pid
|
||||
#*# pid_kp = 68.420
|
||||
#*# pid_ki = 1.068
|
||||
#*# pid_kd = 1095.581
|
||||
#*#
|
||||
#*# [extruder]
|
||||
#*# control = pid
|
||||
#*# pid_kp = 22.905
|
||||
#*# pid_ki = 1.483
|
||||
#*# pid_kd = 88.472
|
||||
#*#
|
||||
#*# [probe]
|
||||
#*# z_offset = 1.410
|
||||
#*#
|
||||
#*# [bed_mesh default]
|
||||
#*# version = 1
|
||||
#*# points =
|
||||
#*# -0.052344, -0.023750, -0.024063, -0.022500, -0.039219
|
||||
#*# -0.029688, -0.011563, -0.011406, -0.013750, -0.048750
|
||||
#*# -0.038750, -0.023281, -0.039375, -0.036875, -0.067188
|
||||
#*# -0.035156, -0.035000, -0.035781, -0.034375, -0.065313
|
||||
#*# -0.024688, -0.015781, -0.011406, -0.021094, -0.022500
|
||||
#*# x_count = 5
|
||||
#*# y_count = 5
|
||||
#*# mesh_x_pps = 2
|
||||
#*# mesh_y_pps = 2
|
||||
#*# algo = lagrange
|
||||
#*# tension = 0.2
|
||||
#*# min_x = 27.0
|
||||
#*# max_x = 222.0
|
||||
#*# min_y = 6.0
|
||||
#*# max_y = 203.0
|
||||
#*#
|
||||
#*# [skew_correction CaliFlower]
|
||||
#*# xy_skew = -0.0001004783772044709
|
||||
#*# xz_skew = 0.0
|
||||
#*# yz_skew = 0.0
|
||||
427
modules/services/printer/timelapse.cfg
Normal file
427
modules/services/printer/timelapse.cfg
Normal file
@@ -0,0 +1,427 @@
|
||||
# Timelapse klipper macro definition
|
||||
#
|
||||
# Copyright (C) 2021 Christoph Frei <fryakatkop@gmail.com>
|
||||
# Copyright (C) 2021 Alex Zellner <alexander.zellner@googlemail.com>
|
||||
#
|
||||
# This file may be distributed under the terms of the GNU GPLv3 license
|
||||
#
|
||||
# Macro version 1.15
|
||||
#
|
||||
|
||||
##### DO NOT CHANGE ANY MACRO!!! #####
|
||||
|
||||
##########################################################################
|
||||
# #
|
||||
# GET_TIMELAPSE_SETUP: Print the Timelapse setup to console #
|
||||
# #
|
||||
##########################################################################
|
||||
|
||||
[gcode_macro GET_TIMELAPSE_SETUP]
|
||||
description: Print the Timelapse setup
|
||||
gcode:
|
||||
{% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %}
|
||||
{% set output_txt = ["Timelapse Setup:"] %}
|
||||
{% set _dummy = output_txt.append("enable: %s" % tl.enable) %}
|
||||
{% set _dummy = output_txt.append("park: %s" % tl.park.enable) %}
|
||||
{% if tl.park.enable %}
|
||||
{% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %}
|
||||
{% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %}
|
||||
{% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %}
|
||||
{% endif %}
|
||||
{% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %}
|
||||
{% if not tl.extruder.fw_retract %}
|
||||
{% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %}
|
||||
{% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %}
|
||||
{% endif %}
|
||||
{% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %}
|
||||
{action_respond_info(output_txt|join("\n"))}
|
||||
|
||||
################################################################################################
|
||||
# #
|
||||
# Use _SET_TIMELAPSE_SETUP [ENABLE=value] [VERBOSE=value] [PARK_ENABLE=value] [PARK_POS=value] #
|
||||
# [PARK_TIME=value] [CUSTOM_POS_X=value] [CUSTOM_POS_Y=value] #
|
||||
# [CUSTOM_POS_DZ=value][TRAVEL_SPEED=value] [RETRACT_SPEED=value] #
|
||||
# [EXTRUDE_SPEED=value] [EXTRUDE_DISTANCE=value] #
|
||||
# [RETRACT_DISTANCE=value] [FW_RETRACT=value] #
|
||||
# #
|
||||
################################################################################################
|
||||
|
||||
[gcode_macro _SET_TIMELAPSE_SETUP]
|
||||
description: Set user parameters for timelapse
|
||||
gcode:
|
||||
{% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %}
|
||||
##### get min and max bed size #####
|
||||
{% set min = printer.toolhead.axis_minimum %}
|
||||
{% set max = printer.toolhead.axis_maximum %}
|
||||
{% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch']
|
||||
else False %}
|
||||
{% set park = {'min' : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3),
|
||||
'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)},
|
||||
'max' : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3),
|
||||
'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)},
|
||||
'center': {'x': (max.x-(max.x-min.x)/2)|round(3),
|
||||
'y': (max.y-(max.y-min.y)/2)|round(3)}} %}
|
||||
##### set new values #####
|
||||
{% if params.ENABLE %}
|
||||
{% if params.ENABLE|lower is in ['true', 'false'] %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False}
|
||||
{% else %}
|
||||
{action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.VERBOSE %}
|
||||
{% if params.VERBOSE|lower is in ['true', 'false'] %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False}
|
||||
{% else %}
|
||||
{action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.CUSTOM_POS_X %}
|
||||
{% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %}
|
||||
{% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.CUSTOM_POS_Y %}
|
||||
{% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %}
|
||||
{% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.CUSTOM_POS_DZ %}
|
||||
{% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %}
|
||||
{% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.PARK_ENABLE %}
|
||||
{% if params.PARK_ENABLE|lower is in ['true', 'false'] %}
|
||||
{% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %}
|
||||
{% else %}
|
||||
{action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.PARK_POS %}
|
||||
{% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %}
|
||||
{% set dic = {'center' : {'x': park.center.x , 'y': park.center.y , 'dz': 1 },
|
||||
'front_left' : {'x': park.min.x , 'y': park.min.y , 'dz': 0 },
|
||||
'front_right' : {'x': park.max.x , 'y': park.min.y , 'dz': 0 },
|
||||
'back_left' : {'x': park.min.x , 'y': park.max.y , 'dz': 0 },
|
||||
'back_right' : {'x': park.max.x , 'y': park.max.y , 'dz': 0 },
|
||||
'custom' : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz},
|
||||
'x_only' : {'x': tl.park.custom.x, 'y': 'none' , 'dz': tl.park.custom.dz},
|
||||
'y_only' : {'x': 'none' , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %}
|
||||
{% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %}
|
||||
{% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %}
|
||||
{% else %}
|
||||
{action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]"
|
||||
% params.PARK_POS|upper)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.PARK_TIME %}
|
||||
{% if params.PARK_TIME|float >= 0.0 %}
|
||||
{% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}"
|
||||
{% if params.TRAVEL_SPEED %}
|
||||
{% if params.TRAVEL_SPEED|float > 0.0 %}
|
||||
{% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.RETRACT_SPEED %}
|
||||
{% if params.RETRACT_SPEED|float > 0.0 %}
|
||||
{% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.EXTRUDE_SPEED %}
|
||||
{% if params.EXTRUDE_SPEED|float > 0.0 %}
|
||||
{% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}"
|
||||
{% if params.EXTRUDE_DISTANCE %}
|
||||
{% if params.EXTRUDE_DISTANCE|float >= 0.0 %}
|
||||
{% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.RETRACT_DISTANCE %}
|
||||
{% if params.RETRACT_DISTANCE|float >= 0.0 %}
|
||||
{% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %}
|
||||
{% else %}
|
||||
{action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if params.FW_RETRACT %}
|
||||
{% if params.FW_RETRACT|lower is in ['true', 'false'] %}
|
||||
{% if 'firmware_retraction' in printer.configfile.settings %}
|
||||
{% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %}
|
||||
{% else %}
|
||||
{% set _dummy = tl.extruder.update({'fw_retract':False}) %}
|
||||
{% if params.FW_RETRACT|capitalize == 'True' %}
|
||||
{action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}"
|
||||
{% if printer.configfile.settings['gcode_macro pause'] is defined %}
|
||||
{% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %}
|
||||
{% endif %}
|
||||
{% if printer.configfile.settings['gcode_macro resume'] is defined %}
|
||||
{% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %}
|
||||
{% endif %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}"
|
||||
|
||||
##########################################################################
|
||||
# #
|
||||
# TIMELAPSE_TAKE_FRAME: take the next picture #
|
||||
# #
|
||||
##########################################################################
|
||||
|
||||
######################### definition #########################
|
||||
## enable: enable or disable the next frame. Valid inputs: [True, False]
|
||||
## takingframe: internal use. Valid inputs: [True, False]
|
||||
##
|
||||
## park.enable: enable or disable to park the head while taking a picture. Valid inputs: [True, False]
|
||||
## park.pos : used position for parking. Valid inputs: [center, front_left, front_right, back_left, back_right, custom, x_only, y_only]
|
||||
## park.time : used for the debug macro. Time in s
|
||||
## park.custom.x, park.custom.y: coordinates of the custom parkposition. Unit [mm]
|
||||
## park.custom.dz : custom z hop for the picture. Unit [mm]
|
||||
## park.coord : internal use
|
||||
##
|
||||
## extruder.fw_retract: enable disable fw retraction [True,False]
|
||||
## extruder.extrude : filament extruded at the end of park. Unit [mm]
|
||||
## extruder.retract : filament retract at the start of park. Unit [mm]
|
||||
##
|
||||
## speed.travel : used speed for travel from and to the park positon. Unit: [mm/min]
|
||||
## speed.retract: used speed for retract [mm/min]
|
||||
## speed.extrude: used speed for extrude [mm/min]
|
||||
##
|
||||
## verbose: Enable mesage output of TIMELAPSE_TAKE_FRAME
|
||||
##
|
||||
## check_time: time when the status of the taken picture is checked. Default 0.5 sec
|
||||
##
|
||||
## restore.absolute.coordinates: internal use
|
||||
## restore.absolute.extrude : internal use
|
||||
## restore.speed : internal use
|
||||
## restore.e : internal use
|
||||
## restore.factor.speed : internal use
|
||||
## restore.factor.extrude : internal use
|
||||
##
|
||||
## macro.pause : internal use
|
||||
## macro.resume : internal use
|
||||
##
|
||||
## is_paused: internal use
|
||||
###############################################################
|
||||
[gcode_macro TIMELAPSE_TAKE_FRAME]
|
||||
description: Take Timelapse shoot
|
||||
variable_enable: False
|
||||
variable_takingframe: False
|
||||
variable_park: {'enable': False,
|
||||
'pos' : 'center',
|
||||
'time' : 0.1,
|
||||
'custom': {'x': 0, 'y': 0, 'dz': 0},
|
||||
'coord' : {'x': 0, 'y': 0, 'dz': 0}}
|
||||
variable_extruder: {'fw_retract': False,
|
||||
'retract': 1.0,
|
||||
'extrude': 1.0}
|
||||
variable_speed: {'travel': 100,
|
||||
'retract': 15,
|
||||
'extrude': 15}
|
||||
variable_verbose: True
|
||||
variable_check_time: 0.5
|
||||
variable_restore: {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}}
|
||||
variable_macro: {'pause': 'PAUSE', 'resume': 'RESUME'}
|
||||
variable_is_paused: False
|
||||
gcode:
|
||||
{% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %}
|
||||
{% if enable %}
|
||||
{% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or
|
||||
(not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %}
|
||||
{% if park.enable %}
|
||||
{% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '',
|
||||
'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '',
|
||||
'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %}
|
||||
{% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates,
|
||||
'extrude' : printer.gcode_move.absolute_extrude},
|
||||
'speed' : printer.gcode_move.speed,
|
||||
'e' : printer.gcode_move.gcode_position.e,
|
||||
'factor' : {'speed' : printer.gcode_move.speed_factor,
|
||||
'extrude': printer.gcode_move.extrude_factor}} %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}"
|
||||
{% if not printer[printer.toolhead.extruder].can_extrude %}
|
||||
{% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %}
|
||||
{% else %}
|
||||
{% if extruder.fw_retract %}
|
||||
G10
|
||||
{% else %}
|
||||
M83 ; insure relative extrusion
|
||||
G0 E-{extruder.retract} F{speed.retract * 60}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True
|
||||
{macro.pause} ; execute the klipper PAUSE command
|
||||
SET_GCODE_OFFSET X=0 Y=0 ; this will insure that the head parks always at the same position in a multi setup
|
||||
G90 ; insure absolute move
|
||||
{% if "xyz" not in printer.toolhead.homed_axes %}
|
||||
{% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %}
|
||||
{% else %}
|
||||
G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60}
|
||||
{% endif %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True
|
||||
UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION={check_time}
|
||||
M400
|
||||
{% endif %}
|
||||
_TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %}
|
||||
{% endif %}
|
||||
|
||||
[gcode_macro _TIMELAPSE_NEW_FRAME]
|
||||
description: action call for timelapse shoot. must be a seperate macro
|
||||
gcode:
|
||||
{action_call_remote_method("timelapse_newframe",
|
||||
macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park,
|
||||
hyperlapse=params.HYPERLAPSE)}
|
||||
|
||||
[delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME]
|
||||
gcode:
|
||||
{% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %}
|
||||
{% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %}
|
||||
{% if tl.takingframe %}
|
||||
UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION={tl.check_time}
|
||||
{% else %}
|
||||
{tl.macro.resume} VELOCITY={tl.speed.travel} ; execute the klipper RESUME command
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False
|
||||
{% if not printer[printer.toolhead.extruder].can_extrude %}
|
||||
{action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")}
|
||||
{% else %}
|
||||
{% if tl.extruder.fw_retract %}
|
||||
G11
|
||||
{% else %}
|
||||
G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60}
|
||||
G0 F{tl.restore.speed}
|
||||
{% if tl.restore.absolute.extrude %}
|
||||
M82
|
||||
G92 E{tl.restore.e}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if tl.restore.factor.speed != factor.speed %} M220 S{(factor.speed*100)|round(0)} {% endif %}
|
||||
{% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %}
|
||||
{% if not tl.restore.absolute.coordinates %} G91 {% endif %}
|
||||
{% endif %}
|
||||
|
||||
####################################################################################################
|
||||
# #
|
||||
# HYPERLAPSE: Starts or stops a Hyperlapse video #
|
||||
# Usage: HYPERLAPSE ACTION=START [CYCLE=time] starts a hyperlapse with cycle time (default 30 sec) #
|
||||
# HYPERLAPSE ACTION=STOP stops the hyperlapse recording #
|
||||
# #
|
||||
####################################################################################################
|
||||
|
||||
######################### definition #########################
|
||||
## cycle: cycle time in seconds
|
||||
## run: internal use [True/False]
|
||||
###############################################################
|
||||
[gcode_macro HYPERLAPSE]
|
||||
description: Start/Stop a hyperlapse recording
|
||||
variable_cycle: 0
|
||||
variable_run: False
|
||||
gcode:
|
||||
{% set cycle = params.CYCLE|default(30)|int %}
|
||||
{% if params.ACTION and params.ACTION|lower == 'start' %}
|
||||
{action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)}
|
||||
SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True
|
||||
SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle}
|
||||
UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle}
|
||||
TIMELAPSE_TAKE_FRAME HYPERLAPSE=True
|
||||
{% elif params.ACTION and params.ACTION|lower == 'stop' %}
|
||||
{% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %}
|
||||
SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False
|
||||
UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0
|
||||
{% else %}
|
||||
{action_raise_error("Hyperlapse: No valid input parameter
|
||||
Use:
|
||||
- HYPERLAPSE ACTION=START [CYCLE=time]
|
||||
- HYPERLAPSE ACTION=STOP")}
|
||||
{% endif %}
|
||||
|
||||
[delayed_gcode _HYPERLAPSE_LOOP]
|
||||
gcode:
|
||||
UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle}
|
||||
TIMELAPSE_TAKE_FRAME HYPERLAPSE=True
|
||||
|
||||
##########################################################################
|
||||
# #
|
||||
# TIMELAPSE_RENDER: Render the video at print end #
|
||||
# #
|
||||
##########################################################################
|
||||
|
||||
######################### definition #########################
|
||||
## render: internal use. Valid inputs: [True, False]
|
||||
## run_identifier: internal use. Valid input [0 .. 3]
|
||||
###############################################################
|
||||
[gcode_macro TIMELAPSE_RENDER]
|
||||
description: Render Timelapse video and wait for the result
|
||||
variable_render: False
|
||||
variable_run_identifier: 0
|
||||
gcode:
|
||||
{action_respond_info("Timelapse: Rendering started")}
|
||||
{action_call_remote_method("timelapse_render", byrendermacro="True")}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True
|
||||
{printer.configfile.settings['gcode_macro pause'].rename_existing} ; execute the klipper PAUSE command
|
||||
UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5
|
||||
|
||||
[delayed_gcode _WAIT_TIMELAPSE_RENDER]
|
||||
gcode:
|
||||
{% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %}
|
||||
SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1}
|
||||
{% if printer['gcode_macro TIMELAPSE_RENDER'].render %}
|
||||
M117 Rendering {['-','\\','|','/'][ri]}
|
||||
UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5
|
||||
{% else %}
|
||||
{action_respond_info("Timelapse: Rendering finished")}
|
||||
M117
|
||||
{printer.configfile.settings['gcode_macro resume'].rename_existing} ; execute the klipper RESUME command
|
||||
{% endif %}
|
||||
|
||||
##########################################################################
|
||||
# #
|
||||
# TEST_STREAM_DELAY: Helper macro to find stream and park delay #
|
||||
# #
|
||||
##########################################################################
|
||||
|
||||
[gcode_macro TEST_STREAM_DELAY]
|
||||
description: Helper macro to find stream and park delay
|
||||
gcode:
|
||||
{% set min = printer.toolhead.axis_minimum %}
|
||||
{% set max = printer.toolhead.axis_maximum %}
|
||||
{% set act = printer.toolhead.position %}
|
||||
{% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %}
|
||||
{% if act.z > 5.0 %}
|
||||
G0 X{min.x + 5.0} F{tl.speed.travel|int * 60}
|
||||
G0 X{(max.x-min.x)/2}
|
||||
G4 P{tl.park.time|float * 1000}
|
||||
_TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE
|
||||
G0 X{max.x - 5.0}
|
||||
{% else %}
|
||||
{action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)}
|
||||
{% endif %}
|
||||
@@ -17,7 +17,9 @@
|
||||
./nextcloud.nix
|
||||
./matrix.nix
|
||||
./coturn.nix
|
||||
./ollama.nix
|
||||
./hydra.nix
|
||||
./mealie.nix
|
||||
# ./ollama.nix
|
||||
]
|
||||
|
||||
# picom, polybar and sxhkd are pulled from desktop module
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
DOMAIN = "git.kabtop.de";
|
||||
SSH_PORT = 2220;
|
||||
ENABLE_GZIP = true;
|
||||
LFS_START_SERVER = true;
|
||||
LFS_ALLOW_PURE_SSH = true;
|
||||
};
|
||||
security = {
|
||||
MIN_PASSWORD_LENGTH = 8;
|
||||
@@ -40,7 +42,7 @@
|
||||
};
|
||||
ui = {
|
||||
SHOW_USER_EMAIL = false;
|
||||
DEFAULT_THEME = "arc-green";
|
||||
DEFAULT_THEME = "gitea-dark";
|
||||
};
|
||||
# openid = {
|
||||
# ENABLE_OPENID_SIGNIN = true;
|
||||
@@ -64,6 +66,9 @@
|
||||
actions = {
|
||||
ENABLED = true;
|
||||
};
|
||||
indexer = {
|
||||
REPO_INDEXER_ENABLED = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
77
modules/services/server/hydra.nix
Normal file
77
modules/services/server/hydra.nix
Normal file
@@ -0,0 +1,77 @@
|
||||
{ lib, config, pkgs, ... }:
|
||||
|
||||
{
|
||||
services = {
|
||||
hydra = {
|
||||
enable = true;
|
||||
hydraURL = "https://hydra.ci.kabtop.de";
|
||||
listenHost = "127.0.0.1";
|
||||
port = 3001;
|
||||
notificationSender = "hydra@kabtop.de";
|
||||
useSubstitutes = true;
|
||||
minimumDiskFree = 50;
|
||||
maxServers = 10;
|
||||
};
|
||||
nix-serve = {
|
||||
enable = true;
|
||||
port = 5001;
|
||||
bindAddress = "127.0.0.1";
|
||||
secretKeyFile = config.age.secrets."keys/nixsign".path;
|
||||
};
|
||||
nginx = {
|
||||
enable = true;
|
||||
recommendedProxySettings = true;
|
||||
recommendedTlsSettings = true;
|
||||
recommendedGzipSettings = true;
|
||||
recommendedOptimisation = true;
|
||||
virtualHosts = {
|
||||
"ci.kabtop.de" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
default = true;
|
||||
locations."/".return = "503";
|
||||
};
|
||||
"hydra.ci.kabtop.de" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://localhost:3001";
|
||||
extraConfig = ''
|
||||
proxy_set_header X-Forwarded-Port 443;
|
||||
'';
|
||||
};
|
||||
};
|
||||
"cache.ci.kabtop.de" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/".proxyPass = "http://${config.services.nix-serve.bindAddress}:${toString config.services.nix-serve.port}";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nix = {
|
||||
settings = {
|
||||
cores = 5;
|
||||
max-jobs = 1;
|
||||
trusted-users = [
|
||||
"hydra"
|
||||
];
|
||||
allowed-uris = [
|
||||
"github:"
|
||||
"https://github.com/"
|
||||
"git+ssh://github.com/"
|
||||
];
|
||||
};
|
||||
|
||||
extraOptions = ''
|
||||
secret-key-files = ${config.age.secrets."keys/nixsign".path}
|
||||
'';
|
||||
};
|
||||
|
||||
age.secrets."keys/nixsign" = {
|
||||
file = ../../../secrets/keys/nixservepriv.age;
|
||||
owner = "hydra";
|
||||
};
|
||||
|
||||
}
|
||||
@@ -17,12 +17,6 @@ let
|
||||
return 200 '${builtins.toJSON data}';
|
||||
'';
|
||||
in {
|
||||
environment.systemPackages = [
|
||||
pkgs.mautrix-whatsapp
|
||||
pkgs.signald
|
||||
pkgs.mautrix-signal
|
||||
];
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
recommendedTlsSettings = true;
|
||||
@@ -60,6 +54,8 @@ in {
|
||||
};
|
||||
};
|
||||
|
||||
imports = [ ../../kabbone/mautrix-whatsapp.nix ];
|
||||
|
||||
services.matrix-synapse = {
|
||||
enable = true;
|
||||
settings = {
|
||||
@@ -77,11 +73,6 @@ in {
|
||||
];
|
||||
}
|
||||
];
|
||||
app_service_config_files = [
|
||||
config.age.secrets."services/matrix/whatsapp-registration.yml".path
|
||||
config.age.secrets."services/matrix/telegram-registration.yml".path
|
||||
config.age.secrets."services/matrix/signal-registration.yml".path
|
||||
];
|
||||
};
|
||||
extraConfigFiles = [
|
||||
config.age.secrets."services/matrix/synapse.yml".path
|
||||
@@ -92,113 +83,12 @@ in {
|
||||
matrix-synapse = {
|
||||
requires = [ "postgresql.service" ];
|
||||
};
|
||||
mautrix-whatsapp = {
|
||||
description = "Matrix <-> WhatsApp bridge";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network.target" "postgresql.service" "matrix-synapse.service" ];
|
||||
requires = [ "postgresql.service" "matrix-synapse.service" ];
|
||||
script = "${pkgs.mautrix-whatsapp}/bin/mautrix-whatsapp -n --config ${config.age.secrets."services/matrix/mautrix-whatsapp.yml".path}";
|
||||
serviceConfig = {
|
||||
User = "mautrix-whatsapp";
|
||||
Group = "mautrix-whatsapp";
|
||||
Environment = "HOME=/var/lib/mautrix-whatsapp";
|
||||
ReadWritePaths="/var/log/mautrix-whatsapp";
|
||||
NoNewPrivileges=true;
|
||||
MemoryDenyWriteExecute=true;
|
||||
PrivateDevices=true;
|
||||
PrivateTmp=true;
|
||||
ProtectHome=true;
|
||||
ProtectSystem="strict";
|
||||
ProtectControlGroups=true;
|
||||
RestrictSUIDSGID=true;
|
||||
RestrictRealtime=true;
|
||||
LockPersonality=true;
|
||||
ProtectKernelLogs=true;
|
||||
ProtectKernelTunables=true;
|
||||
ProtectHostname=true;
|
||||
ProtectKernelModules=true;
|
||||
PrivateUsers=true;
|
||||
ProtectClock=true;
|
||||
SystemCallArchitectures="native";
|
||||
SystemCallErrorNumber="EPERM";
|
||||
SystemCallFilter="@system-service";
|
||||
};
|
||||
};
|
||||
mautrix-signal = {
|
||||
description = "Matrix <-> Signal bridge";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network.target" "postgresql.service" "matrix-synapse.service" "signald.service" ];
|
||||
requires = [ "postgresql.service" "matrix-synapse.service" "signald.service"];
|
||||
script = "${pkgs.mautrix-signal}/bin/mautrix-signal -n --config ${config.age.secrets."services/matrix/mautrix-signal.yml".path}";
|
||||
serviceConfig = {
|
||||
User = "mautrix-signal";
|
||||
Group = "mautrix-signal";
|
||||
Environment = "HOME=/var/lib/mautrix-signal";
|
||||
ReadWritePaths= [
|
||||
"/var/run/signald/signald.sock"
|
||||
"/var/log/mautrix-signal"
|
||||
];
|
||||
NoNewPrivileges=true;
|
||||
MemoryDenyWriteExecute=true;
|
||||
PrivateDevices=true;
|
||||
PrivateTmp=true;
|
||||
ProtectHome=true;
|
||||
ProtectSystem="strict";
|
||||
ProtectControlGroups=true;
|
||||
RestrictSUIDSGID=true;
|
||||
RestrictRealtime=true;
|
||||
LockPersonality=true;
|
||||
ProtectKernelLogs=true;
|
||||
ProtectKernelTunables=true;
|
||||
ProtectHostname=true;
|
||||
ProtectKernelModules=true;
|
||||
PrivateUsers=true;
|
||||
ProtectClock=true;
|
||||
SystemCallArchitectures="native";
|
||||
SystemCallErrorNumber="EPERM";
|
||||
SystemCallFilter="@system-service";
|
||||
};
|
||||
};
|
||||
};
|
||||
systemd.tmpfiles.rules = [
|
||||
"d /var/log/mautrix-whatsapp - mautrix-whatsapp mautrix-whatsapp"
|
||||
"d /var/log/mautrix-signal - mautrix-signal mautrix-signal"
|
||||
];
|
||||
|
||||
users = {
|
||||
users = {
|
||||
mautrix-whatsapp = {
|
||||
uid = 3001;
|
||||
group = "mautrix-whatsapp";
|
||||
isSystemUser = true;
|
||||
};
|
||||
mautrix-telegram = {
|
||||
uid = 3002;
|
||||
group = "mautrix-telegram";
|
||||
isSystemUser = true;
|
||||
};
|
||||
mautrix-signal = {
|
||||
uid = 3003;
|
||||
group = "mautrix-signal";
|
||||
isSystemUser = true;
|
||||
};
|
||||
};
|
||||
groups = {
|
||||
mautrix-whatsapp = {
|
||||
gid = 3001;
|
||||
};
|
||||
mautrix-telegram = {
|
||||
gid = 3002;
|
||||
};
|
||||
mautrix-signal = {
|
||||
gid = 3003;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
services = {
|
||||
mautrix-telegram = {
|
||||
enable = true;
|
||||
registerToSynapse = true;
|
||||
environmentFile = config.age.secrets."services/matrix/mautrix-telegram.env".path;
|
||||
settings = {
|
||||
homeserver = {
|
||||
@@ -207,7 +97,6 @@ in {
|
||||
};
|
||||
appservice = {
|
||||
hostname = "127.0.0.1";
|
||||
port = "29317";
|
||||
provisioning.enabled = false;
|
||||
id = "telegram";
|
||||
public = {
|
||||
@@ -255,10 +144,93 @@ in {
|
||||
};
|
||||
};
|
||||
};
|
||||
signald = {
|
||||
enable = true;
|
||||
user = "mautrix-signal";
|
||||
group = "mautrix-signal";
|
||||
mautrix-signal = {
|
||||
enable = true;
|
||||
registerToSynapse = true;
|
||||
environmentFile = config.age.secrets."services/matrix/mautrix-signal.env".path;
|
||||
settings = {
|
||||
homeserver = {
|
||||
address = "http://localhost:8008";
|
||||
domain = "kabtop.de";
|
||||
};
|
||||
appservice = {
|
||||
hostname = "127.0.0.1";
|
||||
id = "signal";
|
||||
as_token = "$MAUTRIX_SIGNAL_AS_TOKEN";
|
||||
hs_token = "$MAUTRIX_SIGNAL_HS_TOKEN";
|
||||
};
|
||||
database = {
|
||||
type = "postgres";
|
||||
uri = "$MAUTRIX_SIGNAL_APPSERVICE_DATABASE";
|
||||
};
|
||||
encryption = {
|
||||
allow = true;
|
||||
default = true;
|
||||
verification_levels = {
|
||||
receive = "cross-signed-untrusted";
|
||||
send = "cross-signed-untrusted";
|
||||
};
|
||||
pickle_key = "$MAUTRIX_SIGNAL_ENCRYPTION_PICKLE_KEY";
|
||||
};
|
||||
backfill = {
|
||||
enabled = true;
|
||||
};
|
||||
bridge = {
|
||||
permissions = {
|
||||
"@kabbone:kabtop.de" = "admin";
|
||||
};
|
||||
};
|
||||
logging = {
|
||||
min_level = "warn";
|
||||
writers = [
|
||||
{
|
||||
format = "pretty-colored";
|
||||
type = "stdout";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
kabbone_mautrix-whatsapp = {
|
||||
enable = true;
|
||||
registerToSynapse = true;
|
||||
environmentFile = config.age.secrets."services/matrix/mautrix-whatsapp.env".path;
|
||||
settings = {
|
||||
homeserver = {
|
||||
address = "http://localhost:8008";
|
||||
domain = "kabtop.de";
|
||||
};
|
||||
appservice = {
|
||||
hostname = "127.0.0.1";
|
||||
id = "whatsapp";
|
||||
as_token = "$MAUTRIX_WHATSAPP_AS_TOKEN";
|
||||
hs_token = "$MAUTRIX_WHATSAPP_HS_TOKEN";
|
||||
};
|
||||
database = {
|
||||
type = "postgres";
|
||||
uri = "$MAUTRIX_WHATSAPP_APPSERVICE_DATABASE";
|
||||
};
|
||||
encryption = {
|
||||
allow = true;
|
||||
default = true;
|
||||
verification_levels = {
|
||||
receive = "cross-signed-untrusted";
|
||||
send = "cross-signed-untrusted";
|
||||
};
|
||||
pickle_key = "$MAUTRIX_WHATSAPP_ENCRYPTION_PICKLE_KEY";
|
||||
};
|
||||
network = {
|
||||
history_sync.request_full_sync = true;
|
||||
};
|
||||
bridge = {
|
||||
permissions = {
|
||||
"@kabbone:kabtop.de" = "admin";
|
||||
};
|
||||
};
|
||||
logging = {
|
||||
min_level = "warn";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -270,25 +242,12 @@ in {
|
||||
file = ../../../secrets/services/matrix/mautrix-telegram.age;
|
||||
owner = "mautrix-telegram";
|
||||
};
|
||||
age.secrets."services/matrix/mautrix-whatsapp.yml" = {
|
||||
age.secrets."services/matrix/mautrix-whatsapp.env" = {
|
||||
file = ../../../secrets/services/matrix/mautrix-whatsapp.age;
|
||||
owner = "mautrix-whatsapp";
|
||||
};
|
||||
age.secrets."services/matrix/mautrix-signal.yml" = {
|
||||
age.secrets."services/matrix/mautrix-signal.env" = {
|
||||
file = ../../../secrets/services/matrix/mautrix-signal.age;
|
||||
owner = "mautrix-signal";
|
||||
};
|
||||
age.secrets."services/matrix/telegram-registration.yml" = {
|
||||
file = ../../../secrets/services/matrix/telegram-registration.age;
|
||||
owner = "matrix-synapse";
|
||||
};
|
||||
age.secrets."services/matrix/whatsapp-registration.yml" = {
|
||||
file = ../../../secrets/services/matrix/whatsapp-registration.age;
|
||||
owner = "matrix-synapse";
|
||||
};
|
||||
age.secrets."services/matrix/signal-registration.yml" = {
|
||||
file = ../../../secrets/services/matrix/signal-registration.age;
|
||||
owner = "matrix-synapse";
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
54
modules/services/server/mealie.nix
Normal file
54
modules/services/server/mealie.nix
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
{ config, pkgs, pkgs-unstable, ... }:
|
||||
{
|
||||
|
||||
services.mealie = {
|
||||
enable = true;
|
||||
#package = pkgs-unstable.mealie;
|
||||
listenAddress = "127.0.0.1";
|
||||
credentialsFile = config.age.secrets."services/mealie/credentialsFile".path;
|
||||
settings = {
|
||||
ALLOW_SIGNUP = "false";
|
||||
DB_ENGINE = "postgres";
|
||||
TZ = "Europe/Berlin";
|
||||
PGID = "911";
|
||||
PUID = "911";
|
||||
};
|
||||
};
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
virtualHosts = {
|
||||
"mealie.kabtop.de" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/".proxyPass = "http://localhost:9000";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
users = {
|
||||
users = {
|
||||
mealie = {
|
||||
uid = 911;
|
||||
group = "mealie";
|
||||
isSystemUser = true;
|
||||
};
|
||||
};
|
||||
groups = {
|
||||
mealie = {
|
||||
gid = 911;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
age.secrets."services/mealie/credentialsFile" = {
|
||||
file = ../../../secrets/services/mealie/credentialsFile.age;
|
||||
owner = "mealie";
|
||||
};
|
||||
|
||||
security.acme.defaults.email = "webmaster@kabtop.de";
|
||||
security.acme.defaults.webroot = "/var/lib/acme/acme-challenge";
|
||||
security.acme.acceptTerms = true;
|
||||
|
||||
}
|
||||
@@ -97,7 +97,6 @@ in
|
||||
hypervisor = "qemu";
|
||||
vcpu = 4;
|
||||
mem = 4096;
|
||||
balloonMem = 4096;
|
||||
#kernel = pkgs.linuxKernel.packages.linux_latest;
|
||||
interfaces = [
|
||||
{
|
||||
|
||||
@@ -9,13 +9,16 @@
|
||||
enable = true;
|
||||
hostName = "cloud.kabtop.de";
|
||||
https = true;
|
||||
package = pkgs.nextcloud29;
|
||||
package = pkgs.nextcloud32;
|
||||
database.createLocally = false;
|
||||
notify_push.enable = true;
|
||||
notify_push.enable = false;
|
||||
enableImagemagick = true;
|
||||
maxUploadSize = "512M";
|
||||
caching = {
|
||||
redis = true;
|
||||
apcu = false;
|
||||
apcu = true;
|
||||
};
|
||||
imaginary.enable = true;
|
||||
settings = {
|
||||
log_type = "file";
|
||||
logfile = "nextcloud.log";
|
||||
@@ -26,9 +29,24 @@
|
||||
host = "/run/redis-nextcloud/redis.sock";
|
||||
port = 0;
|
||||
};
|
||||
"memcache.local" = "\\OC\\Memcache\\Redis";
|
||||
"memcache.local" = "\\OC\\Memcache\\APCu";
|
||||
"memcache.distributed" = "\\OC\\Memcache\\Redis";
|
||||
"memcache.locking" = "\\OC\\Memcache\\Redis";
|
||||
"enable_previews" = true;
|
||||
"enabledPreviewproviders" = "
|
||||
array (
|
||||
'OC\Preview\PNG',
|
||||
'OC\Preview\JPEG',
|
||||
'OC\Preview\GIF',
|
||||
'OC\Preview\BMP',
|
||||
'OC\Preview\XBitmap',
|
||||
'OC\Preview\MP3',
|
||||
'OC\Preview\TXT',
|
||||
'OC\Preview\MarkDown',
|
||||
'OC\Preview\OpenDocument',
|
||||
'OC\Preview\Krita',
|
||||
'OC\Preview\HEIC',
|
||||
)";
|
||||
"maintenance_window_start" = "1";
|
||||
};
|
||||
config = {
|
||||
@@ -43,17 +61,6 @@
|
||||
phpOptions = {
|
||||
"opcache.interned_strings_buffer" = "16";
|
||||
};
|
||||
#autoUpdateApps.enable = true;
|
||||
};
|
||||
|
||||
services.onlyoffice = {
|
||||
enable = true;
|
||||
hostname = "docs.cloud.kabtop.de";
|
||||
postgresName = "onlyoffice";
|
||||
postgresHost = "localhost";
|
||||
postgresUser = "onlyoffice";
|
||||
postgresPasswordFile = config.age.secrets."services/nextcloud/onlyofficedb".path;
|
||||
jwtSecretFile = config.age.secrets."services/nextcloud/onlyofficejwt".path;
|
||||
};
|
||||
|
||||
services.redis = {
|
||||
@@ -72,10 +79,6 @@
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
};
|
||||
"${config.services.onlyoffice.hostname}" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -87,14 +90,6 @@
|
||||
file = ../../../secrets/services/nextcloud/adminpassFile.age;
|
||||
owner = "nextcloud";
|
||||
};
|
||||
age.secrets."services/nextcloud/onlyofficedb" = {
|
||||
file = ../../../secrets/services/nextcloud/onlyofficedb.age;
|
||||
owner = "onlyoffice";
|
||||
};
|
||||
age.secrets."services/nextcloud/onlyofficejwt" = {
|
||||
file = ../../../secrets/services/nextcloud/onlyofficejwt.age;
|
||||
owner = "onlyoffice";
|
||||
};
|
||||
|
||||
systemd.services."nextcloud-setup" = {
|
||||
requires = ["postgresql.service"];
|
||||
|
||||
@@ -5,9 +5,10 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
# imports = [ ./postgresql_upgrade.nix ];
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
package = pkgs.postgresql_15;
|
||||
package = pkgs.postgresql_16;
|
||||
settings = {
|
||||
max_connections = 200;
|
||||
listen_addresses = "localhost";
|
||||
@@ -27,8 +28,18 @@
|
||||
host whatsappdb mautrixwa localhost scram-sha-256
|
||||
host telegramdb mautrixtele localhost scram-sha-256
|
||||
host signaldb mautrixsignal localhost scram-sha-256
|
||||
host mealie mealie localhost scram-sha-256
|
||||
host onlyoffice onlyoffice localhost scram-sha-256
|
||||
local onlyoffice onlyoffice peer
|
||||
local hydra all ident map=hydra-users
|
||||
'';
|
||||
identMap = ''
|
||||
hydra-users hydra hydra
|
||||
hydra-users hydra-queue-runner hydra
|
||||
hydra-users hydra-www hydra
|
||||
hydra-users root hydra
|
||||
# The postgres user is used to create the pg_trgm extension for the hydra database
|
||||
hydra-users postgres postgres
|
||||
'';
|
||||
initialScript = config.age.secrets."services/postgresql/initScript.sql".path;
|
||||
};
|
||||
|
||||
33
modules/services/server/postgresql_upgrade.nix
Normal file
33
modules/services/server/postgresql_upgrade.nix
Normal file
@@ -0,0 +1,33 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
{
|
||||
environment.systemPackages = [
|
||||
(let
|
||||
# XXX specify the postgresql package you'd like to upgrade to.
|
||||
# Do not forget to list the extensions you need.
|
||||
newPostgres = pkgs.postgresql_16.withPackages (pp: [
|
||||
# pp.plv8
|
||||
]);
|
||||
cfg = config.services.postgresql;
|
||||
in pkgs.writeScriptBin "upgrade-pg-cluster" ''
|
||||
set -eux
|
||||
# XXX it's perhaps advisable to stop all services that depend on postgresql
|
||||
systemctl stop postgresql
|
||||
|
||||
export NEWDATA="/var/lib/postgresql/${newPostgres.psqlSchema}"
|
||||
|
||||
export NEWBIN="${newPostgres}/bin"
|
||||
|
||||
export OLDDATA="${cfg.dataDir}"
|
||||
export OLDBIN="${cfg.package}/bin"
|
||||
|
||||
install -d -m 0700 -o postgres -g postgres "$NEWDATA"
|
||||
cd "$NEWDATA"
|
||||
sudo -u postgres $NEWBIN/initdb -D "$NEWDATA" ${lib.escapeShellArgs cfg.initdbArgs}
|
||||
|
||||
sudo -u postgres $NEWBIN/pg_upgrade \
|
||||
--old-datadir "$OLDDATA" --new-datadir "$NEWDATA" \
|
||||
--old-bindir $OLDBIN --new-bindir $NEWBIN \
|
||||
"$@"
|
||||
'')
|
||||
];
|
||||
}
|
||||
@@ -7,18 +7,20 @@
|
||||
programs = {
|
||||
git = {
|
||||
enable = true;
|
||||
userName = "Kabbone";
|
||||
userEmail = "tobias@opel-online.de";
|
||||
lfs.enable = true;
|
||||
settings = {
|
||||
user.name = "Kabbone";
|
||||
user.email = "tobias@opel-online.de";
|
||||
};
|
||||
lfs = {
|
||||
enable = true;
|
||||
skipSmudge = true;
|
||||
};
|
||||
signing = {
|
||||
format = "ssh";
|
||||
key = "/home/${user}/.ssh/id_ed25519_sk_rk_red";
|
||||
signByDefault = true;
|
||||
};
|
||||
extraConfig = {
|
||||
gpg = { format = "ssh"; };
|
||||
credential = { helper = "cache --timeout=3600"; };
|
||||
};
|
||||
difftastic.enable = true;
|
||||
};
|
||||
difftastic.enable = true;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
programs = {
|
||||
zsh = {
|
||||
enable = true;
|
||||
dotDir = ".config/zsh_nix";
|
||||
autosuggestion.enable = true; # Auto suggest options and highlights syntact, searches in history for options
|
||||
syntaxHighlighting.enable = true;
|
||||
history.size = 10000;
|
||||
@@ -19,14 +18,12 @@
|
||||
custom = "$HOME/.config/zsh_nix/custom";
|
||||
};
|
||||
|
||||
initExtraFirst = '' # very first inits in zshrc
|
||||
initContent = ''
|
||||
if [[ $DISPLAY ]]; then
|
||||
[[ $- != *i* ]] && return
|
||||
[[ -z "$TMUX" ]] && (tmux attach || tmux new-session)
|
||||
fi
|
||||
'';
|
||||
|
||||
initExtra = '' # Zsh theme
|
||||
# Spaceship
|
||||
source ${pkgs.spaceship-prompt}/share/zsh/site-functions/prompt_spaceship_setup
|
||||
autoload -U promptinit; promptinit
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
gnome.gnome-terminal
|
||||
gnomeExtensions.dash-to-dock
|
||||
gnomeExtensions.appindicator
|
||||
flatpak
|
||||
rocmPackages.clr.icd
|
||||
rocmPackages.clr
|
||||
clinfo
|
||||
@@ -43,7 +42,7 @@
|
||||
autoLogin.user = "kabbone";
|
||||
};
|
||||
};
|
||||
flatpak.enable = true;
|
||||
#flatpak.enable = true;
|
||||
udev.packages = with pkgs; [ gnome.gnome-settings-daemon ];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -15,15 +15,20 @@
|
||||
{
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
flatpak
|
||||
# rocmPackages.clr.icd
|
||||
# rocmPackages.clr
|
||||
# clinfo
|
||||
kdePackages.discover
|
||||
maliit-keyboard
|
||||
maliit-framework
|
||||
kdePackages.ksshaskpass
|
||||
];
|
||||
|
||||
programs = {
|
||||
ssh.enableAskPassword = true;
|
||||
ssh.askPassword = lib.mkDefault "${pkgs.kdePackages.ksshaskpass}/bin/ksshaskpass";
|
||||
};
|
||||
|
||||
services = {
|
||||
packagekit.enable = true;
|
||||
desktopManager.plasma6.enable = true;
|
||||
@@ -44,7 +49,7 @@
|
||||
# autoLogin.user = "kabbone";
|
||||
# };
|
||||
# };
|
||||
flatpak.enable = true;
|
||||
#flatpak.enable = true;
|
||||
udev.packages = with pkgs; [ gnome-settings-daemon ];
|
||||
};
|
||||
|
||||
|
||||
@@ -16,12 +16,6 @@
|
||||
{
|
||||
imports = [ ../waybar.nix ];
|
||||
|
||||
hardware.opengl = {
|
||||
enable = true;
|
||||
driSupport = true;
|
||||
driSupport32Bit = true;
|
||||
};
|
||||
|
||||
environment = {
|
||||
loginShellInit = ''
|
||||
if [ -z $DISPLAY ] && [ $UID != 0 ] && [ "$(tty)" = "/dev/tty1" ]; then
|
||||
|
||||
@@ -14,8 +14,6 @@
|
||||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.file.".config/sway/scripts/2in1screen".source = ../scripts/2in1screen;
|
||||
|
||||
wayland.windowManager.sway = {
|
||||
enable = true;
|
||||
checkConfig = false;
|
||||
@@ -57,11 +55,12 @@
|
||||
#};
|
||||
"DP-2" = {
|
||||
mode = "2560x1440";
|
||||
pos = "0,0";
|
||||
pos = "0,250";
|
||||
};
|
||||
"DP-3" = {
|
||||
mode = "1920x1200";
|
||||
pos = "2560,180";
|
||||
pos = "2560,0";
|
||||
transform = "90";
|
||||
};
|
||||
#"eDP-1" = {
|
||||
# mode = "1920x1080";
|
||||
@@ -109,7 +108,7 @@
|
||||
assigns = {
|
||||
"workspace number 1" = [{ app_id = "thunderbird"; }];
|
||||
"workspace number 2" = [{ app_id = "firefox"; }];
|
||||
"workspace number 3" = [{ class = "Element"; }];
|
||||
"workspace number 3" = [{ app_id = "Element"; }];
|
||||
};
|
||||
|
||||
window.commands = [
|
||||
@@ -277,7 +276,6 @@
|
||||
};
|
||||
rofi = {
|
||||
enable = true;
|
||||
package = pkgs.rofi-wayland;
|
||||
extraConfig = {
|
||||
modi = "window,drun,ssh";
|
||||
kb-primary-paste = "Control+V,Shift+Insert";
|
||||
@@ -303,7 +301,7 @@
|
||||
{ event = "lock"; command = "${pkgs.swaylock}/bin/swaylock -fF"; }
|
||||
{ event = "after-resume"; command = "${pkgs.sway}/bin/swaymsg 'output * dpms on'"; }
|
||||
{ event = "unlock"; command = "${pkgs.sway}/bin/swaymsg 'output * dpms on'"; }
|
||||
];
|
||||
];
|
||||
timeouts = [
|
||||
{ timeout = 300; command = "${pkgs.swaylock}/bin/swaylock -fF"; }
|
||||
{ timeout = 600; command = "${pkgs.sway}/bin/swaymsg 'output * dpms off'"; resumeCommand = "${pkgs.sway}/bin/swaymsg 'output * dpms on'"; }
|
||||
|
||||
@@ -14,11 +14,6 @@
|
||||
#qemuPackage = pkgs.qemu_kvm; # Default
|
||||
qemu = {
|
||||
runAsRoot = false;
|
||||
ovmf.enable = true;
|
||||
# ovmf.packages = [ pkgs.OVMFFull ];
|
||||
# verbatimConfig = ''
|
||||
# nvram = [ "${pkgs.OVMF}/FV/OVMF_CODE.fd:${pkgs.OVMF}/FV/OVMF_VARS.fd" ]
|
||||
# '';
|
||||
};
|
||||
};
|
||||
spiceUSBRedirection.enable = true; # USB passthrough
|
||||
@@ -38,190 +33,4 @@
|
||||
services = { # Enable file sharing between OS
|
||||
gvfs.enable = true;
|
||||
};
|
||||
|
||||
#boot ={
|
||||
# kernelParams = [ "intel_iommu=on" "vfio" "vfio_iommu_type1" "vfio_pci" "vfio_virqfd" ]; # or amd_iommu (cpu)
|
||||
# kernelModules = [ "vendor-reset" "vfio" "vfio_iommu_type1" "vfio_pci" "vfio_virqfd"];
|
||||
# extraModulePackages = [ config.boot.kernelPackages.vendor-reset ]; # Presumably fix for GPU Reset Bug
|
||||
# extraModprobeConfig = "options vfio-pci ids=1002:67DF,1002:AAF0"; # grep PCI_ID /sys/bus/pci/devices/*/uevent
|
||||
# kernelPatches = [
|
||||
# {
|
||||
# name = "vendor-reset-reqs-and-other-stuff";
|
||||
# patch = null;
|
||||
# extraConfig = ''
|
||||
# FTRACE y
|
||||
# KPROBES y
|
||||
# FUNCTION_TRACER y
|
||||
# HWLAT_TRACER y
|
||||
# TIMERLAT_TRACER y
|
||||
# IRQSOFF_TRACER y
|
||||
# OSNOISE_TRACER y
|
||||
# PCI_QUIRKS y
|
||||
# KALLSYMS y
|
||||
# KALLSYMS_ALL y
|
||||
# '';
|
||||
# }
|
||||
# ];
|
||||
#};
|
||||
}
|
||||
|
||||
#SHARED FOLDER
|
||||
#FOR WINDOWS
|
||||
# 3 options:
|
||||
#
|
||||
# 1. Make use of host samba server
|
||||
# 1.0 Samba is installed by default. The network-shared folder is at /home/<user>/share.
|
||||
# 1.1 On host, set a password for the autentication of the samba server
|
||||
# 1.2 $ smbpasswd -a <user>
|
||||
# 1.3 Give password twice
|
||||
# 1.4 On windows, open file explorer, right click "This PC", Map network drive...
|
||||
# 1.5 fill in address: \\<ip-address>\share
|
||||
# 1.6 Log in with details entered beforehand
|
||||
#
|
||||
# 2. Since this setup make use of iommu, you can pass through external usb hard drives or a specific PCI storage devices
|
||||
# 2.1 Open details of virtual desktop in virt-manager
|
||||
# 2.2 Add hardware
|
||||
# 2.3 USB Host Device
|
||||
# 2.4 Select device and launch virtual desktop
|
||||
#
|
||||
# 3. Set up shared folders in windows guest that can be accessed by host
|
||||
# 3.0. Enable above service gvfs (this is used in the file manager to actually connect to the windows directory)
|
||||
# 3.1. Log in to Windows
|
||||
# 3.2. Go to "Network and Sharing Center"
|
||||
# 3.3. Click "Change advanced sharing settings" and enable all settings for Private, Guest or Public and All Networks
|
||||
# 3.3.1. Under "All Networks" you can disable "Password protected sharing" but it seems for optimal use, it's better to still give the password in the file manager
|
||||
# 3.4. (possibly optional), select a folder and click "Properties", "Sharing", "Advanced Sharing"
|
||||
# 3.4.1. Enable "Share this file"
|
||||
# 3.4.2. Under "Permissions", allow full control. Apply
|
||||
# 3.5. Click "Share" and use de drop down to add "Everyone" and change "Permission Level" to "Read/Write". Share, Done
|
||||
# 3.6. Search for services and open menu
|
||||
# 3.6.1. Search for below serices. Right click and select "Properties". "Startup type" = Automatic
|
||||
# 3.6.1.1. SSDP Discovery
|
||||
# 3.6.1.2. uPnPDevice Host
|
||||
# 3.6.1.3. Functions Discovery Provider Host
|
||||
# 3.6.1.4. Functions Discovery Resource Publication
|
||||
# 3.7. Find IP of virtual device and make sure you can ping it.
|
||||
# 3.8. In file manager add connection
|
||||
# 3.8.1. For example in PCManFM
|
||||
# 3.8.2. Search for smb://*ip*/
|
||||
# 3.8.3. You can even specify specific folder smb://*ip*/users/Matthias/Desktop/share
|
||||
# 3.8.4. If prompted to log in, do it, otherwise it might close on its own.
|
||||
# 3.9. If there are any issues, maybe disable firewall on guest
|
||||
# 3.10. Recommended to bookmark location for later
|
||||
# Note:
|
||||
# There is no passthrough, its recommended to install the windows kvm guest drivers.
|
||||
# Can be found on github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md
|
||||
# Add this as CD storage in virt manager
|
||||
# It can than be accest in the windows and the guest driver exe's can be run.
|
||||
# Also, change video in virt-manager to virtio. This will fix the resolution
|
||||
|
||||
#FOR LINUX
|
||||
# 2 options
|
||||
#
|
||||
# 1. Make use of host samba server
|
||||
# 1.0 Samba is installed by default. The network-shared folder is at /home/<user>/share.
|
||||
# 1.1 On host, set a password for the autentication of the samba server
|
||||
# 1.2 $ smbpasswd -a <user>
|
||||
# 1.3 Give password twice
|
||||
# 1.4 On virtual machine open file manager
|
||||
# 1.5 Search for smb://<ip-address>/share
|
||||
# 1.6 Log in with details entered beforehand
|
||||
#
|
||||
# 2. Passing through a filesystem
|
||||
# 2.1 Open details of virtual desktop on virt-manager
|
||||
# 2.2 Add hardware
|
||||
# 2.3 Select Filesystem: Type = mount / Mode = mapped / Source path = /home/<user>/share / Target path = /sharepoint
|
||||
# 2.4 Boot into virtual machine
|
||||
# 2.5 Create a directory to mount /sharepoint
|
||||
# 2.6 $ sudo mount -t 9p -o trans=virtio /sharepoint /<mountpoint>
|
||||
|
||||
#SINGLE GPU PASSTHROUGH
|
||||
# General Guide: gitlab.com/risingprismtv/single-gpu-passthrough/-/wikis/home
|
||||
# 1. Download ISO
|
||||
# 2. Download latest Video BIOS from techpowerup.com/vgabios (Sapphire RX580 8Gb)
|
||||
# 2.1. $ Sudo mkdir /var/lib/libvirt/vbios/
|
||||
# 2.2. $ Sudo mv ~/Downloads/*.rom /var/lib/libvirt/vbios/GPU.rom
|
||||
# 2.3. $ Cd /var/lib/libvirt/vbios/
|
||||
# 2.4. $ Sudo chmod -R 660 GPU.rom
|
||||
# 3. Launch virt-manager
|
||||
# 4. File - Add Connection
|
||||
# 5. Create Virtual Machine
|
||||
# 5.1 Select ISO and mark it as win10
|
||||
# 5.2 Give temporary RAM
|
||||
# 5.3 Customize configuration before install
|
||||
# 5.4 Overview - Firmware - UEFI x86_64: /usr/*/OVMF_CODE.fd
|
||||
# 5.5 Allow XML Editing via Edit - Preferences
|
||||
# 5.6 Edit XML - Remove rtc & pit line. Change hpet to "yes"
|
||||
# 6. Start Installation (let it run without interference and do steps below)
|
||||
# 6.1 Press Esc, type exit, select boot-manager DVD ROM
|
||||
# 6.2 Do installation, select Pro version.
|
||||
# 6.3 Install hooks (Step 7 in guide)
|
||||
# 7. Close VM
|
||||
# 8. Edit VM
|
||||
# 8.1 Remove everything spice (Display, Video QXL, Serial, Channel Spice)
|
||||
# 8.2 Remove CD Rom
|
||||
# 8.3 Add PCI hardware (GPU: 01:00:0 & 01:00:1 (most likely))
|
||||
# 8.3 Add Mouse, Keyboard (PCI USB Controller in PCI Host Device or USB Host Device)
|
||||
# 9. Select GPU and open XML
|
||||
# 9.1 Add line "<rom file='/var/lib/libvirt/vbios/GPU.rom'/>" under "</source>"
|
||||
# 9.2 Do for both 01:00:0 and 01:00:1
|
||||
# 10. Edit CPU
|
||||
# 10.1 Disable "Copy host CPU configuration" and select "host-passthrough"
|
||||
# 10.2 Edit topology: Sockets=1 Cores=Total/2 Threads=2
|
||||
# 10.3 Edit XML cpu under topology
|
||||
# 10.3.1 Add "<feature policy='require' name='topoext'/>" for AMDCPU
|
||||
# 10.3.2 Add "<feature policy='disable' name='smep'/>" for Intel CPU
|
||||
# 11 Change memory to prefered (12GB for 16GB Total)
|
||||
# 12 Start VM
|
||||
# 13 Install correct video drivers
|
||||
|
||||
#MACOS ON VIRT-MANAGER
|
||||
# General Guide: nixos.wiki/wiki/OSX-KVM
|
||||
# Repository: github.com/kholia/OSX-KVM
|
||||
# IMPORTANT: if you wish to start the virtual machine with virt-manager gui, clone to /home/<user>/.
|
||||
# 1. git clone https://github.com/kholia/OSX-KVM
|
||||
# 2. create a shell.nix (maybe best to store inside cloned directory)
|
||||
# 3. shell.nix content:
|
||||
# with import <nixpkgs> {};
|
||||
# mkShell {
|
||||
# buildInputs = [
|
||||
# qemu
|
||||
# python3
|
||||
# iproute2
|
||||
# ];
|
||||
# }
|
||||
# 4. In nixos configuration add:
|
||||
# virtualisation.libvirtd.enable = true;
|
||||
# users.extraUsers.<user>.extraGroups = [ "libvirtd" ];
|
||||
# boot.extraModprobeConfig = ''
|
||||
# options kvm_intel nested=1
|
||||
# options kvm_intel emulate_invalid_guest_state=0
|
||||
# options kvm ignore_msrs=1
|
||||
# '';
|
||||
# 5. Run the shell: $ nix-shell
|
||||
# 6. As mentioned in the README, run ./fetch-macOS.py
|
||||
# 6.1 Can be a specific version
|
||||
# 7. Create base image for the macOs installer
|
||||
# 8. $ qemu-img convert BaseSystem.dmg -O raw BaseSystem.img
|
||||
# 9. Create disk for macOS
|
||||
# 9.1 $ qemu-img create -f qcow2 mac_hdd_ng.img 128G
|
||||
# 10. Set up networking. If something like virbr0 does not get detected start virt-manager. Commands:
|
||||
# $ sudo ip tuntap add dev tap0 mode tap
|
||||
# $ sudo ip link set tap0 up promisc on
|
||||
# $ sudo ip link set dev virbr0 up
|
||||
# $ sudo ip link set dev tap0 master virbr0
|
||||
# 11. Boot the system
|
||||
# 11.1 $ ./OpenCore-Boot.sh
|
||||
# 12. Choose the first option to start the MacOS installer: macOS Base Systen
|
||||
# 12.1 Use Disk Utility to esase the correct drive.
|
||||
# 13. Go back and select the option to reinstall macOS
|
||||
# 13.1 After the initial installation, a reboot will happen. Do nothing and wait or select the second option 'MacOs install'.
|
||||
# 13.2 This will finalize the installaton but it will probably reboot multiple times. The second option will now have changed to the name of your drive. Use this as the boot option
|
||||
# 14. To add the installation to virt-manager:
|
||||
# 14.1 $ sed "s/CHANGEME/$USER/g" macOS-libvirt-Catalina.xml > macOS.xml
|
||||
# 14.2 Inside macOS.xml change the emulator from /usr/bin/qemu-system-x86_64 to /run/libvirt/nix-emulators/qemu-system-x86_64
|
||||
# 14.3 $ virt-xml-validate macOS.xml
|
||||
# 15. $ virsh --connect qemu:///system define macOS.xml
|
||||
# 16.(optional if permission is needed to the libvirt-qemu user)
|
||||
# 16.1 $ sudo setfacl -m u:libvirt-qemu:rx /home/$USER
|
||||
# 16.2 $ sudo setfacl -R -m u:libvirt-qemu:rx /home/$USER/OSX-KVM
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
#custom-vkeyboard, #custom-appkill {
|
||||
#custom-vkeyboard, #custom-appkill, #custom-rotate {
|
||||
padding: 0px 50px;
|
||||
margin: 0px 0px;
|
||||
font-size: 20px;
|
||||
@@ -135,13 +135,17 @@
|
||||
color: red;
|
||||
background-color: black;
|
||||
}
|
||||
#custom-rotate {
|
||||
color: white;
|
||||
background-color: black;
|
||||
}
|
||||
'';
|
||||
settings = [{
|
||||
layer = "bottom";
|
||||
position = "top";
|
||||
height = 22;
|
||||
tray = { spacing = 10; };
|
||||
modules-center = [ "clock" "custom/appkill" ];
|
||||
modules-center = [ "custom/rotate" "clock" "custom/appkill" ];
|
||||
modules-left = [ "sway/mode" "sway/workspaces" "sway/window" ];
|
||||
#modules-left = [ "wlr/workspaces" ];
|
||||
modules-right = [ "idle_inhibitor" "pulseaudio" "network" "cpu" "memory" "backlight" "temperature" "battery" "tray" ];
|
||||
@@ -269,6 +273,12 @@
|
||||
on-click = "${pkgs.sway}/bin/swaymsg kill";
|
||||
tooltip = false;
|
||||
};
|
||||
"custom/rotate" = {
|
||||
format = "♽ ";
|
||||
icon-size = 20;
|
||||
on-click = "${pkgs.sway}/bin/swaymsg output eDP-1 transform 180 clockwise";
|
||||
tooltip = false;
|
||||
};
|
||||
}];
|
||||
};
|
||||
};
|
||||
|
||||
19
overlays/default.nix
Normal file
19
overlays/default.nix
Normal file
@@ -0,0 +1,19 @@
|
||||
{inputs, ...}: {
|
||||
# This one brings our custom packages from the 'pkgs' directory
|
||||
additions = final: _prev: import ../pkgs {pkgs = final;};
|
||||
|
||||
modifications = final: prev: {
|
||||
mealie = final.unstable.mealie;
|
||||
};
|
||||
|
||||
|
||||
# When applied, the unstable nixpkgs set (declared in the flake inputs) will
|
||||
# be accessible through 'pkgs.unstable'
|
||||
unstable-packages = final: _prev: {
|
||||
unstable = import inputs.nixpkgs-unstable {
|
||||
system = final.system;
|
||||
config.allowUnfree = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
2
packages/build.sh
Normal file
2
packages/build.sh
Normal file
@@ -0,0 +1,2 @@
|
||||
➜ nix-build -j16 -E 'with import <nixpkgs> {}; callPackage ./corosync-qdevice.nix {}'
|
||||
|
||||
49
packages/corosync-qdevice.nix
Normal file
49
packages/corosync-qdevice.nix
Normal file
@@ -0,0 +1,49 @@
|
||||
{
|
||||
lib,
|
||||
pkgs,
|
||||
stdenv
|
||||
} :
|
||||
stdenv.mkDerivation rec {
|
||||
pname = "corosync-qdevice";
|
||||
version = "3.0.3";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "corosync";
|
||||
repo = "corosync-qdevice";
|
||||
rev = "v${version}";
|
||||
sha256 = "sha256-9FyLhcGHNW73Xao7JiODzgyDKIynEAHJUlNppX+nPfw=";
|
||||
};
|
||||
enableParallelBuilding = true;
|
||||
|
||||
nativeBuildInputs = with pkgs; [
|
||||
autoconf
|
||||
automake
|
||||
libtool
|
||||
pkg-config
|
||||
libqb
|
||||
systemd
|
||||
];
|
||||
|
||||
buildInputs = with pkgs; [
|
||||
corosync
|
||||
nss
|
||||
];
|
||||
|
||||
configurePhase = ''
|
||||
./autogen.sh
|
||||
./configure \
|
||||
--prefix=$out \
|
||||
--enable-systemd \
|
||||
--disable-upstart
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
make
|
||||
'';
|
||||
|
||||
meta = {
|
||||
description = "daemon for quorum on clusters";
|
||||
homepage = "https://github.com/corosync/corosync-qdevice";
|
||||
platforms = lib.platforms.linux;
|
||||
license = lib.licenses.gpl3;
|
||||
};
|
||||
}
|
||||
4
packages/default.nix
Normal file
4
packages/default.nix
Normal file
@@ -0,0 +1,4 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
# corosync-qdevice = pkgs.callPackage ./corosync-qdevice.nix {};
|
||||
}
|
||||
1
packages/result
Symbolic link
1
packages/result
Symbolic link
@@ -0,0 +1 @@
|
||||
/nix/store/7azph9v0lqnb3imkgvdlb0p8j98wy5vy-corosync-qdevice
|
||||
Binary file not shown.
Binary file not shown.
@@ -18,9 +18,7 @@ let
|
||||
yubia
|
||||
];
|
||||
|
||||
server = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDwN8p78OncPIRUfV64PLHOem4LtlQ3opOJwLEYqdGVx";
|
||||
server2 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPm3epi3v+yuskxQZgmPdkVDET8IGeYA6LbTCqPWqkz+";
|
||||
kabtopci = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGdvPKu0XJXpxiZYxwHdt0UzzSXxQqZIbHzVvjySR82w";
|
||||
server = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPm3epi3v+yuskxQZgmPdkVDET8IGeYA6LbTCqPWqkz+";
|
||||
dmz = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAq5OMVTx1IkzFvDgDRwiv+ruYTCBlJ+D1hx+BS8Roah";
|
||||
hades = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEgnWyQUUa+vcHAKx6edbTgqW8ph+MCiS6fUwYjYcS+o";
|
||||
nasbak = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOdoxslkKn3ouadPOHmDN7e5AtoJmnllnUmhl1j9qfzz";
|
||||
@@ -31,7 +29,6 @@ let
|
||||
serverrunner="ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHfLhlJX2VlZE4myreojQ0hqCSL28kE9Y3F65uumgrSK";
|
||||
systems = [
|
||||
server
|
||||
server2
|
||||
dmz
|
||||
hades
|
||||
nasbak
|
||||
@@ -43,7 +40,6 @@ let
|
||||
];
|
||||
servers = [
|
||||
server
|
||||
server2
|
||||
];
|
||||
homerunners = [
|
||||
homerunner
|
||||
@@ -58,9 +54,9 @@ let
|
||||
laptop
|
||||
];
|
||||
buildServer = [
|
||||
hades
|
||||
kabtopci
|
||||
server
|
||||
dmz
|
||||
hades
|
||||
];
|
||||
homeServices = [
|
||||
jupiter
|
||||
@@ -72,17 +68,13 @@ in
|
||||
"services/coturn/static-auth.age".publicKeys = servers ++ users;
|
||||
"services/matrix/synapse.age".publicKeys = servers ++ users;
|
||||
"services/matrix/mautrix-telegram.age".publicKeys = servers ++ users;
|
||||
"services/matrix/telegram-registration.age".publicKeys = servers ++ users;
|
||||
"services/matrix/mautrix-whatsapp.age".publicKeys = servers ++ users;
|
||||
"services/matrix/whatsapp-registration.age".publicKeys = servers ++ users;
|
||||
"services/matrix/mautrix-signal.age".publicKeys = servers ++ users;
|
||||
"services/matrix/signal-registration.age".publicKeys = servers ++ users;
|
||||
"services/nextcloud/adminpassFile.age".publicKeys = servers ++ users;
|
||||
"services/nextcloud/dbpassFile.age".publicKeys = servers ++ users;
|
||||
"services/nextcloud/onlyofficedb.age".publicKeys = servers ++ users;
|
||||
"services/nextcloud/onlyofficejwt.age".publicKeys = servers ++ users;
|
||||
"services/gitea/databasePassword.age".publicKeys = servers ++ users;
|
||||
"services/gitea/mailerPassword.age".publicKeys = servers ++ users;
|
||||
"services/mealie/credentialsFile.age".publicKeys = servers ++ users;
|
||||
"services/gitea/homerunner-token.age".publicKeys = homerunners ++ users;
|
||||
"services/gitea/serverrunner-token.age".publicKeys = serverrunners ++ users;
|
||||
"services/vaultwarden/environment.age".publicKeys = homeServices ++ users;
|
||||
|
||||
Binary file not shown.
@@ -1,23 +1,21 @@
|
||||
age-encryption.org/v1
|
||||
-> ssh-ed25519 neExcQ yMHHDZg+ZqoX3BGPI9Ruqbj051Ewsyxc207Ne0EJ6k0
|
||||
LD+wq4I8s/Fc6znNE6WRMba0u1BU5Mi6VKcyBk6xTZo
|
||||
-> ssh-ed25519 WiIaQQ KmHrRHx9vaSMaHUWcMZKRApR9KWntU07umf1mZekRQk
|
||||
/wumFHGj1am02zQ4g4EaEEk2sCoWTkjSARTIUnPnFD8
|
||||
-> ssh-ed25519 WiIaQQ 0L6Q7RQJaJTeeKDVSr6VxGonGkUdyF8mKx05C17uOjo
|
||||
pn3vf/e7nLWfzzrGd2NCyp+xBLY7EEMrVi5Yqzv329o
|
||||
-> ssh-rsa VtjGpQ
|
||||
GBUmtcnkZ4tlQbsWArXcBEX+p7RAwFUeZ7QOteJ61/lDaKYOcYZPC298AI4eE5cE
|
||||
jejlIO1Jh72eQCQ+ZniAdPO8caUWOXyAfXsk8Et8RCaodK0pt14JB/Ez+qHpZR2j
|
||||
V9LC3xrlvWbyY21pnokQudSsu966Kmh27gAd1vyw+rAFpYSLhY6cL3oyiYNtZ0Nf
|
||||
AgsGrCIJhWOKA7+PJPSxbPPosqB9nteRRxl7Hi3XIhu7oE0YCqVVihA908vdaq7G
|
||||
pOIubfd6S7Aptj7xiXb/8oojhsglgISPyFHIPOZaIVXVtNqFxXhjFiJjdZuZ4gRS
|
||||
hmaxAXd8UblKzYWIKDUnAwdn5tdixC+GrqdNit2s946Di7s5oe7BptP707XQK0WA
|
||||
HXJuc/h3+8JAkQsPW0B9+XbeNtRAh9Uqcq3tadGqjwfgLKepebOoG3K0F3+simcr
|
||||
bS3fgd1R92v8KyyXpKvgbilJQ2GBoxEqHTeMzqksp/6t/3s64tLEnrRhqcxyYz7P
|
||||
fDs0IgezPFQ6ZKU2KMnheRiQrRD//9JINPnj+0PPL5PggyaDh4PwA67INrHwANl6
|
||||
Rgh8QNBvom3E8gdYuBuCM75PewMZF9mSksLDYrYz9M9LB4YIvBxHKiW6PhugtTwM
|
||||
fd3uSuaTfTEFgPtEuJUsQk3Q8+lZQpY4BtEDP27NqFI
|
||||
-> piv-p256 grR75w A2dfNFLZpwdWZ4PkmeHpUdalrhHYehriPn23TC8V3mSW
|
||||
N8IfOhaZdWspJ2GCJ8de0Yhe3Jv1BBA8Ep+Tpp/IFyk
|
||||
-> piv-p256 RQguQQ As/Vu7wq9Y3gW8gJfxyi2b31e3A2ZswBPZ3KfShjDR5T
|
||||
sE4kxCyTMm2fEvs/I3KpDt61S2vFv89/MgALO3RVsuQ
|
||||
--- GnBuK/AhHklZlnoQXH6HGNZa/rqLWAOKpvbFK3IQnmU
|
||||
<EFBFBD>mp9/<2F><EFBFBD><EFBFBD><EFBFBD>X<02><EFBFBD>'Hn<48>d<EFBFBD><64>vd<05><><EFBFBD>A[W8A<38>;<3B>2<EFBFBD>u<16>qQT`,%]<5D>~<7E>u<EFBFBD><EFBFBD>.5<EFBFBD><EFBFBD>a= <09><>F<EFBFBD><46>nrc3<63>&<26><>!h<1C>$<16><>J2,i<>'5<>IJ<EFBFBD>
|
||||
DwlLrPYOnIHzAm+wY9T1Oc8jW86RgDm6w9M2KA8C7XWoMSheiKpB1S/Ii3kPVkOz
|
||||
5L9QfJVYrz+9yApL8akUTS+UkKWj5rLKHrEXgdfzGxqt3T16Si/zvQgMR9fOO5mx
|
||||
+cDXBnyD8ufkUCdDZvIaH0fyU94q0HaNgkjd0juDOaYd3hE6usF3l4IWAqhZwfT0
|
||||
Sm54OCH+Y0YSIAA9AVscx3qopU5ZJjXFsRXzvOhQGMm6u1jIsiyHrcu13+hYo+wJ
|
||||
jkHbDNFWV6PGtVmQNDDRPpprnAaFvDyXhDXZKx4tMxIgw7trfDh4+1b9khSavvOl
|
||||
GkMrhyrjpgY1L6Mv5eM9z3jprAutVrNaM4IzINkKijNE0aQMId7hi7V2OIvYS/dH
|
||||
dEoQkN1ZzpkwK4vuFvCAIaErkdNiLU76APpnjhnKy+SPQqASrhKPK+yeEu4Ri49o
|
||||
bht3bpJ9qMGLpi8hk7Af2ICBbHnrJ05yt9Q5S0S+I4459xkbFpjsA7g0z9MPiE0z
|
||||
KnSx+OxyUsQTsiZJMlwfzXOLMlzK/kwJ8QE0kp4rxIMItmklz23qU4i6gG99jnI1
|
||||
5C2o9EujZ0GSsbvZNJ4ucOOCC/J1BcoPHxU9cQz51DU+a0vFsK77UbzAC0mqQl8O
|
||||
wODT219ZFC9GzP91qHtAlVxpoIVi7OhVw8d8ma11N7o
|
||||
-> piv-p256 grR75w Awk7/Q4K6PnOx1VWmtxWQgJfGkPVHIbwk3oc2Dk6wcym
|
||||
oeWbEXfuOxHseJ9W+oKKqJiyGaE2a3w7nsF/AKY3pS8
|
||||
-> piv-p256 RQguQQ AwdHD65+4PZUT4F8t6qU1GiXL6ETjScnFlLIcVSWuOk+
|
||||
POglZeYjAzYb/81gK8CDUDtl8eM6xE+z3YxcaOxK2/4
|
||||
--- juEnuBaZ4x58VXzlmSgEu2TAQWGEie7zgaoa0phxJBI
|
||||
<EFBFBD><0E>Ҥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><02>R<EFBFBD>ר ?H<0C><>g<EFBFBD><0C><><EFBFBD>4 <20> &1<>2C<32>+<2B>۱<EFBFBD>1<EFBFBD>rͭ<72>)<03>LV<4C><EFBFBD><EFBFBD>.P<EFBFBD><EFBFBD>u<EFBFBD>))Bą8<C485><38><EFBFBD><EFBFBD>)e<><65><EFBFBD>2<EFBFBD><32>P<EFBFBD>zf<7A>lT<6C>M
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,21 +1,21 @@
|
||||
age-encryption.org/v1
|
||||
-> ssh-ed25519 0qfOZA iyct51e862F5HcUHrV6HJfocfqWvyu5dcCG9vchvlzk
|
||||
1GbQPF2QRdXA1/XlsovvS6RDvXGeUykYuBf1o9md9NU
|
||||
-> ssh-ed25519 0qfOZA 2w9FxathvqTuN8TEnxHVFgr/O2dAy72owqK5Dfpl234
|
||||
ArxI39jUSbHAW1E9oVmTwkVWKIF4kZRhl26deteony4
|
||||
-> ssh-rsa VtjGpQ
|
||||
V2ezCm2vmn6TYu25I4FDrXtQoMQSWobixzKO1z2HgD/fU5tk6XOwD5Ha/Q1MqTZf
|
||||
JgNrMCChh6xWrcd/dDBjuCRNQlcvWH7DFqu1AH2dg6AvRnEBFJKg5agFjYnQQz4d
|
||||
cLGXAMSRRIIZg55yeMwawm6co7f3/8nw6DEWOtaB+WnXek44cdHGXIDn7jVY10IJ
|
||||
4PwykvCIhZsmBW/f38OH6qvdAdAXJMJqDTyAzSjXH+fVFy8pYuFpALJzOXnk6OFB
|
||||
EMwFnFgt+Du4VybJEsxg93xFNh6CGga/7scjfdulWmakHSKh/LYVowsjPKlV7LIO
|
||||
L+06RHFiBCsi6dxRMUEztwzXWhvHNL1DUix5BJv1v+vCS4DGAiQ+nqntg6sBZgyD
|
||||
A1yR2JblEWND/TeGC7fFI+lPH27608QgNeOqQrHKm5Sk9j4b4ClNhxEQRTquMxM5
|
||||
PAgNpdwyXP2mKi/XeN2v4GnJ9OBUEj3yzZ1YNwOCajI1t9IPChPc2eR9O8AjUT5v
|
||||
C1isvdmcqegtqP7P0SM7xqx/gxUA7QQx7kRr+QALbECbsSzrSycXowp9OvsewQ/3
|
||||
6ZfSAsXTu+voXEv5E59NpUUhIIcEq6BByBbcdBKt0G1FLmIaL8PG2Lwk3/EAaUY6
|
||||
Wx4ieA0ZXK5btRAr947ZM71o5Zag3OBnZ1MKxDCAq2c
|
||||
-> piv-p256 grR75w A9ZmUbec4JRZGWMjnqBTQGCf6GimNyNDmllWB4uBHJFq
|
||||
mN/spixDcTc6UZSLe4vc879uOUxOw9Qh9VDRK2YrTGM
|
||||
-> piv-p256 RQguQQ Ap+H8uhWf+iaeyTIBziLgulUiF0wYOPFizC17xhzWtxj
|
||||
lbgpzytkMbtmlRT67GhwBBMzbTCD8M/1vuobnUhUNlM
|
||||
--- NQ1zWWCImu0ugkcWJW645DMva4rngFMNDagT74Yku6Q
|
||||
<EFBFBD>U<EFBFBD>U?<19><>Q}<7D><EFBFBD>e.+<2B><>ބ3k<33>a?9<><39>\<5C>;C<1C><>_<0B><01>)<29><10>nᜭ38><3E><>C<EFBFBD>{tv<74>1<EFBFBD><31><EFBFBD><0E><>LUq#b+c}
|
||||
PxnpVXjlneM5kJS3ThHQOtA5BCzruLTkNRI/QB5mBQFWTeqlOrUeR6VdIyKWckpp
|
||||
4ZSNoXTi/ub28uGY1y2wA77xPWzwYokFr6tWiJvEfgtvaO6HXhCVEY/g0H60bu++
|
||||
r6rpiJxycFEpRtJqZZRZ+/1S77AdTstkBzFFg1cJygHZjtJ5nlhcVIeh7rngrNEU
|
||||
ypRzgl87zh3ZvG+9wVjBbnrIVF8ICm/rzSv//n2Lq+Q2DmIB5VYIiMErh/S0Xat5
|
||||
t4a6Ch4KdyjvQxqDn15zWmkEMWasBM6BsrcZ0v67DA/q5Ue0KkMu8qomYoitH6dT
|
||||
LyJwm2skAug8c3p53mPFOOZlyHrUgx4zuUx34lRHwmZrQm0Deag//KkKsbA5DsIB
|
||||
T1RCkSIldG11vRc92sg24rWBmyDkJuzU94/Seivf3fuWpI0bjwZJUJlShvxTgk8E
|
||||
SJrkKljDeYE+nBfcCU6pVSx3zMRXEDHn/1O2lY6PV9xSiJ55NbYyBJTDmv4GLJTM
|
||||
AUDZc7ZBSiVHfti3MkyzCO00X1HBKGZmRjfw/PDA0FaTy7h+3g/YIaKR1JCQDgDb
|
||||
g7w/LM2XoaNA4vsZONLlc9LmczGJcno4bGzDafr+R/n91+2s+PXfcLy0JnrjnhcS
|
||||
Uo20lgvdRdC7JhQUYEhGchhuDv18qWz86YGLZtXiDyI
|
||||
-> piv-p256 grR75w Atv6Qx+Kox3yaIg3GlBcjl/jOqB1c+jQZjXjd9QjKG93
|
||||
jCGiPNAhf/dv/u7+gMqyk0/Llg91j5V+eveseRDju2E
|
||||
-> piv-p256 RQguQQ AuFA9C0hg7/lDHEz4ot81oDorONklwhktdbcV28GlZNq
|
||||
Ddl+GdZ+bd884HoRd8hYaMkzJVW1w9Jl09ZSJ5cr0LI
|
||||
--- EXQY07ioUVXZngCW4Fj8TWYtPcxKd33tsA2aSJJLGFU
|
||||
<EFBFBD>'F<><46>ӭ<EFBFBD><D3AD>
|
||||
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user