Compare commits
1548 Commits
2244f37479
...
cfd6b5fc90
Author | SHA1 | Date | |
---|---|---|---|
|
cfd6b5fc90 | ||
|
70db7c7c33 | ||
|
b954abc0c3 | ||
|
4de92eb583 | ||
|
09f966e1ac | ||
|
17bd78bfb1 | ||
|
e1ab04f1e2 | ||
|
f815e63fc3 | ||
|
143925e8fd | ||
|
89545f1ae9 | ||
|
07074caba2 | ||
|
49482fb9df | ||
|
ee3890dfa4 | ||
|
e5ed14a659 | ||
|
6a8ed263b8 | ||
|
a8fe160216 | ||
|
b008f50607 | ||
|
5e03c79792 | ||
|
14f196fabf | ||
|
e3b3b675fe | ||
|
34e6e8a7e5 | ||
|
4298c7f1bc | ||
|
d984f3a321 | ||
|
8ff402c7c2 | ||
|
1950d9b587 | ||
|
fd1cf7c87a | ||
|
5a46ffe437 | ||
|
980d3a3c4d | ||
|
f67dc631ac | ||
|
1b985f6bd5 | ||
|
439b61aecf | ||
|
e38109ac9a | ||
|
818d8609d4 | ||
|
01df002a22 | ||
|
690b5e5552 | ||
|
8aa99de316 | ||
|
49e9049f82 | ||
|
d76c4a6d8a | ||
|
5f09b60800 | ||
|
468109d4f7 | ||
|
6986b2a65e | ||
|
937ace0855 | ||
|
2989f99f0f | ||
|
606cd8949c | ||
|
1a0255c9b6 | ||
|
1572ec6bb1 | ||
|
ded11d6ffe | ||
|
da09de0e5f | ||
|
79cb825bf8 | ||
|
e73ccac681 | ||
|
792acac153 | ||
|
764fb6197f | ||
|
74297fdbbc | ||
|
6ac255deb5 | ||
|
a9fad5b3fb | ||
|
045f8630f3 | ||
|
48a380fc25 | ||
|
d71b16f263 | ||
|
ed5cb90177 | ||
|
1c4b46fcb8 | ||
|
8800848e90 | ||
|
aeeedb0b60 | ||
|
bf69641481 | ||
|
ad4c8244f1 | ||
|
250886da9b | ||
|
65e11451a8 | ||
|
5c38449d89 | ||
|
7229032fe1 | ||
|
e422c24865 | ||
|
3860a08a4b | ||
|
06c9459f03 | ||
|
9b816f8f51 | ||
|
4a733a0640 | ||
|
a6f0780853 | ||
|
faa239f8fc | ||
|
c35454c912 | ||
|
eed1cc2629 | ||
|
0073fb5550 | ||
|
8d131a00f8 | ||
|
b3be5b20d8 | ||
|
295d9e7f22 | ||
|
c7f760c54b | ||
|
1c224142f5 | ||
|
6bffef7a1a | ||
|
4b7e0af631 | ||
|
e18b8d9241 | ||
|
016dee6185 | ||
|
fc0821a959 | ||
|
8c60d2f75c | ||
|
5ef8f585c4 | ||
|
dfdc8d6751 | ||
|
b8959b55dc | ||
|
ac556a6d52 | ||
|
3c84c5602f | ||
|
35e7cd1dfc | ||
|
8b3fe3e265 | ||
|
d7146d9494 | ||
|
196d35342b | ||
|
b790ec1e28 | ||
|
d4da33c6aa | ||
|
f4a6fd88da | ||
|
8b6957fd70 | ||
|
26238b318f | ||
|
5d401f9ed6 | ||
|
b337ae1f73 | ||
|
d202fd07ed | ||
|
0aed6cb2b3 | ||
|
e0e3d312c9 | ||
|
8cff9765db | ||
|
9df9bb382b | ||
|
76e0e59bfa | ||
|
5324736749 | ||
|
66d5079b0f | ||
|
1fb05243af | ||
|
a30155a1ca | ||
|
28555cdd35 | ||
|
5a051661ee | ||
|
6c11b11517 | ||
|
623ac957cb | ||
|
528149bf41 | ||
|
3cfa4ce75b | ||
|
838623c9ac | ||
|
0921e05d53 | ||
|
bbcdd4ae01 | ||
|
4ebbb94b49 | ||
|
1b65557929 | ||
|
3aeec8f017 | ||
|
0c09de94dc | ||
|
97390e1d60 | ||
|
e147a1472b | ||
|
0d76f09f15 | ||
|
0b4275da46 | ||
|
f4d58e6a1b | ||
|
5244ff2814 | ||
|
c069b1b7bd | ||
|
94d87a332a | ||
|
69ef9cc676 | ||
|
535fbe5571 | ||
|
28c37910de | ||
|
196a4fe6ac | ||
|
dd6d24ac8d | ||
|
8e37390d0e | ||
|
e162ac9555 | ||
|
e9c656afe4 | ||
|
8c71431f14 | ||
|
90d0d40c04 | ||
|
eb17291c0d | ||
|
5093b19326 | ||
|
1f1714519a | ||
|
ae70b81b72 | ||
|
a945f3fda9 | ||
|
d11b240fa0 | ||
|
d5d45570cd | ||
|
8aa2fd6dce | ||
|
75e43f38d5 | ||
|
d2ca8b1941 | ||
|
02e7dd1b6a | ||
|
32aca9b2b9 | ||
|
67d52461f9 | ||
|
f10c28182e | ||
|
a88ca768af | ||
|
cd14ed5156 | ||
|
d73f0eb921 | ||
|
57386bcc42 | ||
|
678bebf8e3 | ||
|
037735eb33 | ||
|
e26b9a8d2a | ||
|
ae5bd89e3c | ||
|
39f7ebc1f2 | ||
|
90cdf140e0 | ||
|
e9e8979bff | ||
|
001586bfcb | ||
|
9f30349f00 | ||
|
fc323b7d23 | ||
|
258f2023d5 | ||
|
30f9a9540b | ||
|
1763b81ae5 | ||
|
ddad7ac4e2 | ||
|
54fe58fae2 | ||
|
abf354c5e5 | ||
|
2c35581d1d | ||
|
8f1a3fbaa9 | ||
|
87c6aa9f54 | ||
|
da390f9631 | ||
|
0296a66b61 | ||
|
823874186c | ||
|
19afc01e85 | ||
|
c0d5d2ca20 | ||
|
15e2b9da42 | ||
|
b8f8bafed1 | ||
|
6367606662 | ||
|
feeff83e61 | ||
|
8d3a38e8b1 | ||
|
afc09f49b8 | ||
|
92323443a5 | ||
|
d2d64fd29e | ||
|
74f7e19dc1 | ||
|
13251c3294 | ||
|
6268a5fdf2 | ||
|
c0b8864e5f | ||
|
6d0d47e81d | ||
|
c9d195fd7d | ||
|
b93a93de03 | ||
|
b701934eaa | ||
|
f452a7030b | ||
|
06d8f3e3b8 | ||
|
4615f4dea2 | ||
|
c6a0404e3e | ||
|
11f3e0c15d | ||
|
0e53547984 | ||
|
d08a75c237 | ||
|
1e1122b7a2 | ||
|
7cd7503abd | ||
|
f12904d21d | ||
|
8708bae373 | ||
|
6e3742f3c0 | ||
|
3915098ccf | ||
|
58ce6dcd53 | ||
|
fe485fd316 | ||
|
440fad154e | ||
|
9ca04b778d | ||
|
1fefa3ac15 | ||
|
13d0e1f029 | ||
|
5b6ed54207 | ||
|
5a09eac90d | ||
|
85c27d8d16 | ||
|
defc52f442 | ||
|
96881cfe76 | ||
|
dbf17c1739 | ||
|
f3d714082e | ||
|
88328366a3 | ||
|
6983df85cf | ||
|
b6433d21fc | ||
|
04326b244c | ||
|
ef65638082 | ||
|
62d5453a04 | ||
|
b2383e35b2 | ||
|
fce85f5e7c | ||
|
8ba8f19591 | ||
|
7c363e8fac | ||
|
8437230323 | ||
|
044191fb36 | ||
|
02cf2a4358 | ||
|
0d5113ba51 | ||
|
c057f8f2ba | ||
|
553c9184da | ||
|
49a8bf56ad | ||
|
84a50dcf52 | ||
|
a726656b84 | ||
|
a5f8f3bf36 | ||
|
c82653299c | ||
|
2a057805ae | ||
|
94356ab1dc | ||
|
1607ae9d32 | ||
|
45f55e4399 | ||
|
585b8e0ef0 | ||
|
1f8a41a899 | ||
|
429f963093 | ||
|
dfb067ede6 | ||
|
12e189c1ac | ||
|
ecaf0a5bed | ||
|
46d5cb7915 | ||
|
3e0325206d | ||
|
cf72f3f8f9 | ||
|
85553f6c1b | ||
|
a258b2c5a4 | ||
|
7d33a9563f | ||
|
2ae3d3b64e | ||
|
a0493a1408 | ||
|
d517eff6c1 | ||
|
78751bf9fc | ||
|
ab34cd46e8 | ||
|
2f1816ec74 | ||
|
fd7880beec | ||
|
4ac754bd55 | ||
|
d6f6a6bd42 | ||
|
16317c40ea | ||
|
b1bcfd8959 | ||
|
2f2d042f6b | ||
|
994ac6c6a6 | ||
|
5e32fc4dd6 | ||
|
3c96eb56e1 | ||
|
8127657f4a | ||
|
a4bb614ff7 | ||
|
ea3a814e2a | ||
|
d76ef7a057 | ||
|
24e43efbdc | ||
|
5b950810d7 | ||
|
2110583376 | ||
|
6f11144102 | ||
|
33b43b4007 | ||
|
aa2dd552bb | ||
|
7df411c0aa | ||
|
daf5cf5f83 | ||
|
f3eb37ecba | ||
|
25014fa6ba | ||
|
f64911ab7f | ||
|
bf0a9e71a2 | ||
|
ec08802652 | ||
|
573b674cba | ||
|
8d24f24690 | ||
|
a709106f08 | ||
|
ef4e2f85f1 | ||
|
49b04c6927 | ||
|
b97489f0d2 | ||
|
fc19d1f5ed | ||
|
63cc6594d1 | ||
|
859f329868 | ||
|
bcfb0c192a | ||
|
abd6a507e8 | ||
|
3bba05a94d | ||
|
c31e63e52a | ||
|
b989d28c0b | ||
|
ee8ecb1204 | ||
|
68fac43975 | ||
|
40f84d0682 | ||
|
7fb0bdfe34 | ||
|
0cc367117f | ||
|
1277f7d1e1 | ||
|
83a67322b1 | ||
|
827ce2d1f7 | ||
|
048cd04291 | ||
|
3674a336f6 | ||
|
851c6dbee0 | ||
|
3170cbaec4 | ||
|
8f0e4dbb0b | ||
|
7c5abad9c2 | ||
|
0c250083fb | ||
|
ef2d824716 | ||
|
eac134318b | ||
|
7a599203ed | ||
|
c2181bedc4 | ||
|
d833e87ebe | ||
|
1ff292bfa8 | ||
|
9352c673cc | ||
|
9de6ca85c9 | ||
|
a6090bcf94 | ||
|
bce1960d37 | ||
|
26fc75a28e | ||
|
94f2e685b1 | ||
|
20f483d147 | ||
|
9b90f75114 | ||
|
f475ccc012 | ||
|
5ebf67744e | ||
|
aca35f842d | ||
|
08bd570017 | ||
|
f7e83e978a | ||
|
5b4a9f3090 | ||
|
5f7901130b | ||
|
94511170e0 | ||
|
d810505e25 | ||
|
8a1afb61b8 | ||
|
97a11612f4 | ||
|
8ecbd87641 | ||
|
4267a48a59 | ||
|
12a172cd2a | ||
|
b0f616c86a | ||
|
d00e7644c3 | ||
|
9c9a4f4b03 | ||
|
ae92b08fd4 | ||
|
484878a014 | ||
|
27bcfed792 | ||
|
5b2bc4b094 | ||
|
1973d8420e | ||
|
09ec298fa2 | ||
|
38e238915e | ||
|
bc840c4c4b | ||
|
fe8cdc342c | ||
|
9fe6ec4e08 | ||
|
e5ff406990 | ||
|
7baa0bd9f6 | ||
|
d227092b9e | ||
|
a0c9e3aee1 | ||
|
c85a09da64 | ||
|
a4b7371c70 | ||
|
7af1be6d39 | ||
|
a66754f41a | ||
|
d9110b9705 | ||
|
715b67f79e | ||
|
774b9e99c3 | ||
|
5fe89bc95d | ||
|
d8b125efc0 | ||
|
9a54c3d609 | ||
|
c4e5381072 | ||
|
d5514f4877 | ||
|
078dca4b1e | ||
|
85af3e0c89 | ||
|
e0e03c7b50 | ||
|
c0dcad2a92 | ||
|
fb9042903e | ||
|
24e6e4d6e0 | ||
|
262222169f | ||
|
e44c60ebad | ||
|
50e1ce4c3b | ||
|
9857fcdec9 | ||
|
a64fa316aa | ||
|
b64d76aa6c | ||
|
4a0fd38b81 | ||
|
a64f2ba867 | ||
|
d9e698c512 | ||
|
b38b56ae1e | ||
|
ce5d96dde7 | ||
|
292380fc34 | ||
|
d10683ac24 | ||
|
71c63c8ca8 | ||
|
4051fb8e76 | ||
|
5475817996 | ||
|
200c034c85 | ||
|
50b7b85754 | ||
|
156e1d697b | ||
|
a60e4033ca | ||
|
7b601d9ca4 | ||
|
10c5429290 | ||
|
bd4d34650c | ||
|
0ac090f91a | ||
|
6cbffaae4c | ||
|
caa0cbab28 | ||
|
0739d3c4c0 | ||
|
b5e88b7ad0 | ||
|
a85a635d2d | ||
|
ad5b7186b0 | ||
|
8db206c6eb | ||
|
274dc1ce96 | ||
|
0a5ba16a51 | ||
|
53f191b808 | ||
|
e51e6f95b8 | ||
|
53b52b8ac5 | ||
|
ac025b8bbb | ||
|
6e6269f1e4 | ||
|
e8ccf08ca0 | ||
|
3a8eaa5405 | ||
|
d0b73a3518 | ||
|
3f563e3b75 | ||
|
94bc20ad0f | ||
|
1049436671 | ||
|
865ce9d507 | ||
|
315c01069b | ||
|
0cd92c3790 | ||
|
fea06555b6 | ||
|
2351e89695 | ||
|
b775ef296b | ||
|
9dc3a3d0e8 | ||
|
4b3c66aa1e | ||
|
59a8558857 | ||
|
39c52f4a00 | ||
|
a951cc2cbb | ||
|
1a96397699 | ||
|
8978af6b99 | ||
|
98d520fb5e | ||
|
f9a4ebe058 | ||
|
ce4dcefd17 | ||
|
fc01903452 | ||
|
8d935aae93 | ||
|
d6a67aa678 | ||
|
c904aafde9 | ||
|
903414041b | ||
|
a399db4352 | ||
|
3167f1dea3 | ||
|
a0ca28084b | ||
|
22865a32c6 | ||
|
5838eddf77 | ||
|
5d5d9bb3db | ||
|
9db507982c | ||
|
229a974570 | ||
|
45ce960bf8 | ||
|
383472d1f4 | ||
|
d9edf03c4f | ||
|
4cde9116a1 | ||
|
578d870ed2 | ||
|
3eff05864b | ||
|
398e3c2cc0 | ||
|
004258bf15 | ||
|
d1f7b2b7ac | ||
|
3d250b83e2 | ||
|
07c08838bf | ||
|
ef5045b130 | ||
|
4f83d87e43 | ||
|
eed1d7025b | ||
|
410b95ef0e | ||
|
b8d3915d9f | ||
|
3e0420605d | ||
|
0b361dd84d | ||
|
cb95e89fb8 | ||
|
27abc6249b | ||
|
3e4f96c930 | ||
|
ff11f59f9f | ||
|
1ae21148cd | ||
|
7db4e70d75 | ||
|
794fd46492 | ||
|
ca45605a57 | ||
|
8c0f4ca85a | ||
|
8a71dbd399 | ||
|
6b799b9f88 | ||
|
8721fc49be | ||
|
6f5077ae19 | ||
|
0ba23300de | ||
|
64b110589c | ||
|
fcc7c53e9c | ||
|
f1af369d2c | ||
|
029c95c780 | ||
|
ee952c112c | ||
|
5e43e4eb1b | ||
|
c03ba17b3b | ||
|
1aadbb83c9 | ||
|
434ecb8a6d | ||
|
dcb8f305ff | ||
|
03b8fd0d9b | ||
|
f173d0881e | ||
|
19fb422a60 | ||
|
130b5db625 | ||
|
5010a92fa9 | ||
|
9030f1e684 | ||
|
e67c738314 | ||
|
9169eb4746 | ||
|
0dd8c95dcd | ||
|
08d90fa65e | ||
|
3189bf160b | ||
|
1307c7f27e | ||
|
9072edec01 | ||
|
b24e22d061 | ||
|
3c4f4f2afd | ||
|
0361b39aaa | ||
|
7ab6f241e9 | ||
|
56b26ff8e7 | ||
|
f59f29659e | ||
|
38016dff38 | ||
|
5c26e13e2a | ||
|
2f6a44afa3 | ||
|
f1a819d270 | ||
|
c7bfada2c4 | ||
|
fc41b1abe2 | ||
|
533c6e184c | ||
|
dcd42c5896 | ||
|
1d5c336aa6 | ||
|
4f51994509 | ||
|
1100cf59b1 | ||
|
506078d0b2 | ||
|
f65eeb51be | ||
|
0f416aa6e5 | ||
|
9f53efb9b5 | ||
|
b99c9b7188 | ||
|
e57658dced | ||
|
fd43ba0f75 | ||
|
e508906815 | ||
|
80dccfaf7c | ||
|
24aeb0eace | ||
|
7db70a7b68 | ||
|
6cde10ba6b | ||
|
8e736440e4 | ||
|
d56ea7d83e | ||
|
d038aa83a0 | ||
|
15ed0d2125 | ||
|
104f24e0b9 | ||
|
1fb10f5017 | ||
|
5eaf81362c | ||
|
650a1a1d37 | ||
|
33f554e81f | ||
|
7bccdb6949 | ||
|
909b6dbc0b | ||
|
890b3cc497 | ||
|
36c0c14192 | ||
|
94bb3e2379 | ||
|
d40167f9a5 | ||
|
9bcfb99d6b | ||
|
03a1d58cbf | ||
|
ba169b4893 | ||
|
a1b567757b | ||
|
4f1346de92 | ||
|
3914f2a05c | ||
|
ed2322d191 | ||
|
ae42aad893 | ||
|
edc4dda199 | ||
|
681d4a87b2 | ||
|
084ce1ee88 | ||
|
68b3627a15 | ||
|
4c00536dff | ||
|
b6f215a5d1 | ||
|
3853200ec3 | ||
|
3b26d563c5 | ||
|
5767a044ed | ||
|
3669ad7a7b | ||
|
66ea8cd9d9 | ||
|
0e6aff21fe | ||
|
ee187195cc | ||
|
cb7a6deb80 | ||
|
9417e42024 | ||
|
4a528c3e88 | ||
|
8847bb9115 | ||
|
fcb180445c | ||
|
c75b25068e | ||
|
403c17e488 | ||
|
0114be0584 | ||
|
ffb3c91dd1 | ||
|
997cc15602 | ||
|
762b3b24c9 | ||
|
91693ebee5 | ||
|
854ffac3c1 | ||
|
a5bc2b616c | ||
|
b3642388fe | ||
|
d3e3934dc8 | ||
|
d2c45fd78d | ||
|
a499115d5c | ||
|
c9da9331e7 | ||
|
6b5da54dbb | ||
|
118bca639e | ||
|
3a9f22cf43 | ||
|
1dd6addcca | ||
|
6265d8dd7f | ||
|
513767d7ad | ||
|
97d1ddccdf | ||
|
fb831a1e9a | ||
|
dc11297a61 | ||
|
5150491fd4 | ||
|
873bbd66c2 | ||
|
f3410e6f4e | ||
|
991b1cdaff | ||
|
2ceccc9b70 | ||
|
60193de320 | ||
|
99cf0dc812 | ||
|
587fa3609f | ||
|
5adae1c288 | ||
|
46f5689c73 | ||
|
6271b14d39 | ||
|
646f0dcd01 | ||
|
542ec09bfd | ||
|
156e0d0812 | ||
|
54f7f1fe10 | ||
|
b14303fcce | ||
|
c29d1a5cba | ||
|
7d1bcb47db | ||
|
38d5073d56 | ||
|
7e29fe4391 | ||
|
42041589e4 | ||
|
35085ab730 | ||
|
303fb35953 | ||
|
4ec09aff58 | ||
|
ea97563cf1 | ||
|
e78bd02879 | ||
|
4a42c797a4 | ||
|
54ad90b9cd | ||
|
13ceab7595 | ||
|
ababd9c464 | ||
|
7ba38acb51 | ||
|
789684ad02 | ||
|
9532793d59 | ||
|
bb40bf4a04 | ||
|
5f8a248a90 | ||
|
4e156d13ed | ||
|
a7a1123467 | ||
|
d3fb90b7ef | ||
|
4e2a77fea0 | ||
|
09e987c5ae | ||
|
dd6456f54c | ||
|
ffac9a85ac | ||
|
bec3075d62 | ||
|
cf6c4e59fb | ||
|
3ef25cb316 | ||
|
ff51a64adb | ||
|
0770ab6a87 | ||
|
39447b3f07 | ||
|
15d162adae | ||
|
68b0265ab5 | ||
|
646500b85f | ||
|
96731aab0f | ||
|
9306e3cc87 | ||
|
c1d5363ecc | ||
|
eab5b0a51a | ||
|
1c5c38f1ce | ||
|
ec1f6857a1 | ||
|
0b4d76ea8a | ||
|
3599cc27c8 | ||
|
aa5041e9c2 | ||
|
c9adc16471 | ||
|
03eb727bf5 | ||
|
ac734d9b1e | ||
|
f5933f5148 | ||
|
ae58ca4c0d | ||
|
aac53100f0 | ||
|
1e1d62c9d0 | ||
|
02ab71d401 | ||
|
b7d407d76a | ||
|
3bcce11c0f | ||
|
7d31098bc9 | ||
|
8e5bd02f24 | ||
|
20383fec26 | ||
|
d8f6e7df57 | ||
|
2206386723 | ||
|
9d1116ef74 | ||
|
19331e6aa5 | ||
|
e4ed0cfc56 | ||
|
de1025fdfd | ||
|
47918937b8 | ||
|
97899b5ba6 | ||
|
286d741f47 | ||
|
a352dc5e0f | ||
|
ba0566726e | ||
|
cc0f056492 | ||
|
b094c83dd3 | ||
|
c10316a4f6 | ||
|
94d3c3c65c | ||
|
e122cdb5fe | ||
|
ee7205fa88 | ||
|
67ad2fccc1 | ||
|
12aa54eb50 | ||
|
51f1681f81 | ||
|
71913aac04 | ||
|
a021f9dc78 | ||
|
80cd58c0fc | ||
|
2ea8115fcf | ||
|
b7f618ad85 | ||
|
7439b139aa | ||
|
da3e37a154 | ||
|
1a62250cc1 | ||
|
34d3520673 | ||
|
1a55c25e86 | ||
|
e9332c9fbd | ||
|
cf5251256f | ||
|
c4171ebcde | ||
|
1042fd8b14 | ||
|
a43a959206 | ||
|
871d80c872 | ||
|
60925cabbc | ||
|
4baf94dca8 | ||
|
90175aae04 | ||
|
090f1039ac | ||
|
513bb9b52f | ||
|
13c669b3d8 | ||
|
ecde7fd7f4 | ||
|
d2b7e6797b | ||
|
86e1157d8b | ||
|
e9bb0b431e | ||
|
fe1bedbd90 | ||
|
fa30aeaecf | ||
|
a7056eb22e | ||
|
24d031bfa2 | ||
|
b607b9427a | ||
|
9207dabe91 | ||
|
def4bb025d | ||
|
c15b7df7f7 | ||
|
d43568d702 | ||
|
ba66597c5e | ||
|
f973d87b1b | ||
|
3944e8ada4 | ||
|
da83c7ae68 | ||
|
a8eaee11a9 | ||
|
ef03145c3b | ||
|
8a36964ecf | ||
|
8456d31ce2 | ||
|
59fd0e0be7 | ||
|
0057749884 | ||
|
ee1dafeefa | ||
|
e897ff2f21 | ||
|
dc4f218432 | ||
|
4adc607b77 | ||
|
4e2ce36aab | ||
|
70ed4f3edc | ||
|
8628dda9b9 | ||
|
b612366abc | ||
|
c3a4456e03 | ||
|
5530381075 | ||
|
392c8da877 | ||
|
974668588a | ||
|
9ea7984ec0 | ||
|
08a9aec581 | ||
|
a5c3a84e42 | ||
|
ddcd5f2762 | ||
|
3dfa97c9ea | ||
|
1d093cb426 | ||
|
73b0dc6217 | ||
|
ca729afa8c | ||
|
dbc967d14d | ||
|
85d3f97277 | ||
|
ab0b45a3a0 | ||
|
4093715863 | ||
|
2848915e9b | ||
|
c46343615d | ||
|
870545873f | ||
|
4bde407c23 | ||
|
0a57592720 | ||
|
a4fa45de2b | ||
|
07581bb39a | ||
|
388f9799d7 | ||
|
cad38af16b | ||
|
7e0d0b2c15 | ||
|
2da1af77d4 | ||
|
513f8e4cc4 | ||
|
2373a21e8b | ||
|
e8ff41fa85 | ||
|
877d8a1383 | ||
|
a62dd3ea78 | ||
|
340b351855 | ||
|
aca48416ff | ||
|
3941e911f4 | ||
|
524d680ac7 | ||
|
74c1547424 | ||
|
e17e60b273 | ||
|
1fdc06c13b | ||
|
8d4d2b7f7a | ||
|
7a8dac5cdf | ||
|
0d1cfb5efc | ||
|
0137095b51 | ||
|
0355aaa7d2 | ||
|
4d46279ad9 | ||
|
a4f75867ee | ||
|
512e017782 | ||
|
62bce888d9 | ||
|
5ffac98654 | ||
|
546930ab97 | ||
|
a90b106c96 | ||
|
39a8316074 | ||
|
40705aba04 | ||
|
ebdc52f921 | ||
|
e4bf075cff | ||
|
4fb6fe0206 | ||
|
a74181815c | ||
|
eaf5fc1813 | ||
|
d477ca36fe | ||
|
61d1e89790 | ||
|
e329e2ed05 | ||
|
dadbcf9367 | ||
|
52eb8850b8 | ||
|
c09c154a34 | ||
|
1348195416 | ||
|
658206a8f7 | ||
|
2e10f813fe | ||
|
c044ba368c | ||
|
af887c78d2 | ||
|
550bbd4090 | ||
|
fa12da8a56 | ||
|
7858a70bec | ||
|
8f6d8ef0c9 | ||
|
e863d558d0 | ||
|
cd70dc73d8 | ||
|
3729f136b2 | ||
|
3744104cb6 | ||
|
6347cd23dc | ||
|
37ba60342b | ||
|
e7d58a4040 | ||
|
d715ca173a | ||
|
1530c0622b | ||
|
0b57d008d4 | ||
|
ea50effb2e | ||
|
042a17e5fe | ||
|
11486e15b5 | ||
|
ada5309572 | ||
|
b91d4ffb07 | ||
|
66180bb34b | ||
|
d62a489794 | ||
|
d579be4640 | ||
|
0b2de0ef8f | ||
|
e53c564e26 | ||
|
50939388bd | ||
|
38db005b21 | ||
|
7f48215db9 | ||
|
f1199f8c4d | ||
|
f7e42d4c5d | ||
|
6d3a7a67da | ||
|
70a4a21ed8 | ||
|
94fb0a0ecc | ||
|
275514301c | ||
|
39f8cb5840 | ||
|
0f9de591b6 | ||
|
9fd76adc94 | ||
|
3d29f76fee | ||
|
9f3d1c8717 | ||
|
fa2d0c69d1 | ||
|
e26295d360 | ||
|
ac401ccf45 | ||
|
375367fb75 | ||
|
ae88d86be6 | ||
|
3aa0c2378b | ||
|
ad6579ebb5 | ||
|
1be45886a0 | ||
|
d79aa5d3e3 | ||
|
da2f3ffa0f | ||
|
9a017de7c7 | ||
|
152a0677dc | ||
|
48f9f5daba | ||
|
4aaee3afa3 | ||
|
a68e6b3568 | ||
|
bb0ade9b7c | ||
|
f284c68f12 | ||
|
fd631efe02 | ||
|
9f3eb06dba | ||
|
271fd55b7e | ||
|
d6b3ddd253 | ||
|
e9bc5409ef | ||
|
80d79b79dc | ||
|
68da21acaa | ||
|
5583a60c2c | ||
|
c1f239faf2 | ||
|
7a3d2d331f | ||
|
1a948a4f0b | ||
|
8b3445a066 | ||
|
de3d3a0cf1 | ||
|
93afa6f764 | ||
|
d8481306a1 | ||
|
3536f16682 | ||
|
2a8a59aebb | ||
|
a6ada0502b | ||
|
5deb1d364e | ||
|
d5f1fe5958 | ||
|
d50ce37b58 | ||
|
c8beb5ccdb | ||
|
1ca1bf9b2c | ||
|
14c7a500c0 | ||
|
ac9f9e7eec | ||
|
e817a53a94 | ||
|
3a82aa9865 | ||
|
60392a452f | ||
|
4803dda921 | ||
|
7935635fc6 | ||
|
099f557c42 | ||
|
a33508e69f | ||
|
3223d99210 | ||
|
c392dd7997 | ||
|
db6607c336 | ||
|
11d360a45b | ||
|
cba54bf96a | ||
|
4e76f4085b | ||
|
250855f6b6 | ||
|
7d37e2df44 | ||
|
a6543742b8 | ||
|
4fa2ada624 | ||
|
5bd8070e8e | ||
|
264f865562 | ||
|
d2762e1f4f | ||
|
c13cc3f7a3 | ||
|
aab8dc5ace | ||
|
12934252ad | ||
|
c9d8c685d0 | ||
|
4e84e7a1a2 | ||
|
9aa0ca552e | ||
|
28af3a79e6 | ||
|
415f8b2d9a | ||
|
211da52745 | ||
|
f31ddd385b | ||
|
1a9ee9a242 | ||
|
3ccec6fc4b | ||
|
14ce2430da | ||
|
0514630fa5 | ||
|
f1c99961e3 | ||
|
80001d63f5 | ||
|
dce04b381e | ||
|
9d50a5b0d8 | ||
|
9a2979d9ad | ||
|
82ee84eadf | ||
|
9911aa525c | ||
|
9e663ea918 | ||
|
1600026004 | ||
|
fbea5e488a | ||
|
5f599df38e | ||
|
ee3702bff2 | ||
|
ded5cfda59 | ||
|
f70161f889 | ||
|
dbf5e97357 | ||
|
2f85c76e07 | ||
|
5cb7527b4a | ||
|
5dfb296a9d | ||
|
4610d2694e | ||
|
374fa3532e | ||
|
52f123b158 | ||
|
a9cca8bfcb | ||
|
76fe963e03 | ||
|
1573d996c9 | ||
|
e30e8b374e | ||
|
86a264e727 | ||
|
029aa58786 | ||
|
86cab09dcf | ||
|
4cdaf50584 | ||
|
85aed69b47 | ||
|
f9cee3306b | ||
|
4760a2ba95 | ||
|
b8b4eeb46b | ||
|
aa44066231 | ||
|
611473809d | ||
|
7f22f7f671 | ||
|
ce27583aba | ||
|
680ca0e593 | ||
|
819184e86e | ||
|
7126ab5b25 | ||
|
24012c772d | ||
|
605f06fbe3 | ||
|
20c2ac7966 | ||
|
1dafbd6eb8 | ||
|
b3954004b7 | ||
|
9f35426d61 | ||
|
87ce0c4fc7 | ||
|
45e67eb30e | ||
|
a2f5ac0ca5 | ||
|
b38c346ad2 | ||
|
e349bce637 | ||
|
a91f6fbe05 | ||
|
618159404c | ||
|
685f6ca79d | ||
|
0dda011f18 | ||
|
47b06b6872 | ||
|
8eadba8a35 | ||
|
848c691606 | ||
|
955f206cc4 | ||
|
7c1d1716c9 | ||
|
a59f11bb52 | ||
|
861720bdb1 | ||
|
758deff945 | ||
|
ba4882b1e3 | ||
|
4f7927d53d | ||
|
321f340885 | ||
|
9f77c758db | ||
|
94c80c749a | ||
|
0a0a7a12b9 | ||
|
e90880f508 | ||
|
7f13fd4e79 | ||
|
100ec36577 | ||
|
cd955c18b7 | ||
|
0f69c9b60c | ||
|
cd4f9d4bfe | ||
|
b1d9a3d64e | ||
|
1bda2cf4a9 | ||
|
4b91cf3e42 | ||
|
d9f5e55351 | ||
|
962952fd7e | ||
|
4d6237f592 | ||
|
7718e58610 | ||
|
9b8f9134d5 | ||
|
598ba7fb54 | ||
|
97540bcfed | ||
|
c9bbedab24 | ||
|
7fa66ff662 | ||
|
aca3e092cf | ||
|
d1d7c64acb | ||
|
cdab9473ac | ||
|
b97d0b369d | ||
|
a30289f238 | ||
|
ca74eb2284 | ||
|
0b1c397cd6 | ||
|
4c0232e9b1 | ||
|
a46b4da064 | ||
|
949fe90552 | ||
|
ab36266c0c | ||
|
d548ff99c6 | ||
|
ce3e0bd229 | ||
|
e7ed94636e | ||
|
1064f87125 | ||
|
2e810ec308 | ||
|
70d7f38522 | ||
|
3025317a39 | ||
|
7ed8d23483 | ||
|
49645f2e14 | ||
|
5003e90bea | ||
|
91a4998360 | ||
|
f53c874380 | ||
|
042af1d9f3 | ||
|
54e3496a5b | ||
|
060f38fd6e | ||
|
284850eb9b | ||
|
067e519281 | ||
|
3991ad9d87 | ||
|
faaae5accc | ||
|
0daa01d260 | ||
|
23ceee9dce | ||
|
35fb98d696 | ||
|
1b0c32b464 | ||
|
caf622ec8d | ||
|
9285ee1f65 | ||
|
ef1c3ced3f | ||
|
67e3feca97 | ||
|
d2edee149f | ||
|
ffc7c4d4ed | ||
|
feac3f29b0 | ||
|
c99b2e21e2 | ||
|
473fd691a9 | ||
|
c1d0614ca7 | ||
|
0257f6a003 | ||
|
22fceb7797 | ||
|
c20ecd1a93 | ||
|
78e039b78e | ||
|
d4502d8520 | ||
|
6656743523 | ||
|
ad93af0d07 | ||
|
b9433b75d8 | ||
|
b081623684 | ||
|
fc7dd82484 | ||
|
78216458e8 | ||
|
b16bc0d282 | ||
|
32843abf45 | ||
|
482f3851f6 | ||
|
e68db48edf | ||
|
7ebb7fbf1c | ||
|
2485b5b01b | ||
|
9e4fc15eb4 | ||
|
eb00ddba30 | ||
|
ff1a99273f | ||
|
b88cbfd161 | ||
|
0b3d01046f | ||
|
abc985ddf0 | ||
|
12aef2eb5d | ||
|
548e6d56ae | ||
|
591fba80bb | ||
|
f9300e2249 | ||
|
094ecb0ae8 | ||
|
f9157e0977 | ||
|
6fe145f2d0 | ||
|
9c9e6e7103 | ||
|
715191b91a | ||
|
678bd916fc | ||
|
80d57056bc | ||
|
4ecc85e64e | ||
|
b07cfd92e4 | ||
|
39abaaa2e8 | ||
|
3e1e3b27a4 | ||
|
4229fdcddb | ||
|
1967712b3e | ||
|
b95f829e42 | ||
|
d2fc79dbeb | ||
|
790608c457 | ||
|
2d098d416f | ||
|
7dcdbaf578 | ||
|
d817129bc5 | ||
|
50e2c655e2 | ||
|
c4ad8c524a | ||
|
af1145bcfd | ||
|
0e9dcdb45f | ||
|
58caac99ca | ||
|
f3c42fbcdd | ||
|
3a8f13270d | ||
|
55a4599570 | ||
|
59c1e90e1e | ||
|
eedc40c601 | ||
|
2002fc91df | ||
|
c604c3c2b5 | ||
|
3a45d48d58 | ||
|
a9a37884b4 | ||
|
76b199e34b | ||
|
47b9e6e557 | ||
|
fa8cdc5b59 | ||
|
3d3adf6214 | ||
|
502eff17df | ||
|
eeccc816be | ||
|
cc05d724eb | ||
|
4463210731 | ||
|
ce29021e03 | ||
|
5c00a65148 | ||
|
12c5a5fbc7 | ||
|
c661c64334 | ||
|
48448f4405 | ||
|
a8c0b0eea0 | ||
|
66ce6b9ff5 | ||
|
980ba8855a | ||
|
63dbe07eeb | ||
|
ef16276bb6 | ||
|
d38b10e6bd | ||
|
84680a1573 | ||
|
5a35aeff2a | ||
|
c0ed389f10 | ||
|
7ad95a2d24 | ||
|
f22dd9498a | ||
|
37737d1606 | ||
|
608544faef | ||
|
fb775fd856 | ||
|
bdac716975 | ||
|
b36107b4fd | ||
|
a633945a49 | ||
|
efda7967c2 | ||
|
d037ae232e | ||
|
5bf0a30b80 | ||
|
2dd22d5265 | ||
|
d7361d9da9 | ||
|
be2729d5e4 | ||
|
d3606244da | ||
|
376df0333e | ||
|
8849930598 | ||
|
b98497145c | ||
|
dab7027dba | ||
|
579b692d61 | ||
|
eff60c841b | ||
|
08c7388d35 | ||
|
de6ba9a555 | ||
|
b28aab03da | ||
|
d551b6f3b3 | ||
|
1435739766 | ||
|
e7630c08a9 | ||
|
994f015825 | ||
|
cf845d2e56 | ||
|
8edd3e2105 | ||
|
062fc6cf99 | ||
|
ead4d5b299 | ||
|
873c6228f2 | ||
|
7c4922897e | ||
|
342e8972ba | ||
|
1b478be0de | ||
|
26e7632d0e | ||
|
8bbf176abf | ||
|
28881e9bc7 | ||
|
c9d5111b6e | ||
|
a447b4f5fd | ||
|
3c9f185697 | ||
|
91b458ad5b | ||
|
1507840f1f | ||
|
9c8521432e | ||
|
3da2cf5201 | ||
|
ae67af30bc | ||
|
8d029ac441 | ||
|
46d323f23d | ||
|
d038af2af8 | ||
|
7a87fbb0c3 | ||
|
b910c31468 | ||
|
fe24bde02f | ||
|
2d4c071fbe | ||
|
c4e5d31596 | ||
|
b837c3f233 | ||
|
409af192f4 | ||
|
613f342043 | ||
|
1bf1a7232d | ||
|
4579aaae34 | ||
|
ff5d412231 | ||
|
d066f94c08 | ||
|
f5e125a142 | ||
|
def246052c | ||
|
2704f5bb2f | ||
|
e14b0d9e64 | ||
|
dd1e21f39f | ||
|
7872e50e11 | ||
|
0b854fe739 | ||
|
867727144e | ||
|
ba90425948 | ||
|
daf6d0145c | ||
|
f82837282d | ||
|
b5667ef42c | ||
|
9a7094de99 | ||
|
8f95320f39 | ||
|
ea275bc0c3 | ||
|
4e4d472814 | ||
|
9638d5800a | ||
|
e9ab23a1be | ||
|
6e320e8d8a | ||
|
6eeb73f9ed | ||
|
bf6098f44c | ||
|
ea5dfeab93 | ||
|
580088dab1 | ||
|
77991a85e5 | ||
|
252f23d104 | ||
|
e1bf38de89 | ||
|
8c9b5bdb50 | ||
|
6d7055668f | ||
|
02d5d463dc | ||
|
1d0d67d4d4 | ||
|
9c1dbc6076 | ||
|
5d60da0079 | ||
|
4f1d724b82 | ||
|
40d8229671 | ||
|
4b31973464 | ||
|
8bf291abf0 | ||
|
3f212d5ed3 | ||
|
9b23333630 | ||
|
9c9e67d001 | ||
|
6378ae269b | ||
|
9e08221de6 | ||
|
919cbfa5dc | ||
|
5c01177666 | ||
|
b87dadf030 | ||
|
d030ba37a4 | ||
|
9745027308 | ||
|
315995c66c | ||
|
30756bb4ff | ||
|
e883f0a35a | ||
|
b7ef007f7b | ||
|
e99d758c39 | ||
|
4a6cf08699 | ||
|
c015406186 | ||
|
6748f9d67d | ||
|
aa9922919e | ||
|
c7956e0afb | ||
|
3b30a5d345 | ||
|
a13528fd73 | ||
|
f46d493cf6 | ||
|
1a7e2e45e2 | ||
|
c8d738bbb3 | ||
|
bf421245f2 | ||
|
4afc9675a9 | ||
|
c495c40f15 | ||
|
107fb70390 | ||
|
1eb936134b | ||
|
2ce5494b4d | ||
|
f77029273a | ||
|
adbdc60200 | ||
|
ea9ad6758f | ||
|
0ef7aec309 | ||
|
3c0e7d6fc9 | ||
|
76f338721b | ||
|
32c0dbee24 | ||
|
9df77a83ca | ||
|
62faf6cddf | ||
|
aea960e54a | ||
|
38955a7203 | ||
|
74af93dd19 | ||
|
f8b9215e9f | ||
|
d598b5d88d | ||
|
855667eadc | ||
|
b441c35784 | ||
|
39f3859176 | ||
|
4b8939b1fe | ||
|
213c2aa85c | ||
|
16872991cb | ||
|
b0fbe664b2 | ||
|
79fdb02ada | ||
|
8c79f0dc51 | ||
|
8557b3adf2 | ||
|
527a0c8767 | ||
|
24115d0331 | ||
|
67b8cbae2b | ||
|
fc3aba1ff7 | ||
|
b3d5ac6dfa | ||
|
3577aef354 | ||
|
1300357c0f | ||
|
1b4ff9ff15 | ||
|
2b5face2fd | ||
|
f3ac3b7f59 | ||
|
b5daf9320e | ||
|
9a82281fca | ||
|
897b04ac6b | ||
|
99b27274c3 | ||
|
89db988ed2 | ||
|
013748c4b8 | ||
|
698eba4852 | ||
|
eb91bc05bd | ||
|
8902034a11 | ||
|
b44c010b11 | ||
|
40ed8a06f7 | ||
|
1db8396661 | ||
|
a09ac66053 | ||
|
903255eb28 | ||
|
d16233cc92 | ||
|
1f761a49ce | ||
|
380aba5d92 | ||
|
f90d888548 | ||
|
3cd5ed249e | ||
|
30762f89b0 | ||
|
b32b0c5183 | ||
|
d53210f7e0 | ||
|
a59474718d | ||
|
39e37b1168 | ||
|
91a8a26789 | ||
|
3ab33847c6 | ||
|
347bdce1c4 | ||
|
2ac1517a6b | ||
|
5e7b94d64b | ||
|
d658bf38b4 | ||
|
c67b7cf506 | ||
|
0c8919db24 | ||
|
4400b26870 | ||
|
73d91b52e1 | ||
|
2ad0f8ca0f | ||
|
0f1b64f05b | ||
|
4de36aba89 | ||
|
c26135d648 | ||
|
4fd42c86fa | ||
|
68fcd27c69 | ||
|
3c8ecd4b89 | ||
|
61b2b7bd3b | ||
|
2b3866f5fc | ||
|
26307aa932 | ||
|
2942a15fdc | ||
|
e16a1eb28d | ||
|
9fcda4451a | ||
|
fa04bf2432 | ||
|
e864bff65a | ||
|
5b11e74a01 | ||
|
1fcc6b0ea4 | ||
|
83c5b10797 | ||
|
bebdac46ff | ||
|
62e853a265 | ||
|
fc2679ecff | ||
|
f3f3c19e46 | ||
|
79b79606db | ||
|
9bc7c1d254 | ||
|
a31fc6b1b8 | ||
|
315792df57 | ||
|
d2699e10b4 | ||
|
317125a2e9 | ||
|
d13af9492b | ||
|
5cd16ae016 | ||
|
636a1226a8 | ||
|
ab64efadc6 | ||
|
ec8b9c392b | ||
|
227f0a708e | ||
|
8c7ec2357d | ||
|
9186b1a495 | ||
|
dd538d227e | ||
|
611a654544 | ||
|
de2b0339b3 | ||
|
694bef76b9 | ||
|
00161565e2 | ||
|
58b3ea45ae | ||
|
e659299d1c | ||
|
73142ffe16 | ||
|
5af750a43a | ||
|
2d3b672da7 | ||
|
97ace155ce | ||
|
fe3930301b | ||
|
d160d9a6a1 | ||
|
d218cc5138 | ||
|
bfbaff18e0 | ||
|
cd95ef1083 | ||
|
e08964133d | ||
|
9773be3a4e | ||
|
94793640c5 | ||
|
2f0a7b9584 | ||
|
723ae84900 | ||
|
d6416c0bde | ||
|
a32a48f804 | ||
|
0742e80275 | ||
|
859826ce1d | ||
|
55e622f7d2 | ||
|
90d3a8bfe8 | ||
|
1b23f872be | ||
|
d242920707 | ||
|
39cdfe0cfd | ||
|
d143f64510 | ||
|
078a46ab20 | ||
|
a100859273 | ||
|
fb5d9b77a6 | ||
|
7002413a6b | ||
|
110961b410 | ||
|
4792dfa696 | ||
|
1536ad097b | ||
|
48f1ff4e74 | ||
|
64ff7962ee | ||
|
a9be06cc4d | ||
|
9e5bab31be | ||
|
e4c9652996 | ||
|
14a4dcf948 | ||
|
d9bfea98bd | ||
|
2bf9669828 | ||
|
35fe538330 | ||
|
22d7f146a4 | ||
|
cf4968a904 | ||
|
74831d8b38 | ||
|
f354686536 | ||
|
2d791b5f7b | ||
|
47e4a18d01 | ||
|
1465777b63 | ||
|
bcd774606a | ||
|
fa8b46adf4 | ||
|
c0f54d3dea | ||
|
475a55b2f0 | ||
|
2e1d470569 | ||
|
4c7d990bad | ||
|
e090bb55f0 | ||
|
0bc9783221 | ||
|
42d3b54f0d | ||
|
5b49672af4 | ||
|
40256d1dd4 | ||
|
c9e7fbc38f | ||
|
b52736a31b | ||
|
d68cf48284 | ||
|
c58b0d26b7 | ||
|
b821720d25 | ||
|
a9da75cb7f | ||
|
7c18b96700 | ||
|
0e0d434456 | ||
|
03cb76ec6b | ||
|
3522351939 | ||
|
2f509171e9 | ||
|
db45764193 | ||
|
c07cc01560 | ||
|
77ea4d6b90 | ||
|
422c2f77f7 | ||
|
af997fc9f8 | ||
|
6c0ef7cb9d | ||
|
0c7078e19f | ||
|
adb6af6e87 | ||
|
02c86f89ca | ||
|
1443bac30a | ||
|
ebda6b8f90 | ||
|
91b6d8b4b3 | ||
|
56a86116cb | ||
|
940adc0c55 | ||
|
fe826e91f8 | ||
|
46ad2b23f5 | ||
|
a878acdf0e | ||
|
9b3cf68ef2 | ||
|
e85f7c6c9d | ||
|
b01c88e620 | ||
|
d1fec21f64 | ||
|
ccf3cfcdf6 | ||
|
080c08d3c1 | ||
|
a4b8f2e732 | ||
|
71caf0987d | ||
|
67fc6ff7ff | ||
|
7b0a5c5404 | ||
|
829ed35978 | ||
|
6aca5e1feb | ||
|
f622969b9a | ||
|
4eac13a88c | ||
|
5165779503 | ||
|
5ee48ebd34 | ||
|
1125177568 | ||
|
9103af4df1 | ||
|
e400baa30f | ||
|
24aa348023 | ||
|
2a85869152 | ||
|
de757d162c | ||
|
2f5200175f | ||
|
37d707fb47 | ||
|
71401e8d39 | ||
|
06208fadd6 | ||
|
6ed0323361 | ||
|
5f7be1b9a3 | ||
|
3f71d1bc02 | ||
|
d87c4e1a72 | ||
|
b0a8cf5243 | ||
|
beb139496a | ||
|
9e1fe5cddd | ||
|
7762c2233c | ||
|
c197e4a1e0 | ||
|
f03a4d8e97 | ||
|
f27ac4a21c | ||
|
7e409bb2f2 | ||
|
9f66527328 | ||
|
b1f23d4045 | ||
|
b7b5ba669f | ||
|
8e3ed28f89 | ||
|
3b6cbc4da2 | ||
|
8f384467cc | ||
|
2768ac9c9f | ||
|
9cd5f606b0 | ||
|
c3a3dcb418 | ||
|
6949bc21ce | ||
|
1ad30772ea | ||
|
2ceb5558f9 | ||
|
0feea2dbd2 | ||
|
ca81a89839 | ||
|
8794795cb9 | ||
|
a87488e9f1 | ||
|
ae48df3ebb | ||
|
f028f74d62 | ||
|
d586d4dcef | ||
|
66d312f8a1 | ||
|
32abbb17cd | ||
|
9f2a705f7f | ||
|
ebf185539f | ||
|
bf85950d9a | ||
|
7d4c083215 | ||
|
1ec01c34d7 | ||
72b3e9b5a0 | |||
|
5a4f40797c | ||
|
e6a4a3feea | ||
|
01d078d970 |
15
.github/CODEOWNERS
vendored
15
.github/CODEOWNERS
vendored
|
@ -55,7 +55,7 @@
|
||||||
/pkgs/pkgs-lib/formats/hocon @h7x4
|
/pkgs/pkgs-lib/formats/hocon @h7x4
|
||||||
|
|
||||||
# pkgs/by-name
|
# pkgs/by-name
|
||||||
/pkgs/test/nixpkgs-check-by-name @infinisil
|
/pkgs/test/check-by-name @infinisil
|
||||||
/pkgs/by-name/README.md @infinisil
|
/pkgs/by-name/README.md @infinisil
|
||||||
/pkgs/top-level/by-name-overlay.nix @infinisil
|
/pkgs/top-level/by-name-overlay.nix @infinisil
|
||||||
/.github/workflows/check-by-name.yml @infinisil
|
/.github/workflows/check-by-name.yml @infinisil
|
||||||
|
@ -359,3 +359,16 @@ pkgs/development/tools/continuous-integration/buildbot @Mic92 @zowoq
|
||||||
pkgs/by-name/pr/pretix/ @mweinelt
|
pkgs/by-name/pr/pretix/ @mweinelt
|
||||||
nixos/modules/services/web-apps/pretix.nix @mweinelt
|
nixos/modules/services/web-apps/pretix.nix @mweinelt
|
||||||
nixos/tests/web-apps/pretix.nix @mweinelt
|
nixos/tests/web-apps/pretix.nix @mweinelt
|
||||||
|
|
||||||
|
# incus/lxc/lxd
|
||||||
|
nixos/maintainers/scripts/lxd/ @adamcstephens
|
||||||
|
nixos/modules/virtualisation/incus.nix @adamcstephens
|
||||||
|
nixos/modules/virtualisation/lxc* @adamcstephens
|
||||||
|
nixos/modules/virtualisation/lxd* @adamcstephens
|
||||||
|
nixos/tests/incus/ @adamcstephens
|
||||||
|
nixos/tests/lxd/ @adamcstephens
|
||||||
|
pkgs/by-name/in/incus/ @adamcstephens
|
||||||
|
pkgs/by-name/lx/lxc* @adamcstephens
|
||||||
|
pkgs/by-name/lx/lxd* @adamcstephens
|
||||||
|
pkgs/os-specific/linux/lxc/ @adamcstephens
|
||||||
|
|
||||||
|
|
1
.github/workflows/manual-nixpkgs.yml
vendored
1
.github/workflows/manual-nixpkgs.yml
vendored
|
@ -9,6 +9,7 @@ on:
|
||||||
paths:
|
paths:
|
||||||
- 'doc/**'
|
- 'doc/**'
|
||||||
- 'lib/**'
|
- 'lib/**'
|
||||||
|
- 'pkgs/tools/nix/nixdoc/**'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
nixpkgs:
|
nixpkgs:
|
||||||
|
|
|
@ -283,7 +283,7 @@ If `pname` and `version` are specified, `fetchurl` will use those values and wil
|
||||||
|
|
||||||
_Default value:_ `""`.
|
_Default value:_ `""`.
|
||||||
|
|
||||||
`recursiveHash` (Boolean; _optional_)
|
`recursiveHash` (Boolean; _optional_) []{#sec-pkgs-fetchers-fetchurl-inputs-recursiveHash}
|
||||||
: If set to `true`, will signal to Nix that the hash given to `fetchurl` was calculated using the `"recursive"` mode.
|
: If set to `true`, will signal to Nix that the hash given to `fetchurl` was calculated using the `"recursive"` mode.
|
||||||
See [the documentation on the Nix manual](https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-outputHashMode) for more information about the existing modes.
|
See [the documentation on the Nix manual](https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-outputHashMode) for more information about the existing modes.
|
||||||
|
|
||||||
|
@ -296,7 +296,7 @@ If `pname` and `version` are specified, `fetchurl` will use those values and wil
|
||||||
|
|
||||||
_Default value_: `false`.
|
_Default value_: `false`.
|
||||||
|
|
||||||
`downloadToTemp` (Boolean; _optional_)
|
`downloadToTemp` (Boolean; _optional_) []{#sec-pkgs-fetchers-fetchurl-inputs-downloadToTemp}
|
||||||
: If `true`, saves the downloaded file to a temporary location instead of the expected Nix store location.
|
: If `true`, saves the downloaded file to a temporary location instead of the expected Nix store location.
|
||||||
This is useful when used in conjunction with `postFetch` attribute, otherwise `fetchurl` will not produce any meaningful output.
|
This is useful when used in conjunction with `postFetch` attribute, otherwise `fetchurl` will not produce any meaningful output.
|
||||||
|
|
||||||
|
@ -519,15 +519,81 @@ See [](#chap-pkgs-fetchers-caveats) for more details on how to work with the `ha
|
||||||
|
|
||||||
## `fetchzip` {#sec-pkgs-fetchers-fetchzip}
|
## `fetchzip` {#sec-pkgs-fetchers-fetchzip}
|
||||||
|
|
||||||
Downloads content from a given URL (which is assumed to be an archive), and decompresses the archive for you, making files and directories directly accessible.
|
Returns a [fixed-output derivation](https://nixos.org/manual/nix/stable/glossary.html#gloss-fixed-output-derivation) which downloads an archive from a given URL and decompresses it.
|
||||||
`fetchzip` can only be used with archives.
|
|
||||||
Despite its name, `fetchzip` is not limited to `.zip` files and can also be used with any tarball.
|
|
||||||
|
|
||||||
It has two required arguments, a URL and a hash.
|
Despite its name, `fetchzip` is not limited to `.zip` files but can also be used with [various compressed tarball formats](#tar-files) by default.
|
||||||
The hash is typically `hash`, although many more hash algorithms are supported.
|
This can extended by specifying additional attributes, see [](#ex-fetchers-fetchzip-rar-archive) to understand how to do that.
|
||||||
Nixpkgs contributors are currently recommended to use `hash`.
|
|
||||||
This hash will be used by Nix to identify your source.
|
### Inputs {#sec-pkgs-fetchers-fetchzip-inputs}
|
||||||
A typical usage of `fetchzip` is provided below.
|
|
||||||
|
`fetchzip` requires an attribute set, and most attributes are passed to the underlying call to [`fetchurl`](#sec-pkgs-fetchers-fetchurl).
|
||||||
|
|
||||||
|
The attributes below are treated differently by `fetchzip` when compared to what `fetchurl` expects:
|
||||||
|
|
||||||
|
`name` (String; _optional_)
|
||||||
|
: Works as defined in `fetchurl`, but has a different default value than `fetchurl`.
|
||||||
|
|
||||||
|
_Default value:_ `"source"`.
|
||||||
|
|
||||||
|
`nativeBuildInputs` (List of Attribute Set; _optional_)
|
||||||
|
: Works as defined in `fetchurl`, but it is also augmented by `fetchzip` to include packages to deal with additional archives (such as `.zip`).
|
||||||
|
|
||||||
|
_Default value:_ `[]`.
|
||||||
|
|
||||||
|
`postFetch` (String; _optional_)
|
||||||
|
: Works as defined in `fetchurl`, but it is also augmented with the code needed to make `fetchzip` work.
|
||||||
|
|
||||||
|
:::{.caution}
|
||||||
|
It is only safe to modify files in `$out` in `postFetch`.
|
||||||
|
Consult the implementation of `fetchzip` for anything more involved.
|
||||||
|
:::
|
||||||
|
|
||||||
|
_Default value:_ `""`.
|
||||||
|
|
||||||
|
`stripRoot` (Boolean; _optional_)
|
||||||
|
: If `true`, the decompressed contents are moved one level up the directory tree.
|
||||||
|
|
||||||
|
This is useful for archives that decompress into a single directory which commonly includes some values that change with time, such as version numbers.
|
||||||
|
When this is the case (and `stripRoot` is `true`), `fetchzip` will remove this directory and make the decompressed contents available in the top-level directory.
|
||||||
|
|
||||||
|
[](#ex-fetchers-fetchzip-simple-striproot) shows what this attribute does.
|
||||||
|
|
||||||
|
This attribute is **not** passed through to `fetchurl`.
|
||||||
|
|
||||||
|
_Default value:_ `true`.
|
||||||
|
|
||||||
|
`extension` (String or Null; _optional_)
|
||||||
|
: If set, the archive downloaded by `fetchzip` will be renamed to a filename with the extension specified in this attribute.
|
||||||
|
|
||||||
|
This is useful when making `fetchzip` support additional types of archives, because the implementation may use the extension of an archive to determine whether they can decompress it.
|
||||||
|
If the URL you're using to download the contents doesn't end with the extension associated with the archive, use this attribute to fix the filename of the archive.
|
||||||
|
|
||||||
|
This attribute is **not** passed through to `fetchurl`.
|
||||||
|
|
||||||
|
_Default value:_ `null`.
|
||||||
|
|
||||||
|
`recursiveHash` (Boolean; _optional_)
|
||||||
|
: Works [as defined in `fetchurl`](#sec-pkgs-fetchers-fetchurl-inputs-recursiveHash), but its default value is different than for `fetchurl`.
|
||||||
|
|
||||||
|
_Default value:_ `true`.
|
||||||
|
|
||||||
|
`downloadToTemp` (Boolean; _optional_)
|
||||||
|
: Works [as defined in `fetchurl`](#sec-pkgs-fetchers-fetchurl-inputs-downloadToTemp), but its default value is different than for `fetchurl`.
|
||||||
|
|
||||||
|
_Default value:_ `true`.
|
||||||
|
|
||||||
|
`extraPostFetch` **DEPRECATED**
|
||||||
|
: This attribute is deprecated.
|
||||||
|
Please use `postFetch` instead.
|
||||||
|
|
||||||
|
This attribute is **not** passed through to `fetchurl`.
|
||||||
|
|
||||||
|
### Examples {#sec-pkgs-fetchers-fetchzip-examples}
|
||||||
|
|
||||||
|
::::{.example #ex-fetchers-fetchzip-simple-striproot}
|
||||||
|
# Using `fetchzip` to output contents directly
|
||||||
|
|
||||||
|
The following recipe shows how to use `fetchzip` to decompress a `.tar.gz` archive:
|
||||||
|
|
||||||
```nix
|
```nix
|
||||||
{ fetchzip }:
|
{ fetchzip }:
|
||||||
|
@ -537,6 +603,80 @@ fetchzip {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This archive has all its contents in a directory named `patchelf-0.18.0`.
|
||||||
|
This means that after decompressing, you'd have to enter this directory to see the contents of the archive.
|
||||||
|
However, `fetchzip` makes this easier through the attribute `stripRoot` (enabled by default).
|
||||||
|
|
||||||
|
After building the recipe, the derivation output will show all the files in the archive at the top level:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ nix-build
|
||||||
|
(output removed for clarity)
|
||||||
|
/nix/store/1b7h3fvmgrcddvs0m299hnqxlgli1yjw-source
|
||||||
|
|
||||||
|
$ ls /nix/store/1b7h3fvmgrcddvs0m299hnqxlgli1yjw-source
|
||||||
|
aclocal.m4 completions configure.ac m4 Makefile.in patchelf.spec README.md tests
|
||||||
|
build-aux configure COPYING Makefile.am patchelf.1 patchelf.spec.in src version
|
||||||
|
```
|
||||||
|
|
||||||
|
If `stripRoot` is set to `false`, the derivation output will be the decompressed archive as-is:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{ fetchzip }:
|
||||||
|
fetchzip {
|
||||||
|
url = "https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0.tar.gz";
|
||||||
|
hash = "sha256-uv3FuKE4DqpHT3yfE0qcnq0gYjDNQNKZEZt2+PUAneg=";
|
||||||
|
stripRoot = false;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
:::{.caution}
|
||||||
|
The hash changed!
|
||||||
|
Whenever changing attributes of a Nixpkgs fetcher, [remember to invalidate the hash](#chap-pkgs-fetchers-caveats), otherwise you won't get the results you're expecting!
|
||||||
|
:::
|
||||||
|
|
||||||
|
After building the recipe:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ nix-build
|
||||||
|
(output removed for clarity)
|
||||||
|
/nix/store/2hy5bxw7xgbgxkn0i4x6hjr8w3dbx16c-source
|
||||||
|
|
||||||
|
$ ls /nix/store/2hy5bxw7xgbgxkn0i4x6hjr8w3dbx16c-source
|
||||||
|
patchelf-0.18.0
|
||||||
|
```
|
||||||
|
::::
|
||||||
|
|
||||||
|
::::{.example #ex-fetchers-fetchzip-rar-archive}
|
||||||
|
# Using `fetchzip` to decompress a `.rar` file
|
||||||
|
|
||||||
|
The `unrar` package provides a [setup hook](#ssec-setup-hooks) to decompress `.rar` archives during the [unpack phase](#ssec-unpack-phase), which can be used with `fetchzip` to decompress those archives:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{ fetchzip, unrar }:
|
||||||
|
fetchzip {
|
||||||
|
url = "https://archive.org/download/SpaceCadet_Plus95/Space_Cadet.rar";
|
||||||
|
hash = "sha256-fC+zsR8BY6vXpUkVd6i1jF0IZZxVKVvNi6VWCKT+pA4=";
|
||||||
|
stripRoot = false;
|
||||||
|
nativeBuildInputs = [ unrar ];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Since this particular `.rar` file doesn't put its contents in a directory inside the archive, `stripRoot` must be set to `false`.
|
||||||
|
|
||||||
|
After building the recipe, the derivation output will show the decompressed files:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ nix-build
|
||||||
|
(output removed for clarity)
|
||||||
|
/nix/store/zpn7knxfva6rfjja2gbb4p3l9w1f0d36-source
|
||||||
|
|
||||||
|
$ ls /nix/store/zpn7knxfva6rfjja2gbb4p3l9w1f0d36-source
|
||||||
|
FONT.DAT PINBALL.DAT PINBALL.EXE PINBALL2.MID TABLE.BMP WMCONFIG.EXE
|
||||||
|
MSCREATE.DIR PINBALL.DOC PINBALL.MID Sounds WAVEMIX.INF
|
||||||
|
```
|
||||||
|
::::
|
||||||
|
|
||||||
## `fetchpatch` {#fetchpatch}
|
## `fetchpatch` {#fetchpatch}
|
||||||
|
|
||||||
`fetchpatch` works very similarly to `fetchurl` with the same arguments expected. It expects patch files as a source and performs normalization on them before computing the checksum. For example, it will remove comments or other unstable parts that are sometimes added by version control systems and can change over time.
|
`fetchpatch` works very similarly to `fetchurl` with the same arguments expected. It expects patch files as a source and performs normalization on them before computing the checksum. For example, it will remove comments or other unstable parts that are sometimes added by version control systems and can change over time.
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
|
|
||||||
Some packages provide the shell integration to be more useful. But unlike other systems, nix doesn't have a standard `share` directory location. This is why a bunch `PACKAGE-share` scripts are shipped that print the location of the corresponding shared folder. Current list of such packages is as following:
|
Some packages provide the shell integration to be more useful. But unlike other systems, nix doesn't have a standard `share` directory location. This is why a bunch `PACKAGE-share` scripts are shipped that print the location of the corresponding shared folder. Current list of such packages is as following:
|
||||||
|
|
||||||
- `sk` : `sk-share`
|
- `fzf` : `fzf-share`
|
||||||
|
|
||||||
E.g. `sk` can then be used in the `.bashrc` like this:
|
E.g. `fzf` can then be used in the `.bashrc` like this:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
source "$(sk-share)/completion.bash"
|
source "$(fzf-share)/completion.bash"
|
||||||
source "$(sk-share)/key-bindings.bash"
|
source "$(fzf-share)/key-bindings.bash"
|
||||||
```
|
```
|
||||||
|
|
|
@ -128,7 +128,7 @@ let
|
||||||
canCleanSource pathIsGitRepo;
|
canCleanSource pathIsGitRepo;
|
||||||
inherit (self.modules) evalModules setDefaultModuleLocation
|
inherit (self.modules) evalModules setDefaultModuleLocation
|
||||||
unifyModuleSyntax applyModuleArgsIfFunction mergeModules
|
unifyModuleSyntax applyModuleArgsIfFunction mergeModules
|
||||||
mergeModules' mergeOptionDecls evalOptionValue mergeDefinitions
|
mergeModules' mergeOptionDecls mergeDefinitions
|
||||||
pushDownProperties dischargeProperties filterOverrides
|
pushDownProperties dischargeProperties filterOverrides
|
||||||
sortProperties fixupOptionType mkIf mkAssert mkMerge mkOverride
|
sortProperties fixupOptionType mkIf mkAssert mkMerge mkOverride
|
||||||
mkOptionDefault mkDefault mkImageMediaOverride mkForce mkVMOverride
|
mkOptionDefault mkDefault mkImageMediaOverride mkForce mkVMOverride
|
||||||
|
@ -138,6 +138,7 @@ let
|
||||||
mkMergedOptionModule mkChangedOptionModule
|
mkMergedOptionModule mkChangedOptionModule
|
||||||
mkAliasOptionModule mkDerivedConfig doRename
|
mkAliasOptionModule mkDerivedConfig doRename
|
||||||
mkAliasOptionModuleMD;
|
mkAliasOptionModuleMD;
|
||||||
|
evalOptionValue = lib.warn "External use of `lib.evalOptionValue` is deprecated. If your use case isn't covered by non-deprecated functions, we'd like to know more and perhaps support your use case well, instead of providing access to these low level functions. In this case please open an issue in https://github.com/nixos/nixpkgs/issues/." self.modules.evalOptionValue;
|
||||||
inherit (self.options) isOption mkEnableOption mkSinkUndeclaredOptions
|
inherit (self.options) isOption mkEnableOption mkSinkUndeclaredOptions
|
||||||
mergeDefaultOption mergeOneOption mergeEqualOption mergeUniqueOption
|
mergeDefaultOption mergeOneOption mergeEqualOption mergeUniqueOption
|
||||||
getValues getFiles
|
getValues getFiles
|
||||||
|
|
|
@ -1378,7 +1378,6 @@ let
|
||||||
inherit
|
inherit
|
||||||
applyModuleArgsIfFunction
|
applyModuleArgsIfFunction
|
||||||
dischargeProperties
|
dischargeProperties
|
||||||
evalOptionValue
|
|
||||||
mergeModules
|
mergeModules
|
||||||
mergeModules'
|
mergeModules'
|
||||||
pushDownProperties
|
pushDownProperties
|
||||||
|
@ -1399,6 +1398,7 @@ private //
|
||||||
defaultPriority
|
defaultPriority
|
||||||
doRename
|
doRename
|
||||||
evalModules
|
evalModules
|
||||||
|
evalOptionValue # for use by lib.types
|
||||||
filterOverrides
|
filterOverrides
|
||||||
filterOverrides'
|
filterOverrides'
|
||||||
fixMergeModules
|
fixMergeModules
|
||||||
|
|
|
@ -103,6 +103,18 @@ checkConfigError 'The option .sub.wrong2. does not exist. Definition values:' co
|
||||||
checkConfigError '.*This can happen if you e.g. declared your options in .types.submodule.' config.sub ./error-mkOption-in-submodule-config.nix
|
checkConfigError '.*This can happen if you e.g. declared your options in .types.submodule.' config.sub ./error-mkOption-in-submodule-config.nix
|
||||||
checkConfigError '.*A definition for option .bad. is not of type .non-empty .list of .submodule...\.' config.bad ./error-nonEmptyListOf-submodule.nix
|
checkConfigError '.*A definition for option .bad. is not of type .non-empty .list of .submodule...\.' config.bad ./error-nonEmptyListOf-submodule.nix
|
||||||
|
|
||||||
|
# types.attrTag
|
||||||
|
checkConfigOutput '^true$' config.okChecks ./types-attrTag.nix
|
||||||
|
checkConfigError 'A definition for option .intStrings\.syntaxError. is not of type .attribute-tagged union' config.intStrings.syntaxError ./types-attrTag.nix
|
||||||
|
checkConfigError 'A definition for option .intStrings\.syntaxError2. is not of type .attribute-tagged union' config.intStrings.syntaxError2 ./types-attrTag.nix
|
||||||
|
checkConfigError 'A definition for option .intStrings\.syntaxError3. is not of type .attribute-tagged union' config.intStrings.syntaxError3 ./types-attrTag.nix
|
||||||
|
checkConfigError 'A definition for option .intStrings\.syntaxError4. is not of type .attribute-tagged union' config.intStrings.syntaxError4 ./types-attrTag.nix
|
||||||
|
checkConfigError 'A definition for option .intStrings\.mergeError. is not of type .attribute-tagged union' config.intStrings.mergeError ./types-attrTag.nix
|
||||||
|
checkConfigError 'A definition for option .intStrings\.badTagError. is not of type .attribute-tagged union' config.intStrings.badTagError ./types-attrTag.nix
|
||||||
|
checkConfigError 'A definition for option .intStrings\.badTagTypeError\.left. is not of type .signed integer.' config.intStrings.badTagTypeError.left ./types-attrTag.nix
|
||||||
|
checkConfigError 'A definition for option .nested\.right\.left. is not of type .signed integer.' config.nested.right.left ./types-attrTag.nix
|
||||||
|
checkConfigError 'In attrTag, each tag value must be an option, but tag int was a bare type, not wrapped in mkOption.' config.opt.int ./types-attrTag-wrong-decl.nix
|
||||||
|
|
||||||
# types.pathInStore
|
# types.pathInStore
|
||||||
checkConfigOutput '".*/store/0lz9p8xhf89kb1c1kk6jxrzskaiygnlh-bash-5.2-p15.drv"' config.pathInStore.ok1 ./types.nix
|
checkConfigOutput '".*/store/0lz9p8xhf89kb1c1kk6jxrzskaiygnlh-bash-5.2-p15.drv"' config.pathInStore.ok1 ./types.nix
|
||||||
checkConfigOutput '".*/store/0fb3ykw9r5hpayd05sr0cizwadzq1d8q-bash-5.2-p15"' config.pathInStore.ok2 ./types.nix
|
checkConfigOutput '".*/store/0fb3ykw9r5hpayd05sr0cizwadzq1d8q-bash-5.2-p15"' config.pathInStore.ok2 ./types.nix
|
||||||
|
|
41
lib/tests/modules/docs.nix
Normal file
41
lib/tests/modules/docs.nix
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
A basic documentation generating module.
|
||||||
|
Declares and defines a `docs` option, suitable for making assertions about
|
||||||
|
the extraction "phase" of documentation generation.
|
||||||
|
*/
|
||||||
|
{ lib, options, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib)
|
||||||
|
head
|
||||||
|
length
|
||||||
|
mkOption
|
||||||
|
types
|
||||||
|
;
|
||||||
|
|
||||||
|
traceListSeq = l: v: lib.foldl' (a: b: lib.traceSeq b a) v l;
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
options.docs = mkOption {
|
||||||
|
type = types.lazyAttrsOf types.raw;
|
||||||
|
description = ''
|
||||||
|
All options to be rendered, without any visibility filtering applied.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
config.docs =
|
||||||
|
lib.zipAttrsWith
|
||||||
|
(name: values:
|
||||||
|
if length values > 1 then
|
||||||
|
traceListSeq values
|
||||||
|
abort "Multiple options with the same name: ${name}"
|
||||||
|
else
|
||||||
|
assert length values == 1;
|
||||||
|
head values
|
||||||
|
)
|
||||||
|
(map
|
||||||
|
(opt: { ${opt.name} = opt; })
|
||||||
|
(lib.optionAttrSetToDocList options)
|
||||||
|
);
|
||||||
|
}
|
14
lib/tests/modules/types-attrTag-wrong-decl.nix
Normal file
14
lib/tests/modules/types-attrTag-wrong-decl.nix
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) types mkOption;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
opt = mkOption {
|
||||||
|
type = types.attrTag {
|
||||||
|
int = types.int;
|
||||||
|
};
|
||||||
|
default = { int = 1; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
135
lib/tests/modules/types-attrTag.nix
Normal file
135
lib/tests/modules/types-attrTag.nix
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
{ lib, config, options, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkOption types;
|
||||||
|
forceDeep = x: builtins.deepSeq x x;
|
||||||
|
mergedSubOption = (options.merged.type.getSubOptions options.merged.loc).extensible."merged.<name>";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
intStrings = mkOption {
|
||||||
|
type = types.attrsOf
|
||||||
|
(types.attrTag {
|
||||||
|
left = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
right = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
nested = mkOption {
|
||||||
|
type = types.attrTag {
|
||||||
|
left = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
right = mkOption {
|
||||||
|
type = types.attrTag {
|
||||||
|
left = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
right = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
merged = mkOption {
|
||||||
|
type = types.attrsOf (
|
||||||
|
types.attrTag {
|
||||||
|
yay = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
extensible = mkOption {
|
||||||
|
type = types.enum [ "foo" ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
submodules = mkOption {
|
||||||
|
type = types.attrsOf (
|
||||||
|
types.attrTag {
|
||||||
|
foo = mkOption {
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
bar = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
qux = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = "A qux for when you don't want a foo";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
okChecks = mkOption {};
|
||||||
|
};
|
||||||
|
imports = [
|
||||||
|
./docs.nix
|
||||||
|
{
|
||||||
|
options.merged = mkOption {
|
||||||
|
type = types.attrsOf (
|
||||||
|
types.attrTag {
|
||||||
|
nay = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
};
|
||||||
|
extensible = mkOption {
|
||||||
|
type = types.enum [ "bar" ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
config = {
|
||||||
|
intStrings.syntaxError = 1;
|
||||||
|
intStrings.syntaxError2 = {};
|
||||||
|
intStrings.syntaxError3 = { a = true; b = true; };
|
||||||
|
intStrings.syntaxError4 = lib.mkMerge [ { a = true; } { b = true; } ];
|
||||||
|
intStrings.mergeError = lib.mkMerge [ { int = throw "do not eval"; } { string = throw "do not eval"; } ];
|
||||||
|
intStrings.badTagError.rite = throw "do not eval";
|
||||||
|
intStrings.badTagTypeError.left = "bad";
|
||||||
|
intStrings.numberOne.left = 1;
|
||||||
|
intStrings.hello.right = "hello world";
|
||||||
|
nested.right.left = "not a number";
|
||||||
|
merged.negative.nay = false;
|
||||||
|
merged.positive.yay = 100;
|
||||||
|
merged.extensi-foo.extensible = "foo";
|
||||||
|
merged.extensi-bar.extensible = "bar";
|
||||||
|
okChecks = builtins.addErrorContext "while evaluating the assertions" (
|
||||||
|
assert config.intStrings.hello == { right = "hello world"; };
|
||||||
|
assert config.intStrings.numberOne == { left = 1; };
|
||||||
|
assert config.merged.negative == { nay = false; };
|
||||||
|
assert config.merged.positive == { yay = 100; };
|
||||||
|
assert config.merged.extensi-foo == { extensible = "foo"; };
|
||||||
|
assert config.merged.extensi-bar == { extensible = "bar"; };
|
||||||
|
assert config.docs."submodules.<name>.foo.bar".type == "signed integer";
|
||||||
|
assert config.docs."submodules.<name>.qux".type == "string";
|
||||||
|
assert config.docs."submodules.<name>.qux".declarations == [ __curPos.file ];
|
||||||
|
assert config.docs."submodules.<name>.qux".loc == [ "submodules" "<name>" "qux" ];
|
||||||
|
assert config.docs."submodules.<name>.qux".name == "submodules.<name>.qux";
|
||||||
|
assert config.docs."submodules.<name>.qux".description == "A qux for when you don't want a foo";
|
||||||
|
assert config.docs."submodules.<name>.qux".readOnly == false;
|
||||||
|
assert config.docs."submodules.<name>.qux".visible == true;
|
||||||
|
# Not available (yet?)
|
||||||
|
# assert config.docs."submodules.<name>.qux".declarationsWithPositions == [ ... ];
|
||||||
|
assert options.submodules.declarations == [ __curPos.file ];
|
||||||
|
assert lib.length options.submodules.declarationPositions == 1;
|
||||||
|
assert (lib.head options.submodules.declarationPositions).file == __curPos.file;
|
||||||
|
assert options.merged.declarations == [ __curPos.file __curPos.file ];
|
||||||
|
assert lib.length options.merged.declarationPositions == 2;
|
||||||
|
assert (lib.elemAt options.merged.declarationPositions 0).file == __curPos.file;
|
||||||
|
assert (lib.elemAt options.merged.declarationPositions 1).file == __curPos.file;
|
||||||
|
assert (lib.elemAt options.merged.declarationPositions 0).line != (lib.elemAt options.merged.declarationPositions 1).line;
|
||||||
|
assert mergedSubOption.declarations == [ __curPos.file __curPos.file ];
|
||||||
|
assert lib.length mergedSubOption.declarationPositions == 2;
|
||||||
|
assert (lib.elemAt mergedSubOption.declarationPositions 0).file == __curPos.file;
|
||||||
|
assert (lib.elemAt mergedSubOption.declarationPositions 1).file == __curPos.file;
|
||||||
|
assert (lib.elemAt mergedSubOption.declarationPositions 0).line != (lib.elemAt mergedSubOption.declarationPositions 1).line;
|
||||||
|
assert lib.length config.docs."merged.<name>.extensible".declarations == 2;
|
||||||
|
true);
|
||||||
|
};
|
||||||
|
}
|
102
lib/types.nix
102
lib/types.nix
|
@ -15,6 +15,7 @@ let
|
||||||
isList
|
isList
|
||||||
isString
|
isString
|
||||||
isStorePath
|
isStorePath
|
||||||
|
throwIf
|
||||||
toDerivation
|
toDerivation
|
||||||
toList
|
toList
|
||||||
;
|
;
|
||||||
|
@ -65,6 +66,11 @@ let
|
||||||
fixupOptionType
|
fixupOptionType
|
||||||
mergeOptionDecls
|
mergeOptionDecls
|
||||||
;
|
;
|
||||||
|
|
||||||
|
inAttrPosSuffix = v: name:
|
||||||
|
let pos = builtins.unsafeGetAttrPos name v; in
|
||||||
|
if pos == null then "" else " at ${pos.file}:${toString pos.line}:${toString pos.column}";
|
||||||
|
|
||||||
outer_types =
|
outer_types =
|
||||||
rec {
|
rec {
|
||||||
__attrsFailEvaluation = true;
|
__attrsFailEvaluation = true;
|
||||||
|
@ -152,7 +158,7 @@ rec {
|
||||||
# If it doesn't, this should be {}
|
# If it doesn't, this should be {}
|
||||||
# This may be used when a value is required for `mkIf false`. This allows the extra laziness in e.g. `lazyAttrsOf`.
|
# This may be used when a value is required for `mkIf false`. This allows the extra laziness in e.g. `lazyAttrsOf`.
|
||||||
emptyValue ? {}
|
emptyValue ? {}
|
||||||
, # Return a flat list of sub-options. Used to generate
|
, # Return a flat attrset of sub-options. Used to generate
|
||||||
# documentation.
|
# documentation.
|
||||||
getSubOptions ? prefix: {}
|
getSubOptions ? prefix: {}
|
||||||
, # List of modules if any, or null if none.
|
, # List of modules if any, or null if none.
|
||||||
|
@ -623,6 +629,100 @@ rec {
|
||||||
nestedTypes.elemType = elemType;
|
nestedTypes.elemType = elemType;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
attrTag = tags:
|
||||||
|
let tags_ = tags; in
|
||||||
|
let
|
||||||
|
tags =
|
||||||
|
mapAttrs
|
||||||
|
(n: opt:
|
||||||
|
builtins.addErrorContext "while checking that attrTag tag ${lib.strings.escapeNixIdentifier n} is an option with a type${inAttrPosSuffix tags_ n}" (
|
||||||
|
throwIf (opt._type or null != "option")
|
||||||
|
"In attrTag, each tag value must be an option, but tag ${lib.strings.escapeNixIdentifier n} ${
|
||||||
|
if opt?_type then
|
||||||
|
if opt._type == "option-type"
|
||||||
|
then "was a bare type, not wrapped in mkOption."
|
||||||
|
else "was of type ${lib.strings.escapeNixString opt._type}."
|
||||||
|
else "was not."}"
|
||||||
|
opt // {
|
||||||
|
declarations = opt.declarations or (
|
||||||
|
let pos = builtins.unsafeGetAttrPos n tags_;
|
||||||
|
in if pos == null then [] else [ pos.file ]
|
||||||
|
);
|
||||||
|
declarationPositions = opt.declarationPositions or (
|
||||||
|
let pos = builtins.unsafeGetAttrPos n tags_;
|
||||||
|
in if pos == null then [] else [ pos ]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
))
|
||||||
|
tags_;
|
||||||
|
choicesStr = concatMapStringsSep ", " lib.strings.escapeNixIdentifier (attrNames tags);
|
||||||
|
in
|
||||||
|
mkOptionType {
|
||||||
|
name = "attrTag";
|
||||||
|
description = "attribute-tagged union";
|
||||||
|
descriptionClass = "noun";
|
||||||
|
getSubOptions = prefix:
|
||||||
|
mapAttrs
|
||||||
|
(tagName: tagOption: {
|
||||||
|
"${lib.showOption prefix}" =
|
||||||
|
tagOption // {
|
||||||
|
loc = prefix ++ [ tagName ];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
tags;
|
||||||
|
check = v: isAttrs v && length (attrNames v) == 1 && tags?${head (attrNames v)};
|
||||||
|
merge = loc: defs:
|
||||||
|
let
|
||||||
|
choice = head (attrNames (head defs).value);
|
||||||
|
checkedValueDefs = map
|
||||||
|
(def:
|
||||||
|
assert (length (attrNames def.value)) == 1;
|
||||||
|
if (head (attrNames def.value)) != choice
|
||||||
|
then throw "The option `${showOption loc}` is defined both as `${choice}` and `${head (attrNames def.value)}`, in ${showFiles (getFiles defs)}."
|
||||||
|
else { inherit (def) file; value = def.value.${choice}; })
|
||||||
|
defs;
|
||||||
|
in
|
||||||
|
if tags?${choice}
|
||||||
|
then
|
||||||
|
{ ${choice} =
|
||||||
|
(lib.modules.evalOptionValue
|
||||||
|
(loc ++ [choice])
|
||||||
|
tags.${choice}
|
||||||
|
checkedValueDefs
|
||||||
|
).value;
|
||||||
|
}
|
||||||
|
else throw "The option `${showOption loc}` is defined as ${lib.strings.escapeNixIdentifier choice}, but ${lib.strings.escapeNixIdentifier choice} is not among the valid choices (${choicesStr}). Value ${choice} was defined in ${showFiles (getFiles defs)}.";
|
||||||
|
nestedTypes = tags;
|
||||||
|
functor = defaultFunctor "attrTag" // {
|
||||||
|
type = { tags, ... }: types.attrTag tags;
|
||||||
|
payload = { inherit tags; };
|
||||||
|
binOp =
|
||||||
|
let
|
||||||
|
# Add metadata in the format that submodules work with
|
||||||
|
wrapOptionDecl =
|
||||||
|
option: { options = option; _file = "<attrTag {...}>"; pos = null; };
|
||||||
|
in
|
||||||
|
a: b: {
|
||||||
|
tags = a.tags // b.tags //
|
||||||
|
mapAttrs
|
||||||
|
(tagName: bOpt:
|
||||||
|
lib.mergeOptionDecls
|
||||||
|
# FIXME: loc is not accurate; should include prefix
|
||||||
|
# Fortunately, it's only used for error messages, where a "relative" location is kinda ok.
|
||||||
|
# It is also returned though, but use of the attribute seems rare?
|
||||||
|
[tagName]
|
||||||
|
[ (wrapOptionDecl a.tags.${tagName}) (wrapOptionDecl bOpt) ]
|
||||||
|
// {
|
||||||
|
# mergeOptionDecls is not idempotent in these attrs:
|
||||||
|
declarations = a.tags.${tagName}.declarations ++ bOpt.declarations;
|
||||||
|
declarationPositions = a.tags.${tagName}.declarationPositions ++ bOpt.declarationPositions;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
(builtins.intersectAttrs a.tags b.tags);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
uniq = unique { message = ""; };
|
uniq = unique { message = ""; };
|
||||||
|
|
||||||
unique = { message }: type: mkOptionType rec {
|
unique = { message }: type: mkOptionType rec {
|
||||||
|
|
|
@ -1342,12 +1342,6 @@
|
||||||
githubId = 81317317;
|
githubId = 81317317;
|
||||||
name = "Anna Aurora";
|
name = "Anna Aurora";
|
||||||
};
|
};
|
||||||
a-n-n-a-l-e-e = {
|
|
||||||
github = "a-n-n-a-l-e-e";
|
|
||||||
githubId = 150648636;
|
|
||||||
matrix = "@a-n-n-a-l-e-e:matrix.org";
|
|
||||||
name = "annalee";
|
|
||||||
};
|
|
||||||
anoa = {
|
anoa = {
|
||||||
matrix = "@andrewm:amorgan.xyz";
|
matrix = "@andrewm:amorgan.xyz";
|
||||||
email = "andrew@amorgan.xyz";
|
email = "andrew@amorgan.xyz";
|
||||||
|
@ -1776,6 +1770,16 @@
|
||||||
githubId = 11037075;
|
githubId = 11037075;
|
||||||
name = "Ashley Hooper";
|
name = "Ashley Hooper";
|
||||||
};
|
};
|
||||||
|
ashuramaruzxc = {
|
||||||
|
email = "ashuramaru@tenjin-dk.com";
|
||||||
|
matrix = "@tenjin:mozilla.org";
|
||||||
|
github = "ashuramaruzxc";
|
||||||
|
githubId = 72100551;
|
||||||
|
name = "Mariia Holovata";
|
||||||
|
keys = [{
|
||||||
|
fingerprint = "409D 201E 9450 8732 A49E D0FC 6BDA F874 0068 08DF";
|
||||||
|
}];
|
||||||
|
};
|
||||||
ashvith-shetty = {
|
ashvith-shetty = {
|
||||||
github = "Ashvith10";
|
github = "Ashvith10";
|
||||||
githubId = 113123021;
|
githubId = 113123021;
|
||||||
|
@ -2617,6 +2621,12 @@
|
||||||
githubId = 30630233;
|
githubId = 30630233;
|
||||||
name = "Timo Triebensky";
|
name = "Timo Triebensky";
|
||||||
};
|
};
|
||||||
|
birkb = {
|
||||||
|
email = "birk@batchworks.de";
|
||||||
|
github = "birkb";
|
||||||
|
githubId = 10164833;
|
||||||
|
name = "Birk Bohne";
|
||||||
|
};
|
||||||
bjornfor = {
|
bjornfor = {
|
||||||
email = "bjorn.forsman@gmail.com";
|
email = "bjorn.forsman@gmail.com";
|
||||||
github = "bjornfor";
|
github = "bjornfor";
|
||||||
|
@ -5385,6 +5395,12 @@
|
||||||
fingerprint = "389A 78CB CD88 5E0C 4701 DEB9 FD42 C7D0 D414 94C8";
|
fingerprint = "389A 78CB CD88 5E0C 4701 DEB9 FD42 C7D0 D414 94C8";
|
||||||
}];
|
}];
|
||||||
};
|
};
|
||||||
|
dudymas = {
|
||||||
|
email = "jeremy.white@cloudposse.com";
|
||||||
|
github = "dudymas";
|
||||||
|
githubId = 928448;
|
||||||
|
name = "Jeremy White";
|
||||||
|
};
|
||||||
dukc = {
|
dukc = {
|
||||||
email = "ajieskola@gmail.com";
|
email = "ajieskola@gmail.com";
|
||||||
github = "dukc";
|
github = "dukc";
|
||||||
|
@ -11409,6 +11425,13 @@
|
||||||
fingerprint = "80EE AAD8 43F9 3097 24B5 3D7E 27E9 7B91 E63A 7FF8";
|
fingerprint = "80EE AAD8 43F9 3097 24B5 3D7E 27E9 7B91 E63A 7FF8";
|
||||||
}];
|
}];
|
||||||
};
|
};
|
||||||
|
link2xt = {
|
||||||
|
email = "link2xt@testrun.org";
|
||||||
|
githubId = 18373967;
|
||||||
|
github = "link2xt";
|
||||||
|
matrix = "@link2xt:matrix.org";
|
||||||
|
name = "link2xt";
|
||||||
|
};
|
||||||
linquize = {
|
linquize = {
|
||||||
email = "linquize@yahoo.com.hk";
|
email = "linquize@yahoo.com.hk";
|
||||||
github = "linquize";
|
github = "linquize";
|
||||||
|
@ -11761,12 +11784,6 @@
|
||||||
githubId = 5767106;
|
githubId = 5767106;
|
||||||
name = "Lukas Schmidt";
|
name = "Lukas Schmidt";
|
||||||
};
|
};
|
||||||
luis = {
|
|
||||||
email = "luis.nixos@gmail.com";
|
|
||||||
github = "Luis-Hebendanz";
|
|
||||||
githubId = 22085373;
|
|
||||||
name = "Luis Hebendanz";
|
|
||||||
};
|
|
||||||
luisdaranda = {
|
luisdaranda = {
|
||||||
email = "luisdomingoaranda@gmail.com";
|
email = "luisdomingoaranda@gmail.com";
|
||||||
github = "propet";
|
github = "propet";
|
||||||
|
@ -11811,6 +11828,12 @@
|
||||||
githubId = 30468956;
|
githubId = 30468956;
|
||||||
name = "Lukas Heiligenbrunner";
|
name = "Lukas Heiligenbrunner";
|
||||||
};
|
};
|
||||||
|
lukaslihotzki = {
|
||||||
|
email = "lukas@lihotzki.de";
|
||||||
|
github = "lukaslihotzki";
|
||||||
|
githubId = 10326063;
|
||||||
|
name = "Lukas Lihotzki";
|
||||||
|
};
|
||||||
lukaswrz = {
|
lukaswrz = {
|
||||||
email = "lukas@wrz.one";
|
email = "lukas@wrz.one";
|
||||||
github = "lukaswrz";
|
github = "lukaswrz";
|
||||||
|
@ -14911,6 +14934,12 @@
|
||||||
github = "ony";
|
github = "ony";
|
||||||
githubId = 11265;
|
githubId = 11265;
|
||||||
};
|
};
|
||||||
|
oo-infty = {
|
||||||
|
name = "Justin Chen";
|
||||||
|
email = "oo-infty@outlook.com";
|
||||||
|
github = "oo-infty";
|
||||||
|
githubId = 42143810;
|
||||||
|
};
|
||||||
ooliver1 = {
|
ooliver1 = {
|
||||||
name = "Oliver Wilkes";
|
name = "Oliver Wilkes";
|
||||||
email = "oliverwilkes2006@icloud.com";
|
email = "oliverwilkes2006@icloud.com";
|
||||||
|
@ -15354,6 +15383,12 @@
|
||||||
githubId = 1368952;
|
githubId = 1368952;
|
||||||
name = "Pedro Lara Campos";
|
name = "Pedro Lara Campos";
|
||||||
};
|
};
|
||||||
|
peefy = {
|
||||||
|
email = "xpf6677@gmail.com";
|
||||||
|
github = "Peefy";
|
||||||
|
githubId = 22744597;
|
||||||
|
name = "Peefy";
|
||||||
|
};
|
||||||
peelz = {
|
peelz = {
|
||||||
email = "peelz.dev+nixpkgs@gmail.com";
|
email = "peelz.dev+nixpkgs@gmail.com";
|
||||||
github = "notpeelz";
|
github = "notpeelz";
|
||||||
|
@ -15486,6 +15521,12 @@
|
||||||
fingerprint = "7756 E88F 3C6A 47A5 C5F0 CDFB AB54 6777 F93E 20BF";
|
fingerprint = "7756 E88F 3C6A 47A5 C5F0 CDFB AB54 6777 F93E 20BF";
|
||||||
}];
|
}];
|
||||||
};
|
};
|
||||||
|
phdyellow = {
|
||||||
|
name = "Phil Dyer";
|
||||||
|
email = "phildyer@protonmail.com";
|
||||||
|
github = "PhDyellow";
|
||||||
|
githubId = 7740661;
|
||||||
|
};
|
||||||
phfroidmont = {
|
phfroidmont = {
|
||||||
name = "Paul-Henri Froidmont";
|
name = "Paul-Henri Froidmont";
|
||||||
email = "nix.contact-j9dw4d@froidmont.org";
|
email = "nix.contact-j9dw4d@froidmont.org";
|
||||||
|
@ -16300,6 +16341,12 @@
|
||||||
matrix = "@quantenzitrone:matrix.org";
|
matrix = "@quantenzitrone:matrix.org";
|
||||||
name = "quantenzitrone";
|
name = "quantenzitrone";
|
||||||
};
|
};
|
||||||
|
qubasa = {
|
||||||
|
email = "consulting@qube.email";
|
||||||
|
github = "Qubasa";
|
||||||
|
githubId = 22085373;
|
||||||
|
name = "Luis Hebendanz";
|
||||||
|
};
|
||||||
queezle = {
|
queezle = {
|
||||||
email = "git@queezle.net";
|
email = "git@queezle.net";
|
||||||
github = "queezle42";
|
github = "queezle42";
|
||||||
|
@ -19567,6 +19614,12 @@
|
||||||
githubId = 2389333;
|
githubId = 2389333;
|
||||||
name = "Andy Tockman";
|
name = "Andy Tockman";
|
||||||
};
|
};
|
||||||
|
tcmal = {
|
||||||
|
email = "me@aria.rip";
|
||||||
|
github = "tcmal";
|
||||||
|
githubId = 4183876;
|
||||||
|
name = "Aria Shrimpton";
|
||||||
|
};
|
||||||
teatwig = {
|
teatwig = {
|
||||||
email = "nix@teatwig.net";
|
email = "nix@teatwig.net";
|
||||||
name = "tea";
|
name = "tea";
|
||||||
|
@ -20578,6 +20631,12 @@
|
||||||
githubId = 20206121;
|
githubId = 20206121;
|
||||||
name = "umlx5h";
|
name = "umlx5h";
|
||||||
};
|
};
|
||||||
|
uncenter = {
|
||||||
|
name = "uncenter";
|
||||||
|
email = "uncenter@uncenter.dev";
|
||||||
|
github = "uncenter";
|
||||||
|
githubId = 47499684;
|
||||||
|
};
|
||||||
unclamped = {
|
unclamped = {
|
||||||
name = "Maru";
|
name = "Maru";
|
||||||
email = "clear6860@tutanota.com";
|
email = "clear6860@tutanota.com";
|
||||||
|
|
|
@ -12,6 +12,9 @@ PICKABLE_BRANCHES=${PICKABLE_BRANCHES:-master staging release-??.?? staging-??.?
|
||||||
problem=0
|
problem=0
|
||||||
|
|
||||||
while read new_commit_sha ; do
|
while read new_commit_sha ; do
|
||||||
|
if [ -z "$new_commit_sha" ] ; then
|
||||||
|
continue # skip empty lines
|
||||||
|
fi
|
||||||
if [ "$GITHUB_ACTIONS" = 'true' ] ; then
|
if [ "$GITHUB_ACTIONS" = 'true' ] ; then
|
||||||
echo "::group::Commit $new_commit_sha"
|
echo "::group::Commit $new_commit_sha"
|
||||||
else
|
else
|
||||||
|
@ -57,6 +60,8 @@ while read new_commit_sha ; do
|
||||||
|
|
||||||
$range_diff_common --color
|
$range_diff_common --color
|
||||||
|
|
||||||
|
echo "Note this should not necessarily be treated as a hard fail, but a reviewer's attention should" \
|
||||||
|
"be drawn to it and github actions have no way of doing that but to raise a 'failure'"
|
||||||
problem=1
|
problem=1
|
||||||
else
|
else
|
||||||
echo " ✔ $original_commit_sha highly similar to $new_commit_sha"
|
echo " ✔ $original_commit_sha highly similar to $new_commit_sha"
|
||||||
|
|
|
@ -122,10 +122,7 @@ class KDERepoMetadata:
|
||||||
dep_graph={},
|
dep_graph={},
|
||||||
)
|
)
|
||||||
|
|
||||||
dep_specs = [
|
dep_specs = ["dependency-data-stable-kf6-qt6"]
|
||||||
"dependency-data-common",
|
|
||||||
"dependency-data-kf6-qt6"
|
|
||||||
]
|
|
||||||
dep_graph = collections.defaultdict(set)
|
dep_graph = collections.defaultdict(set)
|
||||||
|
|
||||||
for spec in dep_specs:
|
for spec in dep_specs:
|
||||||
|
|
|
@ -146,6 +146,15 @@ with lib.maintainers; {
|
||||||
enableFeatureFreezePing = true;
|
enableFeatureFreezePing = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
cloudposse = {
|
||||||
|
members = [
|
||||||
|
dudymas
|
||||||
|
];
|
||||||
|
scope = "Maintain atmos and applications made by the Cloud Posse team.";
|
||||||
|
shortName = "CloudPosse";
|
||||||
|
enableFeatureFreezePing = true;
|
||||||
|
};
|
||||||
|
|
||||||
coq = {
|
coq = {
|
||||||
members = [
|
members = [
|
||||||
cohencyril
|
cohencyril
|
||||||
|
@ -442,6 +451,7 @@ with lib.maintainers; {
|
||||||
# Verify additions to this team with at least one already existing member of the team.
|
# Verify additions to this team with at least one already existing member of the team.
|
||||||
members = [
|
members = [
|
||||||
das_j
|
das_j
|
||||||
|
conni2461
|
||||||
];
|
];
|
||||||
scope = "Group registration for packages maintained by Helsinki Systems";
|
scope = "Group registration for packages maintained by Helsinki Systems";
|
||||||
shortName = "Helsinki Systems employees";
|
shortName = "Helsinki Systems employees";
|
||||||
|
@ -475,6 +485,7 @@ with lib.maintainers; {
|
||||||
ryantm
|
ryantm
|
||||||
lassulus
|
lassulus
|
||||||
yayayayaka
|
yayayayaka
|
||||||
|
asymmetric
|
||||||
];
|
];
|
||||||
scope = "Maintain Jitsi.";
|
scope = "Maintain Jitsi.";
|
||||||
shortName = "Jitsi";
|
shortName = "Jitsi";
|
||||||
|
|
|
@ -42,6 +42,9 @@ merging is handled.
|
||||||
: One element of the list *`l`*, e.g. `types.enum [ "left" "right" ]`.
|
: One element of the list *`l`*, e.g. `types.enum [ "left" "right" ]`.
|
||||||
Multiple definitions cannot be merged.
|
Multiple definitions cannot be merged.
|
||||||
|
|
||||||
|
If you want to pair these values with more information, possibly of
|
||||||
|
distinct types, consider using a [sum type](#sec-option-types-sums).
|
||||||
|
|
||||||
`types.anything`
|
`types.anything`
|
||||||
|
|
||||||
: A type that accepts any value and recursively merges attribute sets
|
: A type that accepts any value and recursively merges attribute sets
|
||||||
|
@ -279,6 +282,84 @@ Submodules are detailed in [Submodule](#section-option-types-submodule).
|
||||||
more convenient and discoverable than expecting the module user to
|
more convenient and discoverable than expecting the module user to
|
||||||
type-merge with the `attrsOf submodule` option.
|
type-merge with the `attrsOf submodule` option.
|
||||||
|
|
||||||
|
## Union types {#sec-option-types-unions}
|
||||||
|
|
||||||
|
A union of types is a type such that a value is valid when it is valid for at least one of those types.
|
||||||
|
|
||||||
|
If some values are instances of more than one of the types, it is not possible to distinguish which type they are meant to be instances of. If that's needed, consider using a [sum type](#sec-option-types-sums).
|
||||||
|
|
||||||
|
`types.either` *`t1 t2`*
|
||||||
|
|
||||||
|
: Type *`t1`* or type *`t2`*, e.g. `with types; either int str`.
|
||||||
|
Multiple definitions cannot be merged.
|
||||||
|
|
||||||
|
`types.oneOf` \[ *`t1 t2`* ... \]
|
||||||
|
|
||||||
|
: Type *`t1`* or type *`t2`* and so forth, e.g.
|
||||||
|
`with types; oneOf [ int str bool ]`. Multiple definitions cannot be
|
||||||
|
merged.
|
||||||
|
|
||||||
|
`types.nullOr` *`t`*
|
||||||
|
|
||||||
|
: `null` or type *`t`*. Multiple definitions are merged according to
|
||||||
|
type *`t`*.
|
||||||
|
|
||||||
|
|
||||||
|
## Sum types {#sec-option-types-sums}
|
||||||
|
|
||||||
|
A sum type can be thought of, conceptually, as a *`types.enum`* where each valid item is paired with at least a type, through some value syntax.
|
||||||
|
Nix does not have a built-in syntax for this pairing of a label and a type or value, so sum types may be represented in multiple ways.
|
||||||
|
|
||||||
|
If the you're interested in can be distinguished without a label, you may simplify your value syntax with a [union type](#sec-option-types-unions) instead.
|
||||||
|
|
||||||
|
`types.attrTag` *`{ attr1 = option1; attr2 = option2; ... }`*
|
||||||
|
|
||||||
|
: An attribute set containing one attribute, whose name must be picked from
|
||||||
|
the attribute set (`attr1`, etc) and whose value consists of definitions that are valid for the corresponding option (`option1`, etc).
|
||||||
|
|
||||||
|
This type appears in the documentation as _attribute-tagged union_.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
{ lib, ... }:
|
||||||
|
let inherit (lib) type mkOption;
|
||||||
|
in {
|
||||||
|
options.toyRouter.rules = mkOption {
|
||||||
|
description = ''
|
||||||
|
Rules for a fictional packet routing service.
|
||||||
|
'';
|
||||||
|
type = types.attrsOf (
|
||||||
|
types.attrTag {
|
||||||
|
bounce = mkOption {
|
||||||
|
description = "Send back a packet explaining why it wasn't forwarded.";
|
||||||
|
type = types.submodule {
|
||||||
|
options.errorMessage = mkOption { … };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
forward = mkOption {
|
||||||
|
description = "Forward the packet.";
|
||||||
|
type = types.submodule {
|
||||||
|
options.destination = mkOption { … };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
ignore = types.mkOption {
|
||||||
|
description = "Drop the packet without sending anything back.";
|
||||||
|
type = types.submodule {};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
config.toyRouter.rules = {
|
||||||
|
http = {
|
||||||
|
bounce = {
|
||||||
|
errorMessage = "Unencrypted HTTP is banned. You must always use https://.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
ssh = { drop = {}; };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Composed types {#sec-option-types-composed}
|
## Composed types {#sec-option-types-composed}
|
||||||
|
|
||||||
Composed types are types that take a type as parameter. `listOf
|
Composed types are types that take a type as parameter. `listOf
|
||||||
|
@ -318,11 +399,6 @@ Composed types are types that take a type as parameter. `listOf
|
||||||
returned instead for the same `mkIf false` definition.
|
returned instead for the same `mkIf false` definition.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
`types.nullOr` *`t`*
|
|
||||||
|
|
||||||
: `null` or type *`t`*. Multiple definitions are merged according to
|
|
||||||
type *`t`*.
|
|
||||||
|
|
||||||
`types.uniq` *`t`*
|
`types.uniq` *`t`*
|
||||||
|
|
||||||
: Ensures that type *`t`* cannot be merged. It is used to ensure option
|
: Ensures that type *`t`* cannot be merged. It is used to ensure option
|
||||||
|
@ -334,17 +410,6 @@ Composed types are types that take a type as parameter. `listOf
|
||||||
the line `The option <option path> is defined multiple times.` and before
|
the line `The option <option path> is defined multiple times.` and before
|
||||||
a list of definition locations.
|
a list of definition locations.
|
||||||
|
|
||||||
`types.either` *`t1 t2`*
|
|
||||||
|
|
||||||
: Type *`t1`* or type *`t2`*, e.g. `with types; either int str`.
|
|
||||||
Multiple definitions cannot be merged.
|
|
||||||
|
|
||||||
`types.oneOf` \[ *`t1 t2`* ... \]
|
|
||||||
|
|
||||||
: Type *`t1`* or type *`t2`* and so forth, e.g.
|
|
||||||
`with types; oneOf [ int str bool ]`. Multiple definitions cannot be
|
|
||||||
merged.
|
|
||||||
|
|
||||||
`types.coercedTo` *`from f to`*
|
`types.coercedTo` *`from f to`*
|
||||||
|
|
||||||
: Type *`to`* or type *`from`* which will be coerced to type *`to`* using
|
: Type *`to`* or type *`from`* which will be coerced to type *`to`* using
|
||||||
|
|
|
@ -376,7 +376,7 @@ Use the following commands:
|
||||||
|
|
||||||
```ShellSession
|
```ShellSession
|
||||||
# mkdir -p /mnt/boot
|
# mkdir -p /mnt/boot
|
||||||
# mount /dev/disk/by-label/boot /mnt/boot
|
# mount -o umask=077 /dev/disk/by-label/boot /mnt/boot
|
||||||
```
|
```
|
||||||
|
|
||||||
3. If your machine has a limited amount of memory, you may want to
|
3. If your machine has a limited amount of memory, you may want to
|
||||||
|
@ -572,7 +572,7 @@ With a partitioned disk.
|
||||||
# mkfs.fat -F 32 -n boot /dev/sda3 # (for UEFI systems only)
|
# mkfs.fat -F 32 -n boot /dev/sda3 # (for UEFI systems only)
|
||||||
# mount /dev/disk/by-label/nixos /mnt
|
# mount /dev/disk/by-label/nixos /mnt
|
||||||
# mkdir -p /mnt/boot # (for UEFI systems only)
|
# mkdir -p /mnt/boot # (for UEFI systems only)
|
||||||
# mount /dev/disk/by-label/boot /mnt/boot # (for UEFI systems only)
|
# mount -o umask=077 /dev/disk/by-label/boot /mnt/boot # (for UEFI systems only)
|
||||||
# nixos-generate-config --root /mnt
|
# nixos-generate-config --root /mnt
|
||||||
# nano /mnt/etc/nixos/configuration.nix
|
# nano /mnt/etc/nixos/configuration.nix
|
||||||
# nixos-install
|
# nixos-install
|
||||||
|
|
|
@ -79,7 +79,7 @@ In addition to numerous new and updated packages, this release has the following
|
||||||
|
|
||||||
- [frigate](https://frigate.video), an open source NVR built around real-time AI object detection. Available as [services.frigate](#opt-services.frigate.enable).
|
- [frigate](https://frigate.video), an open source NVR built around real-time AI object detection. Available as [services.frigate](#opt-services.frigate.enable).
|
||||||
|
|
||||||
- [fzf](https://github.com/junegunn/fzf), a command line fuzzyfinder. Available as [programs.fzf](#opt-programs.fzf.enable).
|
- [fzf](https://github.com/junegunn/fzf), a command line fuzzyfinder. Available as [programs.fzf](#opt-programs.fzf.fuzzyCompletion).
|
||||||
|
|
||||||
- [gemstash](https://github.com/rubygems/gemstash), a RubyGems.org cache and private gem server. Available as [services.gemstash](#opt-services.gemstash.enable).
|
- [gemstash](https://github.com/rubygems/gemstash), a RubyGems.org cache and private gem server. Available as [services.gemstash](#opt-services.gemstash.enable).
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,10 @@ Use `services.pipewire.extraConfig` or `services.pipewire.configPackages` for Pi
|
||||||
|
|
||||||
- [maubot](https://github.com/maubot/maubot), a plugin-based Matrix bot framework. Available as [services.maubot](#opt-services.maubot.enable).
|
- [maubot](https://github.com/maubot/maubot), a plugin-based Matrix bot framework. Available as [services.maubot](#opt-services.maubot.enable).
|
||||||
|
|
||||||
|
- [ryzen-monitor-ng](https://github.com/mann1x/ryzen_monitor_ng), a desktop AMD CPU power monitor and controller, similar to Ryzen Master but for Linux. Available as [programs.ryzen-monitor-ng](#opt-programs.ryzen-monitor-ng.enable)
|
||||||
|
|
||||||
|
- [ryzen-smu](https://gitlab.com/leogx9r/ryzen_smu), Linux kernel driver to expose the SMU (System Management Unit) for certain AMD Ryzen Processors. Includes the userspace program `monitor_cpu`. Available at [hardward.cpu.amd.ryzen-smu](#opt-hardware.cpu.amd.ryzen-smu.enable)
|
||||||
|
|
||||||
- systemd's gateway, upload, and remote services, which provides ways of sending journals across the network. Enable using [services.journald.gateway](#opt-services.journald.gateway.enable), [services.journald.upload](#opt-services.journald.upload.enable), and [services.journald.remote](#opt-services.journald.remote.enable).
|
- systemd's gateway, upload, and remote services, which provides ways of sending journals across the network. Enable using [services.journald.gateway](#opt-services.journald.gateway.enable), [services.journald.upload](#opt-services.journald.upload.enable), and [services.journald.remote](#opt-services.journald.remote.enable).
|
||||||
|
|
||||||
- [GNS3](https://www.gns3.com/), a network software emulator. Available as [services.gns3-server](#opt-services.gns3-server.enable).
|
- [GNS3](https://www.gns3.com/), a network software emulator. Available as [services.gns3-server](#opt-services.gns3-server.enable).
|
||||||
|
@ -163,6 +167,8 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
||||||
|
|
||||||
- [Uni-Sync](https://github.com/EightB1ts/uni-sync), a synchronization tool for Lian Li Uni Controllers. Available as [hardware.uni-sync](#opt-hardware.uni-sync.enable)
|
- [Uni-Sync](https://github.com/EightB1ts/uni-sync), a synchronization tool for Lian Li Uni Controllers. Available as [hardware.uni-sync](#opt-hardware.uni-sync.enable)
|
||||||
|
|
||||||
|
- [prometheus-nats-exporter](https://github.com/nats-io/prometheus-nats-exporter), a Prometheus exporter for NATS. Available as [services.prometheus.exporters.nats](#opt-services.prometheus.exporters.nats.enable).
|
||||||
|
|
||||||
## Backward Incompatibilities {#sec-release-24.05-incompatibilities}
|
## Backward Incompatibilities {#sec-release-24.05-incompatibilities}
|
||||||
|
|
||||||
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
|
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
|
||||||
|
@ -176,6 +182,10 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
||||||
- `programs.nix-ld.libraries` no longer sets `baseLibraries` via the option's default but in config and now merges any additional libraries with the default ones.
|
- `programs.nix-ld.libraries` no longer sets `baseLibraries` via the option's default but in config and now merges any additional libraries with the default ones.
|
||||||
This means that `lib.mkForce` must be used to clear the list of default libraries.
|
This means that `lib.mkForce` must be used to clear the list of default libraries.
|
||||||
|
|
||||||
|
- `cudaPackages.autoAddOpenGLRunpathHook` and `cudaPackages.autoAddDriverRunpath` have been deprecated for `pkgs.autoAddDriverRunpath`. Functionality has not changed, but the setuphook has been renamed and moved to the top-level package scope.
|
||||||
|
|
||||||
|
- `cudaPackages.autoFixElfFiles` has been deprecated for `pkgs.autoFixElfFiles`. Functionality has not changed, but the setuphook has been renamed and moved to the top-level package scope.
|
||||||
|
|
||||||
- `pdns` was updated to version [v4.9.x](https://doc.powerdns.com/authoritative/changelog/4.9.html), which introduces breaking changes. Check out the [Upgrade Notes](https://doc.powerdns.com/authoritative/upgrading.html#to-4-9-0) for details.
|
- `pdns` was updated to version [v4.9.x](https://doc.powerdns.com/authoritative/changelog/4.9.html), which introduces breaking changes. Check out the [Upgrade Notes](https://doc.powerdns.com/authoritative/upgrading.html#to-4-9-0) for details.
|
||||||
|
|
||||||
- `unrar` was updated to v7. See [changelog](https://www.rarlab.com/unrar7notes.htm) for more information.
|
- `unrar` was updated to v7. See [changelog](https://www.rarlab.com/unrar7notes.htm) for more information.
|
||||||
|
@ -207,6 +217,10 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
||||||
|
|
||||||
- `services.neo4j.allowUpgrade` was removed and no longer has any effect. Neo4j 5 supports automatic rolling upgrades.
|
- `services.neo4j.allowUpgrade` was removed and no longer has any effect. Neo4j 5 supports automatic rolling upgrades.
|
||||||
|
|
||||||
|
- `unifiLTS`, `unifi5` and `unifi6` have been removed, as they require MongoDB versions which are end-of-life. All these versions can be upgraded to `unifi7` directly.
|
||||||
|
|
||||||
|
- `mongodb-4_4` has been removed as it has reached end of life. Consequently, `unifi7` and `unifi8` now use MongoDB 5.0 by default.
|
||||||
|
|
||||||
- `nitter` requires a `guest_accounts.jsonl` to be provided as a path or loaded into the default location at `/var/lib/nitter/guest_accounts.jsonl`. See [Guest Account Branch Deployment](https://github.com/zedeus/nitter/wiki/Guest-Account-Branch-Deployment) for details.
|
- `nitter` requires a `guest_accounts.jsonl` to be provided as a path or loaded into the default location at `/var/lib/nitter/guest_accounts.jsonl`. See [Guest Account Branch Deployment](https://github.com/zedeus/nitter/wiki/Guest-Account-Branch-Deployment) for details.
|
||||||
|
|
||||||
- `boot.supportedFilesystems` and `boot.initrd.supportedFilesystems` are now attribute sets instead of lists. Assignment from lists as done previously is still supported, but checking whether a filesystem is enabled must now by done using `supportedFilesystems.fs or false` instead of using `lib.elem "fs" supportedFilesystems` as was done previously.
|
- `boot.supportedFilesystems` and `boot.initrd.supportedFilesystems` are now attribute sets instead of lists. Assignment from lists as done previously is still supported, but checking whether a filesystem is enabled must now by done using `supportedFilesystems.fs or false` instead of using `lib.elem "fs" supportedFilesystems` as was done previously.
|
||||||
|
@ -318,8 +332,6 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
||||||
|
|
||||||
- `xxd` has been moved from `vim` default output to its own output to reduce closure size. The canonical way to reference it across all platforms is `unixtools.xxd`.
|
- `xxd` has been moved from `vim` default output to its own output to reduce closure size. The canonical way to reference it across all platforms is `unixtools.xxd`.
|
||||||
|
|
||||||
- `programs.fzf.keybindings` and `programs.fzf.fuzzyCompletion` got replaced by `programs.fzf.enabled` as shell-completion is included in the fzf-binary now there is no easy option to load completion and keybindings separately. Please consult fzf-documentation on how to configure/disable certain keybindings.
|
|
||||||
|
|
||||||
- The `stalwart-mail` package has been updated to v0.5.3, which includes [breaking changes](https://github.com/stalwartlabs/mail-server/blob/v0.5.3/UPGRADING.md).
|
- The `stalwart-mail` package has been updated to v0.5.3, which includes [breaking changes](https://github.com/stalwartlabs/mail-server/blob/v0.5.3/UPGRADING.md).
|
||||||
|
|
||||||
- `services.zope2` has been removed as `zope2` is unmaintained and was relying on Python2.
|
- `services.zope2` has been removed as `zope2` is unmaintained and was relying on Python2.
|
||||||
|
@ -402,6 +414,10 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
||||||
- The `erlang_node_short_name`, `erlang_node_name`, `port` and `options` configuration parameters are gone, and have been replaced with an `environment` parameter.
|
- The `erlang_node_short_name`, `erlang_node_name`, `port` and `options` configuration parameters are gone, and have been replaced with an `environment` parameter.
|
||||||
Use the appropriate [environment variables](https://hexdocs.pm/livebook/readme.html#environment-variables) inside `environment` to configure the service instead.
|
Use the appropriate [environment variables](https://hexdocs.pm/livebook/readme.html#environment-variables) inside `environment` to configure the service instead.
|
||||||
|
|
||||||
|
- `akkoma` now requires explicitly setting the base URL for uploaded media (`settings."Pleroma.Upload".base_url`), as well as for the media proxy if enabled (`settings."Media"`).
|
||||||
|
This is recommended to be a separate (sub)domain to the one Akkoma is hosted at.
|
||||||
|
See [here](https://meta.akkoma.dev/t/akkoma-stable-2024-03-securer-i-barely-know-her/681#explicit-upload-and-media-proxy-domains-5) for more details.
|
||||||
|
|
||||||
- The `crystal` package has been updated to 1.11.x, which has some breaking changes.
|
- The `crystal` package has been updated to 1.11.x, which has some breaking changes.
|
||||||
Refer to crystal's changelog for more information. ([v1.10](https://github.com/crystal-lang/crystal/blob/master/CHANGELOG.md#1100-2023-10-09), [v1.11](https://github.com/crystal-lang/crystal/blob/master/CHANGELOG.md#1110-2024-01-08))
|
Refer to crystal's changelog for more information. ([v1.10](https://github.com/crystal-lang/crystal/blob/master/CHANGELOG.md#1100-2023-10-09), [v1.11](https://github.com/crystal-lang/crystal/blob/master/CHANGELOG.md#1110-2024-01-08))
|
||||||
|
|
||||||
|
@ -452,6 +468,8 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
||||||
|
|
||||||
- [Lilypond](https://lilypond.org/index.html) and [Denemo](https://www.denemo.org) are now compiled with Guile 3.0.
|
- [Lilypond](https://lilypond.org/index.html) and [Denemo](https://www.denemo.org) are now compiled with Guile 3.0.
|
||||||
|
|
||||||
|
- Garage has been updated to v1.x.x. Users should read the [upstream release notes](https://git.deuxfleurs.fr/Deuxfleurs/garage/releases/tag/v1.0.0) and follow the documentation when changing over their `services.garage.package` and performing this manual upgrade.
|
||||||
|
|
||||||
- The EC2 image module now enables the [Amazon SSM Agent](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html) by default.
|
- The EC2 image module now enables the [Amazon SSM Agent](https://docs.aws.amazon.com/systems-manager/latest/userguide/ssm-agent.html) by default.
|
||||||
|
|
||||||
- The following options of the Nextcloud module were moved into [`services.nextcloud.settings`](#opt-services.nextcloud.settings) and renamed to match the name from Nextcloud's `config.php`:
|
- The following options of the Nextcloud module were moved into [`services.nextcloud.settings`](#opt-services.nextcloud.settings) and renamed to match the name from Nextcloud's `config.php`:
|
||||||
|
@ -564,6 +582,8 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
|
||||||
- QtMultimedia has changed its default backend to `QT_MEDIA_BACKEND=ffmpeg` (previously `gstreamer` on Linux or `darwin` on MacOS).
|
- QtMultimedia has changed its default backend to `QT_MEDIA_BACKEND=ffmpeg` (previously `gstreamer` on Linux or `darwin` on MacOS).
|
||||||
The previous native backends remain available but are now minimally maintained. Refer to [upstream documentation](https://doc.qt.io/qt-6/qtmultimedia-index.html#ffmpeg-as-the-default-backend) for further details about each platform.
|
The previous native backends remain available but are now minimally maintained. Refer to [upstream documentation](https://doc.qt.io/qt-6/qtmultimedia-index.html#ffmpeg-as-the-default-backend) for further details about each platform.
|
||||||
|
|
||||||
|
- The `drbd` out-of-tree Linux kernel driver has been added in version `9.2.7`. With it the DRBD 9.x features can be used instead of the 8.x features provided by the `8.4.11` in-tree driver.
|
||||||
|
|
||||||
- The oil shell's c++ version is now available as `oils-for-unix`. The python version is still available as `oil`
|
- The oil shell's c++ version is now available as `oils-for-unix`. The python version is still available as `oil`
|
||||||
|
|
||||||
- `documentation.man.mandoc` now by default uses `MANPATH` to set the directories where mandoc will search for manual pages.
|
- `documentation.man.mandoc` now by default uses `MANPATH` to set the directories where mandoc will search for manual pages.
|
||||||
|
|
|
@ -36,7 +36,7 @@ in
|
||||||
};
|
};
|
||||||
platforms = lib.mkOption {
|
platforms = lib.mkOption {
|
||||||
type = types.listOf types.raw;
|
type = types.listOf types.raw;
|
||||||
default = lib.platforms.linux;
|
default = lib.platforms.linux ++ lib.platforms.darwin;
|
||||||
description = ''
|
description = ''
|
||||||
Sets the [`meta.platforms`](https://nixos.org/manual/nixpkgs/stable/#var-meta-platforms) attribute on the [{option}`test`](#test-opt-test) derivation.
|
Sets the [`meta.platforms`](https://nixos.org/manual/nixpkgs/stable/#var-meta-platforms) attribute on the [{option}`test`](#test-opt-test) derivation.
|
||||||
'';
|
'';
|
||||||
|
|
|
@ -10,7 +10,8 @@ let
|
||||||
|
|
||||||
resolvconfOptions = cfg.extraOptions
|
resolvconfOptions = cfg.extraOptions
|
||||||
++ optional cfg.dnsSingleRequest "single-request"
|
++ optional cfg.dnsSingleRequest "single-request"
|
||||||
++ optional cfg.dnsExtensionMechanism "edns0";
|
++ optional cfg.dnsExtensionMechanism "edns0"
|
||||||
|
++ optional cfg.useLocalResolver "trust-ad";
|
||||||
|
|
||||||
configText =
|
configText =
|
||||||
''
|
''
|
||||||
|
@ -27,9 +28,7 @@ let
|
||||||
resolv_conf_options='${concatStringsSep " " resolvconfOptions}'
|
resolv_conf_options='${concatStringsSep " " resolvconfOptions}'
|
||||||
'' + optionalString cfg.useLocalResolver ''
|
'' + optionalString cfg.useLocalResolver ''
|
||||||
# This hosts runs a full-blown DNS resolver.
|
# This hosts runs a full-blown DNS resolver.
|
||||||
name_servers='127.0.0.1'
|
name_servers='127.0.0.1${optionalString config.networking.enableIPv6 " ::1"}'
|
||||||
'' + optionalString (cfg.useLocalResolver && config.networking.enableIPv6) ''
|
|
||||||
name_servers='::1'
|
|
||||||
'' + cfg.extraConfig;
|
'' + cfg.extraConfig;
|
||||||
|
|
||||||
in
|
in
|
||||||
|
|
26
nixos/modules/hardware/cpu/amd-ryzen-smu.nix
Normal file
26
nixos/modules/hardware/cpu/amd-ryzen-smu.nix
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{ config
|
||||||
|
, lib
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib) mkEnableOption mkIf;
|
||||||
|
cfg = config.hardware.cpu.amd.ryzen-smu;
|
||||||
|
ryzen-smu = config.boot.kernelPackages.ryzen-smu;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.hardware.cpu.amd.ryzen-smu = {
|
||||||
|
enable = mkEnableOption ''
|
||||||
|
ryzen_smu, a linux kernel driver that exposes access to the SMU (System Management Unit) for certain AMD Ryzen Processors.
|
||||||
|
|
||||||
|
WARNING: Damage cause by use of your AMD processor outside of official AMD specifications or outside of factory settings are not covered under any AMD product warranty and may not be covered by your board or system manufacturer's warranty
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
boot.kernelModules = [ "ryzen-smu" ];
|
||||||
|
boot.extraModulePackages = [ ryzen-smu ];
|
||||||
|
environment.systemPackages = [ ryzen-smu ];
|
||||||
|
};
|
||||||
|
|
||||||
|
meta.maintainers = with lib.maintainers; [ Cryolitia phdyellow ];
|
||||||
|
}
|
|
@ -453,6 +453,17 @@ EOF
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Preserve umask (fmask, dmask) settings for vfat filesystems.
|
||||||
|
# (The default is to mount these world-readable, but that's a security risk
|
||||||
|
# for the EFI System Partition.)
|
||||||
|
if ($fsType eq "vfat") {
|
||||||
|
for (@superOptions) {
|
||||||
|
if ($_ =~ /fmask|dmask/) {
|
||||||
|
push @extraOptions, $_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# is this a stratis fs?
|
# is this a stratis fs?
|
||||||
my $stableDevPath = findStableDevPath $device;
|
my $stableDevPath = findStableDevPath $device;
|
||||||
my $stratisPool;
|
my $stratisPool;
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
./hardware/corectrl.nix
|
./hardware/corectrl.nix
|
||||||
./hardware/cpu/amd-microcode.nix
|
./hardware/cpu/amd-microcode.nix
|
||||||
./hardware/cpu/amd-sev.nix
|
./hardware/cpu/amd-sev.nix
|
||||||
|
./hardware/cpu/amd-ryzen-smu.nix
|
||||||
./hardware/cpu/intel-microcode.nix
|
./hardware/cpu/intel-microcode.nix
|
||||||
./hardware/cpu/intel-sgx.nix
|
./hardware/cpu/intel-sgx.nix
|
||||||
./hardware/cpu/x86-msr.nix
|
./hardware/cpu/x86-msr.nix
|
||||||
|
@ -212,6 +213,8 @@
|
||||||
./programs/kbdlight.nix
|
./programs/kbdlight.nix
|
||||||
./programs/kclock.nix
|
./programs/kclock.nix
|
||||||
./programs/kdeconnect.nix
|
./programs/kdeconnect.nix
|
||||||
|
./programs/lazygit.nix
|
||||||
|
./programs/kubeswitch.nix
|
||||||
./programs/less.nix
|
./programs/less.nix
|
||||||
./programs/liboping.nix
|
./programs/liboping.nix
|
||||||
./programs/light.nix
|
./programs/light.nix
|
||||||
|
@ -251,6 +254,7 @@
|
||||||
./programs/regreet.nix
|
./programs/regreet.nix
|
||||||
./programs/rog-control-center.nix
|
./programs/rog-control-center.nix
|
||||||
./programs/rust-motd.nix
|
./programs/rust-motd.nix
|
||||||
|
./programs/ryzen-monitor-ng.nix
|
||||||
./programs/screen.nix
|
./programs/screen.nix
|
||||||
./programs/seahorse.nix
|
./programs/seahorse.nix
|
||||||
./programs/sedutil.nix
|
./programs/sedutil.nix
|
||||||
|
@ -1363,6 +1367,7 @@
|
||||||
./services/web-apps/miniflux.nix
|
./services/web-apps/miniflux.nix
|
||||||
./services/web-apps/monica.nix
|
./services/web-apps/monica.nix
|
||||||
./services/web-apps/moodle.nix
|
./services/web-apps/moodle.nix
|
||||||
|
./services/web-apps/movim.nix
|
||||||
./services/web-apps/netbox.nix
|
./services/web-apps/netbox.nix
|
||||||
./services/web-apps/nextcloud.nix
|
./services/web-apps/nextcloud.nix
|
||||||
./services/web-apps/nextcloud-notify_push.nix
|
./services/web-apps/nextcloud-notify_push.nix
|
||||||
|
|
|
@ -1,46 +1,38 @@
|
||||||
{ pkgs, config, lib, ... }:
|
{ pkgs, config, lib, ... }:
|
||||||
|
|
||||||
with lib;
|
|
||||||
|
|
||||||
let
|
let
|
||||||
cfg = config.programs.fzf;
|
cfg = config.programs.fzf;
|
||||||
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
|
||||||
(lib.mkRemovedOptionModule [ "programs" "fzf" "keybindings" ] ''
|
|
||||||
Use "programs.fzf.enabled" instead, due to fzf upstream-change it's not possible to load shell-completion and keybindings separately.
|
|
||||||
If you want to change/disable certain keybindings please check the fzf-documentation.
|
|
||||||
'')
|
|
||||||
(lib.mkRemovedOptionModule [ "programs" "fzf" "fuzzyCompletion" ] ''
|
|
||||||
Use "programs.fzf.enabled" instead, due to fzf upstream-change it's not possible to load shell-completion and keybindings separately.
|
|
||||||
If you want to change/disable certain keybindings please check the fzf-documentation.
|
|
||||||
'')
|
|
||||||
];
|
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
programs.fzf.enable = mkEnableOption (mdDoc "fuzzy completion with fzf and keybindings");
|
programs.fzf = {
|
||||||
};
|
fuzzyCompletion = lib.mkEnableOption (lib.mdDoc "fuzzy completion with fzf");
|
||||||
|
keybindings = lib.mkEnableOption (lib.mdDoc "fzf keybindings");
|
||||||
config = mkIf cfg.enable {
|
|
||||||
environment.systemPackages = [ pkgs.fzf ];
|
|
||||||
|
|
||||||
programs.bash.interactiveShellInit = ''
|
|
||||||
eval "$(${getExe pkgs.fzf} --bash)"
|
|
||||||
'';
|
|
||||||
|
|
||||||
programs.fish.interactiveShellInit = ''
|
|
||||||
${getExe pkgs.fzf} --fish | source
|
|
||||||
'';
|
|
||||||
|
|
||||||
programs.zsh = {
|
|
||||||
interactiveShellInit = optionalString (!config.programs.zsh.ohMyZsh.enable) ''
|
|
||||||
eval "$(${getExe pkgs.fzf} --zsh)"
|
|
||||||
'';
|
|
||||||
|
|
||||||
ohMyZsh.plugins = mkIf (config.programs.zsh.ohMyZsh.enable) [ "fzf" ];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
meta.maintainers = with maintainers; [ laalsaas ];
|
config = lib.mkIf (cfg.keybindings || cfg.fuzzyCompletion) {
|
||||||
|
environment.systemPackages = lib.mkIf (cfg.keybindings || cfg.fuzzyCompletion) [ pkgs.fzf ];
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
bash.interactiveShellInit = lib.optionalString cfg.fuzzyCompletion ''
|
||||||
|
source ${pkgs.fzf}/share/fzf/completion.bash
|
||||||
|
'' + lib.optionalString cfg.keybindings ''
|
||||||
|
source ${pkgs.fzf}/share/fzf/key-bindings.bash
|
||||||
|
'';
|
||||||
|
|
||||||
|
zsh = {
|
||||||
|
interactiveShellInit = lib.optionalString (!config.programs.zsh.ohMyZsh.enable)
|
||||||
|
(lib.optionalString cfg.fuzzyCompletion ''
|
||||||
|
source ${pkgs.fzf}/share/fzf/completion.zsh
|
||||||
|
'' + lib.optionalString cfg.keybindings ''
|
||||||
|
source ${pkgs.fzf}/share/fzf/key-bindings.zsh
|
||||||
|
'');
|
||||||
|
|
||||||
|
ohMyZsh.plugins = lib.mkIf config.programs.zsh.ohMyZsh.enable [ "fzf" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
meta.maintainers = with lib.maintainers; [ laalsaas ];
|
||||||
}
|
}
|
||||||
|
|
56
nixos/modules/programs/kubeswitch.nix
Normal file
56
nixos/modules/programs/kubeswitch.nix
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.programs.kubeswitch;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
programs.kubeswitch = {
|
||||||
|
enable = lib.mkEnableOption (lib.mdDoc "kubeswitch");
|
||||||
|
|
||||||
|
commandName = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "kswitch";
|
||||||
|
description = "The name of the command to use";
|
||||||
|
};
|
||||||
|
|
||||||
|
package = lib.mkOption {
|
||||||
|
type = lib.types.package;
|
||||||
|
default = pkgs.kubeswitch;
|
||||||
|
defaultText = lib.literalExpression "pkgs.kubeswitch";
|
||||||
|
description = "The package to install for kubeswitch";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config =
|
||||||
|
let
|
||||||
|
shell_files = pkgs.stdenv.mkDerivation rec {
|
||||||
|
name = "kubeswitch-shell-files";
|
||||||
|
phases = [ "installPhase" ];
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/share
|
||||||
|
for shell in bash zsh; do
|
||||||
|
${cfg.package}/bin/switcher init $shell | sed 's/switch(/${cfg.commandName}(/' > $out/share/${cfg.commandName}_init.$shell
|
||||||
|
${cfg.package}/bin/switcher --cmd ${cfg.commandName} completion $shell > $out/share/${cfg.commandName}_completion.$shell
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mkIf cfg.enable {
|
||||||
|
environment.systemPackages = [ cfg.package ];
|
||||||
|
|
||||||
|
programs.bash.interactiveShellInit = ''
|
||||||
|
source ${shell_files}/share/${cfg.commandName}_init.bash
|
||||||
|
source ${shell_files}/share/${cfg.commandName}_completion.bash
|
||||||
|
'';
|
||||||
|
programs.zsh.interactiveShellInit = ''
|
||||||
|
source ${shell_files}/share/${cfg.commandName}_init.zsh
|
||||||
|
source ${shell_files}/share/${cfg.commandName}_completion.zsh
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
37
nixos/modules/programs/lazygit.nix
Normal file
37
nixos/modules/programs/lazygit.nix
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.programs.lazygit;
|
||||||
|
|
||||||
|
settingsFormat = pkgs.formats.yaml { };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.programs.lazygit = {
|
||||||
|
enable = lib.mkEnableOption "lazygit, a simple terminal UI for git commands";
|
||||||
|
|
||||||
|
package = lib.mkPackageOption pkgs "lazygit" { };
|
||||||
|
|
||||||
|
settings = lib.mkOption {
|
||||||
|
inherit (settingsFormat) type;
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
Lazygit configuration.
|
||||||
|
|
||||||
|
See https://github.com/jesseduffield/lazygit/blob/master/docs/Config.md for documentation.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
environment = {
|
||||||
|
systemPackages = [ cfg.package ];
|
||||||
|
etc = lib.mkIf (cfg.settings != { }) {
|
||||||
|
"xdg/lazygit/config.yml".source = settingsFormat.generate "lazygit-config.yml" cfg.settings;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
maintainers = with lib.maintainers; [ linsui ];
|
||||||
|
};
|
||||||
|
}
|
35
nixos/modules/programs/ryzen-monitor-ng.nix
Normal file
35
nixos/modules/programs/ryzen-monitor-ng.nix
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{ pkgs
|
||||||
|
, config
|
||||||
|
, lib
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (lib) mkEnableOption mkPackageOption mkIf;
|
||||||
|
cfg = config.programs.ryzen-monitor-ng;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
programs.ryzen-monitor-ng = {
|
||||||
|
enable = mkEnableOption ''
|
||||||
|
ryzen_monitor_ng, a userspace application for setting and getting Ryzen SMU (System Management Unit) parameters via the ryzen_smu kernel driver.
|
||||||
|
|
||||||
|
Monitor power information of Ryzen processors via the PM table of the SMU.
|
||||||
|
|
||||||
|
SMU Set and Get for many parameters and CO counts.
|
||||||
|
|
||||||
|
https://github.com/mann1x/ryzen_monitor_ng
|
||||||
|
|
||||||
|
WARNING: Damage cause by use of your AMD processor outside of official AMD specifications or outside of factory settings are not covered under any AMD product warranty and may not be covered by your board or system manufacturer's warranty
|
||||||
|
'';
|
||||||
|
|
||||||
|
package = mkPackageOption pkgs "ryzen-monitor-ng" {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
environment.systemPackages = [ cfg.package ];
|
||||||
|
hardware.cpu.amd.ryzen-smu.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
meta.maintainers = with lib.maintainers; [ Cryolitia phdyellow ];
|
||||||
|
}
|
|
@ -12,7 +12,7 @@ in
|
||||||
enable = mkEnableOption (lib.mdDoc "Restic REST Server");
|
enable = mkEnableOption (lib.mdDoc "Restic REST Server");
|
||||||
|
|
||||||
listenAddress = mkOption {
|
listenAddress = mkOption {
|
||||||
default = ":8000";
|
default = "8000";
|
||||||
example = "127.0.0.1:8080";
|
example = "127.0.0.1:8080";
|
||||||
type = types.str;
|
type = types.str;
|
||||||
description = lib.mdDoc "Listen on a specific IP address and port.";
|
description = lib.mdDoc "Listen on a specific IP address and port.";
|
||||||
|
@ -61,14 +61,19 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
assertions = [{
|
||||||
|
assertion = lib.substring 0 1 cfg.listenAddress != ":";
|
||||||
|
message = "The restic-rest-server now uses systemd socket activation, which expects only the Port number: services.restic.server.listenAddress = \"${lib.substring 1 6 cfg.listenAddress}\";";
|
||||||
|
}];
|
||||||
|
|
||||||
systemd.services.restic-rest-server = {
|
systemd.services.restic-rest-server = {
|
||||||
description = "Restic REST Server";
|
description = "Restic REST Server";
|
||||||
after = [ "network.target" ];
|
after = [ "network.target" "restic-rest-server.socket" ];
|
||||||
|
requires = [ "restic-rest-server.socket" ];
|
||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = ''
|
ExecStart = ''
|
||||||
${cfg.package}/bin/rest-server \
|
${cfg.package}/bin/rest-server \
|
||||||
--listen ${cfg.listenAddress} \
|
|
||||||
--path ${cfg.dataDir} \
|
--path ${cfg.dataDir} \
|
||||||
${optionalString cfg.appendOnly "--append-only"} \
|
${optionalString cfg.appendOnly "--append-only"} \
|
||||||
${optionalString cfg.privateRepos "--private-repos"} \
|
${optionalString cfg.privateRepos "--private-repos"} \
|
||||||
|
@ -80,16 +85,40 @@ in
|
||||||
Group = "restic";
|
Group = "restic";
|
||||||
|
|
||||||
# Security hardening
|
# Security hardening
|
||||||
ReadWritePaths = [ cfg.dataDir ];
|
CapabilityBoundingSet = "";
|
||||||
|
LockPersonality = true;
|
||||||
|
MemoryDenyWriteExecute = true;
|
||||||
|
NoNewPrivileges = true;
|
||||||
|
PrivateNetwork = true;
|
||||||
PrivateTmp = true;
|
PrivateTmp = true;
|
||||||
|
PrivateUsers = true;
|
||||||
|
ProtectClock = true;
|
||||||
|
ProtectHome = true;
|
||||||
|
ProtectHostname = true;
|
||||||
|
ProtectKernelLogs = true;
|
||||||
|
ProtectProc = "invisible";
|
||||||
ProtectSystem = "strict";
|
ProtectSystem = "strict";
|
||||||
ProtectKernelTunables = true;
|
ProtectKernelTunables = true;
|
||||||
ProtectKernelModules = true;
|
ProtectKernelModules = true;
|
||||||
ProtectControlGroups = true;
|
ProtectControlGroups = true;
|
||||||
PrivateDevices = true;
|
PrivateDevices = true;
|
||||||
|
ReadWritePaths = [ cfg.dataDir ];
|
||||||
|
RemoveIPC = true;
|
||||||
|
RestrictAddressFamilies = "none";
|
||||||
|
RestrictNamespaces = true;
|
||||||
|
RestrictRealtime = true;
|
||||||
|
RestrictSUIDSGID = true;
|
||||||
|
SystemCallArchitectures = "native";
|
||||||
|
SystemCallFilter = "@system-service";
|
||||||
|
UMask = 027;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
systemd.sockets.restic-rest-server = {
|
||||||
|
listenStreams = [ cfg.listenAddress ];
|
||||||
|
wantedBy = [ "sockets.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
systemd.tmpfiles.rules = mkIf cfg.privateRepos [
|
systemd.tmpfiles.rules = mkIf cfg.privateRepos [
|
||||||
"f ${cfg.dataDir}/.htpasswd 0700 restic restic -"
|
"f ${cfg.dataDir}/.htpasswd 0700 restic restic -"
|
||||||
];
|
];
|
||||||
|
|
|
@ -465,5 +465,5 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
meta.maintainers = with maintainers; [ infinisil SlothOfAnarchy ];
|
meta.maintainers = with maintainers; [ SlothOfAnarchy ];
|
||||||
}
|
}
|
||||||
|
|
|
@ -338,7 +338,7 @@ in {
|
||||||
after = [ "network.target" ];
|
after = [ "network.target" ];
|
||||||
|
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
ExecStart = "${cfg.package}/bin/redis-server /var/lib/${redisName name}/redis.conf ${escapeShellArgs conf.extraParams}";
|
ExecStart = "${cfg.package}/bin/${cfg.package.serverBin or "redis-server"} /var/lib/${redisName name}/redis.conf ${escapeShellArgs conf.extraParams}";
|
||||||
ExecStartPre = "+"+pkgs.writeShellScript "${redisName name}-prep-conf" (let
|
ExecStartPre = "+"+pkgs.writeShellScript "${redisName name}-prep-conf" (let
|
||||||
redisConfVar = "/var/lib/${redisName name}/redis.conf";
|
redisConfVar = "/var/lib/${redisName name}/redis.conf";
|
||||||
redisConfRun = "/run/${redisName name}/nixos.conf";
|
redisConfRun = "/run/${redisName name}/nixos.conf";
|
||||||
|
@ -391,7 +391,8 @@ in {
|
||||||
RestrictAddressFamilies = [ "AF_INET" "AF_INET6" "AF_UNIX" ];
|
RestrictAddressFamilies = [ "AF_INET" "AF_INET6" "AF_UNIX" ];
|
||||||
RestrictNamespaces = true;
|
RestrictNamespaces = true;
|
||||||
LockPersonality = true;
|
LockPersonality = true;
|
||||||
MemoryDenyWriteExecute = true;
|
# we need to disable MemoryDenyWriteExecute for keydb
|
||||||
|
MemoryDenyWriteExecute = cfg.package.pname != "keydb";
|
||||||
RestrictRealtime = true;
|
RestrictRealtime = true;
|
||||||
RestrictSUIDSGID = true;
|
RestrictSUIDSGID = true;
|
||||||
PrivateMounts = true;
|
PrivateMounts = true;
|
||||||
|
|
|
@ -173,11 +173,14 @@ in
|
||||||
imports = [
|
imports = [
|
||||||
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "autoLogin" ] [ "services" "displayManager" "autoLogin" ])
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "autoLogin" ] [ "services" "displayManager" "autoLogin" ])
|
||||||
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "defaultSession" ] [ "services" "displayManager" "defaultSession" ])
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "defaultSession" ] [ "services" "displayManager" "defaultSession" ])
|
||||||
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "hiddenUsers" ] [ "services" "displayManager" "hiddenUsers" ])
|
||||||
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "environment" ] [ "services" "displayManager" "environment" ])
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "environment" ] [ "services" "displayManager" "environment" ])
|
||||||
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "execCmd" ] [ "services" "displayManager" "execCmd" ])
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "execCmd" ] [ "services" "displayManager" "execCmd" ])
|
||||||
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "logToFile" ] [ "services" "displayManager" "logToFile" ])
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "logToFile" ] [ "services" "displayManager" "logToFile" ])
|
||||||
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "logToJournal" ] [ "services" "displayManager" "logToJournal" ])
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "logToJournal" ] [ "services" "displayManager" "logToJournal" ])
|
||||||
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "preStart" ] [ "services" "displayManager" "preStart" ])
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "preStart" ] [ "services" "displayManager" "preStart" ])
|
||||||
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "sessionData" ] [ "services" "displayManager" "sessionData" ])
|
||||||
|
(lib.mkRenamedOptionModule [ "services" "xserver" "displayManager" "sessionPackages" ] [ "services" "displayManager" "sessionPackages" ])
|
||||||
];
|
];
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
|
|
|
@ -60,6 +60,9 @@ in
|
||||||
# This prevents nixos-rebuild from killing greetd by activating getty again
|
# This prevents nixos-rebuild from killing greetd by activating getty again
|
||||||
systemd.services."autovt@${tty}".enable = false;
|
systemd.services."autovt@${tty}".enable = false;
|
||||||
|
|
||||||
|
# Enable desktop session data
|
||||||
|
services.displayManager.enable = lib.mkDefault true;
|
||||||
|
|
||||||
systemd.services.greetd = {
|
systemd.services.greetd = {
|
||||||
aliases = [ "display-manager.service" ];
|
aliases = [ "display-manager.service" ];
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ let
|
||||||
HideShells = "/run/current-system/sw/bin/nologin";
|
HideShells = "/run/current-system/sw/bin/nologin";
|
||||||
};
|
};
|
||||||
|
|
||||||
X11 = {
|
X11 = optionalAttrs xcfg.enable {
|
||||||
MinimumVT = if xcfg.tty != null then xcfg.tty else 7;
|
MinimumVT = if xcfg.tty != null then xcfg.tty else 7;
|
||||||
ServerPath = toString xserverWrapper;
|
ServerPath = toString xserverWrapper;
|
||||||
XephyrPath = "${pkgs.xorg.xorgserver.out}/bin/Xephyr";
|
XephyrPath = "${pkgs.xorg.xorgserver.out}/bin/Xephyr";
|
||||||
|
|
|
@ -104,9 +104,12 @@ in
|
||||||
default = { };
|
default = { };
|
||||||
description = lib.mdDoc ''
|
description = lib.mdDoc ''
|
||||||
logrotate freeform settings: each attribute here will define its own section,
|
logrotate freeform settings: each attribute here will define its own section,
|
||||||
ordered by priority, which can either define files to rotate with their settings
|
ordered by {option}`services.logrotate.settings.<name>.priority`,
|
||||||
|
which can either define files to rotate with their settings
|
||||||
or settings common to all further files settings.
|
or settings common to all further files settings.
|
||||||
Refer to <https://linux.die.net/man/8/logrotate> for details.
|
All attribute names not explicitly defined as sub-options here are passed through
|
||||||
|
as logrotate config directives,
|
||||||
|
refer to <https://linux.die.net/man/8/logrotate> for details.
|
||||||
'';
|
'';
|
||||||
example = literalExpression ''
|
example = literalExpression ''
|
||||||
{
|
{
|
||||||
|
@ -125,6 +128,14 @@ in
|
||||||
"/var/log/second.log"
|
"/var/log/second.log"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
# specify custom order of sections
|
||||||
|
"/var/log/myservice/*.log" = {
|
||||||
|
# ensure lower priority
|
||||||
|
priority = 110;
|
||||||
|
postrotate = '''
|
||||||
|
systemctl reload myservice
|
||||||
|
''';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
'';
|
'';
|
||||||
type = types.attrsOf (types.submodule ({ name, ... }: {
|
type = types.attrsOf (types.submodule ({ name, ... }: {
|
||||||
|
|
|
@ -260,6 +260,12 @@ in {
|
||||||
description = lib.mdDoc "Treat outputs as connected even if their lids are closed";
|
description = lib.mdDoc "Treat outputs as connected even if their lids are closed";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
matchEdid = mkOption {
|
||||||
|
default = false;
|
||||||
|
type = types.bool;
|
||||||
|
description = lib.mdDoc "Match displays based on edid instead of name";
|
||||||
|
};
|
||||||
|
|
||||||
hooks = mkOption {
|
hooks = mkOption {
|
||||||
type = hooksModule;
|
type = hooksModule;
|
||||||
description = lib.mdDoc "Global hook scripts";
|
description = lib.mdDoc "Global hook scripts";
|
||||||
|
@ -351,7 +357,8 @@ in {
|
||||||
--batch \
|
--batch \
|
||||||
--change \
|
--change \
|
||||||
--default ${cfg.defaultTarget} \
|
--default ${cfg.defaultTarget} \
|
||||||
${optionalString cfg.ignoreLid "--ignore-lid"}
|
${optionalString cfg.ignoreLid "--ignore-lid"} \
|
||||||
|
${optionalString cfg.matchEdid "--match-edid"}
|
||||||
'';
|
'';
|
||||||
Type = "oneshot";
|
Type = "oneshot";
|
||||||
RemainAfterExit = false;
|
RemainAfterExit = false;
|
||||||
|
|
|
@ -42,9 +42,11 @@ in
|
||||||
startAt = lib.optionals cfg.automatic cfg.dates;
|
startAt = lib.optionals cfg.automatic cfg.dates;
|
||||||
};
|
};
|
||||||
|
|
||||||
timers.nix-optimise.timerConfig = {
|
timers.nix-optimise = lib.mkIf cfg.automatic {
|
||||||
Persistent = true;
|
timerConfig = {
|
||||||
RandomizedDelaySec = 1800;
|
Persistent = true;
|
||||||
|
RandomizedDelaySec = 1800;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -220,15 +220,16 @@ in
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
services.redis.servers.paperless.enable = mkIf enableRedis true;
|
services.redis.servers.paperless.enable = mkIf enableRedis true;
|
||||||
|
|
||||||
systemd.tmpfiles.rules = [
|
systemd.tmpfiles.settings."10-paperless" = let
|
||||||
"d '${cfg.dataDir}' - ${cfg.user} ${config.users.users.${cfg.user}.group} - -"
|
defaultRule = {
|
||||||
"d '${cfg.mediaDir}' - ${cfg.user} ${config.users.users.${cfg.user}.group} - -"
|
inherit (cfg) user;
|
||||||
(if cfg.consumptionDirIsPublic then
|
inherit (config.users.users.${cfg.user}) group;
|
||||||
"d '${cfg.consumptionDir}' 777 - - - -"
|
};
|
||||||
else
|
in {
|
||||||
"d '${cfg.consumptionDir}' - ${cfg.user} ${config.users.users.${cfg.user}.group} - -"
|
"${cfg.dataDir}".d = defaultRule;
|
||||||
)
|
"${cfg.mediaDir}".d = defaultRule;
|
||||||
];
|
"${cfg.consumptionDir}".d = if cfg.consumptionDirIsPublic then { mode = "777"; } else defaultRule;
|
||||||
|
};
|
||||||
|
|
||||||
systemd.services.paperless-scheduler = {
|
systemd.services.paperless-scheduler = {
|
||||||
description = "Paperless Celery Beat";
|
description = "Paperless Celery Beat";
|
||||||
|
@ -238,6 +239,7 @@ in
|
||||||
User = cfg.user;
|
User = cfg.user;
|
||||||
ExecStart = "${pkg}/bin/celery --app paperless beat --loglevel INFO";
|
ExecStart = "${pkg}/bin/celery --app paperless beat --loglevel INFO";
|
||||||
Restart = "on-failure";
|
Restart = "on-failure";
|
||||||
|
LoadCredential = lib.optionalString (cfg.passwordFile != null) "PAPERLESS_ADMIN_PASSWORD:${cfg.passwordFile}";
|
||||||
};
|
};
|
||||||
environment = env;
|
environment = env;
|
||||||
|
|
||||||
|
@ -270,7 +272,7 @@ in
|
||||||
''
|
''
|
||||||
+ optionalString (cfg.passwordFile != null) ''
|
+ optionalString (cfg.passwordFile != null) ''
|
||||||
export PAPERLESS_ADMIN_USER="''${PAPERLESS_ADMIN_USER:-admin}"
|
export PAPERLESS_ADMIN_USER="''${PAPERLESS_ADMIN_USER:-admin}"
|
||||||
export PAPERLESS_ADMIN_PASSWORD=$(cat "${cfg.dataDir}/superuser-password")
|
export PAPERLESS_ADMIN_PASSWORD=$(cat $CREDENTIALS_DIRECTORY/PAPERLESS_ADMIN_PASSWORD)
|
||||||
superuserState="$PAPERLESS_ADMIN_USER:$PAPERLESS_ADMIN_PASSWORD"
|
superuserState="$PAPERLESS_ADMIN_USER:$PAPERLESS_ADMIN_PASSWORD"
|
||||||
superuserStateFile="${cfg.dataDir}/superuser-state"
|
superuserStateFile="${cfg.dataDir}/superuser-state"
|
||||||
|
|
||||||
|
@ -298,19 +300,6 @@ in
|
||||||
environment = env;
|
environment = env;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Reading the user-provided password file requires root access
|
|
||||||
systemd.services.paperless-copy-password = mkIf (cfg.passwordFile != null) {
|
|
||||||
requiredBy = [ "paperless-scheduler.service" ];
|
|
||||||
before = [ "paperless-scheduler.service" ];
|
|
||||||
serviceConfig = {
|
|
||||||
ExecStart = ''
|
|
||||||
${pkgs.coreutils}/bin/install --mode 600 --owner '${cfg.user}' --compare \
|
|
||||||
'${cfg.passwordFile}' '${cfg.dataDir}/superuser-password'
|
|
||||||
'';
|
|
||||||
Type = "oneshot";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.paperless-consumer = {
|
systemd.services.paperless-consumer = {
|
||||||
description = "Paperless document consumer";
|
description = "Paperless document consumer";
|
||||||
# Bind to `paperless-scheduler` so that the consumer never runs
|
# Bind to `paperless-scheduler` so that the consumer never runs
|
||||||
|
|
|
@ -55,6 +55,7 @@ let
|
||||||
"modemmanager"
|
"modemmanager"
|
||||||
"mongodb"
|
"mongodb"
|
||||||
"mysqld"
|
"mysqld"
|
||||||
|
"nats"
|
||||||
"nextcloud"
|
"nextcloud"
|
||||||
"nginx"
|
"nginx"
|
||||||
"nginxlog"
|
"nginxlog"
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
{ config, lib, pkgs, options, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
cfg = config.services.prometheus.exporters.nats;
|
||||||
|
|
||||||
|
in
|
||||||
|
{
|
||||||
|
port = 7777;
|
||||||
|
|
||||||
|
extraOpts = {
|
||||||
|
url = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "http://127.0.0.1:8222";
|
||||||
|
description = ''
|
||||||
|
NATS monitor endpoint to query.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
serviceOpts = {
|
||||||
|
serviceConfig = {
|
||||||
|
ExecStart = ''
|
||||||
|
${pkgs.prometheus-nats-exporter}/bin/prometheus-nats-exporter \
|
||||||
|
-addr ${cfg.listenAddress} \
|
||||||
|
-port ${toString cfg.port} \
|
||||||
|
${concatStringsSep " \\\n " cfg.extraFlags} \
|
||||||
|
${cfg.url}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,46 +1,52 @@
|
||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
with lib;
|
|
||||||
|
|
||||||
let
|
let
|
||||||
toStr = value:
|
inherit (lib.attrsets) optionalAttrs;
|
||||||
if true == value then "yes"
|
inherit (lib.generators) toINIWithGlobalSection;
|
||||||
else if false == value then "no"
|
inherit (lib.lists) optional;
|
||||||
else toString value;
|
inherit (lib.modules) mkIf;
|
||||||
|
inherit (lib.options) literalExpression mkEnableOption mkOption;
|
||||||
|
inherit (lib.strings) escape;
|
||||||
|
inherit (lib.types) attrsOf bool int lines oneOf str submodule;
|
||||||
|
|
||||||
cfg = config.services.davfs2;
|
cfg = config.services.davfs2;
|
||||||
format = pkgs.formats.toml { };
|
|
||||||
configFile = let
|
escapeString = escape ["\"" "\\"];
|
||||||
settings = mapAttrsToList (n: v: "${n} = ${toStr v}") cfg.settings;
|
|
||||||
in pkgs.writeText "davfs2.conf" ''
|
formatValue = value:
|
||||||
${concatStringsSep "\n" settings}
|
if true == value then "1"
|
||||||
${cfg.extraConfig}
|
else if false == value then "0"
|
||||||
'';
|
else if builtins.isString value then "\"${escapeString value}\""
|
||||||
|
else toString value;
|
||||||
|
|
||||||
|
configFile = pkgs.writeText "davfs2.conf" (
|
||||||
|
if (cfg.settings != { }) then
|
||||||
|
(toINIWithGlobalSection {
|
||||||
|
mkSectionName = escapeString;
|
||||||
|
mkKeyValue = k: v: "${k} ${formatValue v}";
|
||||||
|
} cfg.settings)
|
||||||
|
else
|
||||||
|
cfg.extraConfig
|
||||||
|
);
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
|
||||||
options.services.davfs2 = {
|
options.services.davfs2 = {
|
||||||
enable = mkOption {
|
enable = mkEnableOption "davfs2";
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
description = lib.mdDoc ''
|
|
||||||
Whether to enable davfs2.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
davUser = mkOption {
|
davUser = mkOption {
|
||||||
type = types.str;
|
type = str;
|
||||||
default = "davfs2";
|
default = "davfs2";
|
||||||
description = lib.mdDoc ''
|
description = ''
|
||||||
When invoked by root the mount.davfs daemon will run as this user.
|
When invoked by root the mount.davfs daemon will run as this user.
|
||||||
Value must be given as name, not as numerical id.
|
Value must be given as name, not as numerical id.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
davGroup = mkOption {
|
davGroup = mkOption {
|
||||||
type = types.str;
|
type = str;
|
||||||
default = "davfs2";
|
default = "davfs2";
|
||||||
description = lib.mdDoc ''
|
description = ''
|
||||||
The group of the running mount.davfs daemon. Ordinary users must be
|
The group of the running mount.davfs daemon. Ordinary users must be
|
||||||
member of this group in order to mount a davfs2 file system. Value must
|
member of this group in order to mount a davfs2 file system. Value must
|
||||||
be given as name, not as numerical id.
|
be given as name, not as numerical id.
|
||||||
|
@ -48,14 +54,19 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
extraConfig = mkOption {
|
extraConfig = mkOption {
|
||||||
type = types.lines;
|
type = lines;
|
||||||
default = "";
|
default = "";
|
||||||
example = ''
|
example = ''
|
||||||
kernel_fs coda
|
|
||||||
proxy foo.bar:8080
|
proxy foo.bar:8080
|
||||||
use_locks 0
|
use_locks 0
|
||||||
|
|
||||||
|
[/media/dav]
|
||||||
|
use_locks 1
|
||||||
|
|
||||||
|
[/home/otto/mywebspace]
|
||||||
|
gui_optimize 1
|
||||||
'';
|
'';
|
||||||
description = lib.mdDoc ''
|
description = ''
|
||||||
Extra lines appended to the configuration of davfs2.
|
Extra lines appended to the configuration of davfs2.
|
||||||
See {manpage}`davfs2.conf(5)` for available settings.
|
See {manpage}`davfs2.conf(5)` for available settings.
|
||||||
|
|
||||||
|
@ -66,18 +77,30 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
settings = mkOption {
|
settings = mkOption {
|
||||||
type = types.submodule {
|
type = submodule {
|
||||||
freeformType = format.type;
|
freeformType = let
|
||||||
|
valueTypes = [ bool int str ];
|
||||||
|
in
|
||||||
|
attrsOf (attrsOf (oneOf (valueTypes ++ [ (attrsOf (oneOf valueTypes)) ] )));
|
||||||
};
|
};
|
||||||
default = {};
|
default = { };
|
||||||
example = literalExpression ''
|
example = literalExpression ''
|
||||||
{
|
{
|
||||||
kernel_fs = "coda";
|
globalSection = {
|
||||||
proxy = "foo.bar:8080";
|
proxy = "foo.bar:8080";
|
||||||
use_locks = 0;
|
use_locks = false;
|
||||||
|
};
|
||||||
|
sections = {
|
||||||
|
"/media/dav" = {
|
||||||
|
use_locks = true;
|
||||||
|
};
|
||||||
|
"/home/otto/mywebspace" = {
|
||||||
|
gui_optimize = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
description = lib.mdDoc ''
|
description = ''
|
||||||
Extra settings appended to the configuration of davfs2.
|
Extra settings appended to the configuration of davfs2.
|
||||||
See {manpage}`davfs2.conf(5)` for available settings.
|
See {manpage}`davfs2.conf(5)` for available settings.
|
||||||
'' ;
|
'' ;
|
||||||
|
@ -86,16 +109,29 @@ in
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
|
||||||
warnings = lib.optional (cfg.extraConfig != null) ''
|
assertions = [
|
||||||
services.davfs2.extraConfig will be deprecated in future releases, please use the settings option now.
|
{
|
||||||
|
assertion = cfg.extraConfig != "" -> cfg.settings == { };
|
||||||
|
message = ''
|
||||||
|
services.davfs2.extraConfig and services.davfs2.settings cannot be used together.
|
||||||
|
Please prefer using services.davfs2.settings.
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
warnings = optional (cfg.extraConfig != "") ''
|
||||||
|
services.davfs2.extraConfig will be deprecated in future releases;
|
||||||
|
please use services.davfs2.settings instead.
|
||||||
'';
|
'';
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.davfs2 ];
|
environment.systemPackages = [ pkgs.davfs2 ];
|
||||||
environment.etc."davfs2/davfs2.conf".source = configFile;
|
environment.etc."davfs2/davfs2.conf".source = configFile;
|
||||||
|
|
||||||
services.davfs2.settings = {
|
services.davfs2.settings = {
|
||||||
dav_user = cfg.davUser;
|
globalSection = {
|
||||||
dav_group = cfg.davGroup;
|
dav_user = cfg.davUser;
|
||||||
|
dav_group = cfg.davGroup;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
users.groups = optionalAttrs (cfg.davGroup == "davfs2") {
|
users.groups = optionalAttrs (cfg.davGroup == "davfs2") {
|
||||||
|
|
|
@ -11,7 +11,7 @@ let
|
||||||
default = null;
|
default = null;
|
||||||
example = "30s";
|
example = "30s";
|
||||||
description = lib.mdDoc ''
|
description = lib.mdDoc ''
|
||||||
Timeout for establishing a new TCP connection to your origin server. This excludes the time taken to establish TLS, which is controlled by [https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/local-management/ingress/#tlstimeout](tlsTimeout).
|
Timeout for establishing a new TCP connection to your origin server. This excludes the time taken to establish TLS, which is controlled by [tlsTimeout](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/local-management/ingress/#tlstimeout).
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,8 @@ with lib;
|
||||||
let
|
let
|
||||||
cfg = config.services.i2p;
|
cfg = config.services.i2p;
|
||||||
homeDir = "/var/lib/i2p";
|
homeDir = "/var/lib/i2p";
|
||||||
in {
|
in
|
||||||
|
{
|
||||||
###### interface
|
###### interface
|
||||||
options.services.i2p.enable = mkEnableOption (lib.mdDoc "I2P router");
|
options.services.i2p.enable = mkEnableOption (lib.mdDoc "I2P router");
|
||||||
|
|
||||||
|
@ -27,7 +28,7 @@ in {
|
||||||
User = "i2p";
|
User = "i2p";
|
||||||
WorkingDirectory = homeDir;
|
WorkingDirectory = homeDir;
|
||||||
Restart = "on-abort";
|
Restart = "on-abort";
|
||||||
ExecStart = "${pkgs.i2p}/bin/i2prouter-plain";
|
ExecStart = "${pkgs.i2p}/bin/i2prouter";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -200,5 +200,5 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
meta.maintainers = with lib.maintainers; [ infinisil dotlambda ];
|
meta.maintainers = with lib.maintainers; [ dotlambda ];
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,10 +39,10 @@ in
|
||||||
services.unifi.unifiPackage = lib.mkPackageOption pkgs "unifi5" { };
|
services.unifi.unifiPackage = lib.mkPackageOption pkgs "unifi5" { };
|
||||||
|
|
||||||
services.unifi.mongodbPackage = lib.mkPackageOption pkgs "mongodb" {
|
services.unifi.mongodbPackage = lib.mkPackageOption pkgs "mongodb" {
|
||||||
default = "mongodb-4_4";
|
default = "mongodb-5_0";
|
||||||
extraDescription = ''
|
extraDescription = ''
|
||||||
::: {.note}
|
::: {.note}
|
||||||
unifi7 officially only supports mongodb up until 3.6 but works with 4.4.
|
unifi7 officially only supports mongodb up until 4.4 but works with 5.0.
|
||||||
:::
|
:::
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
|
@ -108,7 +108,7 @@ in
|
||||||
unifiVideoPackage = mkPackageOption pkgs "unifi-video" { };
|
unifiVideoPackage = mkPackageOption pkgs "unifi-video" { };
|
||||||
|
|
||||||
mongodbPackage = mkPackageOption pkgs "mongodb" {
|
mongodbPackage = mkPackageOption pkgs "mongodb" {
|
||||||
default = "mongodb-4_4";
|
default = "mongodb-5_0";
|
||||||
};
|
};
|
||||||
|
|
||||||
logDir = mkOption {
|
logDir = mkOption {
|
||||||
|
|
|
@ -764,6 +764,21 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
"Pleroma.Upload" = let
|
||||||
|
httpConf = cfg.config.":pleroma"."Pleroma.Web.Endpoint".url;
|
||||||
|
in {
|
||||||
|
base_url = mkOption {
|
||||||
|
type = types.nonEmptyStr;
|
||||||
|
default = if lib.versionOlder config.system.stateVersion "24.05"
|
||||||
|
then "${httpConf.scheme}://${httpConf.host}:${builtins.toString httpConf.port}/media/"
|
||||||
|
else null;
|
||||||
|
description = mdDoc ''
|
||||||
|
Base path which uploads will be stored at.
|
||||||
|
Whilst this can just be set to a subdirectory of the main domain, it is now recommended to use a different subdomain.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
":frontends" = mkOption {
|
":frontends" = mkOption {
|
||||||
type = elixirValue;
|
type = elixirValue;
|
||||||
default = mapAttrs
|
default = mapAttrs
|
||||||
|
@ -781,6 +796,30 @@ in {
|
||||||
[{option}`config.services.akkoma.frontends`](#opt-services.akkoma.frontends).
|
[{option}`config.services.akkoma.frontends`](#opt-services.akkoma.frontends).
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
":media_proxy" = let
|
||||||
|
httpConf = cfg.config.":pleroma"."Pleroma.Web.Endpoint".url;
|
||||||
|
in {
|
||||||
|
enabled = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = mdDoc ''
|
||||||
|
Whether to enable proxying of remote media through the instance's proxy.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
base_url = mkOption {
|
||||||
|
type = types.nullOr types.nonEmptyStr;
|
||||||
|
default = if lib.versionOlder config.system.stateVersion "24.05"
|
||||||
|
then "${httpConf.scheme}://${httpConf.host}:${builtins.toString httpConf.port}/media/"
|
||||||
|
else null;
|
||||||
|
description = mdDoc ''
|
||||||
|
Base path for the media proxy.
|
||||||
|
Whilst this can just be set to a subdirectory of the main domain, it is now recommended to use a different subdomain.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
":web_push_encryption" = mkOption {
|
":web_push_encryption" = mkOption {
|
||||||
|
@ -904,6 +943,9 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
config = mkIf cfg.enable {
|
||||||
|
assertions = optionals (cfg.config.":pleroma".":media_proxy".enabled && cfg.config.":pleroma".":media_proxy".base_url == null) [''
|
||||||
|
`services.akkoma.config.":pleroma".":media_proxy".base_url` must be set when the media proxy is enabled.
|
||||||
|
''];
|
||||||
warnings = optionals (with config.security; (!sudo.enable) && (!sudo-rs.enable)) [''
|
warnings = optionals (with config.security; (!sudo.enable) && (!sudo-rs.enable)) [''
|
||||||
The pleroma_ctl wrapper enabled by the installWrapper option relies on
|
The pleroma_ctl wrapper enabled by the installWrapper option relies on
|
||||||
sudo, which appears to have been disabled through security.sudo.enable.
|
sudo, which appears to have been disabled through security.sudo.enable.
|
||||||
|
@ -1083,6 +1125,6 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
meta.maintainers = with maintainers; [ mvs ];
|
meta.maintainers = with maintainers; [ mvs tcmal ];
|
||||||
meta.doc = ./akkoma.md;
|
meta.doc = ./akkoma.md;
|
||||||
}
|
}
|
||||||
|
|
711
nixos/modules/services/web-apps/movim.nix
Normal file
711
nixos/modules/services/web-apps/movim.nix
Normal file
|
@ -0,0 +1,711 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib)
|
||||||
|
filterAttrsRecursive
|
||||||
|
generators
|
||||||
|
literalExpression
|
||||||
|
mkDefault
|
||||||
|
mkIf
|
||||||
|
mkOption
|
||||||
|
mkEnableOption
|
||||||
|
mkPackageOption
|
||||||
|
mkMerge
|
||||||
|
pipe
|
||||||
|
types
|
||||||
|
;
|
||||||
|
|
||||||
|
cfg = config.services.movim;
|
||||||
|
|
||||||
|
defaultPHPCfg = {
|
||||||
|
"output_buffering" = 0;
|
||||||
|
"error_reporting" = "E_ALL & ~E_DEPRECATED & ~E_STRICT";
|
||||||
|
"opcache.enable_cli" = 1;
|
||||||
|
"opcache.interned_strings_buffer" = 8;
|
||||||
|
"opcache.max_accelerated_files" = 6144;
|
||||||
|
"opcache.memory_consumption" = 128;
|
||||||
|
"opcache.revalidate_freq" = 2;
|
||||||
|
"opcache.fast_shutdown" = 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
phpCfg = generators.toKeyValue
|
||||||
|
{ mkKeyValue = generators.mkKeyValueDefault { } " = "; }
|
||||||
|
(defaultPHPCfg // cfg.phpCfg);
|
||||||
|
|
||||||
|
podConfigFlags =
|
||||||
|
let
|
||||||
|
bevalue = a: lib.escapeShellArg (generators.mkValueStringDefault { } a);
|
||||||
|
in
|
||||||
|
lib.concatStringsSep " "
|
||||||
|
(lib.attrsets.foldlAttrs
|
||||||
|
(acc: k: v: acc ++ lib.optional (v != null) "--${k}=${bevalue v}")
|
||||||
|
[ ]
|
||||||
|
cfg.podConfig);
|
||||||
|
|
||||||
|
package =
|
||||||
|
let
|
||||||
|
p = cfg.package.override
|
||||||
|
({
|
||||||
|
inherit phpCfg;
|
||||||
|
withPgsql = cfg.database.type == "pgsql";
|
||||||
|
withMysql = cfg.database.type == "mysql";
|
||||||
|
inherit (cfg) minifyStaticFiles;
|
||||||
|
} // lib.optionalAttrs (lib.isAttrs cfg.minifyStaticFiles) (with cfg.minifyStaticFiles; {
|
||||||
|
esbuild = esbuild.package;
|
||||||
|
lightningcss = lightningcss.package;
|
||||||
|
scour = scour.package;
|
||||||
|
}));
|
||||||
|
in
|
||||||
|
p.overrideAttrs (finalAttrs: prevAttrs:
|
||||||
|
let
|
||||||
|
appDir = "$out/share/php/${finalAttrs.pname}";
|
||||||
|
|
||||||
|
stateDirectories = ''
|
||||||
|
# Symlinking in our state directories
|
||||||
|
rm -rf $out/.env $out/cache ${appDir}/public/cache
|
||||||
|
ln -s ${cfg.dataDir}/.env ${appDir}/.env
|
||||||
|
ln -s ${cfg.dataDir}/public/cache ${appDir}/public/cache
|
||||||
|
ln -s ${cfg.logDir} ${appDir}/log
|
||||||
|
ln -s ${cfg.runtimeDir}/cache ${appDir}/cache
|
||||||
|
'';
|
||||||
|
|
||||||
|
exposeComposer = ''
|
||||||
|
# Expose PHP Composer for scripts
|
||||||
|
mkdir -p $out/bin
|
||||||
|
echo "#!${lib.getExe pkgs.dash}" > $out/bin/movim-composer
|
||||||
|
echo "${finalAttrs.php.packages.composer}/bin/composer --working-dir="${appDir}" \"\$@\"" >> $out/bin/movim-composer
|
||||||
|
chmod +x $out/bin/movim-composer
|
||||||
|
'';
|
||||||
|
|
||||||
|
podConfigInputDisableReplace = lib.optionalString (podConfigFlags != "")
|
||||||
|
(lib.concatStringsSep "\n"
|
||||||
|
(lib.attrsets.foldlAttrs
|
||||||
|
(acc: k: v:
|
||||||
|
acc ++ lib.optional (v != null)
|
||||||
|
# Disable all Admin panel options that were set in the
|
||||||
|
# `cfg.podConfig` to prevent confusing situtions where the
|
||||||
|
# values are rewritten on server reboot
|
||||||
|
''
|
||||||
|
substituteInPlace ${appDir}/app/widgets/AdminMain/adminmain.tpl \
|
||||||
|
--replace-warn 'name="${k}"' 'name="${k}" disabled'
|
||||||
|
'')
|
||||||
|
[ ]
|
||||||
|
cfg.podConfig));
|
||||||
|
|
||||||
|
precompressStaticFilesJobs =
|
||||||
|
let
|
||||||
|
inherit (cfg.precompressStaticFiles) brotli gzip;
|
||||||
|
|
||||||
|
findTextFileNames = lib.concatStringsSep " -o "
|
||||||
|
(builtins.map (n: ''-iname "*.${n}"'')
|
||||||
|
[ "css" "ini" "js" "json" "manifest" "mjs" "svg" "webmanifest" ]);
|
||||||
|
in
|
||||||
|
lib.concatStringsSep "\n" [
|
||||||
|
(lib.optionalString brotli.enable ''
|
||||||
|
echo -n "Precompressing static files with Brotli …"
|
||||||
|
find ${appDir}/public -type f ${findTextFileNames} \
|
||||||
|
| ${lib.getExe pkgs.parallel} ${lib.escapeShellArgs [
|
||||||
|
"--will-cite"
|
||||||
|
"-j $NIX_BUILD_CORES"
|
||||||
|
"${lib.getExe brotli.package} --keep --quality=${builtins.toString brotli.compressionLevel} --output={}.br {}"
|
||||||
|
]}
|
||||||
|
echo " done."
|
||||||
|
'')
|
||||||
|
(lib.optionalString gzip.enable ''
|
||||||
|
echo -n "Precompressing static files with Gzip …"
|
||||||
|
find ${appDir}/public -type f ${findTextFileNames} \
|
||||||
|
| ${lib.getExe pkgs.parallel} ${lib.escapeShellArgs [
|
||||||
|
"--will-cite"
|
||||||
|
"-j $NIX_BUILD_CORES"
|
||||||
|
"${lib.getExe gzip.package} -c -${builtins.toString gzip.compressionLevel} {} > {}.gz"
|
||||||
|
]}
|
||||||
|
echo " done."
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
postInstall = lib.concatStringsSep "\n\n" [
|
||||||
|
prevAttrs.postInstall
|
||||||
|
stateDirectories
|
||||||
|
exposeComposer
|
||||||
|
podConfigInputDisableReplace
|
||||||
|
precompressStaticFilesJobs
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
configFile = pipe cfg.settings [
|
||||||
|
(filterAttrsRecursive (_: v: v != null))
|
||||||
|
(generators.toKeyValue { })
|
||||||
|
(pkgs.writeText "movim-env")
|
||||||
|
];
|
||||||
|
|
||||||
|
pool = "movim";
|
||||||
|
fpm = config.services.phpfpm.pools.${pool};
|
||||||
|
phpExecutionUnit = "phpfpm-${pool}";
|
||||||
|
|
||||||
|
dbService = {
|
||||||
|
"postgresql" = "postgresql.service";
|
||||||
|
"mysql" = "mysql.service";
|
||||||
|
}.${cfg.database.type};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services = {
|
||||||
|
movim = {
|
||||||
|
enable = mkEnableOption "a Movim instance";
|
||||||
|
package = mkPackageOption pkgs "movim" { };
|
||||||
|
phpPackage = mkPackageOption pkgs "php" { };
|
||||||
|
|
||||||
|
phpCfg = mkOption {
|
||||||
|
type = with types; attrsOf (oneOf [ int str bool ]);
|
||||||
|
defaultText = literalExpression (generators.toPretty { } defaultPHPCfg);
|
||||||
|
default = { };
|
||||||
|
description = "Extra PHP INI options such as `memory_limit`, `max_execution_time`, etc.";
|
||||||
|
};
|
||||||
|
|
||||||
|
user = mkOption {
|
||||||
|
type = types.nonEmptyStr;
|
||||||
|
default = "movim";
|
||||||
|
description = "User running Movim service";
|
||||||
|
};
|
||||||
|
|
||||||
|
group = mkOption {
|
||||||
|
type = types.nonEmptyStr;
|
||||||
|
default = "movim";
|
||||||
|
description = "Group running Movim service";
|
||||||
|
};
|
||||||
|
|
||||||
|
dataDir = mkOption {
|
||||||
|
type = types.nonEmptyStr;
|
||||||
|
default = "/var/lib/movim";
|
||||||
|
description = "State directory of the `movim` user which holds the application’s state & data.";
|
||||||
|
};
|
||||||
|
|
||||||
|
logDir = mkOption {
|
||||||
|
type = types.nonEmptyStr;
|
||||||
|
default = "/var/log/movim";
|
||||||
|
description = "Log directory of the `movim` user which holds the application’s logs.";
|
||||||
|
};
|
||||||
|
|
||||||
|
runtimeDir = mkOption {
|
||||||
|
type = types.nonEmptyStr;
|
||||||
|
default = "/run/movim";
|
||||||
|
description = "Runtime directory of the `movim` user which holds the application’s caches & temporary files.";
|
||||||
|
};
|
||||||
|
|
||||||
|
domain = mkOption {
|
||||||
|
type = types.nonEmptyStr;
|
||||||
|
description = "Fully-qualified domain name (FQDN) for the Movim instance.";
|
||||||
|
};
|
||||||
|
|
||||||
|
port = mkOption {
|
||||||
|
type = types.port;
|
||||||
|
default = 8080;
|
||||||
|
description = "Movim daemon port.";
|
||||||
|
};
|
||||||
|
|
||||||
|
debug = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Debugging logs.";
|
||||||
|
};
|
||||||
|
|
||||||
|
verbose = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Verbose logs.";
|
||||||
|
};
|
||||||
|
|
||||||
|
minifyStaticFiles = mkOption {
|
||||||
|
type = with types; either bool (submodule {
|
||||||
|
options = {
|
||||||
|
script = mkOption {
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
enable = mkEnableOption "Script minification";
|
||||||
|
package = mkPackageOption pkgs "esbuild" { };
|
||||||
|
target = mkOption {
|
||||||
|
type = with types; nullOr nonEmptyStr;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
style = mkOption {
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
enable = mkEnableOption "Script minification";
|
||||||
|
package = mkPackageOption pkgs "lightningcss" { };
|
||||||
|
target = mkOption {
|
||||||
|
type = with types; nullOr nonEmptyStr;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
svg = mkOption {
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
enable = mkEnableOption "SVG minification";
|
||||||
|
package = mkPackageOption pkgs "scour" { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
});
|
||||||
|
default = true;
|
||||||
|
description = "Do minification on public static files";
|
||||||
|
};
|
||||||
|
|
||||||
|
precompressStaticFiles = mkOption {
|
||||||
|
type = with types; submodule {
|
||||||
|
options = {
|
||||||
|
brotli = {
|
||||||
|
enable = mkEnableOption "Brotli precompression";
|
||||||
|
package = mkPackageOption pkgs "brotli" { };
|
||||||
|
compressionLevel = mkOption {
|
||||||
|
type = types.ints.between 0 11;
|
||||||
|
default = 11;
|
||||||
|
description = "Brotli compression level";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
gzip = {
|
||||||
|
enable = mkEnableOption "Gzip precompression";
|
||||||
|
package = mkPackageOption pkgs "gzip" { };
|
||||||
|
compressionLevel = mkOption {
|
||||||
|
type = types.ints.between 1 9;
|
||||||
|
default = 9;
|
||||||
|
description = "Gzip compression level";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
default = {
|
||||||
|
brotli.enable = true;
|
||||||
|
gzip.enable = false;
|
||||||
|
};
|
||||||
|
description = "Aggressively precompress static files";
|
||||||
|
};
|
||||||
|
|
||||||
|
podConfig = mkOption {
|
||||||
|
type = types.submodule {
|
||||||
|
options = {
|
||||||
|
info = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = "Content of the info box on the login page";
|
||||||
|
};
|
||||||
|
|
||||||
|
description = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = "General description of the instance";
|
||||||
|
};
|
||||||
|
|
||||||
|
timezone = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = "The server timezone";
|
||||||
|
};
|
||||||
|
|
||||||
|
restrictsuggestions = mkOption {
|
||||||
|
type = with types; nullOr bool;
|
||||||
|
default = null;
|
||||||
|
description = "Only suggest chatrooms, Communities and other contents that are available on the user XMPP server and related services";
|
||||||
|
};
|
||||||
|
|
||||||
|
chatonly = mkOption {
|
||||||
|
type = with types; nullOr bool;
|
||||||
|
default = null;
|
||||||
|
description = "Disable all the social feature (Communities, Blog…) and keep only the chat ones";
|
||||||
|
};
|
||||||
|
|
||||||
|
disableregistration = mkOption {
|
||||||
|
type = with types; nullOr bool;
|
||||||
|
default = null;
|
||||||
|
description = "Remove the XMPP registration flow and buttons from the interface";
|
||||||
|
};
|
||||||
|
|
||||||
|
loglevel = mkOption {
|
||||||
|
type = with types; nullOr (ints.between 0 3);
|
||||||
|
default = null;
|
||||||
|
description = "The server loglevel";
|
||||||
|
};
|
||||||
|
|
||||||
|
locale = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = "The server main locale";
|
||||||
|
};
|
||||||
|
|
||||||
|
xmppdomain = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = "The default XMPP server domain";
|
||||||
|
};
|
||||||
|
|
||||||
|
xmppdescription = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = "The default XMPP server description";
|
||||||
|
};
|
||||||
|
|
||||||
|
xmppwhitelist = mkOption {
|
||||||
|
type = with types; nullOr str;
|
||||||
|
default = null;
|
||||||
|
description = "The allowlisted XMPP servers";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
Pod configuration (values from `php daemon.php config --help`).
|
||||||
|
Note that these values will now be disabled in the admin panel.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
type = with types; attrsOf (nullOr (oneOf [ int str bool ]));
|
||||||
|
default = { };
|
||||||
|
description = ".env settings for Movim. Secrets should use `secretFile` option instead. `null`s will be culled.";
|
||||||
|
};
|
||||||
|
|
||||||
|
secretFile = mkOption {
|
||||||
|
type = with types; nullOr path;
|
||||||
|
default = null;
|
||||||
|
description = "The secret file to be sourced for the .env settings.";
|
||||||
|
};
|
||||||
|
|
||||||
|
database = {
|
||||||
|
type = mkOption {
|
||||||
|
type = types.enum [ "mysql" "postgresql" ];
|
||||||
|
example = "mysql";
|
||||||
|
default = "postgresql";
|
||||||
|
description = "Database engine to use.";
|
||||||
|
};
|
||||||
|
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "movim";
|
||||||
|
description = "Database name.";
|
||||||
|
};
|
||||||
|
|
||||||
|
user = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "movim";
|
||||||
|
description = "Database username.";
|
||||||
|
};
|
||||||
|
|
||||||
|
createLocally = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = "local database using UNIX socket authentication";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nginx = mkOption {
|
||||||
|
type = with types; nullOr (submodule
|
||||||
|
(import ../web-servers/nginx/vhost-options.nix {
|
||||||
|
inherit config lib;
|
||||||
|
}));
|
||||||
|
default = null;
|
||||||
|
example = lib.literalExpression /* nginx */ ''
|
||||||
|
{
|
||||||
|
serverAliases = [
|
||||||
|
"pics.''${config.networking.domain}"
|
||||||
|
];
|
||||||
|
enableACME = true;
|
||||||
|
forceHttps = true;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
description = ''
|
||||||
|
With this option, you can customize an nginx virtual host which already has sensible defaults for Movim.
|
||||||
|
Set to `{ }` if you do not need any customization to the virtual host.
|
||||||
|
If enabled, then by default, the {option}`serverName` is `''${domain}`,
|
||||||
|
If this is set to null (the default), no nginx virtualHost will be configured.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
poolConfig = mkOption {
|
||||||
|
type = with types; attrsOf (oneOf [ int str bool ]);
|
||||||
|
default = { };
|
||||||
|
description = "Options for Movim’s PHP-FPM pool.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
environment.systemPackages = [ cfg.package ];
|
||||||
|
|
||||||
|
users = {
|
||||||
|
users = {
|
||||||
|
movim = mkIf (cfg.user == "movim") {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = cfg.group;
|
||||||
|
};
|
||||||
|
"${config.services.nginx.user}".extraGroups = [ cfg.group ];
|
||||||
|
};
|
||||||
|
groups = {
|
||||||
|
${cfg.group} = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
movim = {
|
||||||
|
settings = mkMerge [
|
||||||
|
{
|
||||||
|
DAEMON_URL = "//${cfg.domain}";
|
||||||
|
DAEMON_PORT = cfg.port;
|
||||||
|
DAEMON_INTERFACE = "127.0.0.1";
|
||||||
|
DAEMON_DEBUG = cfg.debug;
|
||||||
|
DAEMON_VERBOSE = cfg.verbose;
|
||||||
|
}
|
||||||
|
(mkIf cfg.database.createLocally {
|
||||||
|
DB_DRIVER = {
|
||||||
|
"postgresql" = "pgsql";
|
||||||
|
"mysql" = "mysql";
|
||||||
|
}.${cfg.database.type};
|
||||||
|
DB_HOST = "localhost";
|
||||||
|
DB_PORT = config.services.${cfg.database.type}.settings.port;
|
||||||
|
DB_DATABASE = cfg.database.name;
|
||||||
|
DB_USERNAME = cfg.database.user;
|
||||||
|
DB_PASSWORD = "";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
poolConfig = lib.mapAttrs' (n: v: lib.nameValuePair n (lib.mkDefault v)) {
|
||||||
|
"pm" = "dynamic";
|
||||||
|
"php_admin_value[error_log]" = "stderr";
|
||||||
|
"php_admin_flag[log_errors]" = true;
|
||||||
|
"catch_workers_output" = true;
|
||||||
|
"pm.max_children" = 32;
|
||||||
|
"pm.start_servers" = 2;
|
||||||
|
"pm.min_spare_servers" = 2;
|
||||||
|
"pm.max_spare_servers" = 8;
|
||||||
|
"pm.max_requests" = 500;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nginx = mkIf (cfg.nginx != null) {
|
||||||
|
enable = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
recommendedGzipSettings = true;
|
||||||
|
recommendedBrotliSettings = true;
|
||||||
|
recommendedProxySettings = true;
|
||||||
|
# TODO: recommended cache options already in Nginx⁇
|
||||||
|
appendHttpConfig = /* nginx */ ''
|
||||||
|
fastcgi_cache_path /tmp/nginx_cache levels=1:2 keys_zone=nginx_cache:100m inactive=60m;
|
||||||
|
fastcgi_cache_key "$scheme$request_method$host$request_uri";
|
||||||
|
'';
|
||||||
|
virtualHosts."${cfg.domain}" = mkMerge [
|
||||||
|
cfg.nginx
|
||||||
|
{
|
||||||
|
root = lib.mkForce "${package}/share/php/movim/public";
|
||||||
|
locations = {
|
||||||
|
"/favicon.ico" = {
|
||||||
|
priority = 100;
|
||||||
|
extraConfig = /* nginx */ ''
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"/robots.txt" = {
|
||||||
|
priority = 100;
|
||||||
|
extraConfig = /* nginx */ ''
|
||||||
|
access_log off;
|
||||||
|
log_not_found off;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"~ /\\.(?!well-known).*" = {
|
||||||
|
priority = 210;
|
||||||
|
extraConfig = /* nginx */ ''
|
||||||
|
deny all;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
# Ask nginx to cache every URL starting with "/picture"
|
||||||
|
"/picture" = {
|
||||||
|
priority = 400;
|
||||||
|
tryFiles = "$uri $uri/ /index.php$is_args$args";
|
||||||
|
extraConfig = /* nginx */ ''
|
||||||
|
set $no_cache 0; # Enable cache only there
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"/" = {
|
||||||
|
priority = 490;
|
||||||
|
tryFiles = "$uri $uri/ /index.php$is_args$args";
|
||||||
|
extraConfig = /* nginx */ ''
|
||||||
|
# https://github.com/movim/movim/issues/314
|
||||||
|
add_header Content-Security-Policy "default-src 'self'; img-src 'self' aesgcm: https:; media-src 'self' aesgcm: https:; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-inline';";
|
||||||
|
set $no_cache 1;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"~ \\.php$" = {
|
||||||
|
priority = 500;
|
||||||
|
tryFiles = "$uri =404";
|
||||||
|
extraConfig = /* nginx */ ''
|
||||||
|
include ${config.services.nginx.package}/conf/fastcgi.conf;
|
||||||
|
add_header X-Cache $upstream_cache_status;
|
||||||
|
fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
|
||||||
|
fastcgi_cache nginx_cache;
|
||||||
|
fastcgi_cache_valid any 7d;
|
||||||
|
fastcgi_cache_bypass $no_cache;
|
||||||
|
fastcgi_no_cache $no_cache;
|
||||||
|
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||||
|
fastcgi_index index.php;
|
||||||
|
fastcgi_pass unix:${fpm.socket};
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"/ws/" = {
|
||||||
|
priority = 900;
|
||||||
|
proxyPass = "http://${cfg.settings.DAEMON_INTERFACE}:${builtins.toString cfg.port}/";
|
||||||
|
proxyWebsockets = true;
|
||||||
|
recommendedProxySettings = true;
|
||||||
|
extraConfig = /* nginx */ ''
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_redirect off;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extraConfig = /* ngnix */ ''
|
||||||
|
index index.php;
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
mysql = mkIf (cfg.database.createLocally && cfg.database.type == "mysql") {
|
||||||
|
enable = mkDefault true;
|
||||||
|
package = mkDefault pkgs.mariadb;
|
||||||
|
ensureDatabases = [ cfg.database.name ];
|
||||||
|
ensureUsers = [{
|
||||||
|
name = cfg.user;
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
|
||||||
|
postgresql = mkIf (cfg.database.createLocally && cfg.database.type == "postgresql") {
|
||||||
|
enable = mkDefault true;
|
||||||
|
ensureDatabases = [ cfg.database.name ];
|
||||||
|
ensureUsers = [{
|
||||||
|
name = cfg.user;
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
}];
|
||||||
|
authentication = ''
|
||||||
|
host ${cfg.database.name} ${cfg.database.user} localhost trust
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
phpfpm.pools.${pool} =
|
||||||
|
let
|
||||||
|
socketOwner =
|
||||||
|
if (cfg.nginx != null)
|
||||||
|
then config.services.nginx.user
|
||||||
|
else cfg.user;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
phpPackage = package.php;
|
||||||
|
user = cfg.user;
|
||||||
|
group = cfg.group;
|
||||||
|
|
||||||
|
phpOptions = ''
|
||||||
|
error_log = 'stderr'
|
||||||
|
log_errors = on
|
||||||
|
'';
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
"listen.owner" = socketOwner;
|
||||||
|
"listen.group" = cfg.group;
|
||||||
|
"listen.mode" = "0660";
|
||||||
|
"catch_workers_output" = true;
|
||||||
|
} // cfg.poolConfig;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd = {
|
||||||
|
services.movim-data-setup = {
|
||||||
|
description = "Movim setup: .env file, databases init, cache reload";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
requiredBy = [ "${phpExecutionUnit}.service" ];
|
||||||
|
before = [ "${phpExecutionUnit}.service" ];
|
||||||
|
after = lib.optional cfg.database.createLocally dbService;
|
||||||
|
requires = lib.optional cfg.database.createLocally dbService;
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
UMask = "077";
|
||||||
|
} // lib.optionalAttrs (cfg.secretFile != null) {
|
||||||
|
LoadCredential = "env-secrets:${cfg.secretFile}";
|
||||||
|
};
|
||||||
|
|
||||||
|
script = ''
|
||||||
|
# Env vars
|
||||||
|
rm -f ${cfg.dataDir}/.env
|
||||||
|
cp --no-preserve=all ${configFile} ${cfg.dataDir}/.env
|
||||||
|
echo -e '\n' >> ${cfg.dataDir}/.env
|
||||||
|
if [[ -f "$CREDENTIALS_DIRECTORY/env-secrets" ]]; then
|
||||||
|
cat "$CREDENTIALS_DIRECTORY/env-secrets" >> ${cfg.dataDir}/.env
|
||||||
|
echo -e '\n' >> ${cfg.dataDir}/.env
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Caches, logs
|
||||||
|
mkdir -p ${cfg.dataDir}/public/cache ${cfg.logDir} ${cfg.runtimeDir}/cache
|
||||||
|
chmod -R ug+rw ${cfg.dataDir}/public/cache
|
||||||
|
chmod -R ug+rw ${cfg.logDir}
|
||||||
|
chmod -R ug+rwx ${cfg.runtimeDir}/cache
|
||||||
|
|
||||||
|
# Migrations
|
||||||
|
MOVIM_VERSION="${package.version}"
|
||||||
|
if [[ ! -f "${cfg.dataDir}/.migration-version" ]] || [[ "$MOVIM_VERSION" != "$(<${cfg.dataDir}/.migration-version)" ]]; then
|
||||||
|
${package}/bin/movim-composer movim:migrate && echo $MOVIM_VERSION > ${cfg.dataDir}/.migration-version
|
||||||
|
fi
|
||||||
|
''
|
||||||
|
+ lib.optionalString (podConfigFlags != "") (
|
||||||
|
let
|
||||||
|
flags = lib.concatStringsSep " "
|
||||||
|
([ "--no-interaction" ]
|
||||||
|
++ lib.optional cfg.debug "-vvv"
|
||||||
|
++ lib.optional (!cfg.debug && cfg.verbose) "-v");
|
||||||
|
in
|
||||||
|
''
|
||||||
|
${lib.getExe package} config ${podConfigFlags}
|
||||||
|
''
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
services.movim = {
|
||||||
|
description = "Movim daemon";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
after = [ "movim-data-setup.service" ];
|
||||||
|
requires = [ "movim-data-setup.service" ]
|
||||||
|
++ lib.optional cfg.database.createLocally dbService;
|
||||||
|
environment = {
|
||||||
|
PUBLIC_URL = "//${cfg.domain}";
|
||||||
|
WS_PORT = builtins.toString cfg.port;
|
||||||
|
};
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
User = cfg.user;
|
||||||
|
Group = cfg.group;
|
||||||
|
WorkingDirectory = "${package}/share/php/movim";
|
||||||
|
ExecStart = "${lib.getExe package} start";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.${phpExecutionUnit} = {
|
||||||
|
after = [ "movim-data-setup.service" ];
|
||||||
|
requires = [ "movim-data-setup.service" ]
|
||||||
|
++ lib.optional cfg.database.createLocally dbService;
|
||||||
|
};
|
||||||
|
|
||||||
|
tmpfiles.settings."10-movim" = with cfg; {
|
||||||
|
"${dataDir}".d = { inherit user group; mode = "0710"; };
|
||||||
|
"${dataDir}/public".d = { inherit user group; mode = "0750"; };
|
||||||
|
"${dataDir}/public/cache".d = { inherit user group; mode = "0750"; };
|
||||||
|
"${runtimeDir}".d = { inherit user group; mode = "0700"; };
|
||||||
|
"${runtimeDir}/cache".d = { inherit user group; mode = "0700"; };
|
||||||
|
"${logDir}".d = { inherit user group; mode = "0700"; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -43,6 +43,8 @@ let
|
||||||
budgie-control-center = pkgs.budgie.budgie-control-center.override {
|
budgie-control-center = pkgs.budgie.budgie-control-center.override {
|
||||||
enableSshSocket = config.services.openssh.startWhenNeeded;
|
enableSshSocket = config.services.openssh.startWhenNeeded;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
notExcluded = pkg: (!(lib.elem pkg config.environment.budgie.excludePackages));
|
||||||
in {
|
in {
|
||||||
meta.maintainers = lib.teams.budgie.members;
|
meta.maintainers = lib.teams.budgie.members;
|
||||||
|
|
||||||
|
@ -160,7 +162,7 @@ in {
|
||||||
++ cfg.sessionPath;
|
++ cfg.sessionPath;
|
||||||
|
|
||||||
# Both budgie-desktop-view and nemo defaults to this emulator.
|
# Both budgie-desktop-view and nemo defaults to this emulator.
|
||||||
programs.gnome-terminal.enable = mkDefault true;
|
programs.gnome-terminal.enable = mkDefault (notExcluded pkgs.gnome.gnome-terminal);
|
||||||
|
|
||||||
# Fonts.
|
# Fonts.
|
||||||
fonts.packages = [
|
fonts.packages = [
|
||||||
|
|
|
@ -95,7 +95,7 @@ in
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# Default services
|
# Default services
|
||||||
services.blueman.enable = mkDefault true;
|
services.blueman.enable = mkDefault (notExcluded pkgs.blueman);
|
||||||
hardware.bluetooth.enable = mkDefault true;
|
hardware.bluetooth.enable = mkDefault true;
|
||||||
hardware.pulseaudio.enable = mkDefault true;
|
hardware.pulseaudio.enable = mkDefault true;
|
||||||
security.polkit.enable = true;
|
security.polkit.enable = true;
|
||||||
|
@ -228,10 +228,10 @@ in
|
||||||
})
|
})
|
||||||
|
|
||||||
(mkIf serviceCfg.apps.enable {
|
(mkIf serviceCfg.apps.enable {
|
||||||
programs.geary.enable = mkDefault true;
|
programs.geary.enable = mkDefault (notExcluded pkgs.gnome.geary);
|
||||||
programs.gnome-disks.enable = mkDefault true;
|
programs.gnome-disks.enable = mkDefault (notExcluded pkgs.gnome.gnome-disk-utility);
|
||||||
programs.gnome-terminal.enable = mkDefault true;
|
programs.gnome-terminal.enable = mkDefault (notExcluded pkgs.gnome.gnome-terminal);
|
||||||
programs.file-roller.enable = mkDefault true;
|
programs.file-roller.enable = mkDefault (notExcluded pkgs.gnome.file-roller);
|
||||||
|
|
||||||
environment.systemPackages = with pkgs // pkgs.gnome // pkgs.cinnamon; utils.removePackagesByName [
|
environment.systemPackages = with pkgs // pkgs.gnome // pkgs.cinnamon; utils.removePackagesByName [
|
||||||
# cinnamon team apps
|
# cinnamon team apps
|
||||||
|
|
|
@ -12,6 +12,7 @@ let
|
||||||
extraGSettingsOverrides = cfg.extraGSettingsOverrides;
|
extraGSettingsOverrides = cfg.extraGSettingsOverrides;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
notExcluded = pkg: (!(lib.elem pkg config.environment.pantheon.excludePackages));
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -288,8 +289,8 @@ in
|
||||||
})
|
})
|
||||||
|
|
||||||
(mkIf serviceCfg.apps.enable {
|
(mkIf serviceCfg.apps.enable {
|
||||||
programs.evince.enable = mkDefault true;
|
programs.evince.enable = mkDefault (notExcluded pkgs.gnome.evince);
|
||||||
programs.file-roller.enable = mkDefault true;
|
programs.file-roller.enable = mkDefault (notExcluded pkgs.gnome.file-roller);
|
||||||
|
|
||||||
environment.systemPackages = utils.removePackagesByName ([
|
environment.systemPackages = utils.removePackagesByName ([
|
||||||
pkgs.gnome.gnome-font-viewer
|
pkgs.gnome.gnome-font-viewer
|
||||||
|
|
|
@ -31,7 +31,7 @@ with lib;
|
||||||
hostName = config.networking.hostName;
|
hostName = config.networking.hostName;
|
||||||
doMetadataFile = "/run/do-metadata/v1.json";
|
doMetadataFile = "/run/do-metadata/v1.json";
|
||||||
in mkMerge [{
|
in mkMerge [{
|
||||||
fileSystems."/" = {
|
fileSystems."/" = lib.mkDefault {
|
||||||
device = "/dev/disk/by-label/nixos";
|
device = "/dev/disk/by-label/nixos";
|
||||||
autoResize = true;
|
autoResize = true;
|
||||||
fsType = "ext4";
|
fsType = "ext4";
|
||||||
|
@ -41,11 +41,7 @@ with lib;
|
||||||
kernelParams = [ "console=ttyS0" "panic=1" "boot.panic_on_fail" ];
|
kernelParams = [ "console=ttyS0" "panic=1" "boot.panic_on_fail" ];
|
||||||
initrd.kernelModules = [ "virtio_scsi" ];
|
initrd.kernelModules = [ "virtio_scsi" ];
|
||||||
kernelModules = [ "virtio_pci" "virtio_net" ];
|
kernelModules = [ "virtio_pci" "virtio_net" ];
|
||||||
loader = {
|
loader.grub.devices = lib.mkDefault ["/dev/vda"];
|
||||||
grub.device = "/dev/vda";
|
|
||||||
timeout = 0;
|
|
||||||
grub.configurationLimit = 0;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
services.openssh = {
|
services.openssh = {
|
||||||
enable = mkDefault true;
|
enable = mkDefault true;
|
||||||
|
|
|
@ -36,7 +36,8 @@ let
|
||||||
${pkgs.toot}/bin/toot timeline -1 | grep -F -q "hello world Jamy here"
|
${pkgs.toot}/bin/toot timeline -1 | grep -F -q "hello world Jamy here"
|
||||||
|
|
||||||
# Test file upload
|
# Test file upload
|
||||||
${pkgs.toot}/bin/toot upload <(dd if=/dev/zero bs=1024 count=1024 status=none)
|
echo "y" | ${pkgs.toot}/bin/toot upload <(dd if=/dev/zero bs=1024 count=1024 status=none) \
|
||||||
|
| grep -F -q "https://akkoma.nixos.test:443/media"
|
||||||
'';
|
'';
|
||||||
|
|
||||||
checkFe = pkgs.writers.writeBashBin "checkFe" ''
|
checkFe = pkgs.writers.writeBashBin "checkFe" ''
|
||||||
|
@ -90,6 +91,9 @@ in
|
||||||
"Pleroma.Web.Endpoint" = {
|
"Pleroma.Web.Endpoint" = {
|
||||||
url.host = "akkoma.nixos.test";
|
url.host = "akkoma.nixos.test";
|
||||||
};
|
};
|
||||||
|
"Pleroma.Upload" = {
|
||||||
|
base_url = "https://akkoma.nixos.test:443/media/";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -558,6 +558,7 @@ in {
|
||||||
morty = handleTest ./morty.nix {};
|
morty = handleTest ./morty.nix {};
|
||||||
mosquitto = handleTest ./mosquitto.nix {};
|
mosquitto = handleTest ./mosquitto.nix {};
|
||||||
moosefs = handleTest ./moosefs.nix {};
|
moosefs = handleTest ./moosefs.nix {};
|
||||||
|
movim = discoverTests (import ./web-apps/movim { inherit handleTestOn; });
|
||||||
mpd = handleTest ./mpd.nix {};
|
mpd = handleTest ./mpd.nix {};
|
||||||
mpv = handleTest ./mpv.nix {};
|
mpv = handleTest ./mpv.nix {};
|
||||||
mtp = handleTest ./mtp.nix {};
|
mtp = handleTest ./mtp.nix {};
|
||||||
|
@ -592,8 +593,8 @@ in {
|
||||||
nimdow = handleTest ./nimdow.nix {};
|
nimdow = handleTest ./nimdow.nix {};
|
||||||
neo4j = handleTest ./neo4j.nix {};
|
neo4j = handleTest ./neo4j.nix {};
|
||||||
netdata = handleTest ./netdata.nix {};
|
netdata = handleTest ./netdata.nix {};
|
||||||
networking.networkd = handleTest ./networking.nix { networkd = true; };
|
networking.scripted = handleTest ./networking/networkd-and-scripted.nix { networkd = false; };
|
||||||
networking.scripted = handleTest ./networking.nix { networkd = false; };
|
networking.networkd = handleTest ./networking/networkd-and-scripted.nix { networkd = true; };
|
||||||
netbox_3_6 = handleTest ./web-apps/netbox.nix { netbox = pkgs.netbox_3_6; };
|
netbox_3_6 = handleTest ./web-apps/netbox.nix { netbox = pkgs.netbox_3_6; };
|
||||||
netbox_3_7 = handleTest ./web-apps/netbox.nix { netbox = pkgs.netbox_3_7; };
|
netbox_3_7 = handleTest ./web-apps/netbox.nix { netbox = pkgs.netbox_3_7; };
|
||||||
netbox-upgrade = handleTest ./web-apps/netbox-upgrade.nix {};
|
netbox-upgrade = handleTest ./web-apps/netbox-upgrade.nix {};
|
||||||
|
@ -777,6 +778,7 @@ in {
|
||||||
redis = handleTest ./redis.nix {};
|
redis = handleTest ./redis.nix {};
|
||||||
redmine = handleTest ./redmine.nix {};
|
redmine = handleTest ./redmine.nix {};
|
||||||
restartByActivationScript = handleTest ./restart-by-activation-script.nix {};
|
restartByActivationScript = handleTest ./restart-by-activation-script.nix {};
|
||||||
|
restic-rest-server = handleTest ./restic-rest-server.nix {};
|
||||||
restic = handleTest ./restic.nix {};
|
restic = handleTest ./restic.nix {};
|
||||||
retroarch = handleTest ./retroarch.nix {};
|
retroarch = handleTest ./retroarch.nix {};
|
||||||
rkvm = handleTest ./rkvm {};
|
rkvm = handleTest ./rkvm {};
|
||||||
|
|
|
@ -18,6 +18,10 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# We don't ship gnome-text-editor in Budgie module, we add this line mainly
|
||||||
|
# to catch eval issues related to this option.
|
||||||
|
environment.budgie.excludePackages = [ pkgs.gnome-text-editor ];
|
||||||
|
|
||||||
services.xserver.desktopManager.budgie = {
|
services.xserver.desktopManager.budgie = {
|
||||||
enable = true;
|
enable = true;
|
||||||
extraPlugins = [
|
extraPlugins = [
|
||||||
|
|
|
@ -8,6 +8,10 @@ import ./make-test-python.nix ({ pkgs, lib, ... }: {
|
||||||
services.xserver.enable = true;
|
services.xserver.enable = true;
|
||||||
services.xserver.desktopManager.cinnamon.enable = true;
|
services.xserver.desktopManager.cinnamon.enable = true;
|
||||||
|
|
||||||
|
# We don't ship gnome-text-editor in Cinnamon module, we add this line mainly
|
||||||
|
# to catch eval issues related to this option.
|
||||||
|
environment.cinnamon.excludePackages = [ pkgs.gnome-text-editor ];
|
||||||
|
|
||||||
# For the sessionPath subtest.
|
# For the sessionPath subtest.
|
||||||
services.xserver.desktopManager.cinnamon.sessionPath = [ pkgs.gnome.gpaste ];
|
services.xserver.desktopManager.cinnamon.sessionPath = [ pkgs.gnome.gpaste ];
|
||||||
};
|
};
|
||||||
|
|
|
@ -31,11 +31,11 @@ import ./make-test-python.nix (
|
||||||
}
|
}
|
||||||
|
|
||||||
on drbd1 {
|
on drbd1 {
|
||||||
address ${nodes.drbd1.config.networking.primaryIPAddress}:${toString drbdPort};
|
address ${nodes.drbd1.networking.primaryIPAddress}:${toString drbdPort};
|
||||||
}
|
}
|
||||||
|
|
||||||
on drbd2 {
|
on drbd2 {
|
||||||
address ${nodes.drbd2.config.networking.primaryIPAddress}:${toString drbdPort};
|
address ${nodes.drbd2.networking.primaryIPAddress}:${toString drbdPort};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
'';
|
'';
|
||||||
|
@ -45,7 +45,7 @@ import ./make-test-python.nix (
|
||||||
{
|
{
|
||||||
name = "drbd";
|
name = "drbd";
|
||||||
meta = with pkgs.lib.maintainers; {
|
meta = with pkgs.lib.maintainers; {
|
||||||
maintainers = [ ryantm astro ];
|
maintainers = [ ryantm astro birkb ];
|
||||||
};
|
};
|
||||||
|
|
||||||
nodes.drbd1 = drbdConfig;
|
nodes.drbd1 = drbdConfig;
|
||||||
|
|
|
@ -33,7 +33,6 @@ import ./make-test-python.nix ({ pkgs, ... }:
|
||||||
nodes = {
|
nodes = {
|
||||||
node = {...}: {
|
node = {...}: {
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
mongodb-4_4
|
|
||||||
mongodb-5_0
|
mongodb-5_0
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
@ -42,7 +41,6 @@ import ./make-test-python.nix ({ pkgs, ... }:
|
||||||
testScript = ''
|
testScript = ''
|
||||||
node.start()
|
node.start()
|
||||||
''
|
''
|
||||||
+ runMongoDBTest pkgs.mongodb-4_4
|
|
||||||
+ runMongoDBTest pkgs.mongodb-5_0
|
+ runMongoDBTest pkgs.mongodb-5_0
|
||||||
+ ''
|
+ ''
|
||||||
node.shutdown()
|
node.shutdown()
|
||||||
|
|
|
@ -4,98 +4,19 @@
|
||||||
# bool: whether to use networkd in the tests
|
# bool: whether to use networkd in the tests
|
||||||
, networkd }:
|
, networkd }:
|
||||||
|
|
||||||
with import ../lib/testing-python.nix { inherit system pkgs; };
|
with import ../../lib/testing-python.nix { inherit system pkgs; };
|
||||||
with pkgs.lib;
|
|
||||||
|
|
||||||
let
|
let
|
||||||
qemu-common = import ../lib/qemu-common.nix { inherit (pkgs) lib pkgs; };
|
lib = pkgs.lib;
|
||||||
|
router = import ./router.nix { inherit networkd; };
|
||||||
router = { config, pkgs, lib, ... }:
|
clientConfig = extraConfig: lib.recursiveUpdate {
|
||||||
with pkgs.lib;
|
networking.useDHCP = false;
|
||||||
let
|
networking.useNetworkd = networkd;
|
||||||
vlanIfs = range 1 (length config.virtualisation.vlans);
|
} extraConfig;
|
||||||
in {
|
|
||||||
environment.systemPackages = [ pkgs.iptables ]; # to debug firewall rules
|
|
||||||
virtualisation.vlans = [ 1 2 3 ];
|
|
||||||
boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = true;
|
|
||||||
networking = {
|
|
||||||
useDHCP = false;
|
|
||||||
useNetworkd = networkd;
|
|
||||||
firewall.checkReversePath = true;
|
|
||||||
firewall.allowedUDPPorts = [ 547 ];
|
|
||||||
interfaces = mkOverride 0 (listToAttrs (forEach vlanIfs (n:
|
|
||||||
nameValuePair "eth${toString n}" {
|
|
||||||
ipv4.addresses = [ { address = "192.168.${toString n}.1"; prefixLength = 24; } ];
|
|
||||||
ipv6.addresses = [ { address = "fd00:1234:5678:${toString n}::1"; prefixLength = 64; } ];
|
|
||||||
})));
|
|
||||||
};
|
|
||||||
services.kea = {
|
|
||||||
dhcp4 = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
interfaces-config = {
|
|
||||||
interfaces = map (n: "eth${toString n}") vlanIfs;
|
|
||||||
dhcp-socket-type = "raw";
|
|
||||||
service-sockets-require-all = true;
|
|
||||||
service-sockets-max-retries = 5;
|
|
||||||
service-sockets-retry-wait-time = 2500;
|
|
||||||
};
|
|
||||||
subnet4 = map (n: {
|
|
||||||
id = n;
|
|
||||||
subnet = "192.168.${toString n}.0/24";
|
|
||||||
pools = [{ pool = "192.168.${toString n}.3 - 192.168.${toString n}.254"; }];
|
|
||||||
option-data = [{ name = "routers"; data = "192.168.${toString n}.1"; }];
|
|
||||||
|
|
||||||
reservations = [{
|
|
||||||
hw-address = qemu-common.qemuNicMac n 1;
|
|
||||||
hostname = "client${toString n}";
|
|
||||||
ip-address = "192.168.${toString n}.2";
|
|
||||||
}];
|
|
||||||
}) vlanIfs;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
dhcp6 = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
interfaces-config = {
|
|
||||||
interfaces = map (n: "eth${toString n}") vlanIfs;
|
|
||||||
service-sockets-require-all = true;
|
|
||||||
service-sockets-max-retries = 5;
|
|
||||||
service-sockets-retry-wait-time = 2500;
|
|
||||||
};
|
|
||||||
|
|
||||||
subnet6 = map (n: {
|
|
||||||
id = n;
|
|
||||||
subnet = "fd00:1234:5678:${toString n}::/64";
|
|
||||||
interface = "eth${toString n}";
|
|
||||||
pools = [{ pool = "fd00:1234:5678:${toString n}::2-fd00:1234:5678:${toString n}::2"; }];
|
|
||||||
}) vlanIfs;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
services.radvd = {
|
|
||||||
enable = true;
|
|
||||||
config = flip concatMapStrings vlanIfs (n: ''
|
|
||||||
interface eth${toString n} {
|
|
||||||
AdvSendAdvert on;
|
|
||||||
AdvManagedFlag on;
|
|
||||||
AdvOtherConfigFlag on;
|
|
||||||
|
|
||||||
prefix fd00:1234:5678:${toString n}::/64 {
|
|
||||||
AdvAutonomous off;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
'');
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
testCases = {
|
testCases = {
|
||||||
loopback = {
|
loopback = {
|
||||||
name = "Loopback";
|
name = "Loopback";
|
||||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
nodes.client = clientConfig {};
|
||||||
networking.useDHCP = false;
|
|
||||||
networking.useNetworkd = networkd;
|
|
||||||
};
|
|
||||||
testScript = ''
|
testScript = ''
|
||||||
start_all()
|
start_all()
|
||||||
client.wait_for_unit("network.target")
|
client.wait_for_unit("network.target")
|
||||||
|
@ -107,12 +28,10 @@ let
|
||||||
static = {
|
static = {
|
||||||
name = "Static";
|
name = "Static";
|
||||||
nodes.router = router;
|
nodes.router = router;
|
||||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
nodes.client = clientConfig {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
virtualisation.interfaces.enp2s0.vlan = 2;
|
virtualisation.interfaces.enp2s0.vlan = 2;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
|
||||||
useDHCP = false;
|
|
||||||
defaultGateway = { address = "192.168.1.1"; interface = "enp1s0"; };
|
defaultGateway = { address = "192.168.1.1"; interface = "enp1s0"; };
|
||||||
defaultGateway6 = { address = "fd00:1234:5678:1::1"; interface = "enp1s0"; };
|
defaultGateway6 = { address = "fd00:1234:5678:1::1"; interface = "enp1s0"; };
|
||||||
interfaces.enp1s0.ipv4.addresses = [
|
interfaces.enp1s0.ipv4.addresses = [
|
||||||
|
@ -125,8 +44,7 @@ let
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
client.wait_for_unit("network.target")
|
client.wait_for_unit("network.target")
|
||||||
|
@ -139,35 +57,23 @@ let
|
||||||
|
|
||||||
with subtest("Test vlan 1"):
|
with subtest("Test vlan 1"):
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.1.1")
|
client.wait_until_succeeds("ping -c 1 192.168.1.1")
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.1.2")
|
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.1.3")
|
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.1.10")
|
|
||||||
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.1.1")
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.1.2")
|
router.wait_until_succeeds("ping -c 1 192.168.1.2")
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.1.3")
|
router.wait_until_succeeds("ping -c 1 192.168.1.3")
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.1.10")
|
router.wait_until_succeeds("ping -c 1 192.168.1.10")
|
||||||
|
|
||||||
with subtest("Test vlan 2"):
|
with subtest("Test vlan 2"):
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.2.1")
|
client.wait_until_succeeds("ping -c 1 192.168.2.1")
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.2.2")
|
|
||||||
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.2.1")
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.2.2")
|
router.wait_until_succeeds("ping -c 1 192.168.2.2")
|
||||||
|
|
||||||
with subtest("Test default gateway"):
|
with subtest("Test default gateway"):
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.3.1")
|
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.3.1")
|
client.wait_until_succeeds("ping -c 1 192.168.3.1")
|
||||||
router.wait_until_succeeds("ping -c 1 fd00:1234:5678:3::1")
|
|
||||||
client.wait_until_succeeds("ping -c 1 fd00:1234:5678:3::1")
|
client.wait_until_succeeds("ping -c 1 fd00:1234:5678:3::1")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
routeType = {
|
routeType = {
|
||||||
name = "RouteType";
|
name = "RouteType";
|
||||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
nodes.client = clientConfig {
|
||||||
networking = {
|
networking = {
|
||||||
useDHCP = false;
|
|
||||||
useNetworkd = networkd;
|
|
||||||
interfaces.eth1.ipv4.routes = [{
|
interfaces.eth1.ipv4.routes = [{
|
||||||
address = "192.168.1.127";
|
address = "192.168.1.127";
|
||||||
prefixLength = 32;
|
prefixLength = 32;
|
||||||
|
@ -184,7 +90,7 @@ let
|
||||||
dhcpDefault = {
|
dhcpDefault = {
|
||||||
name = "useDHCP-by-default";
|
name = "useDHCP-by-default";
|
||||||
nodes.router = router;
|
nodes.router = router;
|
||||||
nodes.client = { lib, ... }: {
|
nodes.client = {
|
||||||
# Disable test driver default config
|
# Disable test driver default config
|
||||||
networking.interfaces = lib.mkForce {
|
networking.interfaces = lib.mkForce {
|
||||||
# Make sure DHCP defaults correctly even when some unrelated config
|
# Make sure DHCP defaults correctly even when some unrelated config
|
||||||
|
@ -198,28 +104,22 @@ let
|
||||||
start_all()
|
start_all()
|
||||||
client.wait_for_unit("multi-user.target")
|
client.wait_for_unit("multi-user.target")
|
||||||
client.wait_until_succeeds("ip addr show dev enp1s0 | grep '192.168.1'")
|
client.wait_until_succeeds("ip addr show dev enp1s0 | grep '192.168.1'")
|
||||||
client.shell_interact()
|
|
||||||
client.succeed("ping -c 1 192.168.1.1")
|
|
||||||
router.succeed("ping -c 1 192.168.1.1")
|
router.succeed("ping -c 1 192.168.1.1")
|
||||||
router.succeed("ping -c 1 192.168.1.2")
|
|
||||||
client.succeed("ping -c 1 192.168.1.2")
|
client.succeed("ping -c 1 192.168.1.2")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
dhcpSimple = {
|
dhcpSimple = {
|
||||||
name = "SimpleDHCP";
|
name = "SimpleDHCP";
|
||||||
nodes.router = router;
|
nodes.router = router;
|
||||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
nodes.client = clientConfig {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
virtualisation.interfaces.enp2s0.vlan = 2;
|
virtualisation.interfaces.enp2s0.vlan = 2;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
|
||||||
useDHCP = false;
|
|
||||||
interfaces.enp1s0.useDHCP = true;
|
interfaces.enp1s0.useDHCP = true;
|
||||||
interfaces.enp2s0.useDHCP = true;
|
interfaces.enp2s0.useDHCP = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
client.wait_for_unit("network.target")
|
client.wait_for_unit("network.target")
|
||||||
|
@ -234,44 +134,31 @@ let
|
||||||
|
|
||||||
with subtest("Test vlan 1"):
|
with subtest("Test vlan 1"):
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.1.1")
|
client.wait_until_succeeds("ping -c 1 192.168.1.1")
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.1.2")
|
|
||||||
client.wait_until_succeeds("ping -c 1 fd00:1234:5678:1::1")
|
client.wait_until_succeeds("ping -c 1 fd00:1234:5678:1::1")
|
||||||
client.wait_until_succeeds("ping -c 1 fd00:1234:5678:1::2")
|
|
||||||
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.1.1")
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.1.2")
|
router.wait_until_succeeds("ping -c 1 192.168.1.2")
|
||||||
router.wait_until_succeeds("ping -c 1 fd00:1234:5678:1::1")
|
|
||||||
router.wait_until_succeeds("ping -c 1 fd00:1234:5678:1::2")
|
router.wait_until_succeeds("ping -c 1 fd00:1234:5678:1::2")
|
||||||
|
|
||||||
with subtest("Test vlan 2"):
|
with subtest("Test vlan 2"):
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.2.1")
|
client.wait_until_succeeds("ping -c 1 192.168.2.1")
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.2.2")
|
|
||||||
client.wait_until_succeeds("ping -c 1 fd00:1234:5678:2::1")
|
client.wait_until_succeeds("ping -c 1 fd00:1234:5678:2::1")
|
||||||
client.wait_until_succeeds("ping -c 1 fd00:1234:5678:2::2")
|
|
||||||
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.2.1")
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.2.2")
|
router.wait_until_succeeds("ping -c 1 192.168.2.2")
|
||||||
router.wait_until_succeeds("ping -c 1 fd00:1234:5678:2::1")
|
|
||||||
router.wait_until_succeeds("ping -c 1 fd00:1234:5678:2::2")
|
router.wait_until_succeeds("ping -c 1 fd00:1234:5678:2::2")
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
dhcpOneIf = {
|
dhcpOneIf = {
|
||||||
name = "OneInterfaceDHCP";
|
name = "OneInterfaceDHCP";
|
||||||
nodes.router = router;
|
nodes.router = router;
|
||||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
nodes.client = clientConfig {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
virtualisation.interfaces.enp2s0.vlan = 2;
|
virtualisation.interfaces.enp2s0.vlan = 2;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
|
||||||
useDHCP = false;
|
|
||||||
interfaces.enp1s0 = {
|
interfaces.enp1s0 = {
|
||||||
mtu = 1343;
|
mtu = 1343;
|
||||||
useDHCP = true;
|
useDHCP = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
with subtest("Wait for networking to come up"):
|
with subtest("Wait for networking to come up"):
|
||||||
|
@ -286,9 +173,6 @@ let
|
||||||
|
|
||||||
with subtest("Test vlan 1"):
|
with subtest("Test vlan 1"):
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.1.1")
|
client.wait_until_succeeds("ping -c 1 192.168.1.1")
|
||||||
client.wait_until_succeeds("ping -c 1 192.168.1.2")
|
|
||||||
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.1.1")
|
|
||||||
router.wait_until_succeeds("ping -c 1 192.168.1.2")
|
router.wait_until_succeeds("ping -c 1 192.168.1.2")
|
||||||
|
|
||||||
with subtest("Test vlan 2"):
|
with subtest("Test vlan 2"):
|
||||||
|
@ -300,17 +184,15 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
bond = let
|
bond = let
|
||||||
node = address: { pkgs, ... }: with pkgs.lib; {
|
node = address: clientConfig {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
virtualisation.interfaces.enp2s0.vlan = 2;
|
virtualisation.interfaces.enp2s0.vlan = 2;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
|
||||||
useDHCP = false;
|
|
||||||
bonds.bond0 = {
|
bonds.bond0 = {
|
||||||
interfaces = [ "enp1s0" "enp2s0" ];
|
interfaces = [ "enp1s0" "enp2s0" ];
|
||||||
driverOptions.mode = "802.3ad";
|
driverOptions.mode = "802.3ad";
|
||||||
};
|
};
|
||||||
interfaces.bond0.ipv4.addresses = mkOverride 0
|
interfaces.bond0.ipv4.addresses = lib.mkOverride 0
|
||||||
[ { inherit address; prefixLength = 30; } ];
|
[ { inherit address; prefixLength = 30; } ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -318,8 +200,7 @@ let
|
||||||
name = "Bond";
|
name = "Bond";
|
||||||
nodes.client1 = node "192.168.1.1";
|
nodes.client1 = node "192.168.1.1";
|
||||||
nodes.client2 = node "192.168.1.2";
|
nodes.client2 = node "192.168.1.2";
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
with subtest("Wait for networking to come up"):
|
with subtest("Wait for networking to come up"):
|
||||||
|
@ -339,7 +220,7 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
bridge = let
|
bridge = let
|
||||||
node = { address, vlan }: { pkgs, ... }: with pkgs.lib; {
|
node = { address, vlan }: { pkgs, ... }: {
|
||||||
virtualisation.interfaces.enp1s0.vlan = vlan;
|
virtualisation.interfaces.enp1s0.vlan = vlan;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
|
@ -351,21 +232,20 @@ let
|
||||||
name = "Bridge";
|
name = "Bridge";
|
||||||
nodes.client1 = node { address = "192.168.1.2"; vlan = 1; };
|
nodes.client1 = node { address = "192.168.1.2"; vlan = 1; };
|
||||||
nodes.client2 = node { address = "192.168.1.3"; vlan = 2; };
|
nodes.client2 = node { address = "192.168.1.3"; vlan = 2; };
|
||||||
nodes.router = { pkgs, ... }: with pkgs.lib; {
|
nodes.router = {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
virtualisation.interfaces.enp2s0.vlan = 2;
|
virtualisation.interfaces.enp2s0.vlan = 2;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
bridges.bridge.interfaces = [ "enp1s0" "enp2s0" ];
|
bridges.bridge.interfaces = [ "enp1s0" "enp2s0" ];
|
||||||
interfaces.eth1.ipv4.addresses = mkOverride 0 [ ];
|
interfaces.eth1.ipv4.addresses = lib.mkOverride 0 [ ];
|
||||||
interfaces.eth2.ipv4.addresses = mkOverride 0 [ ];
|
interfaces.eth2.ipv4.addresses = lib.mkOverride 0 [ ];
|
||||||
interfaces.bridge.ipv4.addresses = mkOverride 0
|
interfaces.bridge.ipv4.addresses = lib.mkOverride 0
|
||||||
[ { address = "192.168.1.1"; prefixLength = 24; } ];
|
[ { address = "192.168.1.1"; prefixLength = 24; } ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
with subtest("Wait for networking to come up"):
|
with subtest("Wait for networking to come up"):
|
||||||
|
@ -389,7 +269,7 @@ let
|
||||||
macvlan = {
|
macvlan = {
|
||||||
name = "MACVLAN";
|
name = "MACVLAN";
|
||||||
nodes.router = router;
|
nodes.router = router;
|
||||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
nodes.client = { pkgs, ... }: {
|
||||||
environment.systemPackages = [ pkgs.iptables ]; # to debug firewall rules
|
environment.systemPackages = [ pkgs.iptables ]; # to debug firewall rules
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
networking = {
|
networking = {
|
||||||
|
@ -404,8 +284,7 @@ let
|
||||||
interfaces.macvlan.useDHCP = true;
|
interfaces.macvlan.useDHCP = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
with subtest("Wait for networking to come up"):
|
with subtest("Wait for networking to come up"):
|
||||||
|
@ -439,34 +318,31 @@ let
|
||||||
};
|
};
|
||||||
fou = {
|
fou = {
|
||||||
name = "foo-over-udp";
|
name = "foo-over-udp";
|
||||||
nodes.machine = { ... }: {
|
nodes.machine = clientConfig {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
|
||||||
useDHCP = false;
|
|
||||||
interfaces.enp1s0.ipv4.addresses = [ { address = "192.168.1.1"; prefixLength = 24; } ];
|
interfaces.enp1s0.ipv4.addresses = [ { address = "192.168.1.1"; prefixLength = 24; } ];
|
||||||
fooOverUDP = {
|
fooOverUDP = {
|
||||||
fou1 = { port = 9001; };
|
fou1 = { port = 9001; };
|
||||||
fou2 = { port = 9002; protocol = 41; };
|
fou2 = { port = 9002; protocol = 41; };
|
||||||
fou3 = mkIf (!networkd)
|
fou3 = lib.mkIf (!networkd)
|
||||||
{ port = 9003; local.address = "192.168.1.1"; };
|
{ port = 9003; local.address = "192.168.1.1"; };
|
||||||
fou4 = mkIf (!networkd)
|
fou4 = lib.mkIf (!networkd)
|
||||||
{ port = 9004; local = { address = "192.168.1.1"; dev = "enp1s0"; }; };
|
{ port = 9004; local = { address = "192.168.1.1"; dev = "enp1s0"; }; };
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
systemd.services = {
|
systemd.services = {
|
||||||
fou3-fou-encap.after = optional (!networkd) "network-addresses-enp1s0.service";
|
fou3-fou-encap.after = lib.optional (!networkd) "network-addresses-enp1s0.service";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
machine.wait_for_unit("network.target")
|
machine.wait_for_unit("network.target")
|
||||||
fous = json.loads(machine.succeed("ip -json fou show"))
|
fous = json.loads(machine.succeed("ip -json fou show"))
|
||||||
assert {"port": 9001, "gue": None, "family": "inet"} in fous, "fou1 exists"
|
assert {"port": 9001, "gue": None, "family": "inet"} in fous, "fou1 exists"
|
||||||
assert {"port": 9002, "ipproto": 41, "family": "inet"} in fous, "fou2 exists"
|
assert {"port": 9002, "ipproto": 41, "family": "inet"} in fous, "fou2 exists"
|
||||||
'' + optionalString (!networkd) ''
|
'' + lib.optionalString (!networkd) ''
|
||||||
assert {
|
assert {
|
||||||
"port": 9003,
|
"port": 9003,
|
||||||
"gue": None,
|
"gue": None,
|
||||||
|
@ -483,7 +359,7 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
sit = let
|
sit = let
|
||||||
node = { address4, remote, address6 }: { pkgs, ... }: with pkgs.lib; {
|
node = { address4, remote, address6 }: { pkgs, ... }: {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
|
@ -493,9 +369,9 @@ let
|
||||||
local = address4;
|
local = address4;
|
||||||
dev = "enp1s0";
|
dev = "enp1s0";
|
||||||
};
|
};
|
||||||
interfaces.enp1s0.ipv4.addresses = mkOverride 0
|
interfaces.enp1s0.ipv4.addresses = lib.mkOverride 0
|
||||||
[ { address = address4; prefixLength = 24; } ];
|
[ { address = address4; prefixLength = 24; } ];
|
||||||
interfaces.sit.ipv6.addresses = mkOverride 0
|
interfaces.sit.ipv6.addresses = lib.mkOverride 0
|
||||||
[ { address = address6; prefixLength = 64; } ];
|
[ { address = address6; prefixLength = 64; } ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -506,7 +382,7 @@ let
|
||||||
# client2 does the reverse, sending in proto-41 and accepting only UDP incoming.
|
# client2 does the reverse, sending in proto-41 and accepting only UDP incoming.
|
||||||
# that way we'll notice when either SIT itself or FOU breaks.
|
# that way we'll notice when either SIT itself or FOU breaks.
|
||||||
nodes.client1 = args@{ pkgs, ... }:
|
nodes.client1 = args@{ pkgs, ... }:
|
||||||
mkMerge [
|
lib.mkMerge [
|
||||||
(node { address4 = "192.168.1.1"; remote = "192.168.1.2"; address6 = "fc00::1"; } args)
|
(node { address4 = "192.168.1.1"; remote = "192.168.1.2"; address6 = "fc00::1"; } args)
|
||||||
{
|
{
|
||||||
networking = {
|
networking = {
|
||||||
|
@ -516,7 +392,7 @@ let
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
nodes.client2 = args@{ pkgs, ... }:
|
nodes.client2 = args@{ pkgs, ... }:
|
||||||
mkMerge [
|
lib.mkMerge [
|
||||||
(node { address4 = "192.168.1.2"; remote = "192.168.1.1"; address6 = "fc00::2"; } args)
|
(node { address4 = "192.168.1.2"; remote = "192.168.1.1"; address6 = "fc00::2"; } args)
|
||||||
{
|
{
|
||||||
networking = {
|
networking = {
|
||||||
|
@ -525,8 +401,7 @@ let
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
with subtest("Wait for networking to be configured"):
|
with subtest("Wait for networking to be configured"):
|
||||||
|
@ -546,7 +421,7 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
gre = let
|
gre = let
|
||||||
node = { pkgs, ... }: with pkgs.lib; {
|
node = { ... }: {
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
|
@ -556,7 +431,7 @@ let
|
||||||
in {
|
in {
|
||||||
name = "GRE";
|
name = "GRE";
|
||||||
nodes.client1 = args@{ pkgs, ... }:
|
nodes.client1 = args@{ pkgs, ... }:
|
||||||
mkMerge [
|
lib.mkMerge [
|
||||||
(node args)
|
(node args)
|
||||||
{
|
{
|
||||||
virtualisation.vlans = [ 1 2 4 ];
|
virtualisation.vlans = [ 1 2 4 ];
|
||||||
|
@ -578,21 +453,21 @@ let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
bridges.bridge.interfaces = [ "greTunnel" "eth1" ];
|
bridges.bridge.interfaces = [ "greTunnel" "eth1" ];
|
||||||
interfaces.eth1.ipv4.addresses = mkOverride 0 [];
|
interfaces.eth1.ipv4.addresses = lib.mkOverride 0 [];
|
||||||
interfaces.bridge.ipv4.addresses = mkOverride 0 [
|
interfaces.bridge.ipv4.addresses = lib.mkOverride 0 [
|
||||||
{ address = "192.168.1.1"; prefixLength = 24; }
|
{ address = "192.168.1.1"; prefixLength = 24; }
|
||||||
];
|
];
|
||||||
interfaces.eth3.ipv6.addresses = [
|
interfaces.eth3.ipv6.addresses = [
|
||||||
{ address = "fd00:1234:5678:4::1"; prefixLength = 64; }
|
{ address = "fd00:1234:5678:4::1"; prefixLength = 64; }
|
||||||
];
|
];
|
||||||
interfaces.gre6Tunnel.ipv6.addresses = mkOverride 0 [
|
interfaces.gre6Tunnel.ipv6.addresses = lib.mkOverride 0 [
|
||||||
{ address = "fc00::1"; prefixLength = 64; }
|
{ address = "fc00::1"; prefixLength = 64; }
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
nodes.client2 = args@{ pkgs, ... }:
|
nodes.client2 = args@{ pkgs, ... }:
|
||||||
mkMerge [
|
lib.mkMerge [
|
||||||
(node args)
|
(node args)
|
||||||
{
|
{
|
||||||
virtualisation.vlans = [ 2 3 4 ];
|
virtualisation.vlans = [ 2 3 4 ];
|
||||||
|
@ -614,21 +489,20 @@ let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
bridges.bridge.interfaces = [ "greTunnel" "eth2" ];
|
bridges.bridge.interfaces = [ "greTunnel" "eth2" ];
|
||||||
interfaces.eth2.ipv4.addresses = mkOverride 0 [];
|
interfaces.eth2.ipv4.addresses = lib.mkOverride 0 [];
|
||||||
interfaces.bridge.ipv4.addresses = mkOverride 0 [
|
interfaces.bridge.ipv4.addresses = lib.mkOverride 0 [
|
||||||
{ address = "192.168.1.2"; prefixLength = 24; }
|
{ address = "192.168.1.2"; prefixLength = 24; }
|
||||||
];
|
];
|
||||||
interfaces.eth3.ipv6.addresses = [
|
interfaces.eth3.ipv6.addresses = [
|
||||||
{ address = "fd00:1234:5678:4::2"; prefixLength = 64; }
|
{ address = "fd00:1234:5678:4::2"; prefixLength = 64; }
|
||||||
];
|
];
|
||||||
interfaces.gre6Tunnel.ipv6.addresses = mkOverride 0 [
|
interfaces.gre6Tunnel.ipv6.addresses = lib.mkOverride 0 [
|
||||||
{ address = "fc00::2"; prefixLength = 64; }
|
{ address = "fc00::2"; prefixLength = 64; }
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
import json
|
import json
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
|
@ -658,8 +532,7 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
vlan = let
|
vlan = let
|
||||||
node = address: { pkgs, ... }: with pkgs.lib; {
|
node = address: {
|
||||||
#virtualisation.vlans = [ 1 ];
|
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
|
@ -667,9 +540,9 @@ let
|
||||||
id = 1;
|
id = 1;
|
||||||
interface = "eth0";
|
interface = "eth0";
|
||||||
};
|
};
|
||||||
interfaces.eth0.ipv4.addresses = mkOverride 0 [ ];
|
interfaces.eth0.ipv4.addresses = lib.mkOverride 0 [ ];
|
||||||
interfaces.eth1.ipv4.addresses = mkOverride 0 [ ];
|
interfaces.eth1.ipv4.addresses = lib.mkOverride 0 [ ];
|
||||||
interfaces.vlan.ipv4.addresses = mkOverride 0
|
interfaces.vlan.ipv4.addresses = lib.mkOverride 0
|
||||||
[ { inherit address; prefixLength = 24; } ];
|
[ { inherit address; prefixLength = 24; } ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -677,8 +550,7 @@ let
|
||||||
name = "vlan";
|
name = "vlan";
|
||||||
nodes.client1 = node "192.168.1.1";
|
nodes.client1 = node "192.168.1.1";
|
||||||
nodes.client2 = node "192.168.1.2";
|
nodes.client2 = node "192.168.1.2";
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
with subtest("Wait for networking to be configured"):
|
with subtest("Wait for networking to be configured"):
|
||||||
|
@ -695,14 +567,14 @@ let
|
||||||
vlanIP = number: "10.1.1.${number}";
|
vlanIP = number: "10.1.1.${number}";
|
||||||
baseInterface = "enp1s0";
|
baseInterface = "enp1s0";
|
||||||
vlanInterface = "vlan42";
|
vlanInterface = "vlan42";
|
||||||
node = number: {pkgs, ... }: with pkgs.lib; {
|
node = number: {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
networking = {
|
networking = {
|
||||||
#useNetworkd = networkd;
|
#useNetworkd = networkd;
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
vlans.${vlanInterface} = { id = 42; interface = baseInterface; };
|
vlans.${vlanInterface} = { id = 42; interface = baseInterface; };
|
||||||
interfaces.${baseInterface}.ipv4.addresses = mkOverride 0 [{ address = baseIP number; prefixLength = 24; }];
|
interfaces.${baseInterface}.ipv4.addresses = lib.mkOverride 0 [{ address = baseIP number; prefixLength = 24; }];
|
||||||
interfaces.${vlanInterface}.ipv4.addresses = mkOverride 0 [{ address = vlanIP number; prefixLength = 24; }];
|
interfaces.${vlanInterface}.ipv4.addresses = lib.mkOverride 0 [{ address = vlanIP number; prefixLength = 24; }];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -713,8 +585,7 @@ let
|
||||||
name = "vlan-ping";
|
name = "vlan-ping";
|
||||||
nodes.server = node serverNodeNum;
|
nodes.server = node serverNodeNum;
|
||||||
nodes.client = node clientNodeNum;
|
nodes.client = node clientNodeNum;
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
with subtest("Wait for networking to be configured"):
|
with subtest("Wait for networking to be configured"):
|
||||||
|
@ -778,7 +649,7 @@ let
|
||||||
machine.wait_until_succeeds("ip link show dev tun0 | grep 'mtu 1343'")
|
machine.wait_until_succeeds("ip link show dev tun0 | grep 'mtu 1343'")
|
||||||
assert "02:de:ad:be:ef:01" in machine.succeed("ip link show dev tap0")
|
assert "02:de:ad:be:ef:01" in machine.succeed("ip link show dev tap0")
|
||||||
'' # network-addresses-* only exist in scripted networking
|
'' # network-addresses-* only exist in scripted networking
|
||||||
+ optionalString (!networkd) ''
|
+ lib.optionalString (!networkd) ''
|
||||||
with subtest("Test interfaces clean up"):
|
with subtest("Test interfaces clean up"):
|
||||||
machine.succeed("systemctl stop network-addresses-tap0")
|
machine.succeed("systemctl stop network-addresses-tap0")
|
||||||
machine.sleep(10)
|
machine.sleep(10)
|
||||||
|
@ -792,13 +663,13 @@ let
|
||||||
};
|
};
|
||||||
privacy = {
|
privacy = {
|
||||||
name = "Privacy";
|
name = "Privacy";
|
||||||
nodes.router = { ... }: {
|
nodes.router = {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = true;
|
boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = true;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
interfaces.enp1s0.ipv6.addresses = singleton {
|
interfaces.enp1s0.ipv6.addresses = lib.singleton {
|
||||||
address = "fd00:1234:5678:1::1";
|
address = "fd00:1234:5678:1::1";
|
||||||
prefixLength = 64;
|
prefixLength = 64;
|
||||||
};
|
};
|
||||||
|
@ -819,34 +690,33 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
nodes.client_with_privacy = { pkgs, ... }: with pkgs.lib; {
|
nodes.client_with_privacy = {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
interfaces.enp1s0 = {
|
interfaces.enp1s0 = {
|
||||||
tempAddress = "default";
|
tempAddress = "default";
|
||||||
ipv4.addresses = mkOverride 0 [ ];
|
ipv4.addresses = lib.mkOverride 0 [ ];
|
||||||
ipv6.addresses = mkOverride 0 [ ];
|
ipv6.addresses = lib.mkOverride 0 [ ];
|
||||||
useDHCP = true;
|
useDHCP = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
nodes.client = { pkgs, ... }: with pkgs.lib; {
|
nodes.client = {
|
||||||
virtualisation.interfaces.enp1s0.vlan = 1;
|
virtualisation.interfaces.enp1s0.vlan = 1;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
useDHCP = false;
|
useDHCP = false;
|
||||||
interfaces.enp1s0 = {
|
interfaces.enp1s0 = {
|
||||||
tempAddress = "enabled";
|
tempAddress = "enabled";
|
||||||
ipv4.addresses = mkOverride 0 [ ];
|
ipv4.addresses = lib.mkOverride 0 [ ];
|
||||||
ipv6.addresses = mkOverride 0 [ ];
|
ipv6.addresses = lib.mkOverride 0 [ ];
|
||||||
useDHCP = true;
|
useDHCP = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
testScript = { ... }:
|
testScript = ''
|
||||||
''
|
|
||||||
start_all()
|
start_all()
|
||||||
|
|
||||||
client.wait_for_unit("network.target")
|
client.wait_for_unit("network.target")
|
||||||
|
@ -943,7 +813,7 @@ let
|
||||||
ipv6Table, targetIPv6Table
|
ipv6Table, targetIPv6Table
|
||||||
)
|
)
|
||||||
|
|
||||||
'' + optionalString (!networkd) ''
|
'' + lib.optionalString (!networkd) ''
|
||||||
with subtest("test clean-up of the tables"):
|
with subtest("test clean-up of the tables"):
|
||||||
machine.succeed("systemctl stop network-addresses-eth0")
|
machine.succeed("systemctl stop network-addresses-eth0")
|
||||||
ipv4Residue = machine.succeed("ip -4 route list dev eth0 | head -n-3").strip()
|
ipv4Residue = machine.succeed("ip -4 route list dev eth0 | head -n-3").strip()
|
||||||
|
@ -958,7 +828,7 @@ let
|
||||||
};
|
};
|
||||||
rename = if networkd then {
|
rename = if networkd then {
|
||||||
name = "RenameInterface";
|
name = "RenameInterface";
|
||||||
nodes.machine = { pkgs, ... }: {
|
nodes.machine = {
|
||||||
virtualisation.vlans = [ 1 ];
|
virtualisation.vlans = [ 1 ];
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
|
@ -982,7 +852,7 @@ let
|
||||||
# (as it's handled by udev, not networkd)
|
# (as it's handled by udev, not networkd)
|
||||||
link = {
|
link = {
|
||||||
name = "Link";
|
name = "Link";
|
||||||
nodes.client = { pkgs, ... }: {
|
nodes.client = {
|
||||||
virtualisation.vlans = [ 1 ];
|
virtualisation.vlans = [ 1 ];
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
|
@ -1007,7 +877,7 @@ let
|
||||||
testMac = "06:00:00:00:02:00";
|
testMac = "06:00:00:00:02:00";
|
||||||
in {
|
in {
|
||||||
name = "WlanInterface";
|
name = "WlanInterface";
|
||||||
nodes.machine = { pkgs, ... }: {
|
nodes.machine = {
|
||||||
boot.kernelModules = [ "mac80211_hwsim" ];
|
boot.kernelModules = [ "mac80211_hwsim" ];
|
||||||
networking.wlanInterfaces = {
|
networking.wlanInterfaces = {
|
||||||
wlan0 = { device = "wlan0"; };
|
wlan0 = { device = "wlan0"; };
|
||||||
|
@ -1033,10 +903,10 @@ let
|
||||||
];
|
];
|
||||||
in {
|
in {
|
||||||
name = "naughtyInterfaceNames";
|
name = "naughtyInterfaceNames";
|
||||||
nodes.machine = { pkgs, ... }: {
|
nodes.machine = {
|
||||||
networking.useNetworkd = networkd;
|
networking.useNetworkd = networkd;
|
||||||
networking.bridges = listToAttrs
|
networking.bridges = lib.listToAttrs
|
||||||
(flip map ifnames
|
(lib.flip builtins.map ifnames
|
||||||
(name: { inherit name; value.interfaces = []; }));
|
(name: { inherit name; value.interfaces = []; }));
|
||||||
};
|
};
|
||||||
testScript = ''
|
testScript = ''
|
||||||
|
@ -1048,7 +918,7 @@ let
|
||||||
};
|
};
|
||||||
caseSensitiveRenaming = {
|
caseSensitiveRenaming = {
|
||||||
name = "CaseSensitiveRenaming";
|
name = "CaseSensitiveRenaming";
|
||||||
nodes.machine = { pkgs, ... }: {
|
nodes.machine = {
|
||||||
virtualisation.interfaces.enCustom.vlan = 11;
|
virtualisation.interfaces.enCustom.vlan = 11;
|
||||||
networking = {
|
networking = {
|
||||||
useNetworkd = networkd;
|
useNetworkd = networkd;
|
||||||
|
@ -1063,6 +933,6 @@ let
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
in mapAttrs (const (attrs: makeTest (attrs // {
|
in lib.mapAttrs (lib.const (attrs: makeTest (attrs // {
|
||||||
name = "${attrs.name}-Networking-${if networkd then "Networkd" else "Scripted"}";
|
name = "${attrs.name}-Networking-${if networkd then "Networkd" else "Scripted"}";
|
||||||
}))) testCases
|
}))) testCases
|
82
nixos/tests/networking/router.nix
Normal file
82
nixos/tests/networking/router.nix
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
{ networkd }: { config, pkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
qemu-common = import ../../lib/qemu-common.nix { inherit lib pkgs; };
|
||||||
|
vlanIfs = lib.range 1 (lib.length config.virtualisation.vlans);
|
||||||
|
in {
|
||||||
|
environment.systemPackages = [ pkgs.iptables ]; # to debug firewall rules
|
||||||
|
virtualisation.vlans = [ 1 2 3 ];
|
||||||
|
boot.kernel.sysctl."net.ipv6.conf.all.forwarding" = true;
|
||||||
|
networking = {
|
||||||
|
useDHCP = false;
|
||||||
|
useNetworkd = networkd;
|
||||||
|
firewall.checkReversePath = true;
|
||||||
|
firewall.allowedUDPPorts = [ 547 ];
|
||||||
|
interfaces = lib.mkOverride 0 (lib.listToAttrs (lib.forEach vlanIfs (n:
|
||||||
|
lib.nameValuePair "eth${toString n}" {
|
||||||
|
ipv4.addresses = [ { address = "192.168.${toString n}.1"; prefixLength = 24; } ];
|
||||||
|
ipv6.addresses = [ { address = "fd00:1234:5678:${toString n}::1"; prefixLength = 64; } ];
|
||||||
|
})));
|
||||||
|
};
|
||||||
|
services.kea = {
|
||||||
|
dhcp4 = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
interfaces-config = {
|
||||||
|
interfaces = map (n: "eth${toString n}") vlanIfs;
|
||||||
|
dhcp-socket-type = "raw";
|
||||||
|
service-sockets-require-all = true;
|
||||||
|
service-sockets-max-retries = 5;
|
||||||
|
service-sockets-retry-wait-time = 2500;
|
||||||
|
};
|
||||||
|
subnet4 = map (n: {
|
||||||
|
id = n;
|
||||||
|
subnet = "192.168.${toString n}.0/24";
|
||||||
|
pools = [{ pool = "192.168.${toString n}.3 - 192.168.${toString n}.254"; }];
|
||||||
|
option-data = [
|
||||||
|
{ data = "192.168.${toString n}.1"; name = "routers"; }
|
||||||
|
{ data = "192.168.${toString n}.1"; name = "domain-name-servers"; }
|
||||||
|
];
|
||||||
|
|
||||||
|
reservations = [{
|
||||||
|
hw-address = qemu-common.qemuNicMac n 1;
|
||||||
|
hostname = "client${toString n}";
|
||||||
|
ip-address = "192.168.${toString n}.2";
|
||||||
|
}];
|
||||||
|
}) vlanIfs;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
dhcp6 = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
interfaces-config = {
|
||||||
|
interfaces = map (n: "eth${toString n}") vlanIfs;
|
||||||
|
service-sockets-require-all = true;
|
||||||
|
service-sockets-max-retries = 5;
|
||||||
|
service-sockets-retry-wait-time = 2500;
|
||||||
|
};
|
||||||
|
|
||||||
|
subnet6 = map (n: {
|
||||||
|
id = n;
|
||||||
|
subnet = "fd00:1234:5678:${toString n}::/64";
|
||||||
|
interface = "eth${toString n}";
|
||||||
|
pools = [{ pool = "fd00:1234:5678:${toString n}::2-fd00:1234:5678:${toString n}::2"; }];
|
||||||
|
}) vlanIfs;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services.radvd = {
|
||||||
|
enable = true;
|
||||||
|
config = lib.flip lib.concatMapStrings vlanIfs (n: ''
|
||||||
|
interface eth${toString n} {
|
||||||
|
AdvSendAdvert on;
|
||||||
|
AdvManagedFlag on;
|
||||||
|
AdvOtherConfigFlag on;
|
||||||
|
|
||||||
|
prefix fd00:1234:5678:${toString n}::/64 {
|
||||||
|
AdvAutonomous off;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
'');
|
||||||
|
};
|
||||||
|
}
|
|
@ -13,6 +13,13 @@ import ./make-test-python.nix ({ pkgs, lib, ...} :
|
||||||
services.xserver.enable = true;
|
services.xserver.enable = true;
|
||||||
services.xserver.desktopManager.pantheon.enable = true;
|
services.xserver.desktopManager.pantheon.enable = true;
|
||||||
|
|
||||||
|
# We ship pantheon.appcenter by default when this is enabled.
|
||||||
|
services.flatpak.enable = true;
|
||||||
|
|
||||||
|
# We don't ship gnome-text-editor in Pantheon module, we add this line mainly
|
||||||
|
# to catch eval issues related to this option.
|
||||||
|
environment.pantheon.excludePackages = [ pkgs.gnome-text-editor ];
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.xdotool ];
|
environment.systemPackages = [ pkgs.xdotool ];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,44 +1,87 @@
|
||||||
import ./make-test-python.nix ({ pkgs, lib, ... }:
|
|
||||||
{
|
{
|
||||||
name = "redis";
|
system ? builtins.currentSystem,
|
||||||
meta.maintainers = with lib.maintainers; [ flokli ];
|
config ? { },
|
||||||
|
pkgs ? import ../../.. { inherit system config; },
|
||||||
|
|
||||||
nodes = {
|
lib ? pkgs.lib,
|
||||||
machine =
|
}:
|
||||||
{ pkgs, lib, ... }:
|
let
|
||||||
|
makeTest = import ./make-test-python.nix;
|
||||||
{
|
mkTestName =
|
||||||
services.redis.servers."".enable = true;
|
pkg: "${pkg.pname}_${builtins.replaceStrings [ "." ] [ "" ] (lib.versions.majorMinor pkg.version)}";
|
||||||
services.redis.servers."test".enable = true;
|
redisPackages = {
|
||||||
|
inherit (pkgs) redis keydb;
|
||||||
users.users = lib.listToAttrs (map (suffix: lib.nameValuePair "member${suffix}" {
|
|
||||||
createHome = false;
|
|
||||||
description = "A member of the redis${suffix} group";
|
|
||||||
isNormalUser = true;
|
|
||||||
extraGroups = [ "redis${suffix}" ];
|
|
||||||
}) ["" "-test"]);
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
makeRedisTest =
|
||||||
|
{
|
||||||
|
package,
|
||||||
|
name ? mkTestName package,
|
||||||
|
}:
|
||||||
|
makeTest {
|
||||||
|
inherit name;
|
||||||
|
meta.maintainers = [
|
||||||
|
lib.maintainers.flokli
|
||||||
|
lib.teams.helsinki-systems.members
|
||||||
|
];
|
||||||
|
|
||||||
testScript = { nodes, ... }: let
|
nodes = {
|
||||||
inherit (nodes.machine.config.services) redis;
|
machine =
|
||||||
in ''
|
{ lib, ... }:
|
||||||
start_all()
|
|
||||||
machine.wait_for_unit("redis")
|
|
||||||
machine.wait_for_unit("redis-test")
|
|
||||||
|
|
||||||
# The unnamed Redis server still opens a port for backward-compatibility
|
{
|
||||||
machine.wait_for_open_port(6379)
|
services = {
|
||||||
|
redis = {
|
||||||
|
inherit package;
|
||||||
|
servers."".enable = true;
|
||||||
|
servers."test".enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
machine.wait_for_file("${redis.servers."".unixSocket}")
|
users.users = lib.listToAttrs (
|
||||||
machine.wait_for_file("${redis.servers."test".unixSocket}")
|
map
|
||||||
|
(
|
||||||
|
suffix:
|
||||||
|
lib.nameValuePair "member${suffix}" {
|
||||||
|
createHome = false;
|
||||||
|
description = "A member of the redis${suffix} group";
|
||||||
|
isNormalUser = true;
|
||||||
|
extraGroups = [ "redis${suffix}" ];
|
||||||
|
}
|
||||||
|
)
|
||||||
|
[
|
||||||
|
""
|
||||||
|
"-test"
|
||||||
|
]
|
||||||
|
);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
# The unix socket is accessible to the redis group
|
testScript =
|
||||||
machine.succeed('su member -c "redis-cli ping | grep PONG"')
|
{ nodes, ... }:
|
||||||
machine.succeed('su member-test -c "redis-cli ping | grep PONG"')
|
let
|
||||||
|
inherit (nodes.machine.services) redis;
|
||||||
|
in
|
||||||
|
''
|
||||||
|
start_all()
|
||||||
|
machine.wait_for_unit("redis")
|
||||||
|
machine.wait_for_unit("redis-test")
|
||||||
|
|
||||||
machine.succeed("redis-cli ping | grep PONG")
|
# The unnamed Redis server still opens a port for backward-compatibility
|
||||||
machine.succeed("redis-cli -s ${redis.servers."".unixSocket} ping | grep PONG")
|
machine.wait_for_open_port(6379)
|
||||||
machine.succeed("redis-cli -s ${redis.servers."test".unixSocket} ping | grep PONG")
|
|
||||||
'';
|
machine.wait_for_file("${redis.servers."".unixSocket}")
|
||||||
})
|
machine.wait_for_file("${redis.servers."test".unixSocket}")
|
||||||
|
|
||||||
|
# The unix socket is accessible to the redis group
|
||||||
|
machine.succeed('su member -c "${pkgs.redis}/bin/redis-cli ping | grep PONG"')
|
||||||
|
machine.succeed('su member-test -c "${pkgs.redis}/bin/redis-cli ping | grep PONG"')
|
||||||
|
|
||||||
|
machine.succeed("${pkgs.redis}/bin/redis-cli ping | grep PONG")
|
||||||
|
machine.succeed("${pkgs.redis}/bin/redis-cli -s ${redis.servers."".unixSocket} ping | grep PONG")
|
||||||
|
machine.succeed("${pkgs.redis}/bin/redis-cli -s ${
|
||||||
|
redis.servers."test".unixSocket
|
||||||
|
} ping | grep PONG")
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mapAttrs (_: package: makeRedisTest { inherit package; }) redisPackages
|
||||||
|
|
122
nixos/tests/restic-rest-server.nix
Normal file
122
nixos/tests/restic-rest-server.nix
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
import ./make-test-python.nix (
|
||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
remoteRepository = "rest:http://restic_rest_server:8001/";
|
||||||
|
|
||||||
|
backupPrepareCommand = ''
|
||||||
|
touch /root/backupPrepareCommand
|
||||||
|
test ! -e /root/backupCleanupCommand
|
||||||
|
'';
|
||||||
|
|
||||||
|
backupCleanupCommand = ''
|
||||||
|
rm /root/backupPrepareCommand
|
||||||
|
touch /root/backupCleanupCommand
|
||||||
|
'';
|
||||||
|
|
||||||
|
testDir = pkgs.stdenvNoCC.mkDerivation {
|
||||||
|
name = "test-files-to-backup";
|
||||||
|
unpackPhase = "true";
|
||||||
|
installPhase = ''
|
||||||
|
mkdir $out
|
||||||
|
echo some_file > $out/some_file
|
||||||
|
echo some_other_file > $out/some_other_file
|
||||||
|
mkdir $out/a_dir
|
||||||
|
echo a_file > $out/a_dir/a_file
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
passwordFile = "${pkgs.writeText "password" "correcthorsebatterystaple"}";
|
||||||
|
paths = [ "/opt" ];
|
||||||
|
exclude = [ "/opt/excluded_file_*" ];
|
||||||
|
pruneOpts = [
|
||||||
|
"--keep-daily 2"
|
||||||
|
"--keep-weekly 1"
|
||||||
|
"--keep-monthly 1"
|
||||||
|
"--keep-yearly 99"
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
name = "restic-rest-server";
|
||||||
|
|
||||||
|
nodes = {
|
||||||
|
restic_rest_server = {
|
||||||
|
services.restic.server = {
|
||||||
|
enable = true;
|
||||||
|
extraFlags = [ "--no-auth" ];
|
||||||
|
listenAddress = "8001";
|
||||||
|
};
|
||||||
|
networking.firewall.allowedTCPPorts = [ 8001 ];
|
||||||
|
};
|
||||||
|
server = {
|
||||||
|
services.restic.backups = {
|
||||||
|
remotebackup = {
|
||||||
|
inherit passwordFile paths exclude pruneOpts backupPrepareCommand backupCleanupCommand;
|
||||||
|
repository = remoteRepository;
|
||||||
|
initialize = true;
|
||||||
|
timerConfig = null; # has no effect here, just checking that it doesn't break the service
|
||||||
|
};
|
||||||
|
remoteprune = {
|
||||||
|
inherit passwordFile;
|
||||||
|
repository = remoteRepository;
|
||||||
|
pruneOpts = [ "--keep-last 1" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
restic_rest_server.start()
|
||||||
|
server.start()
|
||||||
|
restic_rest_server.wait_for_unit("restic-rest-server.socket")
|
||||||
|
restic_rest_server.wait_for_open_port(8001)
|
||||||
|
server.wait_for_unit("dbus.socket")
|
||||||
|
server.fail(
|
||||||
|
"restic-remotebackup snapshots",
|
||||||
|
)
|
||||||
|
server.succeed(
|
||||||
|
# set up
|
||||||
|
"cp -rT ${testDir} /opt",
|
||||||
|
"touch /opt/excluded_file_1 /opt/excluded_file_2",
|
||||||
|
|
||||||
|
# test that remotebackup runs custom commands and produces a snapshot
|
||||||
|
"timedatectl set-time '2016-12-13 13:45'",
|
||||||
|
"systemctl start restic-backups-remotebackup.service",
|
||||||
|
"rm /root/backupCleanupCommand",
|
||||||
|
'restic-remotebackup snapshots --json | ${pkgs.jq}/bin/jq "length | . == 1"',
|
||||||
|
|
||||||
|
# test that restoring that snapshot produces the same directory
|
||||||
|
"mkdir /tmp/restore-1",
|
||||||
|
"restic-remotebackup restore latest -t /tmp/restore-1",
|
||||||
|
"diff -ru ${testDir} /tmp/restore-1/opt",
|
||||||
|
|
||||||
|
# test that we can create four snapshots in remotebackup and rclonebackup
|
||||||
|
"timedatectl set-time '2017-12-13 13:45'",
|
||||||
|
"systemctl start restic-backups-remotebackup.service",
|
||||||
|
"rm /root/backupCleanupCommand",
|
||||||
|
|
||||||
|
"timedatectl set-time '2018-12-13 13:45'",
|
||||||
|
"systemctl start restic-backups-remotebackup.service",
|
||||||
|
"rm /root/backupCleanupCommand",
|
||||||
|
|
||||||
|
"timedatectl set-time '2018-12-14 13:45'",
|
||||||
|
"systemctl start restic-backups-remotebackup.service",
|
||||||
|
"rm /root/backupCleanupCommand",
|
||||||
|
|
||||||
|
"timedatectl set-time '2018-12-15 13:45'",
|
||||||
|
"systemctl start restic-backups-remotebackup.service",
|
||||||
|
"rm /root/backupCleanupCommand",
|
||||||
|
|
||||||
|
"timedatectl set-time '2018-12-16 13:45'",
|
||||||
|
"systemctl start restic-backups-remotebackup.service",
|
||||||
|
"rm /root/backupCleanupCommand",
|
||||||
|
|
||||||
|
'restic-remotebackup snapshots --json | ${pkgs.jq}/bin/jq "length | . == 4"',
|
||||||
|
|
||||||
|
# test that remoteprune brings us back to 1 snapshot in remotebackup
|
||||||
|
"systemctl start restic-backups-remoteprune.service",
|
||||||
|
'restic-remotebackup snapshots --json | ${pkgs.jq}/bin/jq "length | . == 1"',
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
)
|
|
@ -31,8 +31,6 @@ let
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in with pkgs; {
|
in with pkgs; {
|
||||||
unifiLTS = makeAppTest unifiLTS;
|
|
||||||
unifi5 = makeAppTest unifi5;
|
|
||||||
unifi6 = makeAppTest unifi6;
|
|
||||||
unifi7 = makeAppTest unifi7;
|
unifi7 = makeAppTest unifi7;
|
||||||
|
unifi8 = makeAppTest unifi8;
|
||||||
}
|
}
|
||||||
|
|
8
nixos/tests/web-apps/movim/default.nix
Normal file
8
nixos/tests/web-apps/movim/default.nix
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{ system ? builtins.currentSystem, handleTestOn }:
|
||||||
|
|
||||||
|
let
|
||||||
|
supportedSystems = [ "x86_64-linux" "i686-linux" ];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
standard = handleTestOn supportedSystems ./standard.nix { inherit system; };
|
||||||
|
}
|
102
nixos/tests/web-apps/movim/standard.nix
Normal file
102
nixos/tests/web-apps/movim/standard.nix
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
import ../../make-test-python.nix ({ lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
movim = {
|
||||||
|
domain = "movim.local";
|
||||||
|
info = "No ToS in tests";
|
||||||
|
description = "NixOS testing server";
|
||||||
|
};
|
||||||
|
xmpp = {
|
||||||
|
domain = "xmpp.local";
|
||||||
|
admin = rec {
|
||||||
|
JID = "${username}@${xmpp.domain}";
|
||||||
|
username = "romeo";
|
||||||
|
password = "juliet";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
name = "movim-standard";
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
maintainers = with pkgs.lib.maintainers; [ toastal ];
|
||||||
|
};
|
||||||
|
|
||||||
|
nodes = {
|
||||||
|
server = { pkgs, ... }: {
|
||||||
|
services.movim = {
|
||||||
|
inherit (movim) domain;
|
||||||
|
enable = true;
|
||||||
|
verbose = true;
|
||||||
|
podConfig = {
|
||||||
|
inherit (movim) description info;
|
||||||
|
xmppdomain = xmpp.domain;
|
||||||
|
};
|
||||||
|
nginx = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
services.prosody = {
|
||||||
|
enable = true;
|
||||||
|
xmppComplianceSuite = false;
|
||||||
|
disco_items = [
|
||||||
|
{ url = "upload.${xmpp.domain}"; description = "File Uploads"; }
|
||||||
|
];
|
||||||
|
virtualHosts."${xmpp.domain}" = {
|
||||||
|
inherit (xmpp) domain;
|
||||||
|
enabled = true;
|
||||||
|
extraConfig = ''
|
||||||
|
Component "pubsub.${xmpp.domain}" "pubsub"
|
||||||
|
pubsub_max_items = 10000
|
||||||
|
expose_publisher = true
|
||||||
|
|
||||||
|
Component "upload.${xmpp.domain}" "http_file_share"
|
||||||
|
http_external_url = "http://upload.${xmpp.domain}"
|
||||||
|
http_file_share_expires_after = 300 * 24 * 60 * 60
|
||||||
|
http_file_share_size_limit = 1024 * 1024 * 1024
|
||||||
|
http_file_share_daily_quota = 4 * 1024 * 1024 * 1024
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
pep_max_items = 10000
|
||||||
|
|
||||||
|
http_paths = {
|
||||||
|
file_share = "/";
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.extraHosts = ''
|
||||||
|
127.0.0.1 ${movim.domain}
|
||||||
|
127.0.0.1 ${xmpp.domain}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = /* python */ ''
|
||||||
|
server.wait_for_unit("phpfpm-movim.service")
|
||||||
|
server.wait_for_unit("nginx.service")
|
||||||
|
server.wait_for_open_port(80)
|
||||||
|
|
||||||
|
server.wait_for_unit("prosody.service")
|
||||||
|
server.succeed('prosodyctl status | grep "Prosody is running"')
|
||||||
|
server.succeed("prosodyctl register ${xmpp.admin.username} ${xmpp.domain} ${xmpp.admin.password}")
|
||||||
|
|
||||||
|
server.wait_for_unit("movim.service")
|
||||||
|
|
||||||
|
# Test unauthenticated
|
||||||
|
server.fail("curl -L --fail-with-body --max-redirs 0 http://${movim.domain}/chat")
|
||||||
|
|
||||||
|
# Test basic Websocket
|
||||||
|
server.succeed("echo \"\" | ${lib.getExe pkgs.websocat} 'ws://${movim.domain}/ws/?path=login&offset=0' --origin 'http://${movim.domain}'")
|
||||||
|
|
||||||
|
# Test login + create cookiejar
|
||||||
|
login_html = server.succeed("curl --fail-with-body -c /tmp/cookies http://${movim.domain}/login")
|
||||||
|
assert "${movim.description}" in login_html
|
||||||
|
assert "${movim.info}" in login_html
|
||||||
|
|
||||||
|
# Test authentication POST
|
||||||
|
server.succeed("curl --fail-with-body -b /tmp/cookies -X POST --data-urlencode 'username=${xmpp.admin.JID}' --data-urlencode 'password=${xmpp.admin.password}' http://${movim.domain}/login")
|
||||||
|
|
||||||
|
server.succeed("curl -L --fail-with-body --max-redirs 1 -b /tmp/cookies http://${movim.domain}/chat")
|
||||||
|
'';
|
||||||
|
})
|
|
@ -27,11 +27,11 @@
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
pname = "cardinal";
|
pname = "cardinal";
|
||||||
version = "23.10";
|
version = "24.04";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://github.com/DISTRHO/Cardinal/releases/download/${version}/cardinal+deps-${version}.tar.xz";
|
url = "https://github.com/DISTRHO/Cardinal/releases/download/${version}/cardinal+deps-${version}.tar.xz";
|
||||||
hash = "sha256-6Wt2sC7vdrz2Fkl08bNLfnGu+pAV7b5lZUmsx1wtJRE=";
|
hash = "sha256-vowDdHAXVZ+HSMoQsvJdzghsJzH+OrSpx6MxPRAgtJA=";
|
||||||
};
|
};
|
||||||
|
|
||||||
prePatch = ''
|
prePatch = ''
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
{ stdenv
|
|
||||||
, lib
|
|
||||||
, meta
|
|
||||||
, fetchurl
|
|
||||||
, unzip
|
|
||||||
, mpv
|
|
||||||
, electron_24
|
|
||||||
, makeDesktopItem
|
|
||||||
, makeWrapper
|
|
||||||
, pname
|
|
||||||
, appname
|
|
||||||
, version
|
|
||||||
}:
|
|
||||||
|
|
||||||
stdenv.mkDerivation {
|
|
||||||
inherit pname version meta;
|
|
||||||
|
|
||||||
src = fetchurl {
|
|
||||||
url = "https://github.com/jeffvli/feishin/releases/download/v${version}/${appname}-${version}-mac-x64.zip";
|
|
||||||
hash = "sha256-sJg3hYOiELm+edw2JTFt6cPFdbDj6mLcLngeqEPaPgs=";
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeBuildInputs = [ makeWrapper unzip ];
|
|
||||||
|
|
||||||
# Installs mpv as a requirement
|
|
||||||
propagatedBuildInputs = [ mpv ];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
runHook preInstall
|
|
||||||
mkdir -p $out/{Applications/${appname}.app,bin}
|
|
||||||
cp -R . $out/Applications/${appname}.app
|
|
||||||
makeWrapper $out/Applications/${appname}.app/Contents/MacOS/${appname} $out/bin/${pname}
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
|
|
||||||
shellHook = ''
|
|
||||||
set -x
|
|
||||||
export LD_LIBRARY_PATH=${mpv}/lib
|
|
||||||
set +x
|
|
||||||
'';
|
|
||||||
}
|
|
|
@ -1,27 +1,130 @@
|
||||||
{ lib
|
{
|
||||||
, stdenv
|
lib,
|
||||||
, callPackage
|
buildNpmPackage,
|
||||||
, ...
|
fetchFromGitHub,
|
||||||
}@args:
|
electron_27,
|
||||||
|
copyDesktopItems,
|
||||||
|
makeDesktopItem,
|
||||||
|
...
|
||||||
|
}:
|
||||||
let
|
let
|
||||||
extraArgs = removeAttrs args [ "callPackage" ];
|
|
||||||
|
|
||||||
pname = "feishin";
|
pname = "feishin";
|
||||||
version = "0.5.1";
|
version = "0.6.1";
|
||||||
appname = "Feishin";
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "jeffvli";
|
||||||
|
repo = pname;
|
||||||
|
rev = "v${version}";
|
||||||
|
hash = "sha256-Nj8GwrH49ph14xvJldj5GQR4mlt9unCPEcgLrsH/sx8=";
|
||||||
|
};
|
||||||
|
|
||||||
|
electron = electron_27;
|
||||||
|
in
|
||||||
|
buildNpmPackage {
|
||||||
|
pname = "feishin";
|
||||||
|
inherit version;
|
||||||
|
|
||||||
|
inherit src;
|
||||||
|
npmDepsHash = "sha256-+pr9fWg/9kxkYMmthtqhjgF6MOomSQxVCO5V8tHHRdE=";
|
||||||
|
|
||||||
|
npmFlags = [ "--legacy-peer-deps" ];
|
||||||
|
makeCacheWritable = true;
|
||||||
|
|
||||||
|
env.ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
|
||||||
|
|
||||||
|
nativeBuildInputs = [ copyDesktopItems ];
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
# release/app dependencies are installed on preConfigure
|
||||||
|
substituteInPlace package.json \
|
||||||
|
--replace-fail "electron-builder install-app-deps &&" ""
|
||||||
|
|
||||||
|
# https://github.com/electron/electron/issues/31121
|
||||||
|
substituteInPlace src/main/main.ts \
|
||||||
|
--replace-fail "process.resourcesPath" "'$out/share/feishin/resources'"
|
||||||
|
'';
|
||||||
|
|
||||||
|
preConfigure =
|
||||||
|
let
|
||||||
|
releaseAppDeps = buildNpmPackage {
|
||||||
|
pname = "${pname}-release-app";
|
||||||
|
inherit version;
|
||||||
|
|
||||||
|
src = "${src}/release/app";
|
||||||
|
npmDepsHash = "sha256-MRwKxe1hoFs5bPXT6K/UspSDs9XBdcRJGvxGlTKExp4=";
|
||||||
|
|
||||||
|
npmFlags = [ "--ignore-scripts" ];
|
||||||
|
dontNpmBuild = true;
|
||||||
|
|
||||||
|
env.ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
|
||||||
|
};
|
||||||
|
releaseNodeModules = "${releaseAppDeps}/lib/node_modules/feishin/node_modules";
|
||||||
|
in
|
||||||
|
''
|
||||||
|
for release_module_path in "${releaseNodeModules}"/*; do
|
||||||
|
rm -rf node_modules/"$(basename "$release_module_path")"
|
||||||
|
ln -s "$release_module_path" node_modules/
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
postBuild = ''
|
||||||
|
npm exec electron-builder -- \
|
||||||
|
--dir \
|
||||||
|
-c.electronDist=${electron}/libexec/electron \
|
||||||
|
-c.electronVersion=${electron.version} \
|
||||||
|
-c.npmRebuild=false
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
runHook preInstall
|
||||||
|
|
||||||
|
mkdir -p $out/share/feishin
|
||||||
|
pushd release/build/*/
|
||||||
|
cp -r locales resources{,.pak} $out/share/feishin
|
||||||
|
popd
|
||||||
|
|
||||||
|
# Code relies on checking app.isPackaged, which returns false if the executable is electron.
|
||||||
|
# Set ELECTRON_FORCE_IS_PACKAGED=1.
|
||||||
|
# https://github.com/electron/electron/issues/35153#issuecomment-1202718531
|
||||||
|
makeWrapper ${lib.getExe electron} $out/bin/feishin \
|
||||||
|
--add-flags $out/share/feishin/resources/app.asar \
|
||||||
|
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}" \
|
||||||
|
--set ELECTRON_FORCE_IS_PACKAGED=1 \
|
||||||
|
--inherit-argv0
|
||||||
|
|
||||||
|
for size in 32 64 128 256 512 1024; do
|
||||||
|
mkdir -p $out/share/icons/hicolor/"$size"x"$size"/apps
|
||||||
|
ln -s \
|
||||||
|
$out/share/feishin/resources/assets/icons/"$size"x"$size".png \
|
||||||
|
$out/share/icons/hicolor/"$size"x"$size"/apps/${pname}.png
|
||||||
|
done
|
||||||
|
|
||||||
|
runHook postInstall
|
||||||
|
'';
|
||||||
|
|
||||||
|
desktopItems = [
|
||||||
|
(makeDesktopItem {
|
||||||
|
name = "feishin";
|
||||||
|
desktopName = "Feishin";
|
||||||
|
comment = "Full-featured Subsonic/Jellyfin compatible desktop music player";
|
||||||
|
icon = pname;
|
||||||
|
exec = "feishin %u";
|
||||||
|
categories = [
|
||||||
|
"Audio"
|
||||||
|
"AudioVideo"
|
||||||
|
];
|
||||||
|
mimeTypes = [ "x-scheme-handler/feishin" ];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
description = "Full-featured Subsonic/Jellyfin compatible desktop music player";
|
description = "Full-featured Subsonic/Jellyfin compatible desktop music player";
|
||||||
homepage = "https://github.com/jeffvli/feishin";
|
homepage = "https://github.com/jeffvli/feishin";
|
||||||
changelog = "https://github.com/jeffvli/feishin/releases/tag/v${version}";
|
changelog = "https://github.com/jeffvli/feishin/releases/tag/v${version}";
|
||||||
sourceProvenance = with sourceTypes; [ binaryNativeCode ];
|
sourceProvenance = with sourceTypes; [ fromSource ];
|
||||||
license = licenses.mit;
|
license = licenses.gpl3Plus;
|
||||||
platforms = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
|
platforms = platforms.unix;
|
||||||
|
mainProgram = "feishin";
|
||||||
maintainers = with maintainers; [ onny ];
|
maintainers = with maintainers; [ onny ];
|
||||||
};
|
};
|
||||||
|
}
|
||||||
in
|
|
||||||
if stdenv.isDarwin
|
|
||||||
then callPackage ./darwin.nix (extraArgs // { inherit pname appname version meta; })
|
|
||||||
else callPackage ./linux.nix (extraArgs // { inherit pname appname version meta; })
|
|
||||||
|
|
|
@ -1,71 +0,0 @@
|
||||||
{ stdenv
|
|
||||||
, meta
|
|
||||||
, lib
|
|
||||||
, fetchurl
|
|
||||||
, mpv
|
|
||||||
, graphicsmagick
|
|
||||||
, electron_24
|
|
||||||
, makeDesktopItem
|
|
||||||
, makeWrapper
|
|
||||||
, pname
|
|
||||||
, appname
|
|
||||||
, version
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
icon = fetchurl {
|
|
||||||
url =
|
|
||||||
"https://github.com/jeffvli/feishin/raw/development/assets/icons/1024x1024.png";
|
|
||||||
sha256 = "sha256-8Qigt1CNMa3SDVK2cdqWJuMSl19yfy6nPQfME4qA48I=";
|
|
||||||
};
|
|
||||||
|
|
||||||
desktopItem = makeDesktopItem {
|
|
||||||
name = "feishin";
|
|
||||||
desktopName = "Feishin";
|
|
||||||
comment = "Full-featured Subsonic/Jellyfin compatible desktop music player";
|
|
||||||
icon = "feishin";
|
|
||||||
exec = "feishin %u";
|
|
||||||
categories = [ "Audio" "AudioVideo" ];
|
|
||||||
mimeTypes = [ "x-scheme-handler/feishin" ];
|
|
||||||
};
|
|
||||||
in
|
|
||||||
|
|
||||||
stdenv.mkDerivation {
|
|
||||||
inherit pname version meta;
|
|
||||||
|
|
||||||
src = fetchurl {
|
|
||||||
url = "https://github.com/jeffvli/feishin/releases/download/v${version}/${appname}-${version}-linux-x64.tar.xz";
|
|
||||||
hash = "sha256-uYswGxSXz2YddoFs5F7f+ywqAr7qXqp6WryQ7ENSawQ=";
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
nativeBuildInputs = [ makeWrapper graphicsmagick ];
|
|
||||||
|
|
||||||
# Installs mpv as a requirement
|
|
||||||
propagatedBuildInputs = [ mpv ];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
runHook preInstall
|
|
||||||
|
|
||||||
mkdir -p $out/bin
|
|
||||||
mkdir -p $out/share
|
|
||||||
cp -r resources $out/share/${pname}/
|
|
||||||
cp -r locales $out/share/${pname}/
|
|
||||||
|
|
||||||
makeWrapper ${electron_24}/bin/electron $out/bin/${pname} \
|
|
||||||
--add-flags $out/share/${pname}/app.asar
|
|
||||||
install -m 444 -D "${desktopItem}/share/applications/"* \
|
|
||||||
-t $out/share/applications/
|
|
||||||
for size in 16 24 32 48 64 128 256 512; do
|
|
||||||
mkdir -p $out/share/icons/hicolor/"$size"x"$size"/apps
|
|
||||||
gm convert -resize "$size"x"$size" ${icon} $out/share/icons/hicolor/"$size"x"$size"/apps/${appname}.png
|
|
||||||
done
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
|
|
||||||
shellHook = ''
|
|
||||||
set -x
|
|
||||||
export LD_LIBRARY_PATH=${mpv}/lib
|
|
||||||
set +x
|
|
||||||
'';
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
{
|
{ chromaprint
|
||||||
chromaprint
|
|
||||||
, cmake
|
, cmake
|
||||||
, docbook_xml_dtd_45
|
, docbook_xml_dtd_45
|
||||||
, docbook_xsl
|
, docbook_xsl
|
||||||
|
@ -7,25 +6,43 @@
|
||||||
, ffmpeg
|
, ffmpeg
|
||||||
, flac
|
, flac
|
||||||
, id3lib
|
, id3lib
|
||||||
|
, kdePackages
|
||||||
, lib
|
, lib
|
||||||
, libogg
|
, libogg
|
||||||
, libvorbis
|
, libvorbis
|
||||||
, libxslt
|
, libxslt
|
||||||
, mp4v2
|
, mp4v2
|
||||||
, phonon
|
|
||||||
, pkg-config
|
, pkg-config
|
||||||
, python3
|
, python3
|
||||||
, qtbase
|
, qtbase
|
||||||
|
, qtdeclarative
|
||||||
, qtmultimedia
|
, qtmultimedia
|
||||||
, qtquickcontrols
|
|
||||||
, qttools
|
, qttools
|
||||||
, readline
|
, readline
|
||||||
, stdenv
|
, stdenv
|
||||||
, taglib
|
, taglib
|
||||||
, wrapQtAppsHook
|
, wrapQtAppsHook
|
||||||
, zlib
|
, zlib
|
||||||
|
, withCLI ? true
|
||||||
|
, withKDE ? true
|
||||||
|
, withQt ? false
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (lib) optionals;
|
||||||
|
|
||||||
|
apps = lib.concatStringsSep ";" (
|
||||||
|
optionals withCLI [ "CLI" ]
|
||||||
|
++ optionals withKDE [ "KDE" ]
|
||||||
|
++ optionals withQt [ "Qt" ]
|
||||||
|
);
|
||||||
|
|
||||||
|
mainProgram =
|
||||||
|
if withQt then "kid3-qt"
|
||||||
|
else if withKDE then "kid3"
|
||||||
|
else "kid3-cli";
|
||||||
|
|
||||||
|
in
|
||||||
stdenv.mkDerivation (finalAttrs: {
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
pname = "kid3";
|
pname = "kid3";
|
||||||
version = "3.9.5";
|
version = "3.9.5";
|
||||||
|
@ -41,6 +58,7 @@ stdenv.mkDerivation (finalAttrs: {
|
||||||
docbook_xsl
|
docbook_xsl
|
||||||
pkg-config
|
pkg-config
|
||||||
python3
|
python3
|
||||||
|
qttools
|
||||||
wrapQtAppsHook
|
wrapQtAppsHook
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -53,25 +71,32 @@ stdenv.mkDerivation (finalAttrs: {
|
||||||
libvorbis
|
libvorbis
|
||||||
libxslt
|
libxslt
|
||||||
mp4v2
|
mp4v2
|
||||||
phonon
|
|
||||||
qtbase
|
qtbase
|
||||||
|
qtdeclarative
|
||||||
qtmultimedia
|
qtmultimedia
|
||||||
qtquickcontrols
|
|
||||||
qttools
|
|
||||||
readline
|
readline
|
||||||
taglib
|
taglib
|
||||||
zlib
|
zlib
|
||||||
];
|
] ++ lib.optionals withKDE (with kdePackages; [
|
||||||
|
kconfig
|
||||||
|
kconfigwidgets
|
||||||
|
kcoreaddons
|
||||||
|
kio
|
||||||
|
kxmlgui
|
||||||
|
phonon
|
||||||
|
]);
|
||||||
|
|
||||||
cmakeFlags = [ "-DWITH_APPS=Qt;CLI" ];
|
cmakeFlags = [ (lib.cmakeFeature "WITH_APPS" apps) ];
|
||||||
NIX_LDFLAGS = "-lm -lpthread";
|
|
||||||
|
|
||||||
preConfigure = ''
|
env = {
|
||||||
export DOCBOOKDIR="${docbook_xsl}/xml/xsl/docbook/"
|
DOCBOOKDIR = "${docbook_xsl}/xml/xsl/docbook/";
|
||||||
'';
|
LANG = "C.UTF-8";
|
||||||
|
NIX_LDFLAGS = "-lm -lpthread";
|
||||||
|
};
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
description = "A simple and powerful audio tag editor";
|
description = "A simple and powerful audio tag editor";
|
||||||
|
inherit mainProgram;
|
||||||
homepage = "https://kid3.kde.org/";
|
homepage = "https://kid3.kde.org/";
|
||||||
license = lib.licenses.lgpl2Plus;
|
license = lib.licenses.lgpl2Plus;
|
||||||
longDescription = ''
|
longDescription = ''
|
||||||
|
@ -103,7 +128,7 @@ stdenv.mkDerivation (finalAttrs: {
|
||||||
- Edit synchronized lyrics and event timing codes, import and export
|
- Edit synchronized lyrics and event timing codes, import and export
|
||||||
LRC files.
|
LRC files.
|
||||||
'';
|
'';
|
||||||
maintainers = [ lib.maintainers.AndersonTorres ];
|
maintainers = with lib.maintainers; [ AndersonTorres ];
|
||||||
platforms = lib.platforms.linux;
|
platforms = lib.platforms.linux;
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
|
@ -2,12 +2,12 @@
|
||||||
|
|
||||||
python3Packages.buildPythonApplication rec {
|
python3Packages.buildPythonApplication rec {
|
||||||
pname = "mopidy-jellyfin";
|
pname = "mopidy-jellyfin";
|
||||||
version = "1.0.4";
|
version = "1.0.5";
|
||||||
|
|
||||||
src = fetchPypi {
|
src = fetchPypi {
|
||||||
inherit version;
|
inherit version;
|
||||||
pname = "Mopidy-Jellyfin";
|
pname = "Mopidy-Jellyfin";
|
||||||
sha256 = "ny0u6HdOlZCsmIzZuQ1rql+bvHU3xkh8IdwhJVHNH9c=";
|
sha256 = "sha256-cZliraTxTAJ2dXaxttWI3x4wCkmEhEo33GTNtAYwgTc=";
|
||||||
};
|
};
|
||||||
|
|
||||||
propagatedBuildInputs = [ mopidy python3Packages.unidecode python3Packages.websocket-client ];
|
propagatedBuildInputs = [ mopidy python3Packages.unidecode python3Packages.websocket-client ];
|
||||||
|
|
|
@ -6,13 +6,13 @@
|
||||||
|
|
||||||
python3Packages.buildPythonApplication rec {
|
python3Packages.buildPythonApplication rec {
|
||||||
pname = "pyradio";
|
pname = "pyradio";
|
||||||
version = "0.9.3.1";
|
version = "0.9.3.2";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "coderholic";
|
owner = "coderholic";
|
||||||
repo = "pyradio";
|
repo = "pyradio";
|
||||||
rev = "refs/tags/${version}";
|
rev = "refs/tags/${version}";
|
||||||
hash = "sha256-p3F4uN+hkxGp+216abUkFNM5uF/0e0sQHKk5WIpULso=";
|
hash = "sha256-aIWU68bdPUsIh8QRNnF0NcK7FemmYyUHbJg9KcUALBk=";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
|
|
|
@ -28,7 +28,7 @@ stdenv.mkDerivation rec {
|
||||||
description = "Program for representing sounds visually";
|
description = "Program for representing sounds visually";
|
||||||
license = lib.licenses.gpl2Only;
|
license = lib.licenses.gpl2Only;
|
||||||
platforms = lib.platforms.linux;
|
platforms = lib.platforms.linux;
|
||||||
maintainers = [ lib.maintainers.infinisil ];
|
maintainers = [ ];
|
||||||
mainProgram = "synaesthesia";
|
mainProgram = "synaesthesia";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,13 +5,13 @@
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
pname = "vgmstream";
|
pname = "vgmstream";
|
||||||
version = "1896";
|
version = "1917";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "vgmstream";
|
owner = "vgmstream";
|
||||||
repo = "vgmstream";
|
repo = "vgmstream";
|
||||||
rev = "refs/tags/r${version}";
|
rev = "refs/tags/r${version}";
|
||||||
sha256 = "sha256-1BWJgV631MxxzdUtK8f+XRb9cqfhjlwN2LgWI0VmIHE=";
|
sha256 = "sha256-9HIa5/whdLouUWNFml7tPfXStIkO76dxUl5S4yiat64=";
|
||||||
};
|
};
|
||||||
|
|
||||||
passthru.updateScript = nix-update-script {
|
passthru.updateScript = nix-update-script {
|
||||||
|
|
|
@ -38,11 +38,11 @@ let
|
||||||
in
|
in
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
pname = "bisq-desktop";
|
pname = "bisq-desktop";
|
||||||
version = "1.9.14";
|
version = "1.9.15";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://github.com/bisq-network/bisq/releases/download/v${version}/Bisq-64bit-${version}.deb";
|
url = "https://github.com/bisq-network/bisq/releases/download/v${version}/Bisq-64bit-${version}.deb";
|
||||||
sha256 = "0xbq94qbp59523xjp80bly38aisfwkfi0y9hmyhf8xlw084b82kz";
|
sha256 = "0bz4yzfrzn9rwsmwwnsqdgxsqd42dyiz3vxi53qxj36h49nh8lzg";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
|
|
|
@ -25,13 +25,13 @@
|
||||||
|
|
||||||
mkDerivation rec {
|
mkDerivation rec {
|
||||||
pname = "bitcoin" + lib.optionalString (!withGui) "d" + "-abc";
|
pname = "bitcoin" + lib.optionalString (!withGui) "d" + "-abc";
|
||||||
version = "0.29.0";
|
version = "0.29.1";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "bitcoin-ABC";
|
owner = "bitcoin-ABC";
|
||||||
repo = "bitcoin-abc";
|
repo = "bitcoin-abc";
|
||||||
rev = "v${version}";
|
rev = "v${version}";
|
||||||
hash = "sha256-9BJfzGXX9b7JRWFU9Flda8CWDqkgE2/IZcPopCyfBck=";
|
hash = "sha256-QEuOMl1sbVdB2nRwBO/2adqj/NIQGbwrBqML39fymM0=";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [ pkg-config cmake ];
|
nativeBuildInputs = [ pkg-config cmake ];
|
||||||
|
|
|
@ -20,13 +20,13 @@
|
||||||
|
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
pname = "gridcoin-research";
|
pname = "gridcoin-research";
|
||||||
version = "5.4.7.0";
|
version = "5.4.8.0";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "gridcoin-community";
|
owner = "gridcoin-community";
|
||||||
repo = "Gridcoin-Research";
|
repo = "Gridcoin-Research";
|
||||||
rev = "${version}";
|
rev = "${version}";
|
||||||
sha256 = "sha256-wdXah7QnWohGAtC98exPSkhg5F3BaBOiFs6bklFxD7E=";
|
sha256 = "sha256-HZirzXkqM2aep+wq8k2UCFWHPtN0sBZXjamgt7RYPBo=";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
|
|
|
@ -6,19 +6,19 @@
|
||||||
|
|
||||||
buildGoModule rec {
|
buildGoModule rec {
|
||||||
pname = "optimism";
|
pname = "optimism";
|
||||||
version = "1.7.2";
|
version = "1.7.3";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "ethereum-optimism";
|
owner = "ethereum-optimism";
|
||||||
repo = "optimism";
|
repo = "optimism";
|
||||||
rev = "op-node/v${version}";
|
rev = "op-node/v${version}";
|
||||||
hash = "sha256-p3dbyszUeknAXrI1WqN9WS6AkEYQdVfMP90Kk/L41vM=";
|
hash = "sha256-KKCVjGBQeO5K6wq3GV3f7qaGY1uXNPI27w4DEC31pzU=";
|
||||||
fetchSubmodules = true;
|
fetchSubmodules = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
subPackages = [ "op-node/cmd" "op-proposer/cmd" "op-batcher/cmd" ];
|
subPackages = [ "op-node/cmd" "op-proposer/cmd" "op-batcher/cmd" ];
|
||||||
|
|
||||||
vendorHash = "sha256-24zj480UU9SYqr2mV6rCJ46gwLgzilLuhqrkNKHVR28=";
|
vendorHash = "sha256-pQhNXOYohBoV5QsBnNpNjFg+Vvk5jK1zvSKkolp4yiQ=";
|
||||||
|
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
libpcap
|
libpcap
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
{ lib, stdenv, fetchurl, fetchpatch, zlib, ncurses }:
|
{ lib, gccStdenv, fetchurl, fetchpatch, zlib, ncurses }:
|
||||||
|
|
||||||
|
let stdenv = gccStdenv;
|
||||||
|
in
|
||||||
stdenv.mkDerivation rec {
|
stdenv.mkDerivation rec {
|
||||||
pname = "aewan";
|
pname = "aewan";
|
||||||
version = "1.0.01";
|
version = "1.0.01";
|
||||||
|
|
|
@ -21,11 +21,21 @@
|
||||||
, gzip
|
, gzip
|
||||||
, fontconfig
|
, fontconfig
|
||||||
, freetype
|
, freetype
|
||||||
|
, libbsd
|
||||||
, libpulseaudio
|
, libpulseaudio
|
||||||
, libGL
|
, libGL
|
||||||
|
, libdrm
|
||||||
|
, libpng
|
||||||
, libuuid
|
, libuuid
|
||||||
, libX11
|
, libX11
|
||||||
, libxcb
|
, libxcb
|
||||||
|
, libxkbcommon
|
||||||
|
, xcbutilwm
|
||||||
|
, xcbutilrenderutil
|
||||||
|
, xcbutilkeysyms
|
||||||
|
, xcbutilimage
|
||||||
|
, xcbutilcursor
|
||||||
|
, libxkbfile
|
||||||
, libXcomposite
|
, libXcomposite
|
||||||
, libXcursor
|
, libXcursor
|
||||||
, libXdamage
|
, libXdamage
|
||||||
|
@ -51,6 +61,7 @@
|
||||||
, which
|
, which
|
||||||
, runCommand
|
, runCommand
|
||||||
, xkeyboard_config
|
, xkeyboard_config
|
||||||
|
, xorg
|
||||||
, zlib
|
, zlib
|
||||||
, makeDesktopItem
|
, makeDesktopItem
|
||||||
, tiling_wm # if we are using a tiling wm, need to set _JAVA_AWT_WM_NONREPARENTING in wrapper
|
, tiling_wm # if we are using a tiling wm, need to set _JAVA_AWT_WM_NONREPARENTING in wrapper
|
||||||
|
@ -136,15 +147,27 @@ let
|
||||||
alsa-lib
|
alsa-lib
|
||||||
dbus
|
dbus
|
||||||
expat
|
expat
|
||||||
|
libbsd
|
||||||
libpulseaudio
|
libpulseaudio
|
||||||
libuuid
|
libuuid
|
||||||
libX11
|
libX11
|
||||||
libxcb
|
libxcb
|
||||||
|
libxkbcommon
|
||||||
|
xcbutilwm
|
||||||
|
xcbutilrenderutil
|
||||||
|
xcbutilkeysyms
|
||||||
|
xcbutilimage
|
||||||
|
xcbutilcursor
|
||||||
|
xorg.libICE
|
||||||
|
xorg.libSM
|
||||||
|
libxkbfile
|
||||||
libXcomposite
|
libXcomposite
|
||||||
libXcursor
|
libXcursor
|
||||||
libXdamage
|
libXdamage
|
||||||
libXfixes
|
libXfixes
|
||||||
libGL
|
libGL
|
||||||
|
libdrm
|
||||||
|
libpng
|
||||||
nspr
|
nspr
|
||||||
nss_latest
|
nss_latest
|
||||||
systemd
|
systemd
|
||||||
|
|
|
@ -10,16 +10,16 @@ let
|
||||||
inherit tiling_wm;
|
inherit tiling_wm;
|
||||||
};
|
};
|
||||||
stableVersion = {
|
stableVersion = {
|
||||||
version = "2023.2.1.24"; # "Android Studio Iguana | 2023.2.1 Patch 1"
|
version = "2023.2.1.25"; # "Android Studio Iguana | 2023.2.1 Patch 2"
|
||||||
sha256Hash = "sha256-ACZCdXKEnJy7DJTW+XGOoIvDRdzP47NytUEAqV//mbU=";
|
sha256Hash = "sha256-zWPq1GfckqCP9rNpXAHVfoApdvxkrN3NMc1qJCf/obw=";
|
||||||
};
|
};
|
||||||
betaVersion = {
|
betaVersion = {
|
||||||
version = "2023.3.1.15"; # "Android Studio Jellyfish | 2023.3.1.1 Beta 2"
|
version = "2023.3.1.17"; # "Android Studio Jellyfish | 2023.3.1.1 RC 2"
|
||||||
sha256Hash = "sha256-ImXHda8Xbayuk+OMZVtAFsGNnaqm2PvI3lko2gUpIeU=";
|
sha256Hash = "sha256-zROBKzQiP4V2P67HgOIkHgn8q/M0zy5MkZozVSiQsWU=";
|
||||||
};
|
};
|
||||||
latestVersion = {
|
latestVersion = {
|
||||||
version = "2024.1.1.1"; # "Android Studio Koala | 2024.1.1 Canary 3"
|
version = "2024.1.1.2"; # "Android Studio Koala | 2024.1.1 Canary 4"
|
||||||
sha256Hash = "sha256-QNAudFlM+1QAZg+EYgiIknllai4N1wj55ZnkUWho7ps=";
|
sha256Hash = "sha256-d/bzgKimps0Tw7GQD9sc2LLDNaVpWlqNTKkuyxKrCWo=";
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
# Attributes are named by their corresponding release channels
|
# Attributes are named by their corresponding release channels
|
||||||
|
|
|
@ -3,18 +3,18 @@
|
||||||
"clion": {
|
"clion": {
|
||||||
"update-channel": "CLion RELEASE",
|
"update-channel": "CLion RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}.tar.gz",
|
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}.tar.gz",
|
||||||
"version": "2023.3.4",
|
"version": "2024.1",
|
||||||
"sha256": "eae2e1646387ee36a2f24c10d924647fd3d00bb31dd42e9c17438ae7aecf79a8",
|
"sha256": "a753369d74832d15fcf082587291921e8a90be04529c05b8e9d64a3afb24120c",
|
||||||
"url": "https://download.jetbrains.com/cpp/CLion-2023.3.4.tar.gz",
|
"url": "https://download.jetbrains.com/cpp/CLion-2024.1.tar.gz",
|
||||||
"build_number": "233.14475.31"
|
"build_number": "241.14494.288"
|
||||||
},
|
},
|
||||||
"datagrip": {
|
"datagrip": {
|
||||||
"update-channel": "DataGrip RELEASE",
|
"update-channel": "DataGrip RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}.tar.gz",
|
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}.tar.gz",
|
||||||
"version": "2024.1",
|
"version": "2024.1.1",
|
||||||
"sha256": "cc77892adcbf28b1a2205908466cca9c80217162cdac020d25d258a84cbb88d3",
|
"sha256": "05c1f910126b8499d26ab52d333307d3b6df6a3fa06b5e0b1a79ff15caf40e0a",
|
||||||
"url": "https://download.jetbrains.com/datagrip/datagrip-2024.1.tar.gz",
|
"url": "https://download.jetbrains.com/datagrip/datagrip-2024.1.1.tar.gz",
|
||||||
"build_number": "241.14494.251"
|
"build_number": "241.14494.283"
|
||||||
},
|
},
|
||||||
"dataspell": {
|
"dataspell": {
|
||||||
"update-channel": "DataSpell RELEASE",
|
"update-channel": "DataSpell RELEASE",
|
||||||
|
@ -92,10 +92,10 @@
|
||||||
"rider": {
|
"rider": {
|
||||||
"update-channel": "Rider RELEASE",
|
"update-channel": "Rider RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.tar.gz",
|
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.tar.gz",
|
||||||
"version": "2023.3.4",
|
"version": "2024.1",
|
||||||
"sha256": "fb137ea346d957f151cb0d7755661293ae5e33e36f306b6dc90fb42895443309",
|
"sha256": "194096b0b550e1e320fc72aaf0510faeebf8737d05f6e02eecd72efe6f7cd757",
|
||||||
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2023.3.4.tar.gz",
|
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2024.1.tar.gz",
|
||||||
"build_number": "233.14475.66"
|
"build_number": "241.14494.307"
|
||||||
},
|
},
|
||||||
"ruby-mine": {
|
"ruby-mine": {
|
||||||
"update-channel": "RubyMine RELEASE",
|
"update-channel": "RubyMine RELEASE",
|
||||||
|
@ -126,18 +126,18 @@
|
||||||
"clion": {
|
"clion": {
|
||||||
"update-channel": "CLion RELEASE",
|
"update-channel": "CLion RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}-aarch64.tar.gz",
|
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}-aarch64.tar.gz",
|
||||||
"version": "2023.3.4",
|
"version": "2024.1",
|
||||||
"sha256": "fa427be85ead8e2769aeadf19ce816cb7f02c3b08ec3b4cc7e0cddea44386dc8",
|
"sha256": "f937b263bd697595427e3e1d04513f9b6a786d56214ce34fe7a038efa2e949cf",
|
||||||
"url": "https://download.jetbrains.com/cpp/CLion-2023.3.4-aarch64.tar.gz",
|
"url": "https://download.jetbrains.com/cpp/CLion-2024.1-aarch64.tar.gz",
|
||||||
"build_number": "233.14475.31"
|
"build_number": "241.14494.288"
|
||||||
},
|
},
|
||||||
"datagrip": {
|
"datagrip": {
|
||||||
"update-channel": "DataGrip RELEASE",
|
"update-channel": "DataGrip RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}-aarch64.tar.gz",
|
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}-aarch64.tar.gz",
|
||||||
"version": "2024.1",
|
"version": "2024.1.1",
|
||||||
"sha256": "b293ed99d29510422090736c4e30a0ccd3974fc01ecce7a9f5f497c34b8ea077",
|
"sha256": "d269bfe10fb97572e785dce6e387d09f429396db002e12ecb9a44cced915c032",
|
||||||
"url": "https://download.jetbrains.com/datagrip/datagrip-2024.1-aarch64.tar.gz",
|
"url": "https://download.jetbrains.com/datagrip/datagrip-2024.1.1-aarch64.tar.gz",
|
||||||
"build_number": "241.14494.251"
|
"build_number": "241.14494.283"
|
||||||
},
|
},
|
||||||
"dataspell": {
|
"dataspell": {
|
||||||
"update-channel": "DataSpell RELEASE",
|
"update-channel": "DataSpell RELEASE",
|
||||||
|
@ -215,10 +215,10 @@
|
||||||
"rider": {
|
"rider": {
|
||||||
"update-channel": "Rider RELEASE",
|
"update-channel": "Rider RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.tar.gz",
|
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.tar.gz",
|
||||||
"version": "2023.3.4",
|
"version": "2024.1",
|
||||||
"sha256": "99c80997bd0d2b8b918ef81fbbe7b422e165665c8fa3d108b1387ca0188c9558",
|
"sha256": "e196c8e70d7eb6f56a08df809f5de430bf5e61509abb13de8b301c036c4f446e",
|
||||||
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2023.3.4-aarch64.tar.gz",
|
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2024.1-aarch64.tar.gz",
|
||||||
"build_number": "233.14475.66"
|
"build_number": "241.14494.307"
|
||||||
},
|
},
|
||||||
"ruby-mine": {
|
"ruby-mine": {
|
||||||
"update-channel": "RubyMine RELEASE",
|
"update-channel": "RubyMine RELEASE",
|
||||||
|
@ -249,18 +249,18 @@
|
||||||
"clion": {
|
"clion": {
|
||||||
"update-channel": "CLion RELEASE",
|
"update-channel": "CLion RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}.dmg",
|
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}.dmg",
|
||||||
"version": "2023.3.4",
|
"version": "2024.1",
|
||||||
"sha256": "2eb149d2bbf1c778f3386bc9cf7b11741b4372e69c680def31260b9aa213159e",
|
"sha256": "373c78ff045a17fdcae44cc9b76b41862d4bee9c8476813e518c7cc1de88b6a1",
|
||||||
"url": "https://download.jetbrains.com/cpp/CLion-2023.3.4.dmg",
|
"url": "https://download.jetbrains.com/cpp/CLion-2024.1.dmg",
|
||||||
"build_number": "233.14475.31"
|
"build_number": "241.14494.288"
|
||||||
},
|
},
|
||||||
"datagrip": {
|
"datagrip": {
|
||||||
"update-channel": "DataGrip RELEASE",
|
"update-channel": "DataGrip RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}.dmg",
|
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}.dmg",
|
||||||
"version": "2024.1",
|
"version": "2024.1.1",
|
||||||
"sha256": "8a76d76466b62da1a68d08a066a56319b81e3cab09b57ab11822bf4373def6ce",
|
"sha256": "232582204a6f810bcbd2387ba2cef824f0f81c3a7e022f7f2bebf643d32f866d",
|
||||||
"url": "https://download.jetbrains.com/datagrip/datagrip-2024.1.dmg",
|
"url": "https://download.jetbrains.com/datagrip/datagrip-2024.1.1.dmg",
|
||||||
"build_number": "241.14494.251"
|
"build_number": "241.14494.283"
|
||||||
},
|
},
|
||||||
"dataspell": {
|
"dataspell": {
|
||||||
"update-channel": "DataSpell RELEASE",
|
"update-channel": "DataSpell RELEASE",
|
||||||
|
@ -338,10 +338,10 @@
|
||||||
"rider": {
|
"rider": {
|
||||||
"update-channel": "Rider RELEASE",
|
"update-channel": "Rider RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.dmg",
|
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}.dmg",
|
||||||
"version": "2023.3.4",
|
"version": "2024.1",
|
||||||
"sha256": "00435dc8d9dd43bbd73a55be7d5b304be8ee124032a7485750aef86cddc53ba2",
|
"sha256": "12155c779c7f11dd71b3573af266c0221960eaea8a442fda4faaec8ca6eefa95",
|
||||||
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2023.3.4.dmg",
|
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2024.1.dmg",
|
||||||
"build_number": "233.14475.66"
|
"build_number": "241.14494.307"
|
||||||
},
|
},
|
||||||
"ruby-mine": {
|
"ruby-mine": {
|
||||||
"update-channel": "RubyMine RELEASE",
|
"update-channel": "RubyMine RELEASE",
|
||||||
|
@ -372,18 +372,18 @@
|
||||||
"clion": {
|
"clion": {
|
||||||
"update-channel": "CLion RELEASE",
|
"update-channel": "CLion RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}-aarch64.dmg",
|
"url-template": "https://download.jetbrains.com/cpp/CLion-{version}-aarch64.dmg",
|
||||||
"version": "2023.3.4",
|
"version": "2024.1",
|
||||||
"sha256": "340d239008c38743a10e51ae609ec3bf3dd732cf2042ef997532c6b8ed272b1a",
|
"sha256": "b1044fdbf9e3f93aaf8ca8ad2b7bc2eae165f86bc5cae6910f2ad0ee92c198a5",
|
||||||
"url": "https://download.jetbrains.com/cpp/CLion-2023.3.4-aarch64.dmg",
|
"url": "https://download.jetbrains.com/cpp/CLion-2024.1-aarch64.dmg",
|
||||||
"build_number": "233.14475.31"
|
"build_number": "241.14494.288"
|
||||||
},
|
},
|
||||||
"datagrip": {
|
"datagrip": {
|
||||||
"update-channel": "DataGrip RELEASE",
|
"update-channel": "DataGrip RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}-aarch64.dmg",
|
"url-template": "https://download.jetbrains.com/datagrip/datagrip-{version}-aarch64.dmg",
|
||||||
"version": "2024.1",
|
"version": "2024.1.1",
|
||||||
"sha256": "a5e92addc3f098670814c4d5660f275f997eaa958e9eb24007f862cfb74b8118",
|
"sha256": "c2545df9784fa1f8f9234dd93d1c513ed691c797f26471cb545188ce7f495864",
|
||||||
"url": "https://download.jetbrains.com/datagrip/datagrip-2024.1-aarch64.dmg",
|
"url": "https://download.jetbrains.com/datagrip/datagrip-2024.1.1-aarch64.dmg",
|
||||||
"build_number": "241.14494.251"
|
"build_number": "241.14494.283"
|
||||||
},
|
},
|
||||||
"dataspell": {
|
"dataspell": {
|
||||||
"update-channel": "DataSpell RELEASE",
|
"update-channel": "DataSpell RELEASE",
|
||||||
|
@ -461,10 +461,10 @@
|
||||||
"rider": {
|
"rider": {
|
||||||
"update-channel": "Rider RELEASE",
|
"update-channel": "Rider RELEASE",
|
||||||
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.dmg",
|
"url-template": "https://download.jetbrains.com/rider/JetBrains.Rider-{version}-aarch64.dmg",
|
||||||
"version": "2023.3.4",
|
"version": "2024.1",
|
||||||
"sha256": "8ffd13dcc2207d4a781dc92e89643767e0dd6ef53024c92669f4daaf9cf929c0",
|
"sha256": "c2e0dadc6c7f924e849e87d1c04aeaa02d6a14d5868294dd36481a70cbd508cb",
|
||||||
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2023.3.4-aarch64.dmg",
|
"url": "https://download.jetbrains.com/rider/JetBrains.Rider-2024.1-aarch64.dmg",
|
||||||
"build_number": "233.14475.66"
|
"build_number": "241.14494.307"
|
||||||
},
|
},
|
||||||
"ruby-mine": {
|
"ruby-mine": {
|
||||||
"update-channel": "RubyMine RELEASE",
|
"update-channel": "RubyMine RELEASE",
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
|
@ -27,7 +25,9 @@
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
"241.14494.241": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip"
|
"241.14494.283": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip"
|
||||||
},
|
},
|
||||||
"name": "ideavim"
|
"name": "ideavim"
|
||||||
},
|
},
|
||||||
|
@ -42,13 +42,32 @@
|
||||||
},
|
},
|
||||||
"6954": {
|
"6954": {
|
||||||
"compatible": [
|
"compatible": [
|
||||||
|
"clion",
|
||||||
|
"datagrip",
|
||||||
|
"goland",
|
||||||
"idea-community",
|
"idea-community",
|
||||||
"idea-ultimate",
|
"idea-ultimate",
|
||||||
"mps"
|
"mps",
|
||||||
|
"phpstorm",
|
||||||
|
"pycharm-community",
|
||||||
|
"pycharm-professional",
|
||||||
|
"rider",
|
||||||
|
"ruby-mine",
|
||||||
|
"rust-rover",
|
||||||
|
"webstorm"
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": null,
|
"233.13135.979": null,
|
||||||
"241.14494.240": null
|
"233.15026.24": null,
|
||||||
|
"241.14494.234": null,
|
||||||
|
"241.14494.235": null,
|
||||||
|
"241.14494.237": null,
|
||||||
|
"241.14494.238": null,
|
||||||
|
"241.14494.240": null,
|
||||||
|
"241.14494.241": null,
|
||||||
|
"241.14494.283": null,
|
||||||
|
"241.14494.288": null,
|
||||||
|
"241.14494.307": null
|
||||||
},
|
},
|
||||||
"name": "kotlin"
|
"name": "kotlin"
|
||||||
},
|
},
|
||||||
|
@ -70,8 +89,6 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": null,
|
"233.13135.979": null,
|
||||||
"233.14475.31": null,
|
|
||||||
"233.14475.66": null,
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/6981/509027/ini-233.15026.15.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/6981/509027/ini-233.15026.15.zip",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
||||||
|
@ -79,7 +96,9 @@
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
"241.14494.241": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip"
|
"241.14494.283": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip"
|
||||||
},
|
},
|
||||||
"name": "ini"
|
"name": "ini"
|
||||||
},
|
},
|
||||||
|
@ -89,8 +108,8 @@
|
||||||
"phpstorm"
|
"phpstorm"
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"241.14494.237": "https://plugins.jetbrains.com/files/7219/514919/Symfony_Plugin-2023.1.267.zip",
|
"241.14494.237": "https://plugins.jetbrains.com/files/7219/518876/Symfony_Plugin-2023.1.268.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/7219/514919/Symfony_Plugin-2023.1.267.zip"
|
"241.14494.240": "https://plugins.jetbrains.com/files/7219/518876/Symfony_Plugin-2023.1.268.zip"
|
||||||
},
|
},
|
||||||
"name": "symfony-support"
|
"name": "symfony-support"
|
||||||
},
|
},
|
||||||
|
@ -114,11 +133,11 @@
|
||||||
"rust-rover"
|
"rust-rover"
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/7322/484110/python-ce-233.14475.9.zip",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/7322/502153/python-ce-233.14808.12.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/7322/502153/python-ce-233.14808.12.zip",
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip"
|
"241.14494.283": "https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip"
|
||||||
},
|
},
|
||||||
"name": "python-community-edition"
|
"name": "python-community-edition"
|
||||||
},
|
},
|
||||||
|
@ -139,15 +158,15 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/8182/466854/intellij-rust-233.15445.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/8182/466854/intellij-rust-233.15445.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/8182/466854/intellij-rust-233.15445.zip",
|
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/8182/466854/intellij-rust-233.15445.zip",
|
|
||||||
"241.14494.234": null,
|
"241.14494.234": null,
|
||||||
"241.14494.235": null,
|
"241.14494.235": null,
|
||||||
"241.14494.237": null,
|
"241.14494.237": null,
|
||||||
"241.14494.238": null,
|
"241.14494.238": null,
|
||||||
"241.14494.240": null,
|
"241.14494.240": null,
|
||||||
"241.14494.241": null,
|
"241.14494.241": null,
|
||||||
"241.14494.251": null
|
"241.14494.283": null,
|
||||||
|
"241.14494.288": null,
|
||||||
|
"241.14494.307": null
|
||||||
},
|
},
|
||||||
"name": "-deprecated-rust"
|
"name": "-deprecated-rust"
|
||||||
},
|
},
|
||||||
|
@ -168,15 +187,15 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": null,
|
"233.13135.979": null,
|
||||||
"233.14475.31": null,
|
|
||||||
"233.14475.66": null,
|
|
||||||
"241.14494.234": null,
|
"241.14494.234": null,
|
||||||
"241.14494.235": null,
|
"241.14494.235": null,
|
||||||
"241.14494.237": null,
|
"241.14494.237": null,
|
||||||
"241.14494.238": null,
|
"241.14494.238": null,
|
||||||
"241.14494.240": null,
|
"241.14494.240": null,
|
||||||
"241.14494.241": null,
|
"241.14494.241": null,
|
||||||
"241.14494.251": null
|
"241.14494.283": null,
|
||||||
|
"241.14494.288": null,
|
||||||
|
"241.14494.307": null
|
||||||
},
|
},
|
||||||
"name": "-deprecated-rust-beta"
|
"name": "-deprecated-rust-beta"
|
||||||
},
|
},
|
||||||
|
@ -214,17 +233,17 @@
|
||||||
"webstorm"
|
"webstorm"
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/8607/422943/NixIDEA-0.4.0.11.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/8607/422943/NixIDEA-0.4.0.11.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/8607/422943/NixIDEA-0.4.0.11.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/8607/422943/NixIDEA-0.4.0.11.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"241.14494.234": null,
|
"241.14494.237": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"241.14494.235": null,
|
"241.14494.238": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"241.14494.237": null,
|
"241.14494.240": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"241.14494.238": null,
|
"241.14494.241": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"241.14494.240": null,
|
"241.14494.283": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"241.14494.241": null,
|
"241.14494.288": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip",
|
||||||
"241.14494.251": null
|
"241.14494.307": "https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip"
|
||||||
},
|
},
|
||||||
"name": "nixidea"
|
"name": "nixidea"
|
||||||
},
|
},
|
||||||
|
@ -257,8 +276,6 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/10037/493012/CSVEditor-3.3.0-233.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/10037/493012/CSVEditor-3.3.0-233.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/10037/493012/CSVEditor-3.3.0-233.zip",
|
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/10037/493012/CSVEditor-3.3.0-233.zip",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/10037/493012/CSVEditor-3.3.0-233.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/10037/493012/CSVEditor-3.3.0-233.zip",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
||||||
|
@ -266,7 +283,9 @@
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
"241.14494.241": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip"
|
"241.14494.283": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/10037/493010/CSVEditor-3.3.0-241.zip"
|
||||||
},
|
},
|
||||||
"name": "csv-editor"
|
"name": "csv-editor"
|
||||||
},
|
},
|
||||||
|
@ -288,8 +307,6 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/12062/445740/keymap-vscode-233.11799.188.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/12062/445740/keymap-vscode-233.11799.188.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/12062/445740/keymap-vscode-233.11799.188.zip",
|
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/12062/445740/keymap-vscode-233.11799.188.zip",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/12062/445740/keymap-vscode-233.11799.188.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/12062/445740/keymap-vscode-233.11799.188.zip",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
||||||
|
@ -297,7 +314,9 @@
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
"241.14494.241": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip"
|
"241.14494.283": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/12062/508223/keymap-vscode-241.14494.150.zip"
|
||||||
},
|
},
|
||||||
"name": "vscode-keymap"
|
"name": "vscode-keymap"
|
||||||
},
|
},
|
||||||
|
@ -319,8 +338,6 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/12559/445772/keymap-eclipse-233.11799.165.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/12559/445772/keymap-eclipse-233.11799.165.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/12559/445772/keymap-eclipse-233.11799.165.zip",
|
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/12559/445772/keymap-eclipse-233.11799.165.zip",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/12559/445772/keymap-eclipse-233.11799.165.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/12559/445772/keymap-eclipse-233.11799.165.zip",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
||||||
|
@ -328,7 +345,9 @@
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
"241.14494.241": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip"
|
"241.14494.283": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/12559/508216/keymap-eclipse-241.14494.150.zip"
|
||||||
},
|
},
|
||||||
"name": "eclipse-keymap"
|
"name": "eclipse-keymap"
|
||||||
},
|
},
|
||||||
|
@ -350,8 +369,6 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/13017/445774/keymap-visualStudio-233.11799.165.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/13017/445774/keymap-visualStudio-233.11799.165.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/13017/445774/keymap-visualStudio-233.11799.165.zip",
|
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/13017/445774/keymap-visualStudio-233.11799.165.zip",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/13017/445774/keymap-visualStudio-233.11799.165.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/13017/445774/keymap-visualStudio-233.11799.165.zip",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
||||||
|
@ -359,7 +376,9 @@
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
"241.14494.241": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip"
|
"241.14494.283": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip"
|
||||||
},
|
},
|
||||||
"name": "visual-studio-keymap"
|
"name": "visual-studio-keymap"
|
||||||
},
|
},
|
||||||
|
@ -381,8 +400,6 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
"233.13135.979": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
"233.15026.24": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
"241.14494.234": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
"241.14494.235": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
|
@ -390,7 +407,9 @@
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
"241.14494.238": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
"241.14494.240": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
"241.14494.241": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar"
|
"241.14494.283": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar"
|
||||||
},
|
},
|
||||||
"name": "darcula-pitch-black"
|
"name": "darcula-pitch-black"
|
||||||
},
|
},
|
||||||
|
@ -411,17 +430,17 @@
|
||||||
"webstorm"
|
"webstorm"
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"241.14494.237": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"241.14494.237": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"241.14494.241": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"241.14494.283": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip",
|
"241.14494.288": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip"
|
"241.14494.307": "https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip"
|
||||||
},
|
},
|
||||||
"name": "github-copilot"
|
"name": "github-copilot"
|
||||||
},
|
},
|
||||||
|
@ -443,8 +462,6 @@
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.13135.979": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
"233.13135.979": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
|
||||||
"233.14475.66": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
"241.14494.234": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
"241.14494.234": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
"241.14494.235": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
"241.14494.235": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
|
@ -452,7 +469,9 @@
|
||||||
"241.14494.238": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
"241.14494.238": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
"241.14494.240": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
"241.14494.241": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
"241.14494.241": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
"241.14494.251": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip"
|
"241.14494.283": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip",
|
||||||
|
"241.14494.307": "https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip"
|
||||||
},
|
},
|
||||||
"name": "netbeans-6-5-keymap"
|
"name": "netbeans-6-5-keymap"
|
||||||
},
|
},
|
||||||
|
@ -463,9 +482,9 @@
|
||||||
"rust-rover"
|
"rust-rover"
|
||||||
],
|
],
|
||||||
"builds": {
|
"builds": {
|
||||||
"233.14475.31": "https://plugins.jetbrains.com/files/22407/515371/intellij-rust-233.25026.24.zip",
|
|
||||||
"233.15026.24": "https://plugins.jetbrains.com/files/22407/515371/intellij-rust-233.25026.24.zip",
|
"233.15026.24": "https://plugins.jetbrains.com/files/22407/515371/intellij-rust-233.25026.24.zip",
|
||||||
"241.14494.240": "https://plugins.jetbrains.com/files/22407/515370/intellij-rust-241.25026.24.zip"
|
"241.14494.240": "https://plugins.jetbrains.com/files/22407/515370/intellij-rust-241.25026.24.zip",
|
||||||
|
"241.14494.288": "https://plugins.jetbrains.com/files/22407/515370/intellij-rust-241.25026.24.zip"
|
||||||
},
|
},
|
||||||
"name": "rust"
|
"name": "rust"
|
||||||
}
|
}
|
||||||
|
@ -481,21 +500,20 @@
|
||||||
"https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip": "sha256-tNgt0vIkdCB/LcaSj58mT6cNlw4lytRo0cZSt7sIERU=",
|
"https://plugins.jetbrains.com/files/13017/508253/keymap-visualStudio-241.14494.150.zip": "sha256-tNgt0vIkdCB/LcaSj58mT6cNlw4lytRo0cZSt7sIERU=",
|
||||||
"https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar": "sha256-eXInfAqY3yEZRXCAuv3KGldM1pNKEioNwPB0rIGgJFw=",
|
"https://plugins.jetbrains.com/files/14059/82616/darcula-pitch-black.jar": "sha256-eXInfAqY3yEZRXCAuv3KGldM1pNKEioNwPB0rIGgJFw=",
|
||||||
"https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip": "sha256-FP6th8J3ymfTrwvJ3Ms7fsNPh3f9ab5ZVg5yPpKV/rY=",
|
"https://plugins.jetbrains.com/files/164/515255/IdeaVim-2.10.2-signed.zip": "sha256-FP6th8J3ymfTrwvJ3Ms7fsNPh3f9ab5ZVg5yPpKV/rY=",
|
||||||
"https://plugins.jetbrains.com/files/17718/512366/github-copilot-intellij-1.5.1.5285.zip": "sha256-lep8ZUOjbV0tsfO/yEWJiHWtwm639zxpc/7L9rCKSsU=",
|
"https://plugins.jetbrains.com/files/17718/517133/github-copilot-intellij-1.5.2.5345.zip": "sha256-BaBYXN8eulaJtJSKrz9bZ2Yn8029goSAUvjYU+BaiIU=",
|
||||||
"https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip": "sha256-KrzZTKZMQqoEMw+vDUv2jjs0EX0leaPBkU8H/ecq/oI=",
|
"https://plugins.jetbrains.com/files/18444/165585/NetBeans6.5Keymap.zip": "sha256-KrzZTKZMQqoEMw+vDUv2jjs0EX0leaPBkU8H/ecq/oI=",
|
||||||
"https://plugins.jetbrains.com/files/22407/515370/intellij-rust-241.25026.24.zip": "sha256-tBPoO2EkPaWFZ/Gu3UAkZPy4opssWJQEVlz9GZUkNtQ=",
|
"https://plugins.jetbrains.com/files/22407/515370/intellij-rust-241.25026.24.zip": "sha256-tBPoO2EkPaWFZ/Gu3UAkZPy4opssWJQEVlz9GZUkNtQ=",
|
||||||
"https://plugins.jetbrains.com/files/22407/515371/intellij-rust-233.25026.24.zip": "sha256-j4b4To8jY4orP87GpphHPtLKeAPDNXcLNSUlIXDDy2Q=",
|
"https://plugins.jetbrains.com/files/22407/515371/intellij-rust-233.25026.24.zip": "sha256-j4b4To8jY4orP87GpphHPtLKeAPDNXcLNSUlIXDDy2Q=",
|
||||||
"https://plugins.jetbrains.com/files/631/513581/python-241.14494.240.zip": "sha256-pQP1LF/6uImQpBOpxUGE8KmmFh26kiC4YaYLAHnEc3o=",
|
"https://plugins.jetbrains.com/files/631/513581/python-241.14494.240.zip": "sha256-pQP1LF/6uImQpBOpxUGE8KmmFh26kiC4YaYLAHnEc3o=",
|
||||||
"https://plugins.jetbrains.com/files/6981/509027/ini-233.15026.15.zip": "sha256-6sTD+OFO/yA7m5o0XqoJKLcQ4zAFro7Iy7WNPfA49xM=",
|
"https://plugins.jetbrains.com/files/6981/509027/ini-233.15026.15.zip": "sha256-6sTD+OFO/yA7m5o0XqoJKLcQ4zAFro7Iy7WNPfA49xM=",
|
||||||
"https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip": "sha256-QC42nC7mEE3X1cmKj8jkwzpDJzX7ZoOPEd9y6i8IuvM=",
|
"https://plugins.jetbrains.com/files/6981/513562/ini-241.14494.240.zip": "sha256-QC42nC7mEE3X1cmKj8jkwzpDJzX7ZoOPEd9y6i8IuvM=",
|
||||||
"https://plugins.jetbrains.com/files/7219/514919/Symfony_Plugin-2023.1.267.zip": "sha256-zhnoxJgJJDgSnLdaNRrqS767YuvAzm8sXzhz9e2G0+8=",
|
"https://plugins.jetbrains.com/files/7219/518876/Symfony_Plugin-2023.1.268.zip": "sha256-mYEuFdSaxw9Lc8yNgPB0ty6mfxjKaAa/jY6v4E2Qo0Q=",
|
||||||
"https://plugins.jetbrains.com/files/7320/507957/PHP_Annotations-10.0.0.zip": "sha256-JIZ6Iq3sOcAm8fBXnjRrG9dqCZuD/WajyVmn1JjYMBA=",
|
"https://plugins.jetbrains.com/files/7320/507957/PHP_Annotations-10.0.0.zip": "sha256-JIZ6Iq3sOcAm8fBXnjRrG9dqCZuD/WajyVmn1JjYMBA=",
|
||||||
"https://plugins.jetbrains.com/files/7322/484110/python-ce-233.14475.9.zip": "sha256-YMB/ewCKE1F/JXI8iau9pKkv9D5D9a8OiTVukkzTocA=",
|
|
||||||
"https://plugins.jetbrains.com/files/7322/502153/python-ce-233.14808.12.zip": "sha256-PUBR9krJ26QrL2jTus0b+uhzkEkT+lGnBKy1f4i/U+w=",
|
"https://plugins.jetbrains.com/files/7322/502153/python-ce-233.14808.12.zip": "sha256-PUBR9krJ26QrL2jTus0b+uhzkEkT+lGnBKy1f4i/U+w=",
|
||||||
"https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip": "sha256-6YC/aoiTRLAh87C2v3k24BLBH/tsdTWuDK/CBv8y1QI=",
|
"https://plugins.jetbrains.com/files/7322/513587/python-ce-241.14494.240.zip": "sha256-6YC/aoiTRLAh87C2v3k24BLBH/tsdTWuDK/CBv8y1QI=",
|
||||||
"https://plugins.jetbrains.com/files/8182/466854/intellij-rust-233.15445.zip": "sha256-+Lc/avYBLpyIV63DlbhAJtieHDv4HdggqdGFDw9iqN0=",
|
"https://plugins.jetbrains.com/files/8182/466854/intellij-rust-233.15445.zip": "sha256-+Lc/avYBLpyIV63DlbhAJtieHDv4HdggqdGFDw9iqN0=",
|
||||||
"https://plugins.jetbrains.com/files/8554/508289/featuresTrainer-241.14494.150.zip": "sha256-D2gF9bLAEFd1+6vZskiM2Eyl5e8hmyh/VHrmW2NociE=",
|
"https://plugins.jetbrains.com/files/8554/508289/featuresTrainer-241.14494.150.zip": "sha256-D2gF9bLAEFd1+6vZskiM2Eyl5e8hmyh/VHrmW2NociE=",
|
||||||
"https://plugins.jetbrains.com/files/8607/422943/NixIDEA-0.4.0.11.zip": "sha256-Dwitpu5yLPWx+IUilpN5iqnN8FkKgaxUNjroBEx5lkM=",
|
"https://plugins.jetbrains.com/files/8607/519418/NixIDEA-0.4.0.12.zip": "sha256-D2HFG2tQy719+baHjUyizoq67tv6lDZrX3s6HDlBRA0=",
|
||||||
"https://plugins.jetbrains.com/files/9568/513582/go-plugin-241.14494.240.zip": "sha256-66Gx4XFn5DEZ/wCkN7IFQKtp+P0R9PoEAXmwOB97Q3A="
|
"https://plugins.jetbrains.com/files/9568/513582/go-plugin-241.14494.240.zip": "sha256-66Gx4XFn5DEZ/wCkN7IFQKtp+P0R9PoEAXmwOB97Q3A="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
{ lib, buildFHSEnv, callPackage, makeDesktopItem, writeScript, runtimeShell
|
{ lib, buildFHSEnv, callPackage, makeDesktopItem, writeScript, runtimeShell
|
||||||
, runCommand, quartus-prime-lite
|
, runCommand, unstick, quartus-prime-lite
|
||||||
|
, withQuesta ? true
|
||||||
, supportedDevices ? [ "Arria II" "Cyclone V" "Cyclone IV" "Cyclone 10 LP" "MAX II/V" "MAX 10 FPGA" ]
|
, supportedDevices ? [ "Arria II" "Cyclone V" "Cyclone IV" "Cyclone 10 LP" "MAX II/V" "MAX 10 FPGA" ]
|
||||||
, unwrapped ? callPackage ./quartus.nix { inherit supportedDevices; }
|
, unwrapped ? callPackage ./quartus.nix { inherit unstick supportedDevices withQuesta; }
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
|
@ -18,11 +19,12 @@ in buildFHSEnv rec {
|
||||||
name = "quartus-prime-lite"; # wrapped
|
name = "quartus-prime-lite"; # wrapped
|
||||||
|
|
||||||
targetPkgs = pkgs: with pkgs; [
|
targetPkgs = pkgs: with pkgs; [
|
||||||
(runCommand "ld-lsb-compat" {} ''
|
(runCommand "ld-lsb-compat" {} (''
|
||||||
mkdir -p "$out/lib"
|
mkdir -p "$out/lib"
|
||||||
ln -sr "${glibc}/lib/ld-linux-x86-64.so.2" "$out/lib/ld-lsb-x86-64.so.3"
|
ln -sr "${glibc}/lib/ld-linux-x86-64.so.2" "$out/lib/ld-lsb-x86-64.so.3"
|
||||||
|
'' + lib.optionalString withQuesta ''
|
||||||
ln -sr "${pkgsi686Linux.glibc}/lib/ld-linux.so.2" "$out/lib/ld-lsb.so.3"
|
ln -sr "${pkgsi686Linux.glibc}/lib/ld-linux.so.2" "$out/lib/ld-lsb.so.3"
|
||||||
'')
|
''))
|
||||||
# quartus requirements
|
# quartus requirements
|
||||||
glib
|
glib
|
||||||
xorg.libICE
|
xorg.libICE
|
||||||
|
@ -37,11 +39,14 @@ in buildFHSEnv rec {
|
||||||
# qsys requirements
|
# qsys requirements
|
||||||
xorg.libXtst
|
xorg.libXtst
|
||||||
xorg.libXi
|
xorg.libXi
|
||||||
|
dejavu_fonts
|
||||||
|
gnumake
|
||||||
];
|
];
|
||||||
|
|
||||||
# Also support 32-bit executables.
|
# Also support 32-bit executables used by simulator.
|
||||||
multiArch = true;
|
multiArch = withQuesta;
|
||||||
|
|
||||||
|
# these libs are installed as 64 bit, plus as 32 bit when multiArch is true
|
||||||
multiPkgs = pkgs: with pkgs; let
|
multiPkgs = pkgs: with pkgs; let
|
||||||
# This seems ugly - can we override `libpng = libpng12` for all `pkgs`?
|
# This seems ugly - can we override `libpng = libpng12` for all `pkgs`?
|
||||||
freetype = pkgs.freetype.override { libpng = libpng12; };
|
freetype = pkgs.freetype.override { libpng = libpng12; };
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{ stdenv, lib, unstick, fetchurl
|
{ stdenv, lib, unstick, fetchurl
|
||||||
|
, withQuesta ? true
|
||||||
, supportedDevices ? [ "Arria II" "Cyclone V" "Cyclone IV" "Cyclone 10 LP" "MAX II/V" "MAX 10 FPGA" ]
|
, supportedDevices ? [ "Arria II" "Cyclone V" "Cyclone IV" "Cyclone 10 LP" "MAX II/V" "MAX 10 FPGA" ]
|
||||||
}:
|
}:
|
||||||
|
|
||||||
|
@ -41,26 +42,25 @@ let
|
||||||
url = "https://downloads.intel.com/akdlm/software/acdsinst/${lib.versions.majorMinor version}std/${lib.elemAt (lib.splitVersion version) 4}/ib_installers/${name}";
|
url = "https://downloads.intel.com/akdlm/software/acdsinst/${lib.versions.majorMinor version}std/${lib.elemAt (lib.splitVersion version) 4}/ib_installers/${name}";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
installers = map download ([{
|
||||||
|
name = "QuartusLiteSetup-${version}-linux.run";
|
||||||
|
sha256 = "1mg4db56rg407kdsvpzys96z59bls8djyddfzxi6bdikcklxz98h";
|
||||||
|
}] ++ lib.optional withQuesta {
|
||||||
|
name = "QuestaSetup-${version}-linux.run";
|
||||||
|
sha256 = "0f9lyphk4vf4ijif3kb4iqf18jl357z9h8g16kwnzaqwfngh2ixk";
|
||||||
|
});
|
||||||
|
components = map (id: download {
|
||||||
|
name = "${id}-${version}.qdz";
|
||||||
|
sha256 = lib.getAttr id componentHashes;
|
||||||
|
}) (lib.attrValues supportedDeviceIds);
|
||||||
|
|
||||||
in stdenv.mkDerivation rec {
|
in stdenv.mkDerivation rec {
|
||||||
inherit version;
|
inherit version;
|
||||||
pname = "quartus-prime-lite-unwrapped";
|
pname = "quartus-prime-lite-unwrapped";
|
||||||
|
|
||||||
src = map download ([{
|
|
||||||
name = "QuartusLiteSetup-${version}-linux.run";
|
|
||||||
sha256 = "1mg4db56rg407kdsvpzys96z59bls8djyddfzxi6bdikcklxz98h";
|
|
||||||
} {
|
|
||||||
name = "QuestaSetup-${version}-linux.run";
|
|
||||||
sha256 = "0f9lyphk4vf4ijif3kb4iqf18jl357z9h8g16kwnzaqwfngh2ixk";
|
|
||||||
}] ++ (map (id: {
|
|
||||||
name = "${id}-${version}.qdz";
|
|
||||||
sha256 = lib.getAttr id componentHashes;
|
|
||||||
}) (lib.attrValues supportedDeviceIds)));
|
|
||||||
|
|
||||||
nativeBuildInputs = [ unstick ];
|
nativeBuildInputs = [ unstick ];
|
||||||
|
|
||||||
buildCommand = let
|
buildCommand = let
|
||||||
installers = lib.sublist 0 2 src;
|
|
||||||
components = lib.sublist 2 ((lib.length src) - 2) src;
|
|
||||||
copyInstaller = installer: ''
|
copyInstaller = installer: ''
|
||||||
# `$(cat $NIX_CC/nix-support/dynamic-linker) $src[0]` often segfaults, so cp + patchelf
|
# `$(cat $NIX_CC/nix-support/dynamic-linker) $src[0]` often segfaults, so cp + patchelf
|
||||||
cp ${installer} $TEMP/${installer.name}
|
cp ${installer} $TEMP/${installer.name}
|
||||||
|
@ -68,22 +68,32 @@ in stdenv.mkDerivation rec {
|
||||||
patchelf --interpreter $(cat $NIX_CC/nix-support/dynamic-linker) $TEMP/${installer.name}
|
patchelf --interpreter $(cat $NIX_CC/nix-support/dynamic-linker) $TEMP/${installer.name}
|
||||||
'';
|
'';
|
||||||
copyComponent = component: "cp ${component} $TEMP/${component.name}";
|
copyComponent = component: "cp ${component} $TEMP/${component.name}";
|
||||||
# leaves enabled: quartus, questa_fse, devinfo
|
# leaves enabled: quartus, devinfo
|
||||||
disabledComponents = [
|
disabledComponents = [
|
||||||
"quartus_help"
|
"quartus_help"
|
||||||
"quartus_update"
|
"quartus_update"
|
||||||
# not questa_fse
|
|
||||||
"questa_fe"
|
"questa_fe"
|
||||||
] ++ (lib.attrValues unsupportedDeviceIds);
|
] ++ (lib.optional (!withQuesta) "questa_fse")
|
||||||
|
++ (lib.attrValues unsupportedDeviceIds);
|
||||||
in ''
|
in ''
|
||||||
|
echo "setting up installer..."
|
||||||
${lib.concatMapStringsSep "\n" copyInstaller installers}
|
${lib.concatMapStringsSep "\n" copyInstaller installers}
|
||||||
${lib.concatMapStringsSep "\n" copyComponent components}
|
${lib.concatMapStringsSep "\n" copyComponent components}
|
||||||
|
|
||||||
|
echo "executing installer..."
|
||||||
|
# "Could not load seccomp program: Invalid argument" might occur if unstick
|
||||||
|
# itself is compiled for x86_64 instead of the non-x86 host. In that case,
|
||||||
|
# override the input.
|
||||||
unstick $TEMP/${(builtins.head installers).name} \
|
unstick $TEMP/${(builtins.head installers).name} \
|
||||||
--disable-components ${lib.concatStringsSep "," disabledComponents} \
|
--disable-components ${lib.concatStringsSep "," disabledComponents} \
|
||||||
--mode unattended --installdir $out --accept_eula 1
|
--mode unattended --installdir $out --accept_eula 1
|
||||||
|
|
||||||
|
echo "cleaning up..."
|
||||||
rm -r $out/uninstall $out/logs
|
rm -r $out/uninstall $out/logs
|
||||||
|
|
||||||
|
# replace /proc pentium check with a true statement. this allows usage under emulation.
|
||||||
|
substituteInPlace $out/quartus/adm/qenv.sh \
|
||||||
|
--replace-fail 'grep sse /proc/cpuinfo > /dev/null 2>&1' ':'
|
||||||
'';
|
'';
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
|
|
|
@ -4271,6 +4271,18 @@ final: prev:
|
||||||
meta.homepage = "https://github.com/morhetz/gruvbox/";
|
meta.homepage = "https://github.com/morhetz/gruvbox/";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gruvbox-baby = buildVimPlugin {
|
||||||
|
pname = "gruvbox-baby";
|
||||||
|
version = "2024-01-25";
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "luisiacc";
|
||||||
|
repo = "gruvbox-baby";
|
||||||
|
rev = "bd52e62d8134647090108189e69c8b3cd18bdbbf";
|
||||||
|
sha256 = "17wnc3zpxki0fy8fbkinj0jvf6hnkz139x6yrg7hmj97aa8rh4sj";
|
||||||
|
};
|
||||||
|
meta.homepage = "https://github.com/luisiacc/gruvbox-baby/";
|
||||||
|
};
|
||||||
|
|
||||||
gruvbox-flat-nvim = buildVimPlugin {
|
gruvbox-flat-nvim = buildVimPlugin {
|
||||||
pname = "gruvbox-flat.nvim";
|
pname = "gruvbox-flat.nvim";
|
||||||
version = "2023-05-27";
|
version = "2023-05-27";
|
||||||
|
|
|
@ -356,6 +356,7 @@ https://github.com/liuchengxu/graphviz.vim/,,
|
||||||
https://github.com/blazkowolf/gruber-darker.nvim/,,
|
https://github.com/blazkowolf/gruber-darker.nvim/,,
|
||||||
https://github.com/gruvbox-community/gruvbox/,,gruvbox-community
|
https://github.com/gruvbox-community/gruvbox/,,gruvbox-community
|
||||||
https://github.com/morhetz/gruvbox/,,
|
https://github.com/morhetz/gruvbox/,,
|
||||||
|
https://github.com/luisiacc/gruvbox-baby/,HEAD,
|
||||||
https://github.com/eddyekofo94/gruvbox-flat.nvim/,,
|
https://github.com/eddyekofo94/gruvbox-flat.nvim/,,
|
||||||
https://github.com/sainnhe/gruvbox-material/,,
|
https://github.com/sainnhe/gruvbox-material/,,
|
||||||
https://github.com/ellisonleao/gruvbox.nvim/,,
|
https://github.com/ellisonleao/gruvbox.nvim/,,
|
||||||
|
|
|
@ -428,8 +428,8 @@ let
|
||||||
mktplcRef = {
|
mktplcRef = {
|
||||||
name = "vscode-neovim";
|
name = "vscode-neovim";
|
||||||
publisher = "asvetliakov";
|
publisher = "asvetliakov";
|
||||||
version = "1.7.1";
|
version = "1.8.1";
|
||||||
sha256 = "0ib4sjk7r370ckvaqb4yzgy7csy8pli9z2jhibhhwwcq2748ah4q";
|
sha256 = "0kqzry0cbvvy1pkbx5rhnk5ry7j91cbf11vz1s1jrqc7j0hq0yx8";
|
||||||
};
|
};
|
||||||
meta = {
|
meta = {
|
||||||
changelog = "https://marketplace.visualstudio.com/items/asvetliakov.vscode-neovim/changelog";
|
changelog = "https://marketplace.visualstudio.com/items/asvetliakov.vscode-neovim/changelog";
|
||||||
|
@ -941,8 +941,8 @@ let
|
||||||
mktplcRef = {
|
mktplcRef = {
|
||||||
name = "coder-remote";
|
name = "coder-remote";
|
||||||
publisher = "coder";
|
publisher = "coder";
|
||||||
version = "0.1.18";
|
version = "0.1.36";
|
||||||
sha256 = "soNGZuyvG5+haWRcwYmYB+0OcyDAm4UQ419UnEd8waA=";
|
hash = "sha256-N1X8wB2n6JYoFHCP5iHBXHnEaRa9S1zooQZsR5mUeh8=";
|
||||||
};
|
};
|
||||||
meta = {
|
meta = {
|
||||||
description = "An extension for Visual Studio Code to open any Coder workspace in VS Code with a single click.";
|
description = "An extension for Visual Studio Code to open any Coder workspace in VS Code with a single click.";
|
||||||
|
@ -2803,8 +2803,8 @@ let
|
||||||
mktplcRef = {
|
mktplcRef = {
|
||||||
name = "typst-preview";
|
name = "typst-preview";
|
||||||
publisher = "mgt19937";
|
publisher = "mgt19937";
|
||||||
version = "0.11.1";
|
version = "0.11.4";
|
||||||
hash = "sha256-OsCgkq0OSBu7RZYHlxgy7W7zDNDUgJFSeSET20CX8zA=";
|
hash = "sha256-GwlzFphZmP87pLys01+PWTv13imcdGjunCMH6atz9xs=";
|
||||||
};
|
};
|
||||||
|
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
|
@ -4099,6 +4099,27 @@ let
|
||||||
|
|
||||||
sumneko.lua = callPackage ./sumneko.lua { };
|
sumneko.lua = callPackage ./sumneko.lua { };
|
||||||
|
|
||||||
|
supermaven.supermaven = buildVscodeMarketplaceExtension {
|
||||||
|
mktplcRef = {
|
||||||
|
hash = "sha256-O3AN8fy28ZSun+k6MJnJdFcmwDDE21ib+I9HtDE0JwU=";
|
||||||
|
name = "supermaven";
|
||||||
|
publisher = "supermaven";
|
||||||
|
version = "0.1.42";
|
||||||
|
};
|
||||||
|
meta = {
|
||||||
|
changelog = "https://marketplace.visualstudio.com/items/supermaven.supermaven/changelog";
|
||||||
|
description = "A Visual Studio Code extension for code completion suggestions";
|
||||||
|
downloadPage = "https://marketplace.visualstudio.com/items?itemName=supermaven.supermaven";
|
||||||
|
homepage = "https://supermaven.com/";
|
||||||
|
license = lib.licenses.unfree;
|
||||||
|
longDescription = ''
|
||||||
|
Supermaven uses a 300,000 token context window to provide you the best code completion suggestions and the lowest latency.
|
||||||
|
With our extension you will get the fastest and best completions of any tool on the market.
|
||||||
|
'';
|
||||||
|
maintainers = [ lib.maintainers.msanft ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
svelte.svelte-vscode = buildVscodeMarketplaceExtension {
|
svelte.svelte-vscode = buildVscodeMarketplaceExtension {
|
||||||
mktplcRef = {
|
mktplcRef = {
|
||||||
name = "svelte-vscode";
|
name = "svelte-vscode";
|
||||||
|
|
|
@ -72,7 +72,7 @@ vscode-utils.buildVscodeMarketplaceExtension rec {
|
||||||
tmp=$(mktemp)
|
tmp=$(mktemp)
|
||||||
curl -sLo $tmp $(echo ${(import ../mktplcExtRefToFetchArgs.nix mktplcRef).url} | sed "s|${mktplcRef.version}|$version|")
|
curl -sLo $tmp $(echo ${(import ../mktplcExtRefToFetchArgs.nix mktplcRef).url} | sed "s|${mktplcRef.version}|$version|")
|
||||||
hash=$(nix hash file --type sha256 --base32 --sri $tmp)
|
hash=$(nix hash file --type sha256 --base32 --sri $tmp)
|
||||||
sed -i -e "s|${mktplcRef.hash}|$hash|" -e "s|${mktplcRef.version}|$version|" pkgs/applications/editors/vscode/extensions/python/default.nix
|
sed -i -e "s|${mktplcRef.hash}|$hash|" -e "s|${mktplcRef.version}|$version|" pkgs/applications/editors/vscode/extensions/ms-python.python/default.nix
|
||||||
fi
|
fi
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,10 @@ let
|
||||||
|
|
||||||
inherit configurePhase buildPhase dontPatchELF dontStrip;
|
inherit configurePhase buildPhase dontPatchELF dontStrip;
|
||||||
|
|
||||||
|
# Some .vsix files contain other directories (e.g., `package`) that we don't use.
|
||||||
|
# If other directories are present but `sourceRoot` is unset, the unpacker phase fails.
|
||||||
|
sourceRoot = "extension";
|
||||||
|
|
||||||
installPrefix = "share/vscode/extensions/${vscodeExtUniqueId}";
|
installPrefix = "share/vscode/extensions/${vscodeExtUniqueId}";
|
||||||
|
|
||||||
nativeBuildInputs = [ unzip ] ++ nativeBuildInputs;
|
nativeBuildInputs = [ unzip ] ++ nativeBuildInputs;
|
||||||
|
|
|
@ -15,11 +15,11 @@ let
|
||||||
archive_fmt = if stdenv.isDarwin then "zip" else "tar.gz";
|
archive_fmt = if stdenv.isDarwin then "zip" else "tar.gz";
|
||||||
|
|
||||||
sha256 = {
|
sha256 = {
|
||||||
x86_64-linux = "1jy1lsbha951z2bcnfrkgin7nms3clpa97rx7c7pdm23mnyg9073";
|
x86_64-linux = "1a9k4w6ggmrd17i038gi40d3hp24z5vs8nidxr5kvl74fi61js6y";
|
||||||
x86_64-darwin = "0425cnzw1dz2k6a9p63w7vf25icf02m04ri82dp0k1kvhjfr8l37";
|
x86_64-darwin = "1q9lwx96zcz517pvr97mjqhv86p41ff3cw5jisxbsg6f76aw8y1y";
|
||||||
aarch64-linux = "123p1glr9rc1z2lfl8g5zw7rcipg1njybscqn9qyzkpqymcsqfdy";
|
aarch64-linux = "1fdg9xz1fq9k8fc9x0an2kb8hn2vvbsnc48nv6lbx1j5aaa3k42g";
|
||||||
aarch64-darwin = "1bl5wvbfr5k1vy6ah2i9548cn1l3nx3ng4c544zvclskmr8kf84s";
|
aarch64-darwin = "0kqqn24cimbqb8s7rz64niyknpp36w5ycdw8xfms20zfm5ybm82k";
|
||||||
armv7l-linux = "0nyv3yjqcrg4r2m2d63qz34g07pp8n0ndmai9pqwcf7a1m0v0sj4";
|
armv7l-linux = "14rkr7k0axlaiplf0hdcmyqfgffng25s0j2i903if3i3sqv7316i";
|
||||||
}.${system} or throwSystem;
|
}.${system} or throwSystem;
|
||||||
|
|
||||||
sourceRoot = lib.optionalString (!stdenv.isDarwin) ".";
|
sourceRoot = lib.optionalString (!stdenv.isDarwin) ".";
|
||||||
|
@ -29,7 +29,7 @@ in
|
||||||
|
|
||||||
# Please backport all compatible updates to the stable release.
|
# Please backport all compatible updates to the stable release.
|
||||||
# This is important for the extension ecosystem.
|
# This is important for the extension ecosystem.
|
||||||
version = "1.87.2.24072";
|
version = "1.88.0.24096";
|
||||||
pname = "vscodium";
|
pname = "vscodium";
|
||||||
|
|
||||||
executableName = "codium";
|
executableName = "codium";
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
, fluidsynth
|
, fluidsynth
|
||||||
, freetype
|
, freetype
|
||||||
, glib
|
, glib
|
||||||
|
, libicns
|
||||||
, libpcap
|
, libpcap
|
||||||
, libpng
|
, libpng
|
||||||
, libslirp
|
, libslirp
|
||||||
|
@ -18,6 +19,7 @@
|
||||||
, makeWrapper
|
, makeWrapper
|
||||||
, ncurses
|
, ncurses
|
||||||
, pkg-config
|
, pkg-config
|
||||||
|
, python3
|
||||||
, SDL2
|
, SDL2
|
||||||
, SDL2_net
|
, SDL2_net
|
||||||
, testers
|
, testers
|
||||||
|
@ -36,12 +38,29 @@ stdenv.mkDerivation (finalAttrs: {
|
||||||
hash = "sha256-EcAp7KyqXdBACEbPgkM1INoKeGVo7hMDUx97y2RcX+k=";
|
hash = "sha256-EcAp7KyqXdBACEbPgkM1INoKeGVo7hMDUx97y2RcX+k=";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# sips is unavailable in sandbox, replacing with imagemagick breaks build due to wrong Foundation propagation(?) so don't generate resolution variants
|
||||||
|
# iconutil is unavailable, replace with png2icns from libicns
|
||||||
|
# Patch bad hardcoded compiler
|
||||||
|
# Don't mess with codesign, doesn't seem to work?
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace Makefile.am \
|
||||||
|
--replace-fail 'sips' '## sips' \
|
||||||
|
--replace-fail 'iconutil -c icns -o contrib/macos/dosbox.icns src/dosbox.iconset' 'png2icns contrib/macos/dosbox.icns contrib/macos/dosbox-x.png' \
|
||||||
|
--replace-fail 'g++' "$CXX" \
|
||||||
|
--replace-fail 'codesign' '## codesign'
|
||||||
|
'' + lib.optionalString stdenv.hostPlatform.isDarwin ''
|
||||||
|
patchShebangs appbundledeps.py
|
||||||
|
'';
|
||||||
|
|
||||||
strictDeps = true;
|
strictDeps = true;
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
autoreconfHook
|
autoreconfHook
|
||||||
makeWrapper
|
makeWrapper
|
||||||
pkg-config
|
pkg-config
|
||||||
|
] ++ lib.optionals stdenv.hostPlatform.isDarwin [
|
||||||
|
libicns
|
||||||
|
python3
|
||||||
];
|
];
|
||||||
|
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
|
@ -75,9 +94,22 @@ stdenv.mkDerivation (finalAttrs: {
|
||||||
|
|
||||||
hardeningDisable = [ "format" ]; # https://github.com/joncampbell123/dosbox-x/issues/4436
|
hardeningDisable = [ "format" ]; # https://github.com/joncampbell123/dosbox-x/issues/4436
|
||||||
|
|
||||||
|
# Build optional App Bundle target, which needs at least one arch-suffixed binary
|
||||||
|
postBuild = lib.optionalString stdenv.hostPlatform.isDarwin ''
|
||||||
|
cp src/dosbox-x src/dosbox-x-$(uname -m)
|
||||||
|
make dosbox-x.app
|
||||||
|
'';
|
||||||
|
|
||||||
postInstall = lib.optionalString stdenv.hostPlatform.isLinux ''
|
postInstall = lib.optionalString stdenv.hostPlatform.isLinux ''
|
||||||
wrapProgram $out/bin/dosbox-x \
|
wrapProgram $out/bin/dosbox-x \
|
||||||
--prefix PATH : ${lib.makeBinPath [ yad ]}
|
--prefix PATH : ${lib.makeBinPath [ yad ]}
|
||||||
|
''
|
||||||
|
# Install App Bundle, wrap regular binary into bundle's binary to get the icon working
|
||||||
|
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
|
||||||
|
mkdir $out/Applications
|
||||||
|
mv dosbox-x.app $out/Applications/
|
||||||
|
mv $out/bin/dosbox-x $out/Applications/dosbox-x.app/Contents/MacOS/dosbox-x
|
||||||
|
makeWrapper $out/Applications/dosbox-x.app/Contents/MacOS/dosbox-x $out/bin/dosbox-x
|
||||||
'';
|
'';
|
||||||
|
|
||||||
passthru.tests.version = testers.testVersion {
|
passthru.tests.version = testers.testVersion {
|
||||||
|
|
|
@ -287,31 +287,31 @@
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "libretro",
|
"owner": "libretro",
|
||||||
"repo": "fbneo",
|
"repo": "fbneo",
|
||||||
"rev": "537b5b8dcc358370f2349109004233fbeab46cfe",
|
"rev": "cb370363935458e723e0594fb03380c04e7f455b",
|
||||||
"hash": "sha256-zBOF1RV2dx5zraREZm/W//8DwrRMDc/j8sx+CwTyKz0="
|
"hash": "sha256-u0kBdqfUu7QmZBbuLaDJRnsDUJLZiURF6BSkwOX8zpU="
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-04-02"
|
"version": "unstable-2024-04-08"
|
||||||
},
|
},
|
||||||
"fceumm": {
|
"fceumm": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "libretro",
|
"owner": "libretro",
|
||||||
"repo": "libretro-fceumm",
|
"repo": "libretro-fceumm",
|
||||||
"rev": "40969671ce9e4b1a49165d836476cd71bb960131",
|
"rev": "aebea8783652bc75b21b9d2dcb28cedf1fa78e8a",
|
||||||
"hash": "sha256-wdAigh3qUzB3wmh6q/dwCHHhuyqyAmqV+NSvrzjODVM="
|
"hash": "sha256-4ux8pI2d8djkwY0M+h5tlXrLGIDHnMFiFqAWKrZAsxA="
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-03-02"
|
"version": "unstable-2024-04-06"
|
||||||
},
|
},
|
||||||
"flycast": {
|
"flycast": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "flyinghead",
|
"owner": "flyinghead",
|
||||||
"repo": "flycast",
|
"repo": "flycast",
|
||||||
"rev": "a0c81d2f2a393bd34caf6f15c1231ba4e2175405",
|
"rev": "9d6eab74e1eb182d627f63e1db79752852e9d230",
|
||||||
"hash": "sha256-hajTfovkSH7l6AayQyiHI7E4I/82pBhQnDSxo0BcYu0=",
|
"hash": "sha256-Zi98lszi42XV6u0RhOnt6TVqAfdSaZRcpJIJDwI+ThU=",
|
||||||
"fetchSubmodules": true
|
"fetchSubmodules": true
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-04-03"
|
"version": "unstable-2024-04-05"
|
||||||
},
|
},
|
||||||
"fmsx": {
|
"fmsx": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
|
@ -358,10 +358,10 @@
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "libretro",
|
"owner": "libretro",
|
||||||
"repo": "Genesis-Plus-GX",
|
"repo": "Genesis-Plus-GX",
|
||||||
"rev": "667158b034ce860e345b13e1ed927fea9d155b96",
|
"rev": "b063aa81b90682ca89ae6fd1e958bc589b4ce34d",
|
||||||
"hash": "sha256-uerlejdqJO+vPDs1K7dAxImfJzWrEWlVhF/uTaQoo6E="
|
"hash": "sha256-Tz6if6NfbwvZVDb5Ggr/tXuLNymOjcMkghKwZq6tl6I="
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-03-15"
|
"version": "unstable-2024-04-05"
|
||||||
},
|
},
|
||||||
"gpsp": {
|
"gpsp": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
|
@ -408,10 +408,10 @@
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "libretro",
|
"owner": "libretro",
|
||||||
"repo": "mame",
|
"repo": "mame",
|
||||||
"rev": "ac9d0347f5d331eb49017cd599a5e63a668b4f22",
|
"rev": "3aa1ff0d6c087ac35530572d09bc42a2591ff78f",
|
||||||
"hash": "sha256-YlnW5v8Slz/w/AHwWzJ7ZszFic/W0wth2nOZVOD7yxs="
|
"hash": "sha256-pSBaheo3R5Oxn3nAG8AqodaRtYDIcmT4QVIzLjefa3c="
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-04-01"
|
"version": "unstable-2024-04-05"
|
||||||
},
|
},
|
||||||
"mame2000": {
|
"mame2000": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
|
@ -438,10 +438,10 @@
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "libretro",
|
"owner": "libretro",
|
||||||
"repo": "mame2003-plus-libretro",
|
"repo": "mame2003-plus-libretro",
|
||||||
"rev": "f03f865af9d496965ab15b9a213691319daad9d2",
|
"rev": "bf250331362db8fa08a5b3ef60decffba90bf564",
|
||||||
"hash": "sha256-yHVkEJYSXHeUGNFJ/zbAwNi+I4gka8Id7z+LnDkCCSM="
|
"hash": "sha256-7KxQtmmjJuDzoYzpQi/z6eYtThop3Qc1wY0JpUyv26A="
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-04-03"
|
"version": "unstable-2024-04-09"
|
||||||
},
|
},
|
||||||
"mame2010": {
|
"mame2010": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
|
@ -559,10 +559,10 @@
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "libretro",
|
"owner": "libretro",
|
||||||
"repo": "nestopia",
|
"repo": "nestopia",
|
||||||
"rev": "efe3a052c75ad47d6e98eeffd1f3d2d4893279c2",
|
"rev": "b99ede358b2219602443e7f414eabf81e17da244",
|
||||||
"hash": "sha256-sSXU+rUBJcE2gQRTqnZV8NSuBz/zWNxlZHQqoAUoigU="
|
"hash": "sha256-iciidNkOhie3qJO8D4yB081ywfQtGGMrKBWFmBpps9g="
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-03-29"
|
"version": "unstable-2024-04-07"
|
||||||
},
|
},
|
||||||
"np2kai": {
|
"np2kai": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
|
@ -630,10 +630,10 @@
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "libretro",
|
"owner": "libretro",
|
||||||
"repo": "pcsx_rearmed",
|
"repo": "pcsx_rearmed",
|
||||||
"rev": "2fb8465594a7ffb7ccbac39fdedf7c70085d7f63",
|
"rev": "4cc48a6b324ff1d025768bb5436279831e4bf319",
|
||||||
"hash": "sha256-RQU2EDcBRa6aH40JrEJ3eppjflk5++AWlOH+iGJyjFY="
|
"hash": "sha256-bW/soI5/HgV71L7SdouAeR5ex54veJCTdCXCMwfxHIk="
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-03-29"
|
"version": "unstable-2024-04-06"
|
||||||
},
|
},
|
||||||
"picodrive": {
|
"picodrive": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
|
@ -651,22 +651,22 @@
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "jpd002",
|
"owner": "jpd002",
|
||||||
"repo": "Play-",
|
"repo": "Play-",
|
||||||
"rev": "8445595b734301f22c6fdd57536867fea3786b58",
|
"rev": "8f9fab334eb4ae6faf9cfd88f802cad68674792b",
|
||||||
"hash": "sha256-3e9+PkSGZbjZ2LVY0cWRIK+TbdJ4hn8FxBjWqhsQB4o=",
|
"hash": "sha256-KzRj7Xjfqoi/m+eEHk6Lfk/6FHk4YtrGkY++sjUvT/Y=",
|
||||||
"fetchSubmodules": true
|
"fetchSubmodules": true
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-04-02"
|
"version": "unstable-2024-04-09"
|
||||||
},
|
},
|
||||||
"ppsspp": {
|
"ppsspp": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
"src": {
|
"src": {
|
||||||
"owner": "hrydgard",
|
"owner": "hrydgard",
|
||||||
"repo": "ppsspp",
|
"repo": "ppsspp",
|
||||||
"rev": "5bead8d999717ed13f7808d3e6b88a237806899e",
|
"rev": "1bcb15576252ac4b253c39f7c34ea372a3637d96",
|
||||||
"hash": "sha256-bGNlzpC3xPX5xyFyMfXbeR4q3Q9bGN/oRwFTLcgzfJM=",
|
"hash": "sha256-bc0gJi2C+ZBlF7qczSQ+L4bZD5zt7NNIESEwdpqOhTY=",
|
||||||
"fetchSubmodules": true
|
"fetchSubmodules": true
|
||||||
},
|
},
|
||||||
"version": "unstable-2024-04-04"
|
"version": "unstable-2024-04-09"
|
||||||
},
|
},
|
||||||
"prboom": {
|
"prboom": {
|
||||||
"fetcher": "fetchFromGitHub",
|
"fetcher": "fetchFromGitHub",
|
||||||
|
|
|
@ -11,13 +11,13 @@
|
||||||
|
|
||||||
stdenv.mkDerivation (finalAttrs: {
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
pname = "pineapple-pictures";
|
pname = "pineapple-pictures";
|
||||||
version = "0.7.3";
|
version = "0.7.4";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "BLumia";
|
owner = "BLumia";
|
||||||
repo = "pineapple-pictures";
|
repo = "pineapple-pictures";
|
||||||
rev = finalAttrs.version;
|
rev = finalAttrs.version;
|
||||||
hash = "sha256-UZVpyrUFf/uJNs2GHLYXpb81e7yzC8EFuoD+0Bzj6xQ=";
|
hash = "sha256-aiQlcTID8mfrT4MEx4s5K+QmMHBlHOu2HfsValiH5qU=";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
|
|
|
@ -28,7 +28,7 @@ stdenv.mkDerivation rec {
|
||||||
cmake
|
cmake
|
||||||
];
|
];
|
||||||
|
|
||||||
patchPhase = ''
|
postPatch = ''
|
||||||
runHook prePatch
|
runHook prePatch
|
||||||
|
|
||||||
substituteInPlace ./CMakeLists.txt \
|
substituteInPlace ./CMakeLists.txt \
|
||||||
|
@ -37,12 +37,12 @@ stdenv.mkDerivation rec {
|
||||||
# prevent inheriting permissions from /nix/store when copying
|
# prevent inheriting permissions from /nix/store when copying
|
||||||
substituteInPlace Converter/src/main.cpp --replace \
|
substituteInPlace Converter/src/main.cpp --replace \
|
||||||
'fs::copy(templateDir, pagedir, fs::copy_options::overwrite_existing | fs::copy_options::recursive)' 'string cmd = "cp --no-preserve=mode -r " + templateDir + " " + pagedir; system(cmd.c_str());'
|
'fs::copy(templateDir, pagedir, fs::copy_options::overwrite_existing | fs::copy_options::recursive)' 'string cmd = "cp --no-preserve=mode -r " + templateDir + " " + pagedir; system(cmd.c_str());'
|
||||||
|
|
||||||
runHook postPatch
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
# The upstream build system does not provide an install target.
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
runHook preInstall
|
runHook preInstall
|
||||||
|
|
||||||
mkdir -p $out/{bin,lib}
|
mkdir -p $out/{bin,lib}
|
||||||
mv liblaszip.so $out/lib
|
mv liblaszip.so $out/lib
|
||||||
mv PotreeConverter $out/bin
|
mv PotreeConverter $out/bin
|
||||||
|
@ -56,10 +56,8 @@ stdenv.mkDerivation rec {
|
||||||
runHook postInstall
|
runHook postInstall
|
||||||
'';
|
'';
|
||||||
|
|
||||||
fixupPhase = ''
|
postFixup = ''
|
||||||
runHook preFixup
|
|
||||||
ln -s $src/resources $out/bin/resources
|
ln -s $src/resources $out/bin/resources
|
||||||
runHook postFixup
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
|
|
|
@ -15,13 +15,13 @@
|
||||||
}:
|
}:
|
||||||
stdenv.mkDerivation (finalAttrs: {
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
pname = "ausweisapp";
|
pname = "ausweisapp";
|
||||||
version = "2.1.0";
|
version = "2.1.1";
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
src = fetchFromGitHub {
|
||||||
owner = "Governikus";
|
owner = "Governikus";
|
||||||
repo = "AusweisApp2";
|
repo = "AusweisApp2";
|
||||||
rev = finalAttrs.version;
|
rev = finalAttrs.version;
|
||||||
hash = "sha256-wgVu5Yr65Gu1z5SEWy5l4B6UiI5bIobBfZLhL7s+SRE=";
|
hash = "sha256-YRRm8/yDwQIUjzqYzlqij8h2ri39Q7L8jVh5fgrZbGs=";
|
||||||
};
|
};
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
|
|
|
@ -45,7 +45,7 @@ stdenv.mkDerivation {
|
||||||
description = "A collection of small bash scripts for heavy terminal users";
|
description = "A collection of small bash scripts for heavy terminal users";
|
||||||
homepage = "https://github.com/alexanderepstein/Bash-Snippets";
|
homepage = "https://github.com/alexanderepstein/Bash-Snippets";
|
||||||
license = licenses.mit;
|
license = licenses.mit;
|
||||||
maintainers = with maintainers; [ infinisil ];
|
maintainers = [ ];
|
||||||
platforms = platforms.unix;
|
platforms = platforms.unix;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,6 +82,6 @@ with python3.pkgs; buildPythonApplication rec {
|
||||||
homepage = "https://github.com/jarun/Buku";
|
homepage = "https://github.com/jarun/Buku";
|
||||||
license = licenses.gpl3;
|
license = licenses.gpl3;
|
||||||
platforms = platforms.unix;
|
platforms = platforms.unix;
|
||||||
maintainers = with maintainers; [ matthiasbeyer infinisil ];
|
maintainers = with maintainers; [ matthiasbeyer ];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,11 +9,11 @@
|
||||||
|
|
||||||
stdenvNoCC.mkDerivation rec {
|
stdenvNoCC.mkDerivation rec {
|
||||||
pname = "camunda-modeler";
|
pname = "camunda-modeler";
|
||||||
version = "5.21.0";
|
version = "5.22.0";
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchurl {
|
||||||
url = "https://github.com/camunda/camunda-modeler/releases/download/v${version}/camunda-modeler-${version}-linux-x64.tar.gz";
|
url = "https://github.com/camunda/camunda-modeler/releases/download/v${version}/camunda-modeler-${version}-linux-x64.tar.gz";
|
||||||
hash = "sha256-brZRYvRrOHj/HUb+w5tPkxHnJzVyFBKshk2ZO7YMzsU=";
|
hash = "sha256-WLJMF+G7pP7OZh6xDrO/JpNV9iX/9XBmi5kRPp3TJBI=";
|
||||||
};
|
};
|
||||||
sourceRoot = "camunda-modeler-${version}-linux-x64";
|
sourceRoot = "camunda-modeler-${version}-linux-x64";
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user