mirror of
https://github.com/iiab/iiab.git
synced 2025-03-09 15:40:17 +00:00
Compare commits
1311 commits
8.0-previe
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
423e21c52c | ||
|
|
96ddd6620d | ||
|
|
cb42942699 | ||
|
|
ac12c6db0b | ||
|
|
2461a8fde3 | ||
|
|
89b1487dc2 | ||
|
|
8dac889ad9 | ||
|
|
6d5fcdbcc2 | ||
|
|
1308fb8670 | ||
|
|
96324233d8 | ||
|
|
e2c67e43f0 | ||
|
|
36e4322775 | ||
|
|
957a89d67c | ||
|
|
d1dd071c81 | ||
|
|
f16bd2a6b5 | ||
|
|
b8555f86e1 | ||
|
|
bbdd45365d | ||
|
|
2ef96ad0ff | ||
|
|
66a35ee950 | ||
|
|
e80b912eea | ||
|
|
5267ef87a6 | ||
|
|
f52b390821 | ||
|
|
14d24fda49 | ||
|
|
fe6516b2e9 | ||
|
|
a96b46c223 | ||
|
|
728704b250 | ||
|
|
ebceb4a6ac | ||
|
|
bd8c131ef6 | ||
|
|
52da42c146 | ||
|
|
9a95a046c4 | ||
|
|
759126414e | ||
|
|
cf606c417b | ||
|
|
fda19ad7f9 | ||
|
|
9bc2006ba3 | ||
|
|
543a0e9b0e | ||
|
|
1ec743a654 | ||
|
|
94ca58aa0c | ||
|
|
2398313918 | ||
|
|
c2c36b178e | ||
|
|
f084785452 | ||
|
|
3596963d5c | ||
|
|
38a860d3c5 | ||
|
|
8eed5e3fac | ||
|
|
11f65e7689 | ||
|
|
fb787e0649 | ||
|
|
f22ba85c49 | ||
|
|
c975dd21fc | ||
|
|
810c70e85b | ||
|
|
b6b2f3a0d7 | ||
|
|
3077a39cd6 | ||
|
|
073939a542 | ||
|
|
6b4b94dae2 | ||
|
|
7e56a53549 | ||
|
|
80bdfc677e | ||
|
|
97eeae4845 | ||
|
|
78924e84ba | ||
|
|
0dec3fe810 | ||
|
|
eca12605b9 | ||
|
|
daa3deb034 | ||
|
|
190d66409f | ||
|
|
76d5b5fc17 | ||
|
|
e6051088fc | ||
|
|
34b4a8a7ad | ||
|
|
640ab00d26 | ||
|
|
257dc008ec | ||
|
|
60ca24d63a | ||
|
|
f58ef26768 | ||
|
|
a5af8c89d4 | ||
|
|
36485a109d | ||
|
|
229a913ba4 | ||
|
|
57fa6bb08f | ||
|
|
6c5b4c35ec | ||
|
|
18c287fe27 | ||
|
|
4e7541fc1e | ||
|
|
519daacc2a | ||
|
|
0c0045f1c8 | ||
|
|
078bab6d15 | ||
|
|
4da759a84b | ||
|
|
668d57cb97 | ||
|
|
3bccc1f452 | ||
|
|
957cf6976a | ||
|
|
2d412405fa | ||
|
|
18efafc23e | ||
|
|
16b745d734 | ||
|
|
00d45099ea | ||
|
|
f5e2f4ad79 | ||
|
|
178134ba36 | ||
|
|
765d7854c3 | ||
|
|
e57ea34590 | ||
|
|
c49c7b0d8d | ||
|
|
48f4fc56f8 | ||
|
|
fb07b9e3e5 | ||
|
|
8cbcff710e | ||
|
|
1795276b20 | ||
|
|
7812edfed0 | ||
|
|
cea4cac7f2 | ||
|
|
d4e66748f3 | ||
|
|
5663a84d27 | ||
|
|
920235d54c | ||
|
|
27e286b8ae | ||
|
|
425cbf494c | ||
|
|
cd160da679 | ||
|
|
2401ff3d60 | ||
|
|
d0a00da601 | ||
|
|
427dc57ed0 | ||
|
|
2462bba6f5 | ||
|
|
64756b6772 | ||
|
|
18c5fe711d | ||
|
|
f9538a4834 | ||
|
|
341df04d90 | ||
|
|
13f5227824 | ||
|
|
6562a4a12d | ||
|
|
d15493b399 | ||
|
|
fe633b2cd7 | ||
|
|
7c2f0c9c6e | ||
|
|
44e2772ccc | ||
|
|
b0ef084ac8 | ||
|
|
286890b0d0 | ||
|
|
3b9edfdfc0 | ||
|
|
a20aebf9c2 | ||
|
|
ae1ecdfd89 | ||
|
|
eecf6f8306 | ||
|
|
e319b394e8 | ||
|
|
dcc9862527 | ||
|
|
9991273391 | ||
|
|
dd4a9088b4 | ||
|
|
eb21c8654a | ||
|
|
0cc63d8895 | ||
|
|
6dfda009e4 | ||
|
|
68dafdbc39 | ||
|
|
91533f5fb3 | ||
|
|
ad175fb3ca | ||
|
|
89a06d6e5e | ||
|
|
b6153b9a05 | ||
|
|
765e1cd4b1 | ||
|
|
01baaa661a | ||
|
|
335d8ad4c1 | ||
|
|
f79a43e305 | ||
|
|
024defc89c | ||
|
|
0caa16491d | ||
|
|
f15a50610e | ||
|
|
0994a5786d | ||
|
|
8e7888a51a | ||
|
|
e4bdc4ddab | ||
|
|
9426e6ac98 | ||
|
|
f60a61ea4b | ||
|
|
0cdf077113 | ||
|
|
6f63de1622 | ||
|
|
66fd7fad39 | ||
|
|
d6b7114afc | ||
|
|
cb0788b7ba | ||
|
|
803197e817 | ||
|
|
a81856db5d | ||
|
|
271da50114 | ||
|
|
e2113c5da0 | ||
|
|
d09842245b | ||
|
|
720e328ab6 | ||
|
|
59f1d1b090 | ||
|
|
ebbe9c066e | ||
|
|
f8b743dafc | ||
|
|
c00ceb7f2a | ||
|
|
c2046a1a91 | ||
|
|
a5e90f6511 | ||
|
|
ca22622c7d | ||
|
|
d52fe013cd | ||
|
|
3bb41e2e07 | ||
|
|
a16be49be5 | ||
|
|
0c4df6c42c | ||
|
|
d3730b9494 | ||
|
|
3fa91b821a | ||
|
|
2981a7deaa | ||
|
|
e75a8e5449 | ||
|
|
34326f7318 | ||
|
|
fb008640ef | ||
|
|
a9c916e219 | ||
|
|
fa8cc5637e | ||
|
|
9391d37f40 | ||
|
|
917c6840d6 | ||
|
|
312ddce9ec | ||
|
|
30f940a5f4 | ||
|
|
956257f6cb | ||
|
|
1da4d45509 | ||
|
|
6fe7b11511 | ||
|
|
8fb5656189 | ||
|
|
99ff433a90 | ||
|
|
2706381a38 | ||
|
|
8d167ab981 | ||
|
|
8d0f45bd4d | ||
|
|
886e98c0cb | ||
|
|
59956f2a91 | ||
|
|
b4319bf787 | ||
|
|
3ebf210c99 | ||
|
|
150c14ab54 | ||
|
|
1950a5ba6d | ||
|
|
afa8ae0eeb | ||
|
|
6a6030b40b | ||
|
|
079c7f5fa2 | ||
|
|
04e02587c5 | ||
|
|
6b96085050 | ||
|
|
3c32db26bd | ||
|
|
d886f39bbf | ||
|
|
1c9a784d2a | ||
|
|
4a3e9517dc | ||
|
|
6a6d153034 | ||
|
|
299228e31e | ||
|
|
f722cd783e | ||
|
|
b8a868e231 | ||
|
|
5665b68b13 | ||
|
|
9db5dbe3a4 | ||
|
|
f244669068 | ||
|
|
8b5ea641d4 | ||
|
|
9e235424dc | ||
|
|
325d27a32b | ||
|
|
943dcccf7d | ||
|
|
7f37ccd8db | ||
|
|
58c5e8e71f | ||
|
|
59470cd134 | ||
|
|
577a8f171f | ||
|
|
ad57789c65 | ||
|
|
0bf49da18b | ||
|
|
9dfaccef74 | ||
|
|
e2d646ee18 | ||
|
|
8a9945f014 | ||
|
|
36a5cd458f | ||
|
|
ae40f78d23 | ||
|
|
7544b79285 | ||
|
|
adfc1cc696 | ||
|
|
01304ab133 | ||
|
|
0e68361814 | ||
|
|
5e818c9fd1 | ||
|
|
c16d76ac29 | ||
|
|
676f3eebef | ||
|
|
537c6a84c2 | ||
|
|
defa139a34 | ||
|
|
123a0cc5f1 | ||
|
|
750c15ade1 | ||
|
|
72ff97ef9f | ||
|
|
13557b1172 | ||
|
|
0554e48f81 | ||
|
|
a646a45aea | ||
|
|
aae6729632 | ||
|
|
7b63f0b30e | ||
|
|
1234d11630 | ||
|
|
6f7855f3d9 | ||
|
|
baecd48c7c | ||
|
|
abe1895024 | ||
|
|
8ff3c7c221 | ||
|
|
9d8637abda | ||
|
|
129f284286 | ||
|
|
8cb5a79933 | ||
|
|
d13110d2f3 | ||
|
|
0616e1c097 | ||
|
|
763fe075ac | ||
|
|
ef868120a1 | ||
|
|
1d9c0199cb | ||
|
|
965d494412 | ||
|
|
759ebb48dd | ||
|
|
018b0d21b8 | ||
|
|
735683f509 | ||
|
|
f00f225e28 | ||
|
|
ec348fcc02 | ||
|
|
75f9f61358 | ||
|
|
194ac9b469 | ||
|
|
5a9b929901 | ||
|
|
aedc893bd1 | ||
|
|
d07ae98898 | ||
|
|
3651ac666e | ||
|
|
4be68d3ac1 | ||
|
|
49d7160116 | ||
|
|
ab8c071374 | ||
|
|
b91e953444 | ||
|
|
8e09f02bed | ||
|
|
ccf87c8b90 | ||
|
|
07cf519467 | ||
|
|
297afc3b72 | ||
|
|
ace3b3df32 | ||
|
|
e7eb246a1d | ||
|
|
b7b1b59763 | ||
|
|
8493040b96 | ||
|
|
c7b566418b | ||
|
|
23e92b5853 | ||
|
|
1f75537309 | ||
|
|
526dc22fb8 | ||
|
|
9302dfbd65 | ||
|
|
27e287e508 | ||
|
|
d941a8ffbe | ||
|
|
772c5ec810 | ||
|
|
08f2f2191c | ||
|
|
90d6af32a7 | ||
|
|
e30cefc393 | ||
|
|
278ec39f2c | ||
|
|
4c8c2a1c2f | ||
|
|
c81e3629ff | ||
|
|
4dd927cfd0 | ||
|
|
13fcd0f9c5 | ||
|
|
67458abfc0 | ||
|
|
95986ae681 | ||
|
|
4386d2f3d3 | ||
|
|
d72e60c87d | ||
|
|
086087b65b | ||
|
|
e98cd76ec0 | ||
|
|
f21c4c0572 | ||
|
|
71f6d0371b | ||
|
|
5414eb3c38 | ||
|
|
d3d0b9767c | ||
|
|
35bdd1181b | ||
|
|
c88f1418ad | ||
|
|
f07832105d | ||
|
|
762fed228a | ||
|
|
c7000f330b | ||
|
|
814a97be9c | ||
|
|
bea4aea7a0 | ||
|
|
d1bd41bf48 | ||
|
|
3bb74ec09a | ||
|
|
86fa7bd49c | ||
|
|
b88a3854df | ||
|
|
e1eb26ba68 | ||
|
|
d79a0bde06 | ||
|
|
2c5398dfb2 | ||
|
|
608d05e240 | ||
|
|
ee3781d38a | ||
|
|
fdcb617677 | ||
|
|
0d0772aac9 | ||
|
|
49b574409a | ||
|
|
24def618bc | ||
|
|
8924349924 | ||
|
|
cac1c873f4 | ||
|
|
aa5a020c16 | ||
|
|
6e51ecbdd6 | ||
|
|
fd3ff958b1 | ||
|
|
13a25429ea | ||
|
|
0ab99a456e | ||
|
|
01f87f5e38 | ||
|
|
a0e789a111 | ||
|
|
1c2548ed0c | ||
|
|
cd7baf4b4f | ||
|
|
06d3d537db | ||
|
|
f20493cdc4 | ||
|
|
6d2e5542a5 | ||
|
|
1ddbf01dff | ||
|
|
8f1a72e049 | ||
|
|
1116cbfb36 | ||
|
|
078d896ef7 | ||
|
|
411240da74 | ||
|
|
4cb61cf8b8 | ||
|
|
dc6dae0b4c | ||
|
|
46c1003f2c | ||
|
|
ae2327e23a | ||
|
|
220bea18dc | ||
|
|
ddfbbe7bf0 | ||
|
|
663a35f5ce | ||
|
|
06dbdb178a | ||
|
|
37c6a7ef29 | ||
|
|
06a36706eb | ||
|
|
dbce29b24e | ||
|
|
33ed99c030 | ||
|
|
b1b9d49327 | ||
|
|
f73bce7935 | ||
|
|
af3660045f | ||
|
|
333dbf3be7 | ||
|
|
cdd94f84d9 | ||
|
|
5debb5e650 | ||
|
|
732ddf8011 | ||
|
|
291c049919 | ||
|
|
1b38d34a31 | ||
|
|
280cea8b9d | ||
|
|
1e1998cb14 | ||
|
|
3d6a116352 | ||
|
|
cca3cd2395 | ||
|
|
514f0ea714 | ||
|
|
4150ce342e | ||
|
|
c6815a55f7 | ||
|
|
49f59830c8 | ||
|
|
b1b42e958a | ||
|
|
af4715df6a | ||
|
|
7d004495d3 | ||
|
|
869ff84453 | ||
|
|
4f98de9331 | ||
|
|
e3d9a9a36e | ||
|
|
fadee4caea | ||
|
|
945d9c456f | ||
|
|
89c3d78739 | ||
|
|
e5ce5ca50a | ||
|
|
3b41fbca62 | ||
|
|
2bb78b92a2 | ||
|
|
7c7f145b17 | ||
|
|
8f63aec43a | ||
|
|
2250f507fd | ||
|
|
afb7ed18fd | ||
|
|
924f580277 | ||
|
|
c1eea9d1a1 | ||
|
|
c6b0164cbe | ||
|
|
0c4e8d2cbb | ||
|
|
9d31afdc9f | ||
|
|
fb918e7f2c | ||
|
|
a4a68604e1 | ||
|
|
03610f8c35 | ||
|
|
d75d6a0cb2 | ||
|
|
355ebbc65e | ||
|
|
2ef70bf737 | ||
|
|
199424d470 | ||
|
|
2a5046cd84 | ||
|
|
f274f36050 | ||
|
|
29637bbb39 | ||
|
|
641b31d800 | ||
|
|
2f4151ec2e | ||
|
|
c836694537 | ||
|
|
da3a69a885 | ||
|
|
db04024398 | ||
|
|
2f83e7f266 | ||
|
|
cc130d7e0f | ||
|
|
7020423b6e | ||
|
|
ddd09567e2 | ||
|
|
27be239d9d | ||
|
|
9b0ad93499 | ||
|
|
14d605c643 | ||
|
|
b6ab7bf733 | ||
|
|
7c44e2eb2f | ||
|
|
17463eb810 | ||
|
|
ddca185401 | ||
|
|
9dc634f7de | ||
|
|
1733512463 | ||
|
|
ed9c892946 | ||
|
|
ec4a884c4c | ||
|
|
0cbfeec360 | ||
|
|
6b80af6832 | ||
|
|
daafd61521 | ||
|
|
a8ebf0c300 | ||
|
|
583fa9a898 | ||
|
|
2788f10624 | ||
|
|
9129644dff | ||
|
|
485a619bfa | ||
|
|
d4c97f45b0 | ||
|
|
673fff90e2 | ||
|
|
ff696899f3 | ||
|
|
92a4d7543e | ||
|
|
ebb0e079af | ||
|
|
d79822146e | ||
|
|
4ea8690dd3 | ||
|
|
4dcd8d8823 | ||
|
|
a771260ce9 | ||
|
|
04cef50665 | ||
|
|
e6d5b6aa07 | ||
|
|
b3668e42e9 | ||
|
|
81be4dda9a | ||
|
|
61fa20ee64 | ||
|
|
e279be79df | ||
|
|
8079ca9a4b | ||
|
|
6f83c550de | ||
|
|
d6c4812343 | ||
|
|
1018187e10 | ||
|
|
824469e280 | ||
|
|
812b549d33 | ||
|
|
20a48b3de0 | ||
|
|
837b4ccaff | ||
|
|
fde199037a | ||
|
|
133cc0682b | ||
|
|
9ce709e6e3 | ||
|
|
2c6b565042 | ||
|
|
ea47f27b9d | ||
|
|
b5e60c9875 | ||
|
|
4fb55f87c6 | ||
|
|
6860ede1ad | ||
|
|
1070a3e729 | ||
|
|
a98d02248e | ||
|
|
f67660d30b | ||
|
|
92e70fc0bc | ||
|
|
f8fe9f0af9 | ||
|
|
e990395fc6 | ||
|
|
73e94abe3f | ||
|
|
6819123fed | ||
|
|
f871683c2d | ||
|
|
66eb9862ee | ||
|
|
a737c8c05a | ||
|
|
5fc4952595 | ||
|
|
3ae591a035 | ||
|
|
918758fbe9 | ||
|
|
92fd9a47ae | ||
|
|
c3e7b4c104 | ||
|
|
7a6ca96738 | ||
|
|
dabd4ad7fe | ||
|
|
ddfc2b003a | ||
|
|
5320b4e891 | ||
|
|
586364bd89 | ||
|
|
731829f199 | ||
|
|
7991d48614 | ||
|
|
e6bf0ef177 | ||
|
|
b5f3f44e96 | ||
|
|
81aca5f603 | ||
|
|
65d6f9255e | ||
|
|
98d5122404 | ||
|
|
7c24fcc695 | ||
|
|
efc9705b1a | ||
|
|
3455b6b848 | ||
|
|
7e88735445 | ||
|
|
a852541ad4 | ||
|
|
7d73fca112 | ||
|
|
6776c1d4a5 | ||
|
|
4ebcf6a248 | ||
|
|
961acf9454 | ||
|
|
ebb8368548 | ||
|
|
bd340aa673 | ||
|
|
f23aa77af1 | ||
|
|
2ed820777d | ||
|
|
54badceae4 | ||
|
|
595de4e7f2 | ||
|
|
26ddda9b7e | ||
|
|
524709f31a | ||
|
|
4ae5991cb3 | ||
|
|
5a44399300 | ||
|
|
d932684a11 | ||
|
|
0f6231ab38 | ||
|
|
bed26162cf | ||
|
|
fea5f9ccba | ||
|
|
1c43253062 | ||
|
|
9570f8d117 | ||
|
|
b6975d0c8b | ||
|
|
cc9d791f6c | ||
|
|
40c2c71f52 | ||
|
|
42d580ef65 | ||
|
|
0cbbd09db8 | ||
|
|
71220324f3 | ||
|
|
64e6d6cd04 | ||
|
|
7887e4f8cb | ||
|
|
ebf35d9680 | ||
|
|
cbae5b71ea | ||
|
|
aba3cde8e4 | ||
|
|
fcb1797413 | ||
|
|
0b53b95921 | ||
|
|
34489a03c7 | ||
|
|
3dd3d868ad | ||
|
|
fb4b5868ce | ||
|
|
ff3b23376b | ||
|
|
fa0b777680 | ||
|
|
16d21c9d2d | ||
|
|
a06ec8c88e | ||
|
|
a5f3d318c4 | ||
|
|
624827ea15 | ||
|
|
7b7e17491f | ||
|
|
1b44563777 | ||
|
|
4ed99abf6e | ||
|
|
a120f79ed5 | ||
|
|
4c8baa3b17 | ||
|
|
edc08173b3 | ||
|
|
efc3b2fa87 | ||
|
|
f8748e12fb | ||
|
|
2261c6c9f0 | ||
|
|
93d2621dc4 | ||
|
|
d4846589ea | ||
|
|
aceb236162 | ||
|
|
a7ed9f7dcd | ||
|
|
dcfd65fee4 | ||
|
|
d46d5d12d7 | ||
|
|
120a5701b9 | ||
|
|
b5d3a7658a | ||
|
|
f8155c23af | ||
|
|
b0f1cccd37 | ||
|
|
a7b58da079 | ||
|
|
1a8fd72df6 | ||
|
|
017e55a70a | ||
|
|
73f0fa6ff8 | ||
|
|
16ef96f0f5 | ||
|
|
bb283299f2 | ||
|
|
c90c85acaf | ||
|
|
d70b365335 | ||
|
|
c4738b007e | ||
|
|
a4f9cba1bb | ||
|
|
24905b7c34 | ||
|
|
9bcbee3202 | ||
|
|
1972f4763c | ||
|
|
3b9d2d2e36 | ||
|
|
c2a1ad2e46 | ||
|
|
1488c5a308 | ||
|
|
a6bafe833a | ||
|
|
95866394ea | ||
|
|
9f00b7b41b | ||
|
|
af9597d5b2 | ||
|
|
a546c5132a | ||
|
|
e71f013ea1 | ||
|
|
47da9a9cba | ||
|
|
5feecc022e | ||
|
|
da785cb8c4 | ||
|
|
02471e9402 | ||
|
|
e705ad6cd4 | ||
|
|
c00777f7fd | ||
|
|
4714b06d11 | ||
|
|
c008f4affb | ||
|
|
13467a8b92 | ||
|
|
a3c7955b1b | ||
|
|
7b1b6eca72 | ||
|
|
f2fd0fda9a | ||
|
|
c771689c3d | ||
|
|
c82709eaba | ||
|
|
e9655ad798 | ||
|
|
022569fc61 | ||
|
|
de1f5ed44a | ||
|
|
3d6450a188 | ||
|
|
f2851ad9c4 | ||
|
|
cf69b6438d | ||
|
|
93b381804e | ||
|
|
356c2bd171 | ||
|
|
20e42b3722 | ||
|
|
4ca14a75fc | ||
|
|
01bec789fb | ||
|
|
409dace2e7 | ||
|
|
5e127a7cd7 | ||
|
|
c968abc772 | ||
|
|
acf125f46d | ||
|
|
0304f6bd8c | ||
|
|
5b7297999b | ||
|
|
afbddd16c4 | ||
|
|
579cfac36e | ||
|
|
128088ea90 | ||
|
|
ba9fa67aaa | ||
|
|
1454cf7f42 | ||
|
|
78d48b684c | ||
|
|
8d97dd9add | ||
|
|
9f3ca844ff | ||
|
|
11257daf2a | ||
|
|
a10384c9f1 | ||
|
|
6edd2f4bdd | ||
|
|
aabfd5de9b | ||
|
|
27cc66b87e | ||
|
|
58d9923284 | ||
|
|
402ce97d1d | ||
|
|
8def5c98cf | ||
|
|
a97afd1268 | ||
|
|
699adb9c5a | ||
|
|
53a74c77a7 | ||
|
|
6d5c211f92 | ||
|
|
19cd6be03d | ||
|
|
0c09a2d46d | ||
|
|
914b2db304 | ||
|
|
70a139b643 | ||
|
|
820ad42239 | ||
|
|
5f603769da | ||
|
|
bbef784d80 | ||
|
|
6f397c63a9 | ||
|
|
cdd88d20c5 | ||
|
|
7055165f77 | ||
|
|
b81d3365de | ||
|
|
4c8ca30769 | ||
|
|
cf47363316 | ||
|
|
e1ccb6c328 | ||
|
|
60763fab8e | ||
|
|
de83ed694f | ||
|
|
d514e648db | ||
|
|
1016a49edd | ||
|
|
ca34259402 | ||
|
|
f3d30d6187 | ||
|
|
eea8b086ee | ||
|
|
2b2808bc82 | ||
|
|
2e919694cf | ||
|
|
03d49be4a0 | ||
|
|
667c07048b | ||
|
|
3ef3a4cfa1 | ||
|
|
332c968c52 | ||
|
|
beb34f8eee | ||
|
|
aad284b3c6 | ||
|
|
7905e30f22 | ||
|
|
6723569109 | ||
|
|
5421983766 | ||
|
|
6b5b8068ee | ||
|
|
3b70f38544 | ||
|
|
df35cd73fd | ||
|
|
d55e61c32b | ||
|
|
6c9e684841 | ||
|
|
8f12c34b1c | ||
|
|
3ba6364c86 | ||
|
|
efdf693621 | ||
|
|
488e2fbe0d | ||
|
|
b1758dcc8b | ||
|
|
ca19c18b80 | ||
|
|
2b6244e5d8 | ||
|
|
a8772498cb | ||
|
|
98349b1e6b | ||
|
|
470b64bc5a | ||
|
|
91fcc6ff07 | ||
|
|
97f1038ab7 | ||
|
|
4a700cc351 | ||
|
|
6333c707b8 | ||
|
|
0e30549e43 | ||
|
|
2804bf186b | ||
|
|
b184897d1e | ||
|
|
28cfb9cf47 | ||
|
|
9d4ae8966b | ||
|
|
821f1448b1 | ||
|
|
26211999e2 | ||
|
|
c85c292a5e | ||
|
|
8d1736d116 | ||
|
|
1986126701 | ||
|
|
7191d52a5d | ||
|
|
05372f8508 | ||
|
|
48bfe83c3d | ||
|
|
ee20455bd7 | ||
|
|
1b68242409 | ||
|
|
42e3485023 | ||
|
|
f527807bb8 | ||
|
|
eb09a04bd9 | ||
|
|
14f2f8be69 | ||
|
|
8821ea4d3a | ||
|
|
f363494625 | ||
|
|
2326d3a762 | ||
|
|
9c7c689a55 | ||
|
|
b38b45e27c | ||
|
|
8ef8752ad7 | ||
|
|
cee8a4f3ad | ||
|
|
d585def5d3 | ||
|
|
5da0b60057 | ||
|
|
5193ea2a44 | ||
|
|
01cc4554f1 | ||
|
|
b9a5a67c74 | ||
|
|
b7bb1dcd78 | ||
|
|
7430573573 | ||
|
|
afa0a497be | ||
|
|
a609f3041a | ||
|
|
251c92539e | ||
|
|
c046ac72bb | ||
|
|
1afd6f81e9 | ||
|
|
f3fe8a65b5 | ||
|
|
2b1a8f548a | ||
|
|
1c74b55a7f | ||
|
|
25d8d6a0c8 | ||
|
|
46cc189e67 | ||
|
|
34091ba16d | ||
|
|
aabd59cc8e | ||
|
|
3f1d25bb44 | ||
|
|
d0158ec50b | ||
|
|
3a37ab385d | ||
|
|
35006bff5f | ||
|
|
14fc8a1cce | ||
|
|
806387cef3 | ||
|
|
d3c3a63db3 | ||
|
|
c7ee8c845d | ||
|
|
4508a94528 | ||
|
|
4c2f07af92 | ||
|
|
62e5c0ccb3 | ||
|
|
e2948a99fa | ||
|
|
e94a1a9cb8 | ||
|
|
8ce25a7a20 | ||
|
|
19f5109db3 | ||
|
|
2c38bf505c | ||
|
|
a1a92b590d | ||
|
|
ba596cb5a3 | ||
|
|
ef8126fffb | ||
|
|
8a323c6799 | ||
|
|
58cb0b4c5a | ||
|
|
6c648cbd9b | ||
|
|
50cded27f2 | ||
|
|
61f3d4a9c2 | ||
|
|
79a22d5af6 | ||
|
|
b3e682f24e | ||
|
|
6a0ad0c5ae | ||
|
|
7b807b4bb0 | ||
|
|
77b6f79213 | ||
|
|
318ef5aade | ||
|
|
6fce6c7847 | ||
|
|
b439aa7724 | ||
|
|
ceccade90c | ||
|
|
119d376c79 | ||
|
|
11a978b1da | ||
|
|
31c9ef6297 | ||
|
|
8661026319 | ||
|
|
fc75b456bd | ||
|
|
93d99f9d0a | ||
|
|
71dfda824b | ||
|
|
8b628f9602 | ||
|
|
ff5fc18f18 | ||
|
|
8acf624c52 | ||
|
|
9d27ff0418 | ||
|
|
c62d986316 | ||
|
|
aeb7b60ca7 | ||
|
|
9ac22d65ef | ||
|
|
3934563ad6 | ||
|
|
64cdb3869c | ||
|
|
db7d85c50c | ||
|
|
17413fd570 | ||
|
|
8df708d473 | ||
|
|
dc7cd39283 | ||
|
|
ff6a0cf4d8 | ||
|
|
750dd57d6a | ||
|
|
89148e8214 | ||
|
|
831fdad5dd | ||
|
|
336b76baa1 | ||
|
|
31644737ae | ||
|
|
c657581e69 | ||
|
|
3f74b51f20 | ||
|
|
e7b314334a | ||
|
|
c28e5e6a67 | ||
|
|
c8307501e5 | ||
|
|
303498a9d1 | ||
|
|
8cb282b811 | ||
|
|
41f4617a4f | ||
|
|
8df3848b96 | ||
|
|
65295a100c | ||
|
|
6cf233b332 | ||
|
|
975ce2f54e | ||
|
|
fc21ba80f7 | ||
|
|
712b26c402 | ||
|
|
4be4ac68d4 | ||
|
|
586bfc5cb1 | ||
|
|
9b57d39bf5 | ||
|
|
55caae4eec | ||
|
|
dd2ed56951 | ||
|
|
d7ec19a70b | ||
|
|
cf724194f8 | ||
|
|
ec64e6ff84 | ||
|
|
ea3bb783cc | ||
|
|
822c4c2e08 | ||
|
|
c6316c1df7 | ||
|
|
ed73e94b46 | ||
|
|
36c5caecd1 | ||
|
|
14d5c8a63c | ||
|
|
8387cd94a3 | ||
|
|
c49a68d9aa | ||
|
|
b3f284c35a | ||
|
|
392eb211b3 | ||
|
|
87d3bccd25 | ||
|
|
c4e94c5be0 | ||
|
|
21ca318778 | ||
|
|
934f2c1799 | ||
|
|
9db2496b95 | ||
|
|
251694f2f2 | ||
|
|
2c84233946 | ||
|
|
9df95cedf8 | ||
|
|
16ba23bf3e | ||
|
|
71010c0fee | ||
|
|
7f09784fe1 | ||
|
|
122a84588a | ||
|
|
beae3643b9 | ||
|
|
d03ff5d629 | ||
|
|
73f1d6cf8e | ||
|
|
ef804c2534 | ||
|
|
e5a9cee54f | ||
|
|
fb17537fb5 | ||
|
|
3f63c0b4dd | ||
|
|
2d62b975bf | ||
|
|
0845b9b484 | ||
|
|
10ab5dc91b | ||
|
|
0170835529 | ||
|
|
feccd64b4a | ||
|
|
4d6bdaf808 | ||
|
|
935cc5606e | ||
|
|
751931a917 | ||
|
|
dddd7ce0b4 | ||
|
|
81ba0fc7b7 | ||
|
|
a3104569b1 | ||
|
|
bac736d616 | ||
|
|
ba404ac0f9 | ||
|
|
28d51dd064 | ||
|
|
815f098475 | ||
|
|
249d6fd24d | ||
|
|
03531dfdec | ||
|
|
30c54e8448 | ||
|
|
a9585365c0 | ||
|
|
7cecb4d89b | ||
|
|
c22a713ec4 | ||
|
|
63771833ad | ||
|
|
87bdd3fa0c | ||
|
|
efa974b26a | ||
|
|
424d209513 | ||
|
|
e06f833c6b | ||
|
|
7205219292 | ||
|
|
3c5b071c25 | ||
|
|
1f2d0102a9 | ||
|
|
fc524462ba | ||
|
|
92142f0e7e | ||
|
|
a57710c117 | ||
|
|
8ae4f020e9 | ||
|
|
2973b283df | ||
|
|
56d2733063 | ||
|
|
3d87b0f203 | ||
|
|
987fd7324f | ||
|
|
842bf91f76 | ||
|
|
352ddcf695 | ||
|
|
4e430da1a9 | ||
|
|
294ccf6f78 | ||
|
|
a55c033a16 | ||
|
|
7209bcd97d | ||
|
|
5b4f4d79e6 | ||
|
|
e8a3129f13 | ||
|
|
6dec23b6c3 | ||
|
|
b61053cc3a | ||
|
|
e1df2a5061 | ||
|
|
9ca80db3fa | ||
|
|
046490ad66 | ||
|
|
95cb6f415c | ||
|
|
bc3fba6b22 | ||
|
|
0cc3a064a9 | ||
|
|
8339e46c5d | ||
|
|
8e9401dbe8 | ||
|
|
23ef49f7df | ||
|
|
0812cc4bc3 | ||
|
|
ea2dc1ae62 | ||
|
|
58961b862c | ||
|
|
f3969bd973 | ||
|
|
7f714e7c65 | ||
|
|
d74f80b446 | ||
|
|
687c497669 | ||
|
|
9f866078a0 | ||
|
|
1157bb0f24 | ||
|
|
a23faea688 | ||
|
|
e3bb5c1ed5 | ||
|
|
2f676c5b72 | ||
|
|
b1a219bcae | ||
|
|
e227fdc29e | ||
|
|
f8a543c4b8 | ||
|
|
5eab78b6bf | ||
|
|
cb36d2b02f | ||
|
|
6ce8d05078 | ||
|
|
1939ad22e1 | ||
|
|
fe208879ef | ||
|
|
139696fa31 | ||
|
|
7e1dff54d2 | ||
|
|
090ede2d99 | ||
|
|
38a292227d | ||
|
|
52a81ec782 | ||
|
|
7b214064fa | ||
|
|
7db038c72c | ||
|
|
423eecc293 | ||
|
|
21a7d70c7e | ||
|
|
9c4a6ce723 | ||
|
|
e044de856a | ||
|
|
47a771f8c1 | ||
|
|
6e493c9131 | ||
|
|
d768757f7a | ||
|
|
1b592445f5 | ||
|
|
0324dfb918 | ||
|
|
38083b4314 | ||
|
|
84f3ee8073 | ||
|
|
57bf481315 | ||
|
|
1884f484ae | ||
|
|
63b6724c4a | ||
|
|
df08ecfef6 | ||
|
|
edf99982cf | ||
|
|
8eb29a9ede | ||
|
|
fc46f34f65 | ||
|
|
cc0a32cd67 | ||
|
|
0f8fdb728a | ||
|
|
4bd5d1e9f6 | ||
|
|
dc35445c9c | ||
|
|
eacfec8c91 | ||
|
|
fda10dbe66 | ||
|
|
42042976f4 | ||
|
|
cac14ee4bb | ||
|
|
18fe41b9c6 | ||
|
|
49fac85eca | ||
|
|
40e4b9cce9 | ||
|
|
409efd3222 | ||
|
|
553626d123 | ||
|
|
ef3ddd8326 | ||
|
|
fb2a9c8222 | ||
|
|
25e44b3385 | ||
|
|
bfbb4f06f2 | ||
|
|
6fe64a9097 | ||
|
|
088537b9b8 | ||
|
|
ba9e9ee01a | ||
|
|
78603de7e6 | ||
|
|
78c22d3df5 | ||
|
|
a17103f14f | ||
|
|
544a1f2959 | ||
|
|
e1722645c5 | ||
|
|
04ce0a9d7f | ||
|
|
73e123a357 | ||
|
|
cb86366b13 | ||
|
|
995bc6308b | ||
|
|
d738fdc1ef | ||
|
|
ef6486b09b | ||
|
|
cf67d4c9d7 | ||
|
|
bc4850a09c | ||
|
|
c49adcf395 | ||
|
|
a49a0680d3 | ||
|
|
348974be6f | ||
|
|
d7d6404c53 | ||
|
|
a6cd9ded51 | ||
|
|
472fdfd152 | ||
|
|
b17cab4794 | ||
|
|
0c037b2763 | ||
|
|
262ca468e9 | ||
|
|
9ed5cd53c7 | ||
|
|
319b75fe7d | ||
|
|
cdc77b121c | ||
|
|
d1a7ab2b74 | ||
|
|
07a63f3b8a | ||
|
|
8aaa459d9c | ||
|
|
4fe56e787e | ||
|
|
908c8f4951 | ||
|
|
d831f05769 | ||
|
|
671343b9e9 | ||
|
|
b286d9d6e9 | ||
|
|
3c3affb16a | ||
|
|
5341cc6ca2 | ||
|
|
27c3b1b9a0 | ||
|
|
ff905ef5d8 | ||
|
|
f79f4c0f46 | ||
|
|
ccc074ee73 | ||
|
|
7a31b02a67 | ||
|
|
e63028f8ee | ||
|
|
3ae4627956 | ||
|
|
2f40184de8 | ||
|
|
061a96a5ad | ||
|
|
4089be6b25 | ||
|
|
7845a8bddc | ||
|
|
2f321dc0a4 | ||
|
|
bb95816c79 | ||
|
|
a1aaf70975 | ||
|
|
c9ed0a0410 | ||
|
|
fbb614b1c6 | ||
|
|
191ba39129 | ||
|
|
ca4cd1a260 | ||
|
|
1738f7c540 | ||
|
|
ba2d00fd5a | ||
|
|
df3590fb47 | ||
|
|
3e10fa7bf9 | ||
|
|
3aaeca991e | ||
|
|
e6c4170f7c | ||
|
|
f95db00faf | ||
|
|
6e08ff35eb | ||
|
|
5253c31d93 | ||
|
|
32d40f038d | ||
|
|
57833472a9 | ||
|
|
29d0f0bf90 | ||
|
|
db84a0d03f | ||
|
|
c17cf8dcc8 | ||
|
|
f27a34708a | ||
|
|
4b01b226df | ||
|
|
b75b5a65e4 | ||
|
|
28345650f9 | ||
|
|
660f2f0940 | ||
|
|
0695907bc0 | ||
|
|
0d900a32ab | ||
|
|
273c1fd257 | ||
|
|
32e5324ebd | ||
|
|
d0d95b323f | ||
|
|
35c503945a | ||
|
|
ad57d68b67 | ||
|
|
aeacbc551f | ||
|
|
0ae7073e00 | ||
|
|
8fa5a9c4b6 | ||
|
|
9323fd897a | ||
|
|
834048c9d1 | ||
|
|
be1708a6df | ||
|
|
1eabb9b997 | ||
|
|
2722e1ac14 | ||
|
|
d960b43f98 | ||
|
|
a4a7b3a6b5 | ||
|
|
5eac4ea24a | ||
|
|
33f00a0853 | ||
|
|
cd6d04108a | ||
|
|
af7a646002 | ||
|
|
847751aed3 | ||
|
|
9880ed1d76 | ||
|
|
9f87beb9c9 | ||
|
|
a6b8a5bfc8 | ||
|
|
a0a43f3048 | ||
|
|
413f740496 | ||
|
|
1173ec0db0 | ||
|
|
c1c3697406 | ||
|
|
7f0365c2f2 | ||
|
|
d72ada5248 | ||
|
|
573516463d | ||
|
|
177cf0a5af | ||
|
|
3636d67a2c | ||
|
|
545d66dbe2 | ||
|
|
298866de63 | ||
|
|
5c1b99f240 | ||
|
|
3c360d21fa | ||
|
|
cb1ae8d4f4 | ||
|
|
5bbf96fff6 | ||
|
|
1eb093f064 | ||
|
|
4cf1d94e02 | ||
|
|
f2b1d2293f | ||
|
|
094d66e381 | ||
|
|
1fee1c6dd6 | ||
|
|
912fe4c610 | ||
|
|
07b310f5d5 | ||
|
|
4736bc3873 | ||
|
|
4da7a3fb58 | ||
|
|
09df64c05f | ||
|
|
e3c6d28fc4 | ||
|
|
848a947f9c | ||
|
|
32c81bbb70 | ||
|
|
e0a7344776 | ||
|
|
11817a05a4 | ||
|
|
6f63e73d75 | ||
|
|
3d951f7249 | ||
|
|
8833570a8e | ||
|
|
31a1664483 | ||
|
|
26327ddd05 | ||
|
|
e0251f0ce9 | ||
|
|
6d9c2cf4a0 | ||
|
|
4a32ba0375 | ||
|
|
c69d6ef96c | ||
|
|
f46c7d1555 | ||
|
|
902e377c68 | ||
|
|
4eca25a1f7 | ||
|
|
cc504e3416 | ||
|
|
608a69974a | ||
|
|
dcad86f6d1 | ||
|
|
faa4145d65 | ||
|
|
130ad7b127 | ||
|
|
13f5aa4978 | ||
|
|
85a8dd5c8f | ||
|
|
0f9c6f29f3 | ||
|
|
bbea8c8d78 | ||
|
|
b7ca3dcc2b | ||
|
|
f878107fec | ||
|
|
190ac34bd9 | ||
|
|
2a92ef46d0 | ||
|
|
660ee81e28 | ||
|
|
031e85a62e | ||
|
|
61a9427e7d | ||
|
|
d2da3f97fa | ||
|
|
a46b089f8a | ||
|
|
aa66c7e11f | ||
|
|
928bc94a1a | ||
|
|
c44c20def3 | ||
|
|
e5b1b8e4ec | ||
|
|
d8fdb75e7c | ||
|
|
4e52794a73 | ||
|
|
2e5339fee9 | ||
|
|
96323fd1aa | ||
|
|
8fb14e2cf3 | ||
|
|
7365b41680 | ||
|
|
a61e1b0590 | ||
|
|
1b48a2666a | ||
|
|
7ae63f6a58 | ||
|
|
f52a7497bf | ||
|
|
b96ea582c9 | ||
|
|
5bd483c28b | ||
|
|
abdb67d32a | ||
|
|
47e4d5197a | ||
|
|
06ea1ef2bd | ||
|
|
c195613cfe | ||
|
|
cf07e38121 | ||
|
|
e832ec6635 | ||
|
|
ec855c2ff9 | ||
|
|
95d8300033 | ||
|
|
9c28f88cb2 | ||
|
|
7db4dc546e | ||
|
|
aad12eb928 | ||
|
|
cfb446479d | ||
|
|
e589bbce0f | ||
|
|
d90227e066 | ||
|
|
007df549ab | ||
|
|
38e99031d7 | ||
|
|
00aa5d5a26 | ||
|
|
62543814da | ||
|
|
7ce3881f5c | ||
|
|
cb4a8e2631 | ||
|
|
4750badc4e | ||
|
|
023ea9f499 | ||
|
|
bdd08b9b6d | ||
|
|
95a693167c | ||
|
|
12d7397ff7 | ||
|
|
0292fad92e | ||
|
|
2786eedcb7 | ||
|
|
ba8ea3c72c | ||
|
|
21636907d6 | ||
|
|
7d9e1fc62a | ||
|
|
1165dc715f | ||
|
|
665f403565 | ||
|
|
68b607167d | ||
|
|
314631bb3e | ||
|
|
0cf87464ba | ||
|
|
c591ed16c3 | ||
|
|
ae5daf5830 | ||
|
|
d09046b501 | ||
|
|
4831fd6d7e | ||
|
|
57326cebce | ||
|
|
bd9a6bb3a0 | ||
|
|
7fc222d495 | ||
|
|
79917e22c2 | ||
|
|
9468d1f83a | ||
|
|
0af529b448 | ||
|
|
64b02509cd | ||
|
|
b2e0d45f2d | ||
|
|
f8efc93d0a | ||
|
|
73dce5ffb4 | ||
|
|
9dd6fb2524 | ||
|
|
5bced2429f | ||
|
|
bb85ab918f | ||
|
|
ec9b0b5cba | ||
|
|
7c046c100b | ||
|
|
34effae368 | ||
|
|
49bad59d78 | ||
|
|
8d3864090e | ||
|
|
872c77d728 | ||
|
|
b0f5a85e20 | ||
|
|
689ce1e775 | ||
|
|
611a0ac01a | ||
|
|
c74b8c751f | ||
|
|
69bde5e745 | ||
|
|
555c7a7711 | ||
|
|
30e0169f7a | ||
|
|
81bb08ffb5 | ||
|
|
42c57998d6 | ||
|
|
e9c6cffef2 | ||
|
|
ded399934f | ||
|
|
247e582b56 | ||
|
|
68dfc9239b | ||
|
|
06f8001cb7 | ||
|
|
f36462b0aa | ||
|
|
b0cad086c0 | ||
|
|
0b23bd3ab5 | ||
|
|
8f4024a0e4 | ||
|
|
7b097908a9 | ||
|
|
e378fae876 | ||
|
|
6d2725f63b | ||
|
|
3ccdbac923 | ||
|
|
0f614f1be3 | ||
|
|
e65b03b70a | ||
|
|
199c121a51 | ||
|
|
5f7b8cc34f | ||
|
|
d8e2318670 | ||
|
|
98cff07ca3 | ||
|
|
e34d84f712 | ||
|
|
d5fd98b08e | ||
|
|
64cd4a40a7 | ||
|
|
0ff334eeda | ||
|
|
0ac162fdc6 | ||
|
|
1b2930c52d | ||
|
|
65cb09c67b | ||
|
|
31bd87cd1c | ||
|
|
0c93392146 | ||
|
|
badf12ec28 | ||
|
|
64226e5a6e | ||
|
|
ccaa118dad | ||
|
|
08ade5cd1e | ||
|
|
616efbed60 | ||
|
|
a94bc0e070 | ||
|
|
06ea7a9146 | ||
|
|
f11adb312f | ||
|
|
305af9a9bb | ||
|
|
ecc81829df | ||
|
|
db489402d9 | ||
|
|
9b6681b4d0 | ||
|
|
8f04d45fa2 | ||
|
|
840f1df60d | ||
|
|
92926b9040 | ||
|
|
ef71e4f6d9 | ||
|
|
322b7729d9 | ||
|
|
a02c452110 | ||
|
|
abf5e08f3f | ||
|
|
371146c4ed | ||
|
|
e3ef4cded0 | ||
|
|
f8b625f253 | ||
|
|
2c20165768 | ||
|
|
cc17e30a02 | ||
|
|
6f06bfacd0 | ||
|
|
a4b8f74fe2 | ||
|
|
61f9919426 | ||
|
|
2a7eba7297 | ||
|
|
3dbfabcd8d | ||
|
|
eba3225b7c | ||
|
|
74c680cc6d | ||
|
|
b597913886 | ||
|
|
81004687c8 | ||
|
|
27b0c5b843 | ||
|
|
e635b25d7a | ||
|
|
424f15c4d2 | ||
|
|
7fb4bdde88 | ||
|
|
34463b800f | ||
|
|
3319e287d4 | ||
|
|
7882dcb7f8 | ||
|
|
4638bc7124 | ||
|
|
59bd6eecfd | ||
|
|
dfaccc42ae | ||
|
|
ca927e86ee | ||
|
|
ffa16d5bfb | ||
|
|
fa8d05bab3 | ||
|
|
f082df8ef4 | ||
|
|
f9b5e74d8a | ||
|
|
37f7d3eeaf | ||
|
|
0125554869 | ||
|
|
a0fa51578c | ||
|
|
c3f571f40a | ||
|
|
432e050e08 | ||
|
|
9c21d688ad | ||
|
|
4823353dd9 | ||
|
|
12f8069680 | ||
|
|
b968fd40f5 | ||
|
|
c7ef1ce3d6 | ||
|
|
dd5c181807 | ||
|
|
3b3d223beb | ||
|
|
13df79006c | ||
|
|
5d66eb5f89 | ||
|
|
87ef9b7f23 | ||
|
|
fec9addc0f | ||
|
|
d720e209e3 | ||
|
|
38ee0cfe81 | ||
|
|
503d8d0c24 | ||
|
|
4b17d0b4ab | ||
|
|
313fd279a2 | ||
|
|
51d5bd8a55 | ||
|
|
cc659d0837 | ||
|
|
2408a08aa9 | ||
|
|
b8e0b5e13a | ||
|
|
0a114af24e | ||
|
|
b691bd8252 | ||
|
|
f43aebf491 | ||
|
|
cca40edb3d | ||
|
|
c48abf70c4 | ||
|
|
7746ebd2d2 | ||
|
|
83a6a2db0b | ||
|
|
22906e748c | ||
|
|
ef8808b28d | ||
|
|
872928c885 | ||
|
|
7003fa984c | ||
|
|
9c0e24ac5c | ||
|
|
cb38c04cb5 |
265 changed files with 6615 additions and 2250 deletions
58
.github/workflows/10min-iiab-test-install.yml
vendored
Normal file
58
.github/workflows/10min-iiab-test-install.yml
vendored
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
name: '"10 min" IIAB on Ubuntu 24.04 on x86-64'
|
||||||
|
# run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
|
||||||
|
|
||||||
|
# https://michaelcurrin.github.io/dev-cheatsheets/cheatsheets/ci-cd/github-actions/triggers.html
|
||||||
|
on: [push, pull_request, workflow_dispatch]
|
||||||
|
|
||||||
|
# on:
|
||||||
|
# push:
|
||||||
|
#
|
||||||
|
# pull_request:
|
||||||
|
#
|
||||||
|
# # Allows you to run this workflow manually from the Actions tab
|
||||||
|
# workflow_dispatch:
|
||||||
|
#
|
||||||
|
# # Set your workflow to run every day of the week from Monday to Friday at 6:00 UTC
|
||||||
|
# schedule:
|
||||||
|
# - cron: "0 6 * * 1-5"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-install:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
|
||||||
|
- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
|
||||||
|
#- name: Dump GitHub context (typically almost 500 lines)
|
||||||
|
# env:
|
||||||
|
# GITHUB_CONTEXT: ${{ toJSON(github) }}
|
||||||
|
# run: echo "$GITHUB_CONTEXT"
|
||||||
|
- name: Check out repository code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- run: echo "🍏 This job's status is ${{ job.status }}."
|
||||||
|
- name: GitHub Actions "runner" environment
|
||||||
|
run: |
|
||||||
|
uname -a # uname -srm
|
||||||
|
whoami # Typically 'runner' instead of 'root'
|
||||||
|
pwd # /home/runner/work/iiab/iiab == $GITHUB_WORKSPACE == ${{ github.workspace }}
|
||||||
|
# ls
|
||||||
|
# ls $GITHUB_WORKSPACE
|
||||||
|
# ls ${{ github.workspace }}
|
||||||
|
# ls -la /opt # az, containerd, google, hostedtoolcache, microsoft, mssql-tools, pipx, pipx_bin, post-generation, runner, vsts
|
||||||
|
# apt update
|
||||||
|
# apt dist-upgrade -y
|
||||||
|
# apt autoremove -y
|
||||||
|
- name: Set up /opt/iiab/iiab
|
||||||
|
run: |
|
||||||
|
mkdir /opt/iiab
|
||||||
|
mv $GITHUB_WORKSPACE /opt/iiab
|
||||||
|
mkdir $GITHUB_WORKSPACE # OR SUBSEQUENT STEPS WILL FAIL ('working-directory: /opt/iiab/iiab' hacks NOT worth it!)
|
||||||
|
- name: Set up /etc/iiab/local_vars.yml
|
||||||
|
run: |
|
||||||
|
sudo mkdir /etc/iiab
|
||||||
|
# touch /etc/iiab/local_vars.yml
|
||||||
|
sudo cp /opt/iiab/iiab/vars/local_vars_none.yml /etc/iiab/local_vars.yml
|
||||||
|
- run: sudo /opt/iiab/iiab/scripts/ansible
|
||||||
|
- run: sudo ./iiab-install
|
||||||
|
working-directory: /opt/iiab/iiab
|
||||||
|
- run: iiab-summary
|
||||||
|
- run: cat /etc/iiab/iiab_state.yml
|
||||||
65
.github/workflows/30min-iiab-test-install-deb12-on-rpi3.yml
vendored
Normal file
65
.github/workflows/30min-iiab-test-install-deb12-on-rpi3.yml
vendored
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
name: '"30 min" IIAB on Debian 12 on RPi 3'
|
||||||
|
# run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
|
||||||
|
|
||||||
|
# https://michaelcurrin.github.io/dev-cheatsheets/cheatsheets/ci-cd/github-actions/triggers.html
|
||||||
|
on: [push, pull_request, workflow_dispatch]
|
||||||
|
|
||||||
|
# on:
|
||||||
|
# push:
|
||||||
|
#
|
||||||
|
# pull_request:
|
||||||
|
#
|
||||||
|
# # Allows you to run this workflow manually from the Actions tab
|
||||||
|
# workflow_dispatch:
|
||||||
|
#
|
||||||
|
# # Set your workflow to run every day of the week from Monday to Friday at 6:00 UTC
|
||||||
|
# schedule:
|
||||||
|
# - cron: "0 6 * * 1-5"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-install:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
arch: [debian12]
|
||||||
|
include:
|
||||||
|
- arch: debian12
|
||||||
|
cpu: cortex-a7
|
||||||
|
cpu_info: cpuinfo/raspberrypi_3b
|
||||||
|
base_image: https://raspi.debian.net/daily/raspi_3_bookworm.img.xz
|
||||||
|
# source https://raspi.debian.net/daily-images/
|
||||||
|
steps:
|
||||||
|
#- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
|
||||||
|
#- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
|
||||||
|
#- name: Dump GitHub context (typically almost 500 lines)
|
||||||
|
# env:
|
||||||
|
# GITHUB_CONTEXT: ${{ toJSON(github) }}
|
||||||
|
# run: echo "$GITHUB_CONTEXT"
|
||||||
|
- name: Dump matrix context
|
||||||
|
env:
|
||||||
|
MATRIX_CONTEXT: ${{ toJSON(matrix) }}
|
||||||
|
run: echo "$MATRIX_CONTEXT"
|
||||||
|
- uses: actions/checkout@v3.1.0
|
||||||
|
- uses: pguyot/arm-runner-action@v2
|
||||||
|
with:
|
||||||
|
image_additional_mb: 1024
|
||||||
|
base_image: ${{ matrix.base_image }}
|
||||||
|
cpu: ${{ matrix.cpu }}
|
||||||
|
cpu_info: ${{ matrix.cpu_info }}
|
||||||
|
copy_repository_path: /opt/iiab/iiab
|
||||||
|
commands: |
|
||||||
|
echo "🍏 This job's status is ${{ job.status }}."
|
||||||
|
grep Model /proc/cpuinfo
|
||||||
|
uname -a # uname -srm
|
||||||
|
whoami # Typically 'root' instead of 'runner'
|
||||||
|
pwd # /home/runner/work/iiab/iiab == $GITHUB_WORKSPACE == ${{ github.workspace }}
|
||||||
|
apt-get update -y --allow-releaseinfo-change
|
||||||
|
apt-get install --no-install-recommends -y git
|
||||||
|
ls /opt/iiab/iiab
|
||||||
|
mkdir /etc/iiab
|
||||||
|
cp /opt/iiab/iiab/vars/local_vars_none.yml /etc/iiab/local_vars.yml
|
||||||
|
/opt/iiab/iiab/scripts/ansible
|
||||||
|
./iiab-install
|
||||||
|
cd /opt/iiab/iiab
|
||||||
|
iiab-summary
|
||||||
|
cat /etc/iiab/iiab_state.yml
|
||||||
77
.github/workflows/30min-iiab-test-install-raspios-on-zero2w.yml
vendored
Normal file
77
.github/workflows/30min-iiab-test-install-raspios-on-zero2w.yml
vendored
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
name: '"30 min" IIAB on RasPiOS on Zero 2 W'
|
||||||
|
# run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
|
||||||
|
|
||||||
|
# https://michaelcurrin.github.io/dev-cheatsheets/cheatsheets/ci-cd/github-actions/triggers.html
|
||||||
|
on: [push, pull_request, workflow_dispatch]
|
||||||
|
|
||||||
|
# on:
|
||||||
|
# push:
|
||||||
|
#
|
||||||
|
# pull_request:
|
||||||
|
#
|
||||||
|
# # Allows you to run this workflow manually from the Actions tab
|
||||||
|
# workflow_dispatch:
|
||||||
|
#
|
||||||
|
# # Set your workflow to run every day of the week from Monday to Friday at 6:00 UTC
|
||||||
|
# schedule:
|
||||||
|
# - cron: "0 6 * * 1-5"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-install:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
arch: [aarch64] #[zero_raspbian, zero_raspios, zero2_raspios, aarch64]
|
||||||
|
include:
|
||||||
|
#- arch: zero_raspbian
|
||||||
|
# cpu: arm1176
|
||||||
|
# cpu_info: cpuinfo/raspberrypi_zero_w
|
||||||
|
# base_image: raspbian_lite:latest
|
||||||
|
#- arch: zero_raspios
|
||||||
|
# cpu: arm1176
|
||||||
|
# cpu_info: cpuinfo/raspberrypi_zero_w
|
||||||
|
# base_image: raspios_lite:latest
|
||||||
|
#- arch: zero2_raspios
|
||||||
|
# cpu: cortex-a7
|
||||||
|
# cpu_info: cpuinfo/raspberrypi_zero2_w
|
||||||
|
# base_image: raspios_lite:latest
|
||||||
|
- arch: aarch64
|
||||||
|
cpu: cortex-a53
|
||||||
|
cpu_info: cpuinfo/raspberrypi_zero2_w_arm64
|
||||||
|
base_image: raspios_lite_arm64:latest
|
||||||
|
steps:
|
||||||
|
#- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
|
||||||
|
#- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
|
||||||
|
#- name: Dump GitHub context (typically almost 500 lines)
|
||||||
|
# env:
|
||||||
|
# GITHUB_CONTEXT: ${{ toJSON(github) }}
|
||||||
|
# run: echo "$GITHUB_CONTEXT"
|
||||||
|
- name: Dump matrix context
|
||||||
|
env:
|
||||||
|
MATRIX_CONTEXT: ${{ toJSON(matrix) }}
|
||||||
|
run: echo "$MATRIX_CONTEXT"
|
||||||
|
- uses: actions/checkout@v3.1.0
|
||||||
|
- uses: pguyot/arm-runner-action@v2
|
||||||
|
with:
|
||||||
|
image_additional_mb: 1024
|
||||||
|
base_image: ${{ matrix.base_image }}
|
||||||
|
cpu: ${{ matrix.cpu }}
|
||||||
|
cpu_info: ${{ matrix.cpu_info }}
|
||||||
|
copy_repository_path: /opt/iiab/iiab
|
||||||
|
commands: |
|
||||||
|
echo "🍏 This job's status is ${{ job.status }}."
|
||||||
|
#test `uname -m` = ${{ matrix.arch }}
|
||||||
|
grep Model /proc/cpuinfo
|
||||||
|
uname -a # uname -srm
|
||||||
|
whoami # Typically 'root' instead of 'runner'
|
||||||
|
pwd # /home/runner/work/iiab/iiab == $GITHUB_WORKSPACE == ${{ github.workspace }}
|
||||||
|
apt-get update -y --allow-releaseinfo-change
|
||||||
|
apt-get install --no-install-recommends -y git
|
||||||
|
ls /opt/iiab/iiab
|
||||||
|
mkdir /etc/iiab
|
||||||
|
cp /opt/iiab/iiab/vars/local_vars_none.yml /etc/iiab/local_vars.yml
|
||||||
|
/opt/iiab/iiab/scripts/ansible
|
||||||
|
./iiab-install
|
||||||
|
cd /opt/iiab/iiab
|
||||||
|
iiab-summary
|
||||||
|
cat /etc/iiab/iiab_state.yml
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
|
|
@ -1,8 +1,13 @@
|
||||||
xs-config.spec
|
# https://git-scm.com/docs/gitignore
|
||||||
|
|
||||||
build
|
build
|
||||||
deprecated
|
deprecated
|
||||||
.ansible
|
.ansible
|
||||||
*.patches
|
*.patches
|
||||||
*.log
|
*.log
|
||||||
*.retry
|
*.retry
|
||||||
|
|
||||||
|
# Lines below for emacs, which generates even more tmp files since 2022
|
||||||
*~
|
*~
|
||||||
|
.#*
|
||||||
|
\#*#
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# SEE THE NEW<br>[github.com/iiab/iiab/wiki/IIAB-Contributors-Guide](https://github.com/iiab/iiab/wiki/IIAB-Contributors-Guide)
|
# SEE THE NEW<br>[github.com/iiab/iiab/wiki/Contributors-Guide-(EN)](https://github.com/iiab/iiab/wiki/Contributors-Guide-(EN))
|
||||||
|
|
||||||
# THANKS!
|
# THANKS!
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,6 @@ this is to include the following two lines at the top of the file:
|
||||||
Licensed under the terms of the GNU GPL v2 or later; see LICENSE for details.
|
Licensed under the terms of the GNU GPL v2 or later; see LICENSE for details.
|
||||||
|
|
||||||
All files not containing an explicit copyright notice or terms of license in
|
All files not containing an explicit copyright notice or terms of license in
|
||||||
the file are Copyright © 2015-2022, Unleash Kids, and are licensed under the
|
the file are Copyright © 2015-2025, Unleash Kids, and are licensed under the
|
||||||
terms of the GPLv2 license in the file named LICENSE in the root of the
|
terms of the GPLv2 license in the file named LICENSE in the root of the
|
||||||
repository.
|
repository.
|
||||||
|
|
|
||||||
26
README.md
26
README.md
|
|
@ -2,26 +2,26 @@
|
||||||
|
|
||||||
# Internet-in-a-Box (IIAB)
|
# Internet-in-a-Box (IIAB)
|
||||||
|
|
||||||
[Internet-in-a-Box (IIAB)](https://internet-in-a-box.org) is a "learning hotspot" that brings the Internet's crown jewels
|
[Internet-in-a-Box (IIAB)](https://internet-in-a-box.org) is a “learning hotspot” that brings the Internet's crown jewels
|
||||||
(Wikipedia in any language, thousands of Khan Academy videos, zoomable OpenStreetMap, electronic books, WordPress journaling, Toys from Trash electronics projects, ETC) to those without Internet.
|
(Wikipedia in any language, thousands of Khan Academy videos, zoomable OpenStreetMap, electronic books, WordPress journaling, “Toys from Trash” electronics projects, ETC) to those without Internet.
|
||||||
|
|
||||||
You can build your own tiny, affordable server (an offline digital library) for your school, your medical clinic, your prison, your region and/or your very own family — accessible with any nearby smartphone, tablet or laptop.
|
You can build your own tiny, affordable server (an offline digital library) for your school, your medical clinic, your prison, your region and/or your very own family — accessible with any nearby smartphone, tablet or laptop.
|
||||||
|
|
||||||
Internet-in-a-Box gives you the DIY tools to:
|
Internet-in-a-Box gives you the DIY tools to:
|
||||||
1. Download then drag-and-drop to arrange the [very best of the World’s Free Knowledge](https://internet-in-a-box.org/#quality-content).
|
1. Download then drag-and-drop to arrange the [very best of the World’s Free Knowledge](https://internet-in-a-box.org/#quality-content).
|
||||||
2. Choose among [30+ powerful educational apps](https://wiki.iiab.io/go/FAQ#What_services_.28IIAB_apps.29_are_suggested_during_installation.3F) for your school or learning/teaching community, optionally with a complete LMS (learning management system).
|
2. Choose among [30+ powerful educational apps](https://wiki.iiab.io/go/FAQ#What_services_%28IIAB_apps%29_are_suggested_during_installation%3F) for your school or learning/teaching community, optionally with a complete LMS (learning management system).
|
||||||
3. Exchange local/indigenous knowledge with nearby communities, using our [Manage Content](https://github.com/iiab/iiab-admin-console/blob/master/roles/console/files/help/InstContent.rst#manage-content) interface and possible mesh networking.
|
3. Exchange local/indigenous knowledge with nearby communities, using our [Manage Content](https://github.com/iiab/iiab-admin-console/blob/master/roles/console/files/help/InstContent.rst#manage-content) interface and possible mesh networking.
|
||||||
|
|
||||||
FYI this [community product](https://en.wikipedia.org/wiki/Internet-in-a-Box) is enabled by professional volunteers working [side-by-side](https://wiki.iiab.io/go/FAQ#What_are_the_best_places_for_community_support.3F) with schools, clinics and libraries around the world. *Thank you for being a part of our http://OFF.NETWORK grassroots technology [movement](https://meta.wikimedia.org/wiki/Internet-in-a-Box)!*
|
FYI this [community product](https://en.wikipedia.org/wiki/Internet-in-a-Box) is enabled by professional volunteers working [side-by-side](https://wiki.iiab.io/go/FAQ#What_are_the_best_places_for_community_support%3F) with schools, clinics and libraries around the world. *Thank you for being a part of our http://OFF.NETWORK grassroots technology [movement](https://meta.wikimedia.org/wiki/Internet-in-a-Box)!*
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Install Internet-in-a-Box (IIAB) from [download.iiab.io](https://download.iiab.io/)
|
Install Internet-in-a-Box (IIAB) from: [**download.iiab.io**](https://download.iiab.io/)
|
||||||
|
|
||||||
Please see [FAQ.IIAB.IO](https://wiki.iiab.io/go/FAQ) which has 40+ questions and answers to help you along the way, as you put together the <!--digital--> "local learning hotspot" most suitable for your own teaching/learning community. Here are 2 ways to install IIAB:
|
Please see [FAQ.IIAB.IO](https://wiki.iiab.io/go/FAQ) which has 50+ questions and answers to help you along the way (e.g. [“Is a quick installation possible?”](https://wiki.iiab.io/go/FAQ#Is_a_quick_installation_possible%3F)) as you put together the <!--digital--> “local learning hotspot” most suitable for your own teaching/learning community. Here are 2 ways to install IIAB:
|
||||||
|
|
||||||
- Our [1-line installer](https://download.iiab.io/) gets you the very latest, typically within about an hour, on [different Linux distributions](https://github.com/iiab/iiab/wiki/IIAB-Platforms#operating-systems).
|
- Our [1-line installer](https://download.iiab.io/) gets you the very latest, typically within about an hour, on [different Linux distributions](https://github.com/iiab/iiab/wiki/IIAB-Platforms#operating-systems).
|
||||||
- [Prefab disk images](https://github.com/iiab/iiab/wiki/Raspberry-Pi-Images:-Summary#iiab-images-for-raspberry-pi) ([.img files](https://archive.org/search.php?query=iiab%20.img&sort=-publicdate)) are sometimes a few months out of date, but can be flashed directly onto a microSD card, for insertion into Raspberry Pi.
|
- [Prefab disk images](https://github.com/iiab/iiab/wiki/Raspberry-Pi-Images-~-Summary#iiab-images-for-raspberry-pi) ([.img files](https://archive.org/search.php?query=iiab%20.img&sort=-publicdate)) are sometimes a few months out of date, but can be flashed directly onto a microSD card, for insertion into Raspberry Pi.
|
||||||
|
|
||||||
Our [HOW-TO videos](https://www.youtube.com/channel/UC0cBGCxr_WPBPa3IqPVEe3g) can be very helpful and the [Installation](https://github.com/iiab/iiab/wiki/IIAB-Installation) wiki page has more intricate details e.g. if you're trying to install Internet-in-a-Box (IIAB) onto a [another Linux](https://github.com/iiab/iiab/wiki/IIAB-Platforms) that has not yet been tried.
|
Our [HOW-TO videos](https://www.youtube.com/channel/UC0cBGCxr_WPBPa3IqPVEe3g) can be very helpful and the [Installation](https://github.com/iiab/iiab/wiki/IIAB-Installation) wiki page has more intricate details e.g. if you're trying to install Internet-in-a-Box (IIAB) onto a [another Linux](https://github.com/iiab/iiab/wiki/IIAB-Platforms) that has not yet been tried.
|
||||||
|
|
||||||
|
|
@ -29,22 +29,22 @@ See our [Tech Docs Wiki](https://github.com/iiab/iiab/wiki) for more about the u
|
||||||
|
|
||||||
After you've installed the software, you should [add content](https://github.com/iiab/iiab/wiki/IIAB-Installation#add-content), which can of course take time when downloading multi-gigabyte Content Packs!
|
After you've installed the software, you should [add content](https://github.com/iiab/iiab/wiki/IIAB-Installation#add-content), which can of course take time when downloading multi-gigabyte Content Packs!
|
||||||
|
|
||||||
Finally, you can [customize your Internet-in-a-Box home page](https://wiki.iiab.io/go/FAQ#How_do_I_customize_my_Internet-in-a-Box_home_page.3F) (typically http://box or http://box.lan) using our **drag-and-drop** Admin Console (http://box.lan/admin) — to arrange Content Packs and IIAB Apps (services) for your local community's needs.
|
Finally, you can [customize your Internet-in-a-Box home page](https://wiki.iiab.io/go/FAQ#How_do_I_customize_my_Internet-in-a-Box_home_page%3F) (typically http://box or http://box.lan) using our **drag-and-drop** Admin Console (http://box.lan/admin) — to arrange Content Packs and IIAB Apps (services) for your local community's needs.
|
||||||
|
|
||||||
## Community
|
## Community
|
||||||
|
|
||||||
Global community updates and videos are regularly posted to: **[@internet_in_box](https://twitter.com/internet_in_box)**
|
Global community updates and videos are regularly posted to: **[@internet_in_box](https://twitter.com/internet_in_box)**
|
||||||
|
|
||||||
_Internet-in-a-Box (IIAB) greatly welcomes contributions from educators, librarians and [IT/UX/QA people](https://github.com/iiab/iiab/wiki/Technical-Contributors-Guide) of all kinds!_
|
_Internet-in-a-Box (IIAB) greatly welcomes contributions from educators, librarians and [IT/UX/QA people](https://github.com/iiab/iiab/wiki/Contributors-Guide-(EN)) ([versión en español](https://github.com/iiab/iiab/wiki/Gu%C3%ADa-para-Contribuidores-(ES))) of all kinds!_
|
||||||
|
|
||||||
If you would like to volunteer, please [make contact](https://internet-in-a-box.org/contributing.html) after looking over "[How can I help?](https://wiki.iiab.io/go/FAQ#How_can_I_help.3F)" at: [FAQ.IIAB.IO](https://wiki.iiab.io/go/FAQ)
|
If you would like to volunteer, please [make contact](https://internet-in-a-box.org/contributing.html) after looking over [“How can I help?”](https://wiki.iiab.io/go/FAQ#How_can_I_help%3F) at: [FAQ.IIAB.IO](https://wiki.iiab.io/go/FAQ)
|
||||||
|
|
||||||
<!-- To learn about our software architecture, check out our [Contributors Guide](https://github.com/iiab/iiab/wiki/IIAB-Contributors-Guide).-->
|
<!-- To learn about our software architecture, check out our [Contributors Guide](https://github.com/iiab/iiab/wiki/IIAB-Contributors-Guide).-->
|
||||||
|
|
||||||
To learn more about our open community architecture for "offline" learning, check out "[What technical documentation exists?](https://wiki.iiab.io/go/FAQ#What_technical_documentation_exists.3F)"
|
To learn more about our open community architecture for “offline” learning, check out [“What technical documentation exists?”](https://wiki.iiab.io/go/FAQ#What_technical_documentation_exists%3F)
|
||||||
FYI we use [Ansible](https://wiki.iiab.io/go/FAQ#What_is_Ansible_and_what_version_should_I_use.3F) <!--as the underlying technology--> to install, deploy, configure and manage the various software components.
|
FYI we use [Ansible](https://wiki.iiab.io/go/FAQ#What_is_Ansible_and_what_version_should_I_use%3F) <!--as the underlying technology--> to install, deploy, configure and manage the various software components.
|
||||||
|
|
||||||
*Thank you for helping us enable offline access to the Internet's free/open knowledge jewels, as well as "Sneakernet-of-Alexandria" distribution of local/indigenous content, when mass media channels do not serve grassroots voices.*
|
*Thank you for helping us enable offline access to the Internet's free/open knowledge jewels, as well as “Sneakernet-of-Alexandria” distribution of local/indigenous content, when mass media channels do not serve grassroots voices.*
|
||||||
|
|
||||||
## Versions
|
## Versions
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,4 +5,4 @@
|
||||||
# Disallowed by Ansible 2.11+ -- see https://docs.ansible.com/ansible/devel/porting_guides/porting_guide_2.7.html#using-a-loop-on-a-package-module-via-squash-actions
|
# Disallowed by Ansible 2.11+ -- see https://docs.ansible.com/ansible/devel/porting_guides/porting_guide_2.7.html#using-a-loop-on-a-package-module-via-squash-actions
|
||||||
#squash_actions = apk, apt, dnf, homebrew, openbsd_pkg, pacman, pkgng, yum, zypper, package
|
#squash_actions = apk, apt, dnf, homebrew, openbsd_pkg, pacman, pkgng, yum, zypper, package
|
||||||
[defaults]
|
[defaults]
|
||||||
interpreter_python=/usr/bin/python3
|
interpreter_python=/usr/local/ansible/bin/python3
|
||||||
|
|
|
||||||
11
iiab-install
11
iiab-install
|
|
@ -11,7 +11,7 @@ CWD=`pwd`
|
||||||
OS=`grep ^ID= /etc/os-release | cut -d= -f2`
|
OS=`grep ^ID= /etc/os-release | cut -d= -f2`
|
||||||
OS=${OS//\"/} # Remove all '"'
|
OS=${OS//\"/} # Remove all '"'
|
||||||
MIN_RPI_KERN=5.4.0 # Do not use 'rpi-update' unless absolutely necessary: https://github.com/iiab/iiab/issues/1993
|
MIN_RPI_KERN=5.4.0 # Do not use 'rpi-update' unless absolutely necessary: https://github.com/iiab/iiab/issues/1993
|
||||||
MIN_ANSIBLE_VER=2.11.12 # 2022-11-09: Raspberry Pi 3 (and 3 B+ etc?) apparently install (and require?) ansible-core 2.11 for now -- @deldesir can explain more on PR #3419. Historical: Ansible 2.8.3 and 2.8.6 had serious bugs, preventing their use with IIAB.
|
MIN_ANSIBLE_VER=2.16.14 # 2024-11-08: ansible-core 2.15 EOL is November 2024 per https://docs.ansible.com/ansible/latest/reference_appendices/release_and_maintenance.html#ansible-core-support-matrix 2022-11-09: Raspberry Pi 3 (and 3 B+ etc?) apparently install (and require?) ansible-core 2.11 for now -- @deldesir can explain more on PR #3419. Historical: Ansible 2.8.3 and 2.8.6 had serious bugs, preventing their use with IIAB.
|
||||||
|
|
||||||
REINSTALL=false
|
REINSTALL=false
|
||||||
DEBUG=false
|
DEBUG=false
|
||||||
|
|
@ -65,7 +65,7 @@ if [ ! -f /etc/iiab/local_vars.yml ]; then
|
||||||
echo -e "████████████████████████████████████████████████████████████████████████████████\n" >&2
|
echo -e "████████████████████████████████████████████████████████████████████████████████\n" >&2
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "\nEXITING: /opt/iiab/iiab/iiab-install REQUIRES /etc/iiab/local_vars.yml\n" >&2
|
echo -e "\n\e[1mEXITING: /opt/iiab/iiab/iiab-install REQUIRES /etc/iiab/local_vars.yml\e[0m\n" >&2
|
||||||
|
|
||||||
echo -e "(1) See http://FAQ.IIAB.IO -> What is local_vars.yml and how do I customize it?" >&2
|
echo -e "(1) See http://FAQ.IIAB.IO -> What is local_vars.yml and how do I customize it?" >&2
|
||||||
echo -e "(2) SMALL/MEDIUM/LARGE samples are included in /opt/iiab/iiab/vars" >&2
|
echo -e "(2) SMALL/MEDIUM/LARGE samples are included in /opt/iiab/iiab/vars" >&2
|
||||||
|
|
@ -124,7 +124,7 @@ CURR_ANSIBLE_VER=0
|
||||||
#if [[ $(command -v ansible) ]]; then # Also Works! $(...) nests more easily than backticks
|
#if [[ $(command -v ansible) ]]; then # Also Works! $(...) nests more easily than backticks
|
||||||
#if [[ `which ansible` ]]; then # "which" misses built-in commands like cd, and is RISKY per https://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script
|
#if [[ `which ansible` ]]; then # "which" misses built-in commands like cd, and is RISKY per https://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script
|
||||||
#if [[ `type -P ansible` ]]; then # "type -P" isn't POSIX compliant; it misses built-in commands like "cd"
|
#if [[ `type -P ansible` ]]; then # "type -P" isn't POSIX compliant; it misses built-in commands like "cd"
|
||||||
if [[ `command -v ansible` ]]; then # "command -v" is POSIX compliant; it catches built-in commands like "cd"
|
if [[ $(command -v ansible) ]]; then # "command -v" is POSIX compliant; it catches built-in commands like "cd"
|
||||||
CURR_ANSIBLE_VER=$(ansible --version | head -1 | cut -f 2- -d " " | sed 's/.* \([^ ]*\)\].*/\1/')
|
CURR_ANSIBLE_VER=$(ansible --version | head -1 | cut -f 2- -d " " | sed 's/.* \([^ ]*\)\].*/\1/')
|
||||||
# Above works with 'ansible [core 2.11.0rc2]' -- these old ways do not:
|
# Above works with 'ansible [core 2.11.0rc2]' -- these old ways do not:
|
||||||
#CURR_ANSIBLE_VER=$(ansible --version | head -1 | awk '{print $2}')
|
#CURR_ANSIBLE_VER=$(ansible --version | head -1 | awk '{print $2}')
|
||||||
|
|
@ -179,14 +179,15 @@ fi
|
||||||
# /etc/iiab/iiab_state.yml is mandatory and must be created here. Background:
|
# /etc/iiab/iiab_state.yml is mandatory and must be created here. Background:
|
||||||
# Allow iiab-install to read IIAB_STATE_FILE to not repeat installs of previous
|
# Allow iiab-install to read IIAB_STATE_FILE to not repeat installs of previous
|
||||||
# roles that already completed within the stage.
|
# roles that already completed within the stage.
|
||||||
if [ ! -f $IIAB_STATE_FILE ]; then
|
if [ ! -f $IIAB_STATE_FILE ]; then # touch $IIAB_STATE_FILE
|
||||||
#touch $IIAB_STATE_FILE
|
echo -e "\nCreating... $IIAB_STATE_FILE"
|
||||||
cat > $IIAB_STATE_FILE << EOF
|
cat > $IIAB_STATE_FILE << EOF
|
||||||
# DO *NOT* MANUALLY EDIT THIS, THANKS!
|
# DO *NOT* MANUALLY EDIT THIS, THANKS!
|
||||||
# IIAB does NOT currently support uninstalling apps/services.
|
# IIAB does NOT currently support uninstalling apps/services.
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "\nTRY TO RERUN './iiab-install' IF IT FAILS DUE TO CONNECTIVITY ISSUES ETC!\n"
|
echo -e "\nTRY TO RERUN './iiab-install' IF IT FAILS DUE TO CONNECTIVITY ISSUES ETC!\n"
|
||||||
|
|
||||||
echo -e "\e[1mRunning local Ansible playbooks...\n...Stage 0 will now run\n...followed by Stages $(($STAGE + 1))-9\n...and then the Network Role.\e[0m\n"
|
echo -e "\e[1mRunning local Ansible playbooks...\n...Stage 0 will now run\n...followed by Stages $(($STAGE + 1))-9\n...and then the Network Role.\e[0m\n"
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ fi
|
||||||
echo "Ansible will now run iiab-network.yml -- log file is iiab-network.log"
|
echo "Ansible will now run iiab-network.yml -- log file is iiab-network.log"
|
||||||
Start=`date`
|
Start=`date`
|
||||||
ansible -m setup -i ansible_hosts localhost --connection=local | grep python
|
ansible -m setup -i ansible_hosts localhost --connection=local | grep python
|
||||||
ansible-playbook -i ansible_hosts iiab-network.yml --connection=local
|
ansible-playbook -i ansible_hosts iiab-network.yml --extra-vars "{\"skip_role_on_error\":false}" --connection=local
|
||||||
End=`date`
|
End=`date`
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
# apache_interface: 127.0.0.1
|
# apache_interface: 127.0.0.1
|
||||||
|
|
||||||
# Make this False to disable http://box/common/services/power_off.php button:
|
# Make this False to disable http://box/common/services/power_off.php button:
|
||||||
# apache_allow_sudo: True
|
# allow_www_data_poweroff: False
|
||||||
|
|
||||||
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
||||||
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,17 @@
|
||||||
|
# SECURITY WARNING: https://wiki.iiab.io/go/Security
|
||||||
|
|
||||||
# openvpn_install: True
|
# openvpn_install: True
|
||||||
# openvpn_enabled: False
|
# openvpn_enabled: False
|
||||||
|
|
||||||
# For /etc/iiab/openvpn_handle
|
# Empty string on purpose since ~2016, for /etc/iiab/uuid
|
||||||
|
# SEE https://github.com/iiab/iiab/blob/master/roles/openvpn/tasks/main.yml#L5-L20
|
||||||
# openvpn_handle: ""
|
# openvpn_handle: ""
|
||||||
|
|
||||||
# cron seems necessary on CentOS:
|
# cron seems necessary on CentOS:
|
||||||
# openvpn_cron_enabled: False
|
# openvpn_cron_enabled: False
|
||||||
|
|
||||||
# openvpn_server: xscenet.net
|
# openvpn_server: xscenet.net
|
||||||
|
# openvpn_server_real_ip: 3.89.148.185
|
||||||
# openvpn_server_virtual_ip: 10.8.0.1
|
# openvpn_server_virtual_ip: 10.8.0.1
|
||||||
# openvpn_server_port: 1194
|
# openvpn_server_port: 1194
|
||||||
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: "Install packages: ncat, nmap, openvpn, sudo"
|
- name: "Install packages: ncat, nmap, openvpn, sudo"
|
||||||
package:
|
package:
|
||||||
name:
|
name:
|
||||||
|
|
@ -100,6 +105,17 @@
|
||||||
|
|
||||||
# RECORD OpenVPN AS INSTALLED
|
# RECORD OpenVPN AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'openvpn_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: openvpn
|
||||||
|
option: openvpn_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'openvpn_installed: True'"
|
- name: "Set 'openvpn_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
openvpn_installed: True
|
openvpn_installed: True
|
||||||
|
|
@ -10,11 +10,11 @@ DEBUG=false # Using /usr/bin/true or /usr/bin/false
|
||||||
PLAYBOOK="install-support.yml"
|
PLAYBOOK="install-support.yml"
|
||||||
INVENTORY="ansible_hosts"
|
INVENTORY="ansible_hosts"
|
||||||
|
|
||||||
# 2021-08-18: bash scripts using default_vars.yml &/or local_vars.yml
|
# 2023-02-25: bash scripts using default_vars.yml &/or local_vars.yml
|
||||||
# https://github.com/iiab/iiab-factory/blob/master/iiab
|
# https://github.com/iiab/iiab-factory/blob/master/iiab
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/firmware/templates/iiab-check-firmware#L10-14
|
# https://github.com/iiab/iiab/blob/master/roles/firmware/templates/iiab-check-firmware#L10-14
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/network/templates/gateway/iiab-gen-iptables#L48-L52
|
# https://github.com/iiab/iiab/blob/master/roles/network/templates/gateway/iiab-gen-iptables#L48-L52
|
||||||
# https://github.com/iiab/maps/blob/master/osm-source/pages/viewer/scripts/iiab-install-map-region#L25-L34
|
# https://github.com/iiab/maps/blob/master/osm-source/pages/viewer/scripts/iiab-install-map-region#L23-L39
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/openvpn/templates/iiab-support READS AND WRITES, INCL NON-BOOLEAN
|
# https://github.com/iiab/iiab/blob/master/roles/openvpn/templates/iiab-support READS AND WRITES, INCL NON-BOOLEAN
|
||||||
|
|
||||||
# PARSE local_vars.yml JUST AS Ansible & /etc/openvpn/scripts/announcer DO:
|
# PARSE local_vars.yml JUST AS Ansible & /etc/openvpn/scripts/announcer DO:
|
||||||
|
|
@ -1,13 +1,26 @@
|
||||||
# workaround for fact that auto create does not work on iiab_ini_file (/etc/iiab/iiab.ini)
|
- name: Record disk_used_a_priori (permanently, into {{ iiab_ini_file }} below) to later estimate iiab_software_disk_usage
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
# workaround for fact that auto create does not work on iiab_ini_file
|
||||||
- name: Create {{ iiab_ini_file }}
|
- name: Create {{ iiab_ini_file }}
|
||||||
file:
|
file:
|
||||||
path: "{{ iiab_ini_file }}"
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
state: touch
|
state: touch
|
||||||
|
|
||||||
- name: Add 'location' variable values to {{ iiab_ini_file }}
|
- name: Run command 'dpkg --print-architecture' to identify OS architecture (CPU arch as revealed by ansible_architecture ~= ansible_machine is NOT enough!)
|
||||||
|
command: dpkg --print-architecture
|
||||||
|
register: dpkg_arch
|
||||||
|
|
||||||
|
- name: Run command 'dpkg --print-foreign-architectures' (secondary OS arch, if available)
|
||||||
|
command: dpkg --print-foreign-architectures
|
||||||
|
register: dpkg_foreign_arch
|
||||||
|
|
||||||
|
|
||||||
|
- name: Add 'summary' variable values to {{ iiab_ini_file }}
|
||||||
ini_file:
|
ini_file:
|
||||||
path: "{{ iiab_ini_file }}"
|
path: "{{ iiab_ini_file }}"
|
||||||
section: location
|
section: summary
|
||||||
option: "{{ item.option }}"
|
option: "{{ item.option }}"
|
||||||
value: "{{ item.value | string }}"
|
value: "{{ item.value | string }}"
|
||||||
with_items:
|
with_items:
|
||||||
|
|
@ -15,18 +28,30 @@
|
||||||
value: "{{ iiab_base }}"
|
value: "{{ iiab_base }}"
|
||||||
- option: iiab_dir
|
- option: iiab_dir
|
||||||
value: "{{ iiab_dir }}"
|
value: "{{ iiab_dir }}"
|
||||||
|
- option: disk_used_a_priori
|
||||||
|
value: "{{ df1.stdout }}"
|
||||||
|
|
||||||
- name: Add 'version' variable values to {{ iiab_ini_file }}
|
- name: Add 'initial' variable values to {{ iiab_ini_file }}
|
||||||
ini_file:
|
ini_file:
|
||||||
path: "{{ iiab_ini_file }}"
|
path: "{{ iiab_ini_file }}"
|
||||||
section: version
|
section: initial
|
||||||
option: "{{ item.option }}"
|
option: "{{ item.option }}"
|
||||||
value: "{{ item.value | string }}"
|
value: "{{ item.value | string }}"
|
||||||
with_items:
|
with_items:
|
||||||
|
- option: os_ver
|
||||||
|
value: "{{ os_ver }}"
|
||||||
- option: distribution
|
- option: distribution
|
||||||
value: "{{ ansible_distribution }}"
|
value: "{{ ansible_facts['distribution'] }}"
|
||||||
- option: arch
|
- option: arch
|
||||||
value: "{{ ansible_architecture }}"
|
value: "{{ ansible_architecture }}"
|
||||||
|
- option: dpkg_arch
|
||||||
|
value: "{{ dpkg_arch.stdout }}"
|
||||||
|
- option: dpkg_foreign_arch
|
||||||
|
value: "{{ dpkg_foreign_arch.stdout }}"
|
||||||
|
- option: rpi_model
|
||||||
|
value: "{{ rpi_model }}"
|
||||||
|
- option: devicetree_model
|
||||||
|
value: "{{ devicetree_model }}"
|
||||||
- option: iiab_base_ver
|
- option: iiab_base_ver
|
||||||
value: "{{ iiab_base_ver }}"
|
value: "{{ iiab_base_ver }}"
|
||||||
- option: iiab_remote_url
|
- option: iiab_remote_url
|
||||||
|
|
@ -39,7 +64,3 @@
|
||||||
value: "{{ ansible_local.local_facts.iiab_recent_tag }}"
|
value: "{{ ansible_local.local_facts.iiab_recent_tag }}"
|
||||||
- option: install_date
|
- option: install_date
|
||||||
value: "{{ ansible_date_time.iso8601 }}"
|
value: "{{ ansible_date_time.iso8601 }}"
|
||||||
- option: rpi_model
|
|
||||||
value: "{{ rpi_model }}"
|
|
||||||
- option: devicetree_model
|
|
||||||
value: "{{ devicetree_model }}"
|
|
||||||
|
|
|
||||||
|
|
@ -31,9 +31,6 @@
|
||||||
path: /etc/hosts
|
path: /etc/hosts
|
||||||
regexp: '^127\.0\.0\.1'
|
regexp: '^127\.0\.0\.1'
|
||||||
line: '127.0.0.1 {{ iiab_hostname }}.{{ iiab_domain }} localhost.localdomain localhost {{ iiab_hostname }} box box.lan'
|
line: '127.0.0.1 {{ iiab_hostname }}.{{ iiab_domain }} localhost.localdomain localhost {{ iiab_hostname }} box box.lan'
|
||||||
#owner: root
|
|
||||||
#group: root
|
|
||||||
#mode: 0644
|
|
||||||
|
|
||||||
# 2021-07-30: FQDN_changed isn't used as in the past -- its remaining use is
|
# 2021-07-30: FQDN_changed isn't used as in the past -- its remaining use is
|
||||||
# for {named, dhcpd, squid} in roles/network/tasks/main.yml -- possibly it
|
# for {named, dhcpd, squid} in roles/network/tasks/main.yml -- possibly it
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,14 @@
|
||||||
|
|
||||||
# Higher-level purpose explained at the bottom of:
|
# Higher-level purpose explained at the bottom of:
|
||||||
# https://github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
# https://github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
||||||
- name: "Ansible just ran /etc/ansible/facts.d/local_facts.fact to set 11 vars -- here we extract 3 of those -- rpi_model: {{ ansible_local.local_facts.rpi_model }}, devicetree_model: {{ ansible_local.local_facts.devicetree_model }}, iiab_stage: {{ ansible_local.local_facts.stage }}"
|
- name: "Ansible just ran /etc/ansible/facts.d/local_facts.fact to set 15 vars -- here we extract 6 of those -- iiab_stage: {{ ansible_local.local_facts.stage }}, rpi_model: {{ ansible_local.local_facts.rpi_model }}, devicetree_model: {{ ansible_local.local_facts.devicetree_model }}, os_ver: {{ ansible_local.local_facts.os_ver }}, python_version: {{ ansible_local.local_facts.python_version }}, php_version: {{ ansible_local.local_facts.php_version }}"
|
||||||
set_fact:
|
set_fact:
|
||||||
iiab_stage: "{{ ansible_local.local_facts.stage }}"
|
iiab_stage: "{{ ansible_local.local_facts.stage }}"
|
||||||
rpi_model: "{{ ansible_local.local_facts.rpi_model }}"
|
rpi_model: "{{ ansible_local.local_facts.rpi_model }}"
|
||||||
devicetree_model: "{{ ansible_local.local_facts.devicetree_model }}"
|
devicetree_model: "{{ ansible_local.local_facts.devicetree_model }}"
|
||||||
os_ver: "{{ ansible_local.local_facts.os_ver }}"
|
os_ver: "{{ ansible_local.local_facts.os_ver }}"
|
||||||
|
python_version: "{{ ansible_local.local_facts.python_version }}"
|
||||||
|
php_version: "{{ ansible_local.local_facts.php_version }}"
|
||||||
|
|
||||||
# Initialize /etc/iiab/iiab.ini writing the 'location' and 'version' sections
|
# Initialize /etc/iiab/iiab.ini writing the 'location' and 'version' sections
|
||||||
# once and only once, to preserve the install date and git hash.
|
# once and only once, to preserve the install date and git hash.
|
||||||
|
|
@ -21,9 +23,8 @@
|
||||||
when: not iiab_ini_test.stat.exists
|
when: not iiab_ini_test.stat.exists
|
||||||
|
|
||||||
# 2021-07-30: The 'first_run' flag isn't much used anymore. In theory it's
|
# 2021-07-30: The 'first_run' flag isn't much used anymore. In theory it's
|
||||||
# still used in these 2 places:
|
# still used in 1-prep/tasks/hardware.yml for raspberry_pi.yml
|
||||||
# (1) roles/1-prep/tasks/hardware.yml for raspberry_pi.yml
|
#
|
||||||
# (2) roles/network/tasks/named.yml for "Stop named before copying files"
|
|
||||||
# This needs to be reworked for 0-init speed, and overall understandability.
|
# This needs to be reworked for 0-init speed, and overall understandability.
|
||||||
- name: Set first_run flag
|
- name: Set first_run flag
|
||||||
set_fact:
|
set_fact:
|
||||||
|
|
@ -33,14 +34,23 @@
|
||||||
|
|
||||||
# Copies the latest/known version of iiab-diagnostics into /usr/bin (so it can
|
# Copies the latest/known version of iiab-diagnostics into /usr/bin (so it can
|
||||||
# be run even if local source tree /opt/iiab/iiab is deleted to conserve disk).
|
# be run even if local source tree /opt/iiab/iiab is deleted to conserve disk).
|
||||||
- name: Copy iiab-summary & iiab-diagnostics from /opt/iiab/iiab/scripts/ to /usr/bin/
|
- name: Copy iiab-update & iiab-summary & iiab-diagnostics & iiab-root-login from /opt/iiab/iiab/scripts/ to /usr/bin/
|
||||||
copy:
|
copy:
|
||||||
src: "{{ iiab_dir }}/scripts/{{ item }}"
|
src: "{{ iiab_dir }}/scripts/{{ item }}"
|
||||||
dest: /usr/bin/
|
dest: /usr/bin/
|
||||||
mode: '0755'
|
mode: '0755'
|
||||||
with_items:
|
with_items:
|
||||||
|
- iiab-update
|
||||||
- iiab-summary
|
- iiab-summary
|
||||||
- iiab-diagnostics
|
- iiab-diagnostics
|
||||||
|
- iiab-root-login
|
||||||
|
|
||||||
|
- name: Symlink /usr/bin/iiab-upgrade -> /usr/bin/iiab-update
|
||||||
|
file:
|
||||||
|
src: /usr/bin/iiab-update
|
||||||
|
path: /usr/bin/iiab-upgrade
|
||||||
|
state: link
|
||||||
|
#force: yes
|
||||||
|
|
||||||
- name: Create globally-writable directory /etc/iiab/diag (0777) so non-root users can run 'iiab-diagnostics'
|
- name: Create globally-writable directory /etc/iiab/diag (0777) so non-root users can run 'iiab-diagnostics'
|
||||||
file:
|
file:
|
||||||
|
|
@ -53,8 +63,9 @@
|
||||||
include_tasks: validate_vars.yml
|
include_tasks: validate_vars.yml
|
||||||
when: not (rpi_model | regex_search('\\bW\\b')) # Ansible require double backslashes, e.g. with \b "word boundary" anchors: https://www.regular-expressions.info/wordboundaries.html https://stackoverflow.com/questions/56869119/ansible-regular-expression-to-match-a-string-and-extract-the-line/56869801#56869801
|
when: not (rpi_model | regex_search('\\bW\\b')) # Ansible require double backslashes, e.g. with \b "word boundary" anchors: https://www.regular-expressions.info/wordboundaries.html https://stackoverflow.com/questions/56869119/ansible-regular-expression-to-match-a-string-and-extract-the-line/56869801#56869801
|
||||||
|
|
||||||
- name: "Time Zone / TZ: Set symlink /etc/localtime to UTC if it doesn't exist?"
|
# 2022-12-30: Functionality moved to www_options/tasks/php-settings.yml
|
||||||
include_tasks: tz.yml
|
# - name: "Time Zone / TZ: Set symlink /etc/localtime to UTC if it doesn't exist?"
|
||||||
|
# include_tasks: tz.yml
|
||||||
|
|
||||||
- name: Set hostname / domain (etc) in various places
|
- name: Set hostname / domain (etc) in various places
|
||||||
include_tasks: hostname.yml
|
include_tasks: hostname.yml
|
||||||
|
|
@ -96,12 +107,16 @@
|
||||||
value: "{{ devicetree_model }}"
|
value: "{{ devicetree_model }}"
|
||||||
- option: os_ver
|
- option: os_ver
|
||||||
value: "{{ os_ver }}"
|
value: "{{ os_ver }}"
|
||||||
|
- option: python_version
|
||||||
|
value: "{{ python_version }}"
|
||||||
|
- option: php_version
|
||||||
|
value: "{{ php_version }}"
|
||||||
- option: first_run
|
- option: first_run
|
||||||
value: "{{ first_run }}"
|
value: "{{ first_run }}"
|
||||||
- option: local_tz # e.g. 'EDT' (summer) or 'EST' (winter) after Ansible interprets symlink /etc/localtime -- or 'UTC' if /etc/localtime doesn't exist
|
# - option: local_tz # e.g. 'EDT' (summer) or 'EST' (winter) after Ansible interprets symlink /etc/localtime -- or 'UTC' if /etc/localtime doesn't exist
|
||||||
value: "{{ local_tz }}"
|
# value: "{{ local_tz }}"
|
||||||
- option: etc_localtime.stdout # e.g. 'America/New_York' direct from symlink /etc/localtime -- or '' if /etc/localtime doesn't exist
|
# - option: etc_localtime.stdout # e.g. 'America/New_York' direct from symlink /etc/localtime -- or '' if /etc/localtime doesn't exist
|
||||||
value: "{{ etc_localtime.stdout }}"
|
# value: "{{ etc_localtime.stdout }}"
|
||||||
- option: FQDN_changed
|
- option: FQDN_changed
|
||||||
value: "{{ FQDN_changed }}"
|
value: "{{ FQDN_changed }}"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
# 2022-12-30: Functionality moved to www_options/tasks/php-settings.yml
|
||||||
|
|
||||||
- name: "'local_tz: {{ local_tz }}' was set by ansible_date_time.tz in /opt/iiab/iiab/vars/default_vars.yml -- e.g. if Ansible finds symlink /etc/localtime -> ../usr/share/zoneinfo/America/New_York -- it will simplify that to 'EDT' (in the summer) or 'EST' (in the winter)"
|
- name: "'local_tz: {{ local_tz }}' was set by ansible_date_time.tz in /opt/iiab/iiab/vars/default_vars.yml -- e.g. if Ansible finds symlink /etc/localtime -> ../usr/share/zoneinfo/America/New_York -- it will simplify that to 'EDT' (in the summer) or 'EST' (in the winter)"
|
||||||
command: echo
|
command: echo
|
||||||
|
|
||||||
|
|
@ -64,19 +64,19 @@
|
||||||
# 2020-11-04: Fix validation of 5 [now 4] core dependencies, for ./runrole etc
|
# 2020-11-04: Fix validation of 5 [now 4] core dependencies, for ./runrole etc
|
||||||
|
|
||||||
|
|
||||||
- name: Set vars_checklist for 44 + 44 + 40 vars ("XYZ_install" + "XYZ_enabled" + "XYZ_installed") to be checked
|
- name: Set vars_checklist for 45 + 45 + 40 vars ("XYZ_install" + "XYZ_enabled" + "XYZ_installed") to be checked
|
||||||
set_fact:
|
set_fact:
|
||||||
vars_checklist:
|
vars_checklist:
|
||||||
- hostapd
|
- hostapd
|
||||||
- dnsmasq
|
- dnsmasq
|
||||||
- bluetooth
|
- bluetooth
|
||||||
- sshd
|
- sshd
|
||||||
- openvpn
|
#- openvpn # Deprecated
|
||||||
|
- tailscale
|
||||||
- remoteit
|
- remoteit
|
||||||
- admin_console
|
- admin_console
|
||||||
#- nginx # MANDATORY
|
#- nginx # MANDATORY
|
||||||
#- apache # Unmaintained - former dependency
|
#- apache # Unmaintained - former dependency
|
||||||
#- mysql # MANDATORY
|
|
||||||
- squid
|
- squid
|
||||||
- cups
|
- cups
|
||||||
- samba
|
- samba
|
||||||
|
|
@ -85,6 +85,7 @@
|
||||||
- gitea
|
- gitea
|
||||||
- jupyterhub
|
- jupyterhub
|
||||||
- lokole
|
- lokole
|
||||||
|
- mysql # Dependency - excluded from _installed check below
|
||||||
- mediawiki
|
- mediawiki
|
||||||
- mosquitto
|
- mosquitto
|
||||||
- nodejs # Dependency - excluded from _installed check below
|
- nodejs # Dependency - excluded from _installed check below
|
||||||
|
|
@ -155,23 +156,41 @@
|
||||||
that: "{{ item }}_install or {{ item }}_installed is undefined"
|
that: "{{ item }}_install or {{ item }}_installed is undefined"
|
||||||
fail_msg: "DISALLOWED: '{{ item }}_install: False' (e.g. in /etc/iiab/local_vars.yml) WHEN '{{ item }}_installed' is defined (e.g. in /etc/iiab/iiab_state.yml) -- IIAB DOES NOT SUPPORT UNINSTALLS -- please verify those 2 files especially, and other places variables are defined?"
|
fail_msg: "DISALLOWED: '{{ item }}_install: False' (e.g. in /etc/iiab/local_vars.yml) WHEN '{{ item }}_installed' is defined (e.g. in /etc/iiab/iiab_state.yml) -- IIAB DOES NOT SUPPORT UNINSTALLS -- please verify those 2 files especially, and other places variables are defined?"
|
||||||
quiet: yes
|
quiet: yes
|
||||||
when: item != 'nodejs' and item != 'postgresql' and item != 'mongodb' and item != 'yarn' # Exclude auto-installed dependencies
|
when: item != 'mysql' and item != 'postgresql' and item != 'mongodb' and item != 'nodejs' and item != 'yarn' # Exclude auto-installed dependencies
|
||||||
loop: "{{ vars_checklist }}"
|
loop: "{{ vars_checklist }}"
|
||||||
|
|
||||||
|
|
||||||
|
- name: Set vars_deprecated_list for 4+ vars ("XYZ_install") to be checked
|
||||||
|
set_fact:
|
||||||
|
vars_deprecated_list:
|
||||||
|
- dhcpd # Deprecated
|
||||||
|
- named # Deprecated
|
||||||
|
- wondershaper # Deprecated
|
||||||
|
- dansguardian # Deprecated
|
||||||
|
#- xo_services # Unmaintained
|
||||||
|
#- activity_server # Unmaintained
|
||||||
|
#- ejabberd_xs # Unmaintained
|
||||||
|
#- idmgr # Unmaintained
|
||||||
|
#- dokuwiki # Unmaintained
|
||||||
|
#- ejabberd # Unmaintained
|
||||||
|
#- elgg # Unmaintained
|
||||||
|
|
||||||
- name: 'DISALLOW "XYZ_install: True" if deprecated'
|
- name: 'DISALLOW "XYZ_install: True" if deprecated'
|
||||||
assert:
|
assert:
|
||||||
that: "{{ item }}_install is undefined or not {{ item }}_install"
|
that: "{{ item }}_install is undefined or not {{ item }}_install"
|
||||||
fail_msg: "DISALLOWED: '{{ item }}_install: True' (e.g. in /etc/iiab/local_vars.yml)"
|
fail_msg: "DISALLOWED: '{{ item }}_install: True' (e.g. in /etc/iiab/local_vars.yml)"
|
||||||
quiet: yes
|
quiet: yes
|
||||||
with_items:
|
loop: "{{ vars_deprecated_list }}"
|
||||||
- dhcpd # Deprecated
|
# 2023-12-04: ansible-core 2.16.1 suddenly no longer allows 'assert' with
|
||||||
- named # Deprecated
|
# 'with_items' below (whereas 'loop' construct above works!) BACKGROUND:
|
||||||
- wondershaper # Deprecated
|
#
|
||||||
- dansguardian # Deprecated
|
# 'due to mitigation of security issue CVE-2023-5764 in ansible-core 2.16.1,
|
||||||
#- xo_services # Unmaintained
|
# conditional expressions with embedded template blocks can fail with the
|
||||||
#- activity_server # Unmaintained
|
# message “Conditional is marked as unsafe, and cannot be evaluated.”'
|
||||||
#- ejabberd_xs # Unmaintained
|
# https://docs.ansible.com/ansible-core/2.16/porting_guides/porting_guide_core_2.16.html#playbook
|
||||||
#- idmgr # Unmaintained
|
#
|
||||||
#- dokuwiki # Unmaintained
|
# with_items:
|
||||||
#- ejabberd # Unmaintained
|
# - dhcpd # Deprecated
|
||||||
#- elgg # Unmaintained
|
# - named # Deprecated
|
||||||
|
# - wondershaper # Deprecated
|
||||||
|
# - dansguardian # Deprecated
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ https://github.com/iiab/iiab/wiki/IIAB-Contributors-Guide#ansible[stage]
|
||||||
hardware, low-level OS quirks, and basic security:
|
hardware, low-level OS quirks, and basic security:
|
||||||
|
|
||||||
* SSHD
|
* SSHD
|
||||||
* OpenVPN if/as needed later for remote support
|
* Tailscale if/as needed later for remote support
|
||||||
* https://github.com/iiab/iiab/tree/master/roles/iiab-admin#iiab-admin-readme[iiab-admin]
|
* https://github.com/iiab/iiab/tree/master/roles/iiab-admin#iiab-admin-readme[iiab-admin]
|
||||||
username and group, to log into Admin Console
|
username and group, to log into Admin Console
|
||||||
* dnsmasq (install now, configure later!)
|
* dnsmasq (install now, configure later!)
|
||||||
|
|
|
||||||
|
|
@ -7,17 +7,18 @@
|
||||||
when: first_run and rpi_model != "none"
|
when: first_run and rpi_model != "none"
|
||||||
|
|
||||||
|
|
||||||
- name: Check if the identifier for Intel's NUC6 built-in WiFi is present
|
# 2024-02-09: Code below appears stale for Shanti's #3707 hardware
|
||||||
shell: "lsusb | grep 8087:0a2b | wc | awk '{print $1}'"
|
#- name: Check if the identifier for Intel's NUC6 built-in WiFi is present
|
||||||
register: usb_NUC6
|
# shell: "lsusb | grep 8087:0a2b | wc | awk '{print $1}'"
|
||||||
ignore_errors: True
|
# register: usb_NUC6
|
||||||
|
# ignore_errors: True
|
||||||
- name: Download {{ iiab_download_url }}/iwlwifi-8000C-13.ucode to /lib/firmware for built-in WiFi on NUC6
|
#
|
||||||
get_url:
|
#- name: Download {{ iiab_download_url }}/iwlwifi-8000C-13.ucode to /lib/firmware for built-in WiFi on NUC6
|
||||||
url: "{{ iiab_download_url }}/iwlwifi-8000C-13.ucode" # https://download.iiab.io/packages
|
# get_url:
|
||||||
dest: /lib/firmware
|
# url: "{{ iiab_download_url }}/Old/iwlwifi-8000C-13.ucode" # https://download.iiab.io/packages
|
||||||
timeout: "{{ download_timeout }}"
|
# dest: /lib/firmware
|
||||||
when: usb_NUC6.stdout|int > 0
|
# timeout: "{{ download_timeout }}"
|
||||||
|
# when: usb_NUC6.stdout|int > 0
|
||||||
|
|
||||||
|
|
||||||
- name: "Look for any WiFi devices present: ls -la /sys/class/net/*/phy80211 | cut -d/ -f5"
|
- name: "Look for any WiFi devices present: ls -la /sys/class/net/*/phy80211 | cut -d/ -f5"
|
||||||
|
|
|
||||||
|
|
@ -3,22 +3,22 @@
|
||||||
- name: ...IS BEGINNING ============================================
|
- name: ...IS BEGINNING ============================================
|
||||||
meta: noop
|
meta: noop
|
||||||
|
|
||||||
- name: SSHD -- required by OpenVPN below -- also run by roles/4-server-options/tasks/main.yml
|
- name: SSHD
|
||||||
include_role:
|
include_role:
|
||||||
name: sshd
|
name: sshd
|
||||||
when: sshd_install
|
when: sshd_install
|
||||||
|
|
||||||
- name: OPENVPN
|
- name: TAILSCALE (VPN)
|
||||||
include_role:
|
include_role:
|
||||||
name: openvpn
|
name: tailscale
|
||||||
when: openvpn_install
|
when: tailscale_install
|
||||||
|
|
||||||
- name: REMOTE.IT
|
- name: REMOTE.IT
|
||||||
include_role:
|
include_role:
|
||||||
name: remoteit
|
name: remoteit
|
||||||
when: remoteit_install
|
when: remoteit_install
|
||||||
|
|
||||||
- name: IIAB-ADMIN -- includes roles/iiab-admin/tasks/access.yml
|
- name: IIAB-ADMIN -- includes {lynx, screen, sudo-prereqs.yml, admin-user.yml, pwd-warnings.yml}
|
||||||
include_role:
|
include_role:
|
||||||
name: iiab-admin
|
name: iiab-admin
|
||||||
#when: iiab_admin_install # Flag might be created in future?
|
#when: iiab_admin_install # Flag might be created in future?
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,21 @@
|
||||||
|
|
||||||
# Verifies that rootfs is the last partition.
|
# Verifies that rootfs is the last partition.
|
||||||
|
|
||||||
|
# RELATED:
|
||||||
|
# 1. https://github.com/iiab/iiab-factory/blob/master/box/rpi/min-sd
|
||||||
|
# 2. https://github.com/iiab/iiab-factory/blob/master/box/rpi/cp-sd
|
||||||
|
# 3. https://github.com/iiab/iiab-factory/blob/master/box/rpi/xz-json-sd
|
||||||
|
# OR https://github.com/iiab/iiab-factory/blob/master/box/rpi/exp-sd
|
||||||
|
|
||||||
if [ -f /.expand-rootfs ] || [ -f /.resize-rootfs ]; then
|
if [ -f /.expand-rootfs ] || [ -f /.resize-rootfs ]; then
|
||||||
echo "$0: Expanding rootfs partition"
|
echo "$0: Expanding rootfs partition"
|
||||||
|
|
||||||
if [ -x /usr/bin/raspi-config ]; then # Raspberry Pi OS
|
if [ -x /usr/bin/raspi-config ]; then # Raspberry Pi OS -- WARNING: their fdisk-centric approach of course FAILS with "Hybrid MBR" or GPT partition tables, as required by any drive > 2TB :/
|
||||||
# 2022-02-17: Uses do_expand_rootfs() from:
|
# 2022-02-17: Uses do_expand_rootfs() from:
|
||||||
# https://github.com/RPi-Distro/raspi-config/blob/master/raspi-config
|
# https://github.com/RPi-Distro/raspi-config/blob/master/raspi-config
|
||||||
|
# 2023-10-05: Official new RPi instructions:
|
||||||
|
# sudo raspi-config nonint do_expand_rootfs
|
||||||
|
# https://www.raspberrypi.com/documentation/computers/configuration.html#expand-filesystem-nonint
|
||||||
raspi-config --expand-rootfs # REQUIRES A REBOOT
|
raspi-config --expand-rootfs # REQUIRES A REBOOT
|
||||||
rm -f /.expand-rootfs /.resize-rootfs
|
rm -f /.expand-rootfs /.resize-rootfs
|
||||||
reboot # In future, we might warn interactive users that a reboot is coming?
|
reboot # In future, we might warn interactive users that a reboot is coming?
|
||||||
|
|
@ -32,7 +41,7 @@ if [ -f /.expand-rootfs ] || [ -f /.resize-rootfs ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Expand partition
|
# Expand partition
|
||||||
growpart $ROOT_DEV $ROOT_PART_NUM || true # raspi-config instead uses fdisk. WARNING: growpart RC 2 is more severe than RC 1, and should possibly be handled separately in future?
|
growpart $ROOT_DEV $ROOT_PART_NUM || true # raspi-config instead uses fdisk (assuming MBR). They really should transition to gdisk, as required by any drive > 2TB. WARNING: growpart RC 2 is more severe than RC 1, and should possibly be handled separately in future?
|
||||||
rc=$? # Make Return Code visible, for 'bash -x'
|
rc=$? # Make Return Code visible, for 'bash -x'
|
||||||
resize2fs $ROOT_PART
|
resize2fs $ROOT_PART
|
||||||
rc=$? # Make RC visible (as above)
|
rc=$? # Make RC visible (as above)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# 2022-03-16: 'apt show <pkg> | grep Size' revealed download sizes, on 64-bit RasPiOS with desktop.
|
# 2022-03-16: 'apt show <pkg> | grep Size' revealed download sizes, on 64-bit RasPiOS with desktop.
|
||||||
|
|
||||||
- name: "Install 17 common packages: acpid, bzip2, cron, curl, gawk, htop, i2c-tools, logrotate, plocate, pandoc, pastebinit, rsync, sqlite3, tar, unzip, usbutils, wget"
|
- name: "Install 19 common packages: acpid, bzip2, cron, curl, gawk, gpg, htop, i2c-tools, logrotate, lshw, pandoc, pastebinit, plocate, rsync, sqlite3, tar, unzip, usbutils, wget"
|
||||||
package:
|
package:
|
||||||
name:
|
name:
|
||||||
- acpid # 55kB download: Daemon for ACPI (power mgmt) events
|
- acpid # 55kB download: Daemon for ACPI (power mgmt) events
|
||||||
|
|
@ -11,23 +11,24 @@
|
||||||
#- exfat-fuse # 28kB download: 2021-07-27: Should no longer be nec with 5.4+ kernels, so let's try commenting it out
|
#- exfat-fuse # 28kB download: 2021-07-27: Should no longer be nec with 5.4+ kernels, so let's try commenting it out
|
||||||
#- exfat-utils # 41kB download: Ditto! See also 'ntfs-3g' below
|
#- exfat-utils # 41kB download: Ditto! See also 'ntfs-3g' below
|
||||||
- gawk # 533kB download
|
- gawk # 533kB download
|
||||||
|
- gpg # 884kB download: Debian 12+ (especially!) require this for apt installs of gitea, kolibri, mongodb, yarn
|
||||||
- htop # 109kB download: RasPiOS installs this regardless
|
- htop # 109kB download: RasPiOS installs this regardless
|
||||||
- i2c-tools # 78kB download: RasPiOS installs this regardless -- Low-level bus/chip/register/EEPROM tools e.g. for RTC
|
- i2c-tools # 78kB download: Low-level bus/chip/register/EEPROM tools e.g. for RTC
|
||||||
- logrotate # 67kB download: RasPiOS installs this regardless
|
- logrotate # 67kB download: RasPiOS installs this regardless
|
||||||
|
- lshw # 257kB download: For 'lshw -C network' in iiab-diagnostics
|
||||||
#- lynx # 505kB download: Installed by 1-prep's roles/iiab-admin/tasks/main.yml
|
#- lynx # 505kB download: Installed by 1-prep's roles/iiab-admin/tasks/main.yml
|
||||||
#- make # 376kB download: 2021-07-27: Currently used by roles/pbx and no other roles
|
#- make # 376kB download: 2021-07-27: Currently used by roles/pbx and no other roles
|
||||||
#- mlocate # 92kB download
|
|
||||||
- plocate # 97kB download: Faster & smaller than locate & mlocate
|
|
||||||
#- ntfs-3g # 379kB download: RasPiOS installs this regardless -- 2021-07-31: But this should no longer be nec with 5.4+ kernels, similar to exfat packages above -- however, see also this symlink warning: https://superuser.com/questions/1050544/mount-with-kernel-ntfs-and-not-ntfs-3g -- and upcoming kernel 5.15 improvements: https://www.phoronix.com/scan.php?page=news_item&px=New-NTFS-Likely-For-Linux-5.15
|
#- ntfs-3g # 379kB download: RasPiOS installs this regardless -- 2021-07-31: But this should no longer be nec with 5.4+ kernels, similar to exfat packages above -- however, see also this symlink warning: https://superuser.com/questions/1050544/mount-with-kernel-ntfs-and-not-ntfs-3g -- and upcoming kernel 5.15 improvements: https://www.phoronix.com/scan.php?page=news_item&px=New-NTFS-Likely-For-Linux-5.15
|
||||||
#- openssh-server # 318kB download: RasPiOS installs this regardless -- this is also installed by 1-prep's roles/sshd/tasks/main.yml to cover all OS's
|
#- openssh-server # 318kB download: RasPiOS installs this regardless -- this is also installed by 1-prep's roles/sshd/tasks/main.yml to cover all OS's
|
||||||
- pandoc # 19kB download: For /usr/bin/iiab-refresh-wiki-docs
|
- pandoc # 19kB download: For /usr/bin/iiab-refresh-wiki-docs
|
||||||
- pastebinit # 47kB download: For /usr/bin/iiab-diagnostics
|
- pastebinit # 47kB download: For /usr/bin/iiab-diagnostics
|
||||||
#- python3-pip # 337kB download: RasPiOS installs this regardless -- 2021-07-29: And already installed by /opt/iiab/iiab/scripts/ansible -- this auto-installs 'python3-setuptools' and 'python3' etc
|
#- mlocate # 92kB download
|
||||||
#- python3-venv # 1188kB download: RasPiOS installs this regardless -- 2021-07-30: For Ansible module 'pip' used in roles like {calibre-web, jupyterhub, lokole} -- whereas roles/kalite uses (virtual) package 'virtualenv' for Python 2 -- all these 3+1 IIAB roles install 'python3-venv' for themselves. FYI: Debian 11 auto-installs 'python3-venv' when you install 'python3' -- whereas Ubuntu (e.g. 20.04 & 21.10) and RasPiOS 10 did not.
|
- plocate # 97kB download: Faster & smaller than locate & mlocate
|
||||||
|
#- python3-pip # 337kB download: 2023-03-22: Used to be installed by /opt/iiab/iiab/scripts/ansible -- which would auto-install 'python3-setuptools' and 'python3' etc
|
||||||
|
#- python3-venv # 1188kB download: 2023-03-22: Already installed by /opt/iiab/iiab/scripts/ansible -- used by roles like {calibre-web, jupyterhub, lokole} -- whereas roles/kalite uses (virtual) package 'virtualenv' for Python 2 -- all these 3+1 IIAB roles install 'python3-venv' for themselves. FYI: Debian 11 no longer auto-installs 'python3-venv' when you install 'python3'
|
||||||
- rsync # 351kB download: RasPiOS installs this regardless
|
- rsync # 351kB download: RasPiOS installs this regardless
|
||||||
#- screen # 551kB download: Installed by 1-prep's roles/iiab-admin/tasks/main.yml
|
#- screen # 551kB download: Installed by 1-prep's roles/iiab-admin/tasks/main.yml
|
||||||
- sqlite3 # 1054kB download
|
- sqlite3 # 1054kB download
|
||||||
#- sudo # 991kB download: RasPiOS installs this regardless -- (2) Can also be installed by roles/1-prep's roles/openvpn/tasks/install.yml, (3) Is definitely installed by 1-prep's roles/iiab-admin/tasks/sudo-prereqs.yml
|
|
||||||
- tar # 799kB download: RasPiOS installs this regardless
|
- tar # 799kB download: RasPiOS installs this regardless
|
||||||
- unzip # 151kB download: RasPiOS installs this regardless
|
- unzip # 151kB download: RasPiOS installs this regardless
|
||||||
#- usbmount # 18kB download: Moved to roles/usb_lib/tasks/install.yml
|
#- usbmount # 18kB download: Moved to roles/usb_lib/tasks/install.yml
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,21 @@
|
||||||
|
.. |ss| raw:: html
|
||||||
|
|
||||||
|
<strike>
|
||||||
|
|
||||||
|
.. |se| raw:: html
|
||||||
|
|
||||||
|
</strike>
|
||||||
|
|
||||||
|
.. |nbsp| unicode:: 0xA0
|
||||||
|
:trim:
|
||||||
|
|
||||||
====================
|
====================
|
||||||
3-base-server README
|
3-base-server README
|
||||||
====================
|
====================
|
||||||
|
|
||||||
This 3rd `stage <https://github.com/iiab/iiab/wiki/IIAB-Contributors-Guide#ansible>`_ installs base server infra that `Internet-in-a-Box (IIAB) <https://internet-in-a-box.org/>`_ requires, including:
|
This 3rd `stage <https://github.com/iiab/iiab/wiki/IIAB-Contributors-Guide#ansible>`_ installs base server infra that `Internet-in-a-Box (IIAB) <https://internet-in-a-box.org/>`_ requires, including:
|
||||||
|
|
||||||
- `MySQL <https://github.com/iiab/iiab/blob/master/roles/mysql>`_ (database underlying many/most user-facing apps). This IIAB role also installs apt package:
|
- |ss| `MySQL <https://github.com/iiab/iiab/blob/master/roles/mysql>`_ (database underlying many/most user-facing apps). |se| |nbsp| *As of 2023-11-05, MySQL / MariaDB is NO LONGER INSTALLED by 3-base-server — instead it's installed on-demand — as a dependency of Matomo, MediaWiki, Nextcloud, PBX (for FreePBX), WordPress &/or Admin Console.* This IIAB role (roles/mysql) also installs apt package:
|
||||||
- **php{{ php_version }}-mysql** — which forcibly installs **php{{ php_version }}-common**
|
- **php{{ php_version }}-mysql** — which forcibly installs **php{{ php_version }}-common**
|
||||||
- `NGINX <https://github.com/iiab/iiab/blob/master/roles/nginx>`_ web server (with Apache in some lingering cases). This IIAB role also installs apt package:
|
- `NGINX <https://github.com/iiab/iiab/blob/master/roles/nginx>`_ web server (with Apache in some lingering cases). This IIAB role also installs apt package:
|
||||||
- **php{{ php_version }}-fpm** — which forcibly installs **php{{ php_version }}-cli**, **php{{ php_version }}-common** and **libsodium23**
|
- **php{{ php_version }}-fpm** — which forcibly installs **php{{ php_version }}-cli**, **php{{ php_version }}-common** and **libsodium23**
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,13 @@
|
||||||
- name: ...IS BEGINNING =====================================
|
- name: ...IS BEGINNING =====================================
|
||||||
meta: noop
|
meta: noop
|
||||||
|
|
||||||
- name: MYSQL + CORE PHP
|
# 2023-11-05: MySQL (actually MariaDB) had been mandatory, installed on every
|
||||||
include_role:
|
# IIAB by 3-base-server. Now installed on demand -- as a dependency of Matomo,
|
||||||
name: mysql
|
# MediaWiki, Nextcloud, PBX (for FreePBX), WordPress &/or Admin Console.
|
||||||
#when: mysql_install
|
# - name: MYSQL + CORE PHP
|
||||||
|
# include_role:
|
||||||
|
# name: mysql
|
||||||
|
# #when: mysql_install
|
||||||
|
|
||||||
# 2021-05-21: Apache role 'httpd' is installed as nec by any of these 6 roles:
|
# 2021-05-21: Apache role 'httpd' is installed as nec by any of these 6 roles:
|
||||||
#
|
#
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
4-server-options README
|
4-server-options README
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
Whereas 3-base-server installs critical packages needed by all, this 4th `stage <https://github.com/iiab/iiab/wiki/IIAB-Contributors-Guide#ansible>`_ installs a broad array of *options* — depending on which server apps will be installed in later stages — as specified in `/etc/iiab/local_vars.yml <http://FAQ.IIAB.IO#What_is_local_vars.yml_and_how_do_I_customize_it.3F>`_
|
Whereas 3-base-server installs critical packages needed by all, this 4th `stage <https://github.com/iiab/iiab/wiki/IIAB-Contributors-Guide#ansible>`_ installs a broad array of *options* — depending on which server apps will be installed in later stages — as specified in `/etc/iiab/local_vars.yml <http://FAQ.IIAB.IO#What_is_local_vars.yml_and_how_do_I_customize_it%3F>`_
|
||||||
|
|
||||||
This includes more networking fundamentals, that may further be configured later on.
|
This includes more networking fundamentals, that may further be configured later on.
|
||||||
|
|
||||||
|
|
@ -11,7 +11,7 @@ Specifically, these might be installed:
|
||||||
- Python libraries
|
- Python libraries
|
||||||
- SSH daemon
|
- SSH daemon
|
||||||
- Bluetooth for Raspberry Pi
|
- Bluetooth for Raspberry Pi
|
||||||
- Instant-sharing of `USB stick content <https://wiki.iiab.io/go/FAQ#Can_teachers_display_their_own_content.3F>`_
|
- Instant-sharing of `USB stick content <https://wiki.iiab.io/go/FAQ#Can_teachers_display_their_own_content%3F>`_
|
||||||
- CUPS Printing
|
- CUPS Printing
|
||||||
- Samba for Windows filesystems
|
- Samba for Windows filesystems
|
||||||
- `www_options <https://github.com/iiab/iiab/blob/master/roles/www_options/tasks/main.yml>`_
|
- `www_options <https://github.com/iiab/iiab/blob/master/roles/www_options/tasks/main.yml>`_
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,6 @@
|
||||||
#when: pylibs_installed is undefined
|
#when: pylibs_installed is undefined
|
||||||
#when: pylibs_install # Flag might be created in future?
|
#when: pylibs_install # Flag might be created in future?
|
||||||
|
|
||||||
- name: SSHD -- also run by roles/1-prep/tasks/main.yml as required by OpenVPN
|
|
||||||
include_role:
|
|
||||||
name: sshd
|
|
||||||
when: sshd_install
|
|
||||||
|
|
||||||
- name: Install Bluetooth - only on Raspberry Pi
|
- name: Install Bluetooth - only on Raspberry Pi
|
||||||
include_role:
|
include_role:
|
||||||
name: bluetooth
|
name: bluetooth
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
- name: JUPYTERHUB
|
- name: JUPYTERHUB
|
||||||
include_role:
|
include_role:
|
||||||
name: jupyterhub
|
name: jupyterhub
|
||||||
when: jupyterhub_install and ansible_machine is search("64") # 2022-11-10: Avoid installing on 32-bit, until RasPiOS fixes Rust (PR #3421)
|
when: jupyterhub_install
|
||||||
|
|
||||||
# UNMAINTAINED
|
# UNMAINTAINED
|
||||||
- name: LOKOLE
|
- name: LOKOLE
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,13 @@
|
||||||
- name: KALITE
|
- name: KALITE
|
||||||
include_role:
|
include_role:
|
||||||
name: kalite
|
name: kalite
|
||||||
when: kalite_install
|
when: kalite_install and (is_ubuntu_2204 or is_ubuntu_2310 or is_debian_12) # Also covers is_linuxmint_21 and is_raspbian_12
|
||||||
|
|
||||||
- name: KOLIBRI
|
- name: KOLIBRI
|
||||||
include_role:
|
include_role:
|
||||||
name: kolibri
|
name: kolibri
|
||||||
when: kolibri_install
|
when: kolibri_install
|
||||||
|
#when: kolibri_install and python_version is version('3.12', '<') # Debian 13 still uses Python 3.11 (for now!) so really this just avoids Ubuntu 24.04 and 24.10 pre-releases during initial iiab-install. CLARIF: This is all TEMPORARY until learningequality/kolibri#11316 brings Python 3.12 support to Kolibri 0.17 pre-releases (expected very soon).
|
||||||
|
|
||||||
- name: KIWIX
|
- name: KIWIX
|
||||||
include_role:
|
include_role:
|
||||||
|
|
@ -40,10 +41,23 @@
|
||||||
name: pathagar
|
name: pathagar
|
||||||
when: pathagar_install is defined and pathagar_install
|
when: pathagar_install is defined and pathagar_install
|
||||||
|
|
||||||
|
# WARNING: Since March 2023, 32-bit RasPiOS can act as 64-bit on RPi 4 and
|
||||||
|
# RPi 400 (unlike RPi 3!) SEE: https://github.com/iiab/iiab/pull/3422 and #3516
|
||||||
|
- name: Run command 'dpkg --print-architecture' to identify OS architecture (CPU arch as revealed by ansible_architecture ~= ansible_machine is NO LONGER enough!)
|
||||||
|
command: dpkg --print-architecture
|
||||||
|
register: dpkg_arch
|
||||||
|
when: sugarizer_install
|
||||||
|
|
||||||
|
- name: Explain bypassing of Sugarizer install if 32-bit OS
|
||||||
|
fail: # FORCE IT RED THIS ONCE!
|
||||||
|
msg: "BYPASSING SUGARIZER INSTALL ATTEMPT, as Sugarizer Server 1.5.0 requires MongoDB 3.2+ which is NO LONGER SUPPORTED on 32-bit Raspberry Pi OS. 'dpkg --print-architecture' output for your OS: {{ dpkg_arch.stdout }}"
|
||||||
|
when: sugarizer_install and not dpkg_arch.stdout is search("64")
|
||||||
|
ignore_errors: True
|
||||||
|
|
||||||
- name: SUGARIZER
|
- name: SUGARIZER
|
||||||
include_role:
|
include_role:
|
||||||
name: sugarizer
|
name: sugarizer
|
||||||
when: sugarizer_install
|
when: sugarizer_install and dpkg_arch.stdout is search("64")
|
||||||
|
|
||||||
- name: Recording STAGE 7 HAS COMPLETED ========================
|
- name: Recording STAGE 7 HAS COMPLETED ========================
|
||||||
lineinfile:
|
lineinfile:
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
- name: TRANSMISSION
|
- name: TRANSMISSION
|
||||||
include_role:
|
include_role:
|
||||||
name: transmission
|
name: transmission
|
||||||
when: transmission_install
|
when: transmission_install and not (is_ubuntu_2404 or is_ubuntu_2410 or is_ubuntu_2504) # Also excludes is_linuxmint_22, for #3756 (whereas Debian 13 works great!)
|
||||||
|
|
||||||
- name: AWSTATS
|
- name: AWSTATS
|
||||||
include_role:
|
include_role:
|
||||||
|
|
@ -23,11 +23,6 @@
|
||||||
name: monit
|
name: monit
|
||||||
when: monit_install
|
when: monit_install
|
||||||
|
|
||||||
- name: MUNIN
|
|
||||||
include_role:
|
|
||||||
name: munin
|
|
||||||
when: munin_install
|
|
||||||
|
|
||||||
- name: PHPMYADMIN
|
- name: PHPMYADMIN
|
||||||
include_role:
|
include_role:
|
||||||
name: phpmyadmin
|
name: phpmyadmin
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,23 @@
|
||||||
name: captiveportal
|
name: captiveportal
|
||||||
when: captiveportal_install
|
when: captiveportal_install
|
||||||
|
|
||||||
|
# WARNING: Since March 2023, 32-bit RasPiOS can act as 64-bit on RPi 4 and
|
||||||
|
# RPi 400 (unlike RPi 3!) SEE: https://github.com/iiab/iiab/pull/3516
|
||||||
|
- name: Run command 'dpkg --print-architecture' to identify OS architecture (CPU arch as revealed by ansible_architecture ~= ansible_machine is NO LONGER enough!)
|
||||||
|
command: dpkg --print-architecture
|
||||||
|
register: dpkg_arch
|
||||||
|
when: internetarchive_install
|
||||||
|
|
||||||
|
- name: Explain bypassing of Internet Archive install if 32-bit OS
|
||||||
|
fail: # FORCE IT RED THIS ONCE!
|
||||||
|
msg: "BYPASSING INTERNET ARCHIVE PER https://github.com/iiab/iiab/issues/3641 -- 'dpkg --print-architecture' output for your OS: {{ dpkg_arch.stdout }}"
|
||||||
|
when: internetarchive_install and not dpkg_arch.stdout is search("64")
|
||||||
|
ignore_errors: True
|
||||||
|
|
||||||
- name: INTERNETARCHIVE
|
- name: INTERNETARCHIVE
|
||||||
include_role:
|
include_role:
|
||||||
name: internetarchive
|
name: internetarchive
|
||||||
when: internetarchive_install
|
when: internetarchive_install and dpkg_arch.stdout is search("64")
|
||||||
|
|
||||||
- name: MINETEST
|
- name: MINETEST
|
||||||
include_role:
|
include_role:
|
||||||
|
|
@ -27,7 +40,7 @@
|
||||||
- name: CALIBRE-WEB
|
- name: CALIBRE-WEB
|
||||||
include_role:
|
include_role:
|
||||||
name: calibre-web
|
name: calibre-web
|
||||||
when: calibreweb_install and ansible_machine is search("64") # 2022-11-10: Avoid installing on 32-bit, until RasPiOS fixes Rust (PR #3421)
|
when: calibreweb_install
|
||||||
|
|
||||||
# KEEP NEAR THE VERY END as this installs dependencies from Debian's 'testing' branch!
|
# KEEP NEAR THE VERY END as this installs dependencies from Debian's 'testing' branch!
|
||||||
- name: CALIBRE
|
- name: CALIBRE
|
||||||
|
|
@ -42,6 +55,46 @@
|
||||||
name: pbx
|
name: pbx
|
||||||
when: pbx_install
|
when: pbx_install
|
||||||
|
|
||||||
|
|
||||||
|
- name: '2023-11-05 / TEMPORARY UNTIL ADMIN CONSOLE DECLARES ITS DEPENDENCY: Install MySQL (MariaDB) if admin_console_install (for setup-feedback and record_feedback.php)'
|
||||||
|
set_fact:
|
||||||
|
mysql_install: True
|
||||||
|
mysql_enabled: True
|
||||||
|
when: admin_console_install
|
||||||
|
|
||||||
|
- name: '2023-11-05 / TEMPORARY UNTIL ADMIN CONSOLE DECLARES ITS DEPENDENCY: Install MySQL (MariaDB) if admin_console_install (for setup-feedback and record_feedback.php)'
|
||||||
|
include_role:
|
||||||
|
name: mysql
|
||||||
|
when: admin_console_install
|
||||||
|
|
||||||
|
- name: '2023-11-05 / TEMPORARY UNTIL ADMIN CONSOLE DECLARES ITS DEPENDENCY: Install MySQL (MariaDB) if admin_console_install (for setup-feedback and record_feedback.php)'
|
||||||
|
fail:
|
||||||
|
msg: "Admin Console install cannot proceed, as MySQL / MariaDB is not installed."
|
||||||
|
when: admin_console_install and mysql_installed is undefined
|
||||||
|
|
||||||
|
|
||||||
|
# 2023-11-05: Moved from Stage 8, as it acts on mysql_installed (that might be set just above!)
|
||||||
|
- name: MUNIN
|
||||||
|
include_role:
|
||||||
|
name: munin
|
||||||
|
when: munin_install
|
||||||
|
|
||||||
|
|
||||||
|
- name: Read 'disk_used_a_priori' from /etc/iiab/iiab.ini
|
||||||
|
set_fact:
|
||||||
|
df1: "{{ lookup('ansible.builtin.ini', 'disk_used_a_priori', section='summary', file=iiab_ini_file) }}"
|
||||||
|
|
||||||
|
- name: Record currently used disk space, to compare with original 'disk_used_a_priori'
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add ESTIMATED 'iiab_software_disk_usage = {{ df2.stdout|int - df1|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: summary
|
||||||
|
option: iiab_software_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1|int }}"
|
||||||
|
|
||||||
- name: Recording STAGE 9 HAS COMPLETED ====================
|
- name: Recording STAGE 9 HAS COMPLETED ====================
|
||||||
lineinfile:
|
lineinfile:
|
||||||
path: "{{ iiab_env_file }}"
|
path: "{{ iiab_env_file }}"
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: 'Install package: awstats'
|
- name: 'Install package: awstats'
|
||||||
package:
|
package:
|
||||||
name: awstats
|
name: awstats
|
||||||
|
|
@ -93,6 +98,17 @@
|
||||||
|
|
||||||
# RECORD AWStats AS INSTALLED
|
# RECORD AWStats AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'awstats_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: awstats
|
||||||
|
option: awstats_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'awstats_installed: True'"
|
- name: "Set 'awstats_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
awstats_installed: True
|
awstats_installed: True
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,11 @@
|
||||||
# 5. Run './runrole --reinstall azuracast' in /opt/iiab/iiab
|
# 5. Run './runrole --reinstall azuracast' in /opt/iiab/iiab
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: AzuraCast - Make config directory {{ azuracast_host_dir }}
|
- name: AzuraCast - Make config directory {{ azuracast_host_dir }}
|
||||||
file:
|
file:
|
||||||
path: "{{ azuracast_host_dir }}"
|
path: "{{ azuracast_host_dir }}"
|
||||||
|
|
@ -102,6 +107,17 @@
|
||||||
|
|
||||||
# RECORD AzuraCast AS INSTALLED
|
# RECORD AzuraCast AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'azuracast_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: azuracast
|
||||||
|
option: azuracast_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'azuracast_installed: True'"
|
- name: "Set 'azuracast_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
azuracast_installed: True
|
azuracast_installed: True
|
||||||
|
|
|
||||||
|
|
@ -13,98 +13,175 @@
|
||||||
Calibre-Web README
|
Calibre-Web README
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Calibre-Web provides a clean interface for browsing, reading and downloading
|
This Ansible role installs
|
||||||
e-books using an existing Calibre database. Teachers can upload e-books,
|
`Calibre-Web <https://github.com/janeczku/calibre-web#readme>`_ as a modern
|
||||||
adjust e-book metadata, and create custom e-book collections ("bookshelves"):
|
client-server alternative to Calibre, for your
|
||||||
https://github.com/janeczku/calibre-web#about
|
`Internet-in-a-Box (IIAB) <https://internet-in-a-box.org>`_.
|
||||||
|
|
||||||
This Ansible role installs Calibre-Web as part of your Internet-in-a-Box (IIAB)
|
Calibre-Web provides a clean web interface for students to browse, read and
|
||||||
as a possible alternative to Calibre.
|
download e-books using a
|
||||||
|
`Calibre-compatible database <https://manual.calibre-ebook.com/db_api.html>`_.
|
||||||
|
|
||||||
*WARNING: Calibre-Web depends on Calibre's own* ``/usr/bin/ebook-convert`` *program,
|
Teachers upload e-books, adjust e-book metadata, and create custom "bookshelf"
|
||||||
so we strongly recommend you also install Calibre during your IIAB
|
collections — to help students build the best local community library!
|
||||||
installation!*
|
|
||||||
|
|
||||||
Please note Calibre-Web's Ansible playbook is ``/opt/iiab/iiab/roles/calibre-web``
|
**NEW AS OF JANUARY 2024:** `IIAB's experimental new version of Calibre-Web <https://github.com/iiab/calibre-web/wiki>`_
|
||||||
whereas its Ansible variables ``calibreweb_*`` do **not** include the dash,
|
**also lets you add YouTube and Vimeo videos (and local videos, e.g. from
|
||||||
per Ansible recommendations.
|
teachers' phones) to expand your indigenous/local/family learning library!**
|
||||||
|
|
||||||
|
.. image:: https://www.yankodesign.com/images/design_news/2019/05/221758/luo_beetle_library_8.jpg
|
||||||
|
|
||||||
|
🍒 GURU TIPS 🍒
|
||||||
|
|
||||||
|
* Calibre-Web takes advantage of Calibre's own `/usr/bin/ebook-convert
|
||||||
|
<https://manual.calibre-ebook.com/generated/en/ebook-convert.html>`_ program
|
||||||
|
if that's installed — so consider also installing
|
||||||
|
`Calibre <https://calibre-ebook.com/whats-new>`_ during your IIAB
|
||||||
|
installation — *if you tolerate the weighty ~1 GB (of graphical OS libraries)
|
||||||
|
that Calibre mandates!*
|
||||||
|
|
||||||
|
* If you choose to also install Calibre (e.g. by running
|
||||||
|
``sudo apt install calibre``) then you'll get useful e-book
|
||||||
|
importing/organizing tools like
|
||||||
|
`/usr/bin/calibredb <https://manual.calibre-ebook.com/generated/en/calibredb.html>`_.
|
||||||
|
|
||||||
|
Install It
|
||||||
|
----------
|
||||||
|
|
||||||
|
Install Calibre-Web by setting these 2 variables in
|
||||||
|
`/etc/iiab/local_vars.yml <https://wiki.iiab.io/go/FAQ#What_is_local_vars.yml_and_how_do_I_customize_it%3F>`_::
|
||||||
|
|
||||||
|
calibreweb_install: True
|
||||||
|
calibreweb_enabled: True
|
||||||
|
|
||||||
|
Then install IIAB (`download.iiab.io <https://download.iiab.io>`_). Or if
|
||||||
|
IIAB's already installed, run::
|
||||||
|
|
||||||
|
cd /opt/iiab/iiab
|
||||||
|
sudo ./runrole calibre-web
|
||||||
|
|
||||||
|
NOTE: Calibre-Web's Ansible role (playbook) in
|
||||||
|
`/opt/iiab/iiab/roles <https://github.com/iiab/iiab/tree/master/roles>`_ is
|
||||||
|
``calibre-web`` which contains a hyphen — *whereas its Ansible variables*
|
||||||
|
``calibreweb_*`` *do NOT contain a hyphen!*
|
||||||
|
|
||||||
Using It
|
Using It
|
||||||
--------
|
--------
|
||||||
|
|
||||||
After installation, try out Calibre-Web at http://box/books (or box.lan/books).
|
Try Calibre-Web on your own IIAB by browsing to http://box/books (or
|
||||||
|
http://box.lan/books).
|
||||||
|
|
||||||
Typically students access it without a password (to read and download books)
|
*Students* access it without a password (to read and download books).
|
||||||
whereas teachers add books using an administrative account, as follows::
|
|
||||||
|
*Teachers* add and arrange books using an administrative account, by clicking
|
||||||
|
**Guest** then logging in with::
|
||||||
|
|
||||||
Username: Admin
|
Username: Admin
|
||||||
Password: changeme
|
Password: changeme
|
||||||
|
|
||||||
If the default configuration is not found, the Calibre-Web server creates a
|
🍒 GURU TIPS 🍒
|
||||||
new settings file with calibre-web's own default administrative account::
|
|
||||||
|
|
||||||
Username: admin
|
* If Calibre-Web's configuration file (app.db) goes missing, the administrative
|
||||||
Password: admin123
|
account will revert to::
|
||||||
|
|
||||||
Backend
|
Username: admin
|
||||||
-------
|
Password: admin123
|
||||||
|
|
||||||
You can manage the backend Calibre-Web server with these systemd commands::
|
* If you lose your password, you can change it with the
|
||||||
|
``-s [username]:[newpassword]`` command-line option:
|
||||||
systemctl enable calibre-web
|
https://github.com/janeczku/calibre-web/wiki/FAQ#what-do-i-do-if-i-lose-my-admin-password
|
||||||
systemctl restart calibre-web
|
|
||||||
systemctl status calibre-web
|
|
||||||
systemctl stop calibre-web
|
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
To configure Calibre-Web, log in as user 'Admin' then click 'Admin' on top.
|
To configure Calibre-Web browse to http://box/books then click **Guest** to log
|
||||||
Check 'Configuration' options near the bottom of the page.
|
in as user **Admin** (default passwords above!)
|
||||||
|
|
||||||
Critical settings are stored in::
|
Then click the leftmost **Admin** button to administer — considering all 3
|
||||||
|
**Configuration** buttons further below.
|
||||||
|
|
||||||
|
These critical settings are stored in::
|
||||||
|
|
||||||
/library/calibre-web/config/app.db
|
/library/calibre-web/config/app.db
|
||||||
|
|
||||||
Your e-book metadata is stored in a Calibre-style database::
|
Whereas your e-book metadata is stored in a Calibre-style database::
|
||||||
|
|
||||||
/library/calibre-web/metadata.db
|
/library/calibre-web/metadata.db
|
||||||
|
|
||||||
|
Videos' metadata is stored in database::
|
||||||
|
|
||||||
|
/library/calibre-web/xklb-metadata.db
|
||||||
|
|
||||||
See also::
|
See also::
|
||||||
|
|
||||||
/library/calibre-web/metadata_db_prefs_backup.json
|
/library/calibre-web/metadata_db_prefs_backup.json
|
||||||
|
|
||||||
Finally, take note of Calibre-Web's `FAQ <https://github.com/janeczku/calibre-web/wiki/FAQ>`_ and official docs on its `Runtime Configuration Options <https://github.com/janeczku/calibre-web/wiki/Configuration>`_ and `Command Line Interface <https://github.com/janeczku/calibre-web/wiki/Command-Line-Interface>`_.
|
Finally, take note of Calibre-Web's
|
||||||
|
`FAQ <https://github.com/janeczku/calibre-web/wiki/FAQ>`_ and official docs on
|
||||||
|
its
|
||||||
|
`Runtime Configuration Options <https://github.com/janeczku/calibre-web/wiki/Configuration>`_
|
||||||
|
and
|
||||||
|
`Command Line Interface <https://github.com/janeczku/calibre-web/wiki/Command-Line-Interface>`_.
|
||||||
|
|
||||||
|
Backend
|
||||||
|
-------
|
||||||
|
|
||||||
|
You can manage the backend Calibre-Web server with systemd commands like::
|
||||||
|
|
||||||
|
systemctl status calibre-web
|
||||||
|
systemctl stop calibre-web
|
||||||
|
systemctl restart calibre-web
|
||||||
|
|
||||||
|
Run all commands
|
||||||
|
`as root <https://unix.stackexchange.com/questions/3063/how-do-i-run-a-command-as-the-system-administrator-root>`_.
|
||||||
|
|
||||||
|
Errors and warnings can be seen if you run::
|
||||||
|
|
||||||
|
journalctl -u calibre-web
|
||||||
|
|
||||||
|
Log verbosity level can be
|
||||||
|
`adjusted <https://github.com/janeczku/calibre-web/wiki/Configuration#logfile-configuration>`_
|
||||||
|
within Calibre-Web's **Configuration > Basic Configuration > Logfile
|
||||||
|
Configuration**.
|
||||||
|
|
||||||
|
Finally, http://box/live/stats (Calibre-Web's **About** page) can be a very
|
||||||
|
useful list of ~42 `Calibre-Web dependencies <https://github.com/janeczku/calibre-web/wiki/Dependencies-in-Calibre-Web-Linux-and-Windows>`_
|
||||||
|
(mostly Python packages, and the version number of each that's installed).
|
||||||
|
|
||||||
Back Up Everything
|
Back Up Everything
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
Please back up the entire folder ``/library/calibre-web`` before upgrading —
|
Please back up the entire folder ``/library/calibre-web`` before upgrading —
|
||||||
as it contains your Calibre-Web content **and** settings!
|
as it contains your Calibre-Web content **and** configuration settings!
|
||||||
|
|
||||||
Upgrading
|
Upgrading
|
||||||
---------
|
---------
|
||||||
|
|
||||||
Reinstalling Calibre-Web automatically upgrades to the latest version if your
|
Please see our `new/automated upgrade technique (iiab-update) <https://github.com/iiab/calibre-web/wiki#upgrading>`_
|
||||||
Internet-in-a-Box (IIAB) is online.
|
introduced in July 2024.
|
||||||
|
|
||||||
But first: back up your content **and** settings, as explained above.
|
But first: back up your content **and** configuration settings, as outlined
|
||||||
|
above!
|
||||||
|
|
||||||
**Also move your /library/calibre-web/config/app.db AND/OR
|
**Conversely if you're sure you want to fully reset your Calibre-Web settings,
|
||||||
/library/calibre-web/metadata.db out of the way — if you're sure you want to
|
and remove all existing e-book/video/media metadata — then move your
|
||||||
fully reset your Calibre-Web settings (to install defaults) AND/OR remove all
|
/library/calibre-web/config/app.db, /library/calibre-web/metadata.db and
|
||||||
e-book metadata! Then run**::
|
/library/calibre-web/xklb-metadata.db out of the way.**
|
||||||
|
|
||||||
|
RECAP: Either way, "reinstalling" Calibre-Web automatically installs the latest
|
||||||
|
version — so long as your Internet-in-a-Box (IIAB) is online. Most people
|
||||||
|
should stick with the new ``iiab-update`` technique above. However if you must
|
||||||
|
use the older/manual approach, you would need to run, as root::
|
||||||
|
|
||||||
cd /opt/iiab/iiab
|
cd /opt/iiab/iiab
|
||||||
./runrole --reinstall calibre-web
|
./runrole --reinstall calibre-web
|
||||||
|
|
||||||
Or, if you just want to upgrade Calibre-Web code alone, prior to proceeding
|
Or, if there's a need to try updating Calibre-Web's code alone::
|
||||||
manually::
|
|
||||||
|
|
||||||
cd /usr/local/calibre-web-py3
|
cd /usr/local/calibre-web-py3
|
||||||
git pull
|
git pull
|
||||||
|
|
||||||
This older way *is no longer recommended*::
|
Finally, this much older way is *no longer recommended*::
|
||||||
|
|
||||||
cd /opt/iiab/iiab
|
cd /opt/iiab/iiab
|
||||||
./iiab-install --reinstall # OR: ./iiab-configure
|
./iiab-install --reinstall # OR: ./iiab-configure
|
||||||
|
|
@ -156,5 +233,5 @@ Known Issues
|
||||||
|
|
||||||
* |ss| Upload of not supported file formats gives no feedback to the user: `janeczku/calibre-web#828 <https://github.com/janeczku/calibre-web/issues/828>`_ |se| |nbsp| Fixed by `361a124 <https://github.com/janeczku/calibre-web/commit/361a1243d732116e6f520fabbaae017068b86037>`_ on 2019-02-27.
|
* |ss| Upload of not supported file formats gives no feedback to the user: `janeczku/calibre-web#828 <https://github.com/janeczku/calibre-web/issues/828>`_ |se| |nbsp| Fixed by `361a124 <https://github.com/janeczku/calibre-web/commit/361a1243d732116e6f520fabbaae017068b86037>`_ on 2019-02-27.
|
||||||
|
|
||||||
* *Please assist us in reporting serious issues here:*
|
* *Please report serious issues here:*
|
||||||
https://github.com/janeczku/calibre-web/issues
|
https://github.com/iiab/calibre-web/issues
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,10 @@
|
||||||
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
||||||
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
||||||
|
|
||||||
|
calibreweb_repo_url: https://github.com/iiab/calibre-web # Or use upstream: https://github.com/janeczku/calibre-web
|
||||||
calibreweb_version: master # WAS: master, 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8, 0.6.9
|
calibreweb_version: master # WAS: master, 0.6.4, 0.6.5, 0.6.6, 0.6.7, 0.6.8, 0.6.9
|
||||||
|
|
||||||
|
calibreweb_venv_wipe: False # 2023-12-04: NEW default TDD (Test-Driven Dev!)
|
||||||
calibreweb_venv_path: /usr/local/calibre-web-py3
|
calibreweb_venv_path: /usr/local/calibre-web-py3
|
||||||
calibreweb_exec_path: "{{ calibreweb_venv_path }}/cps.py"
|
calibreweb_exec_path: "{{ calibreweb_venv_path }}/cps.py"
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -23,12 +23,29 @@
|
||||||
dest: "{{ nginx_conf_dir }}/calibre-web-nginx.conf" # /etc/nginx/conf.d
|
dest: "{{ nginx_conf_dir }}/calibre-web-nginx.conf" # /etc/nginx/conf.d
|
||||||
when: calibreweb_enabled
|
when: calibreweb_enabled
|
||||||
|
|
||||||
|
- name: If enabling with Calibre-Web enhanced for large audio/video "books" too, also append onto calibre-web-nginx.conf AND symlink /library/www/html/calibre-web -> /library/calibre-web (WIP)
|
||||||
|
shell: |
|
||||||
|
if [ -f {{ calibreweb_venv_path }}/scripts/calibre-web-nginx.conf ]; then
|
||||||
|
cat {{ calibreweb_venv_path }}/scripts/calibre-web-nginx.conf >> {{ nginx_conf_dir }}/calibre-web-nginx.conf
|
||||||
|
# 2023-12-05: Not needed as a result of PR iiab/calibre-web#57
|
||||||
|
# ln -sf {{ calibreweb_home }} {{ doc_root }}/calibre-web
|
||||||
|
fi
|
||||||
|
when: calibreweb_enabled
|
||||||
|
|
||||||
|
|
||||||
- name: Disable http://box{{ calibreweb_url1 }} via NGINX, by removing {{ nginx_conf_dir }}/calibre-web-nginx.conf
|
- name: Disable http://box{{ calibreweb_url1 }} via NGINX, by removing {{ nginx_conf_dir }}/calibre-web-nginx.conf
|
||||||
file:
|
file:
|
||||||
path: "{{ nginx_conf_dir }}/calibre-web-nginx.conf" # /etc/nginx/conf.d
|
path: "{{ nginx_conf_dir }}/calibre-web-nginx.conf"
|
||||||
state: absent
|
state: absent
|
||||||
when: not calibreweb_enabled
|
when: not calibreweb_enabled
|
||||||
|
|
||||||
|
- name: If disabling, also remove symlink /library/www/html/calibre-web (WIP)
|
||||||
|
file:
|
||||||
|
path: "{{ doc_root }}/calibre-web" # /library/www/html
|
||||||
|
state: absent
|
||||||
|
when: not calibreweb_enabled
|
||||||
|
|
||||||
|
|
||||||
- name: Restart 'nginx' systemd service
|
- name: Restart 'nginx' systemd service
|
||||||
systemd:
|
systemd:
|
||||||
name: nginx
|
name: nginx
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,50 @@
|
||||||
- name: "Install packages: imagemagick, python3-venv"
|
# Or try 'iiab-update -f' for a more rapid upgrade of IIAB Calibre-Web:
|
||||||
|
#
|
||||||
|
# https://wiki.iiab.io/go/FAQ#Can_I_upgrade_IIAB_software%3F
|
||||||
|
# https://github.com/iiab/calibre-web/wiki#upgrading
|
||||||
|
# https://github.com/iiab/iiab/blob/master/scripts/iiab-update
|
||||||
|
# https://github.com/iiab/iiab/tree/master/roles/calibre-web#upgrading
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
|
- name: Stop 'calibre-web' systemd service for safety (RED ERROR CAN BE IGNORED!)
|
||||||
|
systemd:
|
||||||
|
name: calibre-web
|
||||||
|
state: stopped
|
||||||
|
ignore_errors: True # Shows red errors, and continue...
|
||||||
|
#failed_when: False # Hides red errors, and continue...
|
||||||
|
|
||||||
|
# Official upstream instructions:
|
||||||
|
# apt install python3-pip python3-venv
|
||||||
|
# https://github.com/janeczku/calibre-web/wiki/Manual-installation
|
||||||
|
- name: "Install package: imagemagick"
|
||||||
package:
|
package:
|
||||||
name:
|
name:
|
||||||
- imagemagick
|
- imagemagick
|
||||||
- python3-venv
|
#- python3-cryptography # Was needed on Raspberry Pi OS (SEE iiab/calibre-web#260, janeczku/calibre-web#3183)
|
||||||
|
#- python3-netifaces
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
|
# https://github.com/iiab/iiab/pull/3496#issuecomment-1475094542
|
||||||
|
#- name: "Install packages: python3-dev, gcc to compile 'netifaces'"
|
||||||
|
# package:
|
||||||
|
# name:
|
||||||
|
# - python3-dev # header files
|
||||||
|
# - gcc # compiler
|
||||||
|
# state: present
|
||||||
|
# when: python_version is version('3.10', '>=')
|
||||||
|
|
||||||
|
- name: Does /etc/ImageMagick-6/policy.xml exist?
|
||||||
|
stat:
|
||||||
|
path: /etc/ImageMagick-6/policy.xml
|
||||||
|
register: imagemagick6_policy_xml
|
||||||
|
|
||||||
|
# 2024-12-16: Debian 13 uses /etc/ImageMagick-7/policy.xml instead, which doesn't need this lineinfile surgery:
|
||||||
|
# https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion
|
||||||
- name: Allow ImageMagick to read PDFs, per /etc/ImageMagick-6/policy.xml, to create book cover thumbnails
|
- name: Allow ImageMagick to read PDFs, per /etc/ImageMagick-6/policy.xml, to create book cover thumbnails
|
||||||
lineinfile:
|
lineinfile:
|
||||||
path: /etc/ImageMagick-6/policy.xml
|
path: /etc/ImageMagick-6/policy.xml
|
||||||
|
|
@ -12,8 +52,9 @@
|
||||||
backrefs: yes
|
backrefs: yes
|
||||||
line: ' <policy domain="coder" rights="read" pattern="PDF" />'
|
line: ' <policy domain="coder" rights="read" pattern="PDF" />'
|
||||||
state: present
|
state: present
|
||||||
|
when: imagemagick6_policy_xml.stat.exists
|
||||||
|
|
||||||
- name: "Create 3 Calibre-Web folders to store data and config files: {{ calibreweb_home }}, {{ calibreweb_venv_path }}, {{ calibreweb_config }} (all set to {{ calibreweb_user }}:{{ apache_user }}) (default to 0755)"
|
- name: "Create 2 Calibre-Web folders to store data and config files: {{ calibreweb_home }}, {{ calibreweb_config }} (each set to {{ calibreweb_user }}:{{ apache_user }}, default to 0755)"
|
||||||
file:
|
file:
|
||||||
state: directory
|
state: directory
|
||||||
path: "{{ item }}"
|
path: "{{ item }}"
|
||||||
|
|
@ -22,40 +63,100 @@
|
||||||
with_items:
|
with_items:
|
||||||
- "{{ calibreweb_home }}" # /library/calibre-web
|
- "{{ calibreweb_home }}" # /library/calibre-web
|
||||||
- "{{ calibreweb_config }}" # /library/calibre-web/config
|
- "{{ calibreweb_config }}" # /library/calibre-web/config
|
||||||
- "{{ calibreweb_venv_path }}" # /usr/local/calibre-web-py3
|
|
||||||
|
|
||||||
## TODO: Calibre-web future release might get into pypi https://github.com/janeczku/calibre-web/issues/456
|
# FYI since May 2021, Calibre-Web (major releases) can be installed with pip:
|
||||||
- name: Clone i.e. download Calibre-Web ({{ calibreweb_version }}) from https://github.com/janeczku/calibre-web.git to {{ calibreweb_venv_path }} (~94 MB initially, ~115+ MB later)
|
# https://pypi.org/project/calibreweb/
|
||||||
|
# https://github.com/janeczku/calibre-web/issues/456
|
||||||
|
# https://github.com/janeczku/calibre-web/issues/677
|
||||||
|
# https://github.com/janeczku/calibre-web/pull/927
|
||||||
|
# https://github.com/janeczku/calibre-web/pull/1459
|
||||||
|
|
||||||
|
- name: "Remove previous virtual environment {{ calibreweb_venv_path }} -- if 'calibreweb_venv_wipe: True'"
|
||||||
|
file:
|
||||||
|
path: "{{ calibreweb_venv_path }}" # /usr/local/calibre-web-py3
|
||||||
|
state: absent
|
||||||
|
when: calibreweb_venv_wipe
|
||||||
|
|
||||||
|
- name: Does {{ calibreweb_venv_path }} exist?
|
||||||
|
stat:
|
||||||
|
path: "{{ calibreweb_venv_path }}"
|
||||||
|
register: calibreweb_venv
|
||||||
|
|
||||||
|
- name: git clone Calibre-Web ({{ calibreweb_version }}) from {{ calibreweb_repo_url }} to {{ calibreweb_venv_path }} (~122 MB initially, ~191+ or ~203+ MB later) -- if {{ calibreweb_venv_path }} doesns't exist
|
||||||
git:
|
git:
|
||||||
repo: https://github.com/janeczku/calibre-web.git
|
repo: "{{ calibreweb_repo_url }}" # e.g. https://github.com/iiab/calibre-web or https://github.com/janeczku/calibre-web
|
||||||
dest: "{{ calibreweb_venv_path }}"
|
dest: "{{ calibreweb_venv_path }}"
|
||||||
force: yes
|
#force: True # CLAIM: "If true, any modified files in the working repository will be discarded" -- REALITY: even if `force: no`, Ansible destructively reclones (also removing all test branch commits etc!) -- unless a git credential is provided to Ansible?
|
||||||
depth: 1
|
#depth: 1 # 2023-11-04: Full clone for now, to help @deldesir & wider community testing
|
||||||
version: "{{ calibreweb_version }}" # e.g. master, 0.6.17
|
version: "{{ calibreweb_version }}" # e.g. master, 0.6.22
|
||||||
|
when: not calibreweb_venv.stat.exists
|
||||||
|
|
||||||
## Ansible Pip Bug: Cannot use 'chdir' with 'env' https://github.com/ansible/ansible/issues/37912 (Patch landed)
|
- name: cd {{ calibreweb_venv_path }} ; git pull {{ calibreweb_repo_url }} {{ calibreweb_version }} --no-rebase --no-edit -- if {{ calibreweb_venv_path }} exists
|
||||||
#- name: Download calibre-web dependencies into vendor subdirectory.
|
command: git pull "{{ calibreweb_repo_url }}" "{{ calibreweb_version }}" --no-rebase --no-edit
|
||||||
# pip:
|
args:
|
||||||
# requirements: "{{ calibreweb_path }}/requirements.txt"
|
chdir: "{{ calibreweb_venv_path }}"
|
||||||
# chdir: "{{ calibreweb_path }}"
|
when: calibreweb_venv.stat.exists
|
||||||
# extra_args: '--target vendor'
|
|
||||||
# ignore_errors: True
|
- debug:
|
||||||
##
|
msg:
|
||||||
# Implementing this with Ansible command module for now.
|
- "NEED BETTER/EXPERIMENTAL YouTube SCRAPING? RUN THE NEXT LINE -- for the latest yt-dlp 'nightly' release:"
|
||||||
- name: Download Calibre-Web dependencies (using pip) into python3 virtual environment {{ calibreweb_venv_path }}
|
- sudo pipx inject --pip-args='--upgrade --pre' -f library yt-dlp[default]
|
||||||
|
|
||||||
|
- name: If Calibre-Web is being enhanced with audio/video "books" too, install/upgrade additional prereqs -- SEE https://github.com/iiab/calibre-web/wiki
|
||||||
|
shell: |
|
||||||
|
if [ -f {{ calibreweb_venv_path }}/scripts/lb-wrapper ]; then
|
||||||
|
apt install ffmpeg pipx -y
|
||||||
|
if lb --version; then
|
||||||
|
if pipx list | grep -q 'xklb'; then
|
||||||
|
pipx uninstall xklb
|
||||||
|
pipx install library
|
||||||
|
else
|
||||||
|
pipx reinstall library
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
pipx install library
|
||||||
|
fi
|
||||||
|
ln -sf /root/.local/bin/lb /usr/local/bin/lb
|
||||||
|
if [ -f /root/.local/share/pipx/venvs/library/bin/yt-dlp ]; then
|
||||||
|
ln -sf /root/.local/share/pipx/venvs/library/bin/yt-dlp /usr/local/bin/yt-dlp
|
||||||
|
elif [ -f /root/.local/pipx/venvs/library/bin/yt-dlp ]; then
|
||||||
|
ln -sf /root/.local/pipx/venvs/library/bin/yt-dlp /usr/local/bin/yt-dlp
|
||||||
|
else
|
||||||
|
echo "ERROR: yt-dlp NOT FOUND"
|
||||||
|
fi
|
||||||
|
# NEED BETTER/EXPERIMENTAL YouTube SCRAPING? UNCOMMENT THE NEXT LINE -- for the latest yt-dlp "nightly" release:
|
||||||
|
# pipx inject --pip-args="--upgrade --pre" -f library yt-dlp[default]
|
||||||
|
#
|
||||||
|
# https://github.com/yt-dlp/yt-dlp-nightly-builds/releases
|
||||||
|
# https://pypi.org/project/yt-dlp/#history
|
||||||
|
cp {{ calibreweb_venv_path }}/scripts/lb-wrapper /usr/local/bin/
|
||||||
|
chmod a+x /usr/local/bin/lb-wrapper
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Download Calibre-Web dependencies from 'requirements.txt' into python3 virtual environment {{ calibreweb_venv_path }}
|
||||||
pip:
|
pip:
|
||||||
requirements: "{{ calibreweb_venv_path }}/requirements.txt"
|
requirements: "{{ calibreweb_venv_path }}/requirements.txt"
|
||||||
virtualenv: "{{ calibreweb_venv_path }}" # /usr/local/calibre-web-py3
|
virtualenv: "{{ calibreweb_venv_path }}" # /usr/local/calibre-web-py3
|
||||||
virtualenv_site_packages: no
|
#virtualenv_site_packages: no
|
||||||
|
#virtualenv_command: python3 -m venv --system-site-packages {{ calibreweb_venv_path }}
|
||||||
virtualenv_command: python3 -m venv {{ calibreweb_venv_path }}
|
virtualenv_command: python3 -m venv {{ calibreweb_venv_path }}
|
||||||
|
extra_args: --prefer-binary # 2023-10-01: Lifesaver when recent wheels (e.g. piwheels.org) are inevitably not yet built! SEE #3560
|
||||||
|
|
||||||
|
# 2023-10-11: RasPiOS Bookworm doc for Python with venv (PEP 668 now enforced!)
|
||||||
|
# https://www.raspberrypi.com/documentation/computers/os.html#use-python-on-a-raspberry-pi
|
||||||
|
# https://www.raspberrypi.com/documentation/computers/os.html#install-python-packages-using-apt
|
||||||
|
# https://www.raspberrypi.com/documentation/computers/os.html#install-python-libraries-using-pip
|
||||||
|
|
||||||
# VIRTUALENV EXAMPLE COMMANDS:
|
# VIRTUALENV EXAMPLE COMMANDS:
|
||||||
|
# python3 -m venv /usr/local/calibre-web-py3 (create venv)
|
||||||
# cd /usr/local/calibre-web-py3
|
# cd /usr/local/calibre-web-py3
|
||||||
# source bin/activate
|
# . bin/activate (or 'source bin/activate' -- this prepends '/usr/local/calibre-web-py3/bin' to yr PATH)
|
||||||
# python3 -m pip list ('pip list' probably sufficient, likewise below)
|
# python3 -m pip list ('pip list' sufficient *IF* path set above!)
|
||||||
# python3 -m pip freeze > /tmp/requirements.txt
|
# python3 -m pip freeze > /tmp/requirements.txt
|
||||||
# python3 -m pip install -r requirements.txt
|
# python3 -m pip install -r requirements.txt
|
||||||
# deactivate
|
# deactivate
|
||||||
# https://pip.pypa.io/en/latest/user_guide/#requirements-files
|
# https://pip.pypa.io/en/stable/user_guide/#requirements-files
|
||||||
|
# https://pip.pypa.io/en/latest/reference/requirements-file-format/
|
||||||
|
|
||||||
- name: Install /etc/systemd/system/calibre-web.service from template
|
- name: Install /etc/systemd/system/calibre-web.service from template
|
||||||
template:
|
template:
|
||||||
|
|
@ -96,6 +197,17 @@
|
||||||
|
|
||||||
# RECORD Calibre-Web AS INSTALLED
|
# RECORD Calibre-Web AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'calibreweb_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: calibre-web
|
||||||
|
option: calibreweb_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'calibreweb_installed: True'"
|
- name: "Set 'calibreweb_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
calibreweb_installed: True
|
calibreweb_installed: True
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ location {{ calibreweb_url1 }}/ {
|
||||||
proxy_set_header Host $http_host;
|
proxy_set_header Host $http_host;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Scheme $scheme;
|
proxy_set_header X-Scheme $scheme;
|
||||||
proxy_set_header X-Script-Name {{ calibreweb_url1 }};
|
proxy_set_header X-Script-Name "{{ calibreweb_url1 }}";
|
||||||
proxy_pass http://127.0.0.1:8083;
|
proxy_pass http://127.0.0.1:8083;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -14,7 +14,7 @@ location {{ calibreweb_url2 }}/ {
|
||||||
proxy_set_header Host $http_host;
|
proxy_set_header Host $http_host;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Scheme $scheme;
|
proxy_set_header X-Scheme $scheme;
|
||||||
proxy_set_header X-Script-Name {{ calibreweb_url2 }};
|
proxy_set_header X-Script-Name "{{ calibreweb_url2 }}";
|
||||||
proxy_pass http://127.0.0.1:8083;
|
proxy_pass http://127.0.0.1:8083;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -23,6 +23,6 @@ location {{ calibreweb_url3 }}/ {
|
||||||
proxy_set_header Host $http_host;
|
proxy_set_header Host $http_host;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Scheme $scheme;
|
proxy_set_header X-Scheme $scheme;
|
||||||
proxy_set_header X-Script-Name {{ calibreweb_url3 }};
|
proxy_set_header X-Script-Name "{{ calibreweb_url3 }}";
|
||||||
proxy_pass http://127.0.0.1:8083;
|
proxy_pass http://127.0.0.1:8083;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
# 1. APT INSTALL CALIBRE 4.12+ or 5.12+ (calibre, calibredb, calibre-server etc) ON ALL OS'S
|
# 1. APT INSTALL CALIBRE 4.12+ or 5.12+ (calibre, calibredb, calibre-server etc) ON ALL OS'S
|
||||||
|
|
||||||
- name: "Install OS's latest packages: calibre, calibre-bin"
|
- name: "Install OS's latest packages: calibre, calibre-bin"
|
||||||
|
|
@ -79,6 +84,17 @@
|
||||||
|
|
||||||
# 5. RECORD Calibre AS INSTALLED
|
# 5. RECORD Calibre AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'calibre_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: calibre
|
||||||
|
option: calibre_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'calibre_installed: True'"
|
- name: "Set 'calibre_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
calibre_installed: True
|
calibre_installed: True
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: "Install packages: python3-dateutil, python3-jinja2"
|
- name: "Install packages: python3-dateutil, python3-jinja2"
|
||||||
package:
|
package:
|
||||||
name:
|
name:
|
||||||
|
|
@ -51,6 +56,17 @@
|
||||||
|
|
||||||
# RECORD Captive Portal AS INSTALLED
|
# RECORD Captive Portal AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'captiveportal_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: captiveportal
|
||||||
|
option: captiveportal_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'captiveportal_installed: True'"
|
- name: "Set 'captiveportal_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
captiveportal_installed: True
|
captiveportal_installed: True
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ This can be useful if a printer is attached to your IIAB — so student/teac
|
||||||
|
|
||||||
## Using it
|
## Using it
|
||||||
|
|
||||||
Make sure your IIAB was installed with these 2 lines in [/etc/iiab/local_vars.yml](http://faq.iiab.io/#What_is_local_vars.yml_and_how_do_I_customize_it.3F) :
|
Make sure your IIAB was installed with these 2 lines in [/etc/iiab/local_vars.yml](http://faq.iiab.io/#What_is_local_vars.yml_and_how_do_I_customize_it%3F) :
|
||||||
|
|
||||||
```
|
```
|
||||||
cups_install: True
|
cups_install: True
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,11 @@
|
||||||
# (OR ANY MEMBER OF LINUX GROUP 'lpadmin') AS SET UP BELOW...
|
# (OR ANY MEMBER OF LINUX GROUP 'lpadmin') AS SET UP BELOW...
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: Install 'cups' package
|
- name: Install 'cups' package
|
||||||
package:
|
package:
|
||||||
name: cups
|
name: cups
|
||||||
|
|
@ -53,15 +58,30 @@
|
||||||
AuthType Default
|
AuthType Default
|
||||||
Require user @SYSTEM
|
Require user @SYSTEM
|
||||||
|
|
||||||
- name: "CUPS web administration: Create Linux username 'Admin' with password 'changeme' in Linux group 'lpadmin' (shell: /usr/sbin/nologin, create_home: no)"
|
- name: "CUPS web administration: Create Linux username 'Admin' in Linux group 'lpadmin' (shell: /usr/sbin/nologin, create_home: no)"
|
||||||
user:
|
user:
|
||||||
name: Admin
|
name: Admin
|
||||||
append: yes # Don't clobber other groups, that other IIAB Apps might need.
|
append: yes # Don't clobber other groups, that other IIAB Apps might need.
|
||||||
groups: lpadmin
|
groups: lpadmin
|
||||||
password: "{{ 'changeme' | password_hash('sha512') }}" # Random salt. Presumably runs 5000 rounds of SHA-512 per /etc/login.defs & /etc/pam.d/common-password -- https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#encrypting-and-checksumming-strings-and-passwords
|
#password: "{{ 'changeme' | password_hash('sha512') }}" # Random salt. Presumably runs 5000 rounds of SHA-512 per /etc/login.defs & /etc/pam.d/common-password -- https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_filters.html#hashing-and-encrypting-strings-and-passwords
|
||||||
create_home: no
|
create_home: no
|
||||||
shell: /usr/sbin/nologin # Debian/Ubuntu norm -- instead of /sbin/nologin, /bin/false
|
shell: /usr/sbin/nologin # Debian/Ubuntu norm -- instead of /sbin/nologin, /bin/false
|
||||||
|
|
||||||
|
# 2024-05-01: Above password-setting approach no longer works w/ Ansible 2.17 RC1 (#3727).
|
||||||
|
# Ansible STOPS with this error...
|
||||||
|
#
|
||||||
|
# "[DEPRECATION WARNING]: Encryption using the Python crypt module is deprecated. The Python crypt module is
|
||||||
|
# deprecated and will be removed from Python 3.13. Install the passlib library for continued encryption
|
||||||
|
# functionality. This feature will be removed in version 2.17. Deprecation warnings can be disabled by
|
||||||
|
# setting deprecation_warnings=False in ansible.cfg."
|
||||||
|
#
|
||||||
|
# ...so we instead use Linux's "chpasswd" command (below!)
|
||||||
|
|
||||||
|
- name: Use chpasswd to set Linux username 'Admin' password to 'changeme'
|
||||||
|
command: chpasswd
|
||||||
|
args:
|
||||||
|
stdin: Admin:changeme
|
||||||
|
|
||||||
# - name: Add user '{{ iiab_admin_user }}' to Linux group 'lpadmin' -- for CUPS web administration (or modify default 'SystemGroup lpadmin' in /etc/cups/cups-files.conf -- in coordination with ~14 -> ~15 '@SYSTEM' lines in /etc/cups/cupsd.conf)
|
# - name: Add user '{{ iiab_admin_user }}' to Linux group 'lpadmin' -- for CUPS web administration (or modify default 'SystemGroup lpadmin' in /etc/cups/cups-files.conf -- in coordination with ~14 -> ~15 '@SYSTEM' lines in /etc/cups/cupsd.conf)
|
||||||
# #command: "gpasswd -a {{ iiab_admin_user | quote }} lpadmin"
|
# #command: "gpasswd -a {{ iiab_admin_user | quote }} lpadmin"
|
||||||
# #command: "gpasswd -d {{ iiab_admin_user | quote }} lpadmin"
|
# #command: "gpasswd -d {{ iiab_admin_user | quote }} lpadmin"
|
||||||
|
|
@ -124,6 +144,17 @@
|
||||||
|
|
||||||
# RECORD CUPS AS INSTALLED
|
# RECORD CUPS AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'cups_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: cups
|
||||||
|
option: cups_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'cups_installed: True'"
|
- name: "Set 'cups_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
cups_installed: True
|
cups_installed: True
|
||||||
|
|
|
||||||
|
|
@ -23,26 +23,33 @@
|
||||||
quiet: yes
|
quiet: yes
|
||||||
|
|
||||||
|
|
||||||
- name: Install CUPS if 'cups_installed' not defined, e.g. in {{ iiab_state_file }} # /etc/iiab/iiab_state.yml
|
- block:
|
||||||
include_tasks: install.yml
|
|
||||||
when: cups_installed is undefined
|
|
||||||
|
|
||||||
|
- name: Install CUPS if 'cups_installed' not defined, e.g. in {{ iiab_state_file }} # /etc/iiab/iiab_state.yml
|
||||||
|
include_tasks: install.yml
|
||||||
|
when: cups_installed is undefined
|
||||||
|
|
||||||
- include_tasks: enable-or-disable.yml
|
- include_tasks: enable-or-disable.yml
|
||||||
|
|
||||||
|
- name: Add 'cups' variable values to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: cups
|
||||||
|
option: "{{ item.option }}"
|
||||||
|
value: "{{ item.value | string }}"
|
||||||
|
with_items:
|
||||||
|
- option: name
|
||||||
|
value: CUPS
|
||||||
|
- option: description
|
||||||
|
value: '"CUPS (Common UNIX Printing System) is a modular printing system that allows a computer to act as a print server. A computer running CUPS is a host that can accept print jobs from client computers, process them, and send them to the appropriate printer."'
|
||||||
|
- option: cups_install
|
||||||
|
value: "{{ cups_install }}"
|
||||||
|
- option: cups_enabled
|
||||||
|
value: "{{ cups_enabled }}"
|
||||||
|
|
||||||
- name: Add 'cups' variable values to {{ iiab_ini_file }}
|
rescue:
|
||||||
ini_file:
|
|
||||||
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
- name: 'SEE ERROR ABOVE (skip_role_on_error: {{ skip_role_on_error }})'
|
||||||
section: cups
|
fail:
|
||||||
option: "{{ item.option }}"
|
msg: ""
|
||||||
value: "{{ item.value | string }}"
|
when: not skip_role_on_error
|
||||||
with_items:
|
|
||||||
- option: name
|
|
||||||
value: CUPS
|
|
||||||
- option: description
|
|
||||||
value: '"CUPS (Common UNIX Printing System) is a modular printing system that allows a computer to act as a print server. A computer running CUPS is a host that can accept print jobs from client computers, process them, and send them to the appropriate printer."'
|
|
||||||
- option: cups_install
|
|
||||||
value: "{{ cups_install }}"
|
|
||||||
- option: cups_enabled
|
|
||||||
value: "{{ cups_enabled }}"
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,44 @@
|
||||||
- name: Back up 4 OS-provided WiFi firmware files (or symlinks) to /lib/firmware/brcm/*.orig
|
# 2023-02-25: MONITOR FIRMWARE UPDATES in 3 places especially...
|
||||||
copy:
|
#
|
||||||
src: /lib/firmware/brcm/{{ item }}
|
# 1. apt changelog firmware-brcm80211
|
||||||
dest: /lib/firmware/brcm/{{ item }}.orig
|
# https://github.com/RPi-Distro/firmware-nonfree -> debian/config/brcm80211 (brcm, cypress)
|
||||||
|
# https://archive.raspberrypi.org/debian/dists/bullseye/main/binary-arm64/Packages (1.1MB text file, look inside for summary of latest firmware-brcm80211)
|
||||||
|
# https://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/ -> firmware-brcm80211_* e.g.:
|
||||||
|
# https://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/firmware-brcm80211_20190114-1+rpt11_all.deb from 2021-01-25
|
||||||
|
# https://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/firmware-brcm80211_20210315-3+rpt4_all.deb from 2021-12-06
|
||||||
|
# https://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/firmware-brcm80211_20221012-1~bpo11+1+rpt1_all.deb from 2022-11-17
|
||||||
|
# 2. apt changelog linux-firmware-raspi
|
||||||
|
# https://packages.ubuntu.com/search?keywords=linux-firmware-raspi
|
||||||
|
# 3. https://github.com/moodlebox/moodlebox/blob/main/roles/accesspoint/tasks/main.yml
|
||||||
|
|
||||||
|
#- name: Back up 4 OS-provided WiFi firmware files (incl symlink contents) to /lib/firmware/cypress/*.orig
|
||||||
|
- name: Back up 4 OS-provided WiFi firmware files (replicate any symlinks) to /lib/firmware/cypress/*.orig -- /usr/bin/iiab-check-firmware will later do similar (e.g. as firmware install completes) -- moving 2-or-4 of these to <ORIGINAL FILENAME>.YYYY-MM-DD-HH:MM:SS ("doubly timestamping" to preserve BOTH last-modif & moving date)
|
||||||
|
# copy:
|
||||||
|
# src: /lib/firmware/cypress/{{ item }}
|
||||||
|
# dest: /lib/firmware/cypress/{{ item }}.orig
|
||||||
|
# #local_follow: False # FAILS TO PRESERVE LINKS (ansible/ansible#74777) e.g. /lib/firmware/cypress/cyfmac43455-sdio.bin -> /etc/alternatives/cyfmac43455-sdio.bin -> ...
|
||||||
|
# 2023-05-01 CLARIF OF BELOW:
|
||||||
|
# 1) Even if 'mv' fails, no matter it'll continue to 'cp' below
|
||||||
|
# 2) 'cp -P' == 'cp --no-dereference' sufficient to replicate these symlinks and files ('cp -d' & 'cp -a' are incrementally stronger, and so probably can't hurt)
|
||||||
|
shell: |
|
||||||
|
mv /lib/firmware/cypress/{{ item }}.orig /lib/firmware/cypress/{{ item }}.orig.$(date +%F-%T)
|
||||||
|
cp -a /lib/firmware/cypress/{{ item }} /lib/firmware/cypress/{{ item }}.orig
|
||||||
with_items:
|
with_items:
|
||||||
- brcmfmac43430-sdio.bin
|
- cyfmac43430-sdio.bin
|
||||||
- brcmfmac43430-sdio.clm_blob
|
- cyfmac43430-sdio.clm_blob
|
||||||
- brcmfmac43455-sdio.bin
|
- cyfmac43455-sdio.bin
|
||||||
- brcmfmac43455-sdio.clm_blob
|
- cyfmac43455-sdio.clm_blob
|
||||||
ignore_errors: yes
|
#ignore_errors: yes # 2023-02-25: Let's INTENTIONALLY surface any errors, e.g. if any future RasPiOS or Ubuntu-on-Rpi lack some of the above 4 files/links?
|
||||||
|
|
||||||
- name: Download higher-capacity firmwares (for RPi internal WiFi, per https://github.com/iiab/iiab/issues/823#issuecomment-662285202 and https://github.com/iiab/iiab/issues/2853)
|
- name: Download higher-capacity firmwares (for RPi internal WiFi, per https://github.com/iiab/iiab/issues/823#issuecomment-662285202 and https://github.com/iiab/iiab/issues/2853)
|
||||||
get_url:
|
get_url:
|
||||||
url: "{{ iiab_download_url }}/{{ item }}"
|
url: "{{ iiab_download_url }}/{{ item }}"
|
||||||
dest: /lib/firmware/brcm/
|
dest: /lib/firmware/cypress/
|
||||||
timeout: "{{ download_timeout }}"
|
timeout: "{{ download_timeout }}"
|
||||||
with_items:
|
with_items:
|
||||||
- brcmfmac43455-sdio.bin_2021-11-30_minimal # 19 -- from https://github.com/RPi-Distro/firmware-nonfree/blob/feeeda21e930c2e182484e8e1269b61cca2a8451/debian/config/brcm80211/cypress/cyfmac43455-sdio-minimal.bin
|
- brcmfmac43455-sdio.bin_2021-11-30_minimal # 19 -- SAME AS RASPIOS & UBUNTU'S https://github.com/RPi-Distro/firmware-nonfree/blob/feeeda21e930c2e182484e8e1269b61cca2a8451/debian/config/brcm80211/cypress/cyfmac43455-sdio-minimal.bin
|
||||||
- brcmfmac43455-sdio.bin_2021-10-05_3rd-trial-minimal # 24 -- from https://github.com/iiab/iiab/issues/2853#issuecomment-934293015
|
- brcmfmac43455-sdio.bin_2021-10-05_3rd-trial-minimal # 24 -- from https://github.com/iiab/iiab/issues/2853#issuecomment-934293015
|
||||||
- brcmfmac43455-sdio.clm_blob_2021-11-17_rpi # Works w/ both above -- from https://github.com/RPi-Distro/firmware-nonfree/blob/dc406650e840705957f8403efeacf71d2d7543b3/debian/config/brcm80211/cypress/cyfmac43455-sdio.clm_blob
|
- brcmfmac43455-sdio.clm_blob_2021-11-17_rpi # Works w/ both above -- SAME AS RASPIOS & UBUNTU'S https://github.com/RPi-Distro/firmware-nonfree/blob/dc406650e840705957f8403efeacf71d2d7543b3/debian/config/brcm80211/cypress/cyfmac43455-sdio.clm_blob
|
||||||
- brcmfmac43455-sdio.bin_2015-03-01_7.45.18.0_ub19.10.1 # 32 -- from https://github.com/iiab/iiab/issues/823#issuecomment-662285202
|
- brcmfmac43455-sdio.bin_2015-03-01_7.45.18.0_ub19.10.1 # 32 -- from https://github.com/iiab/iiab/issues/823#issuecomment-662285202
|
||||||
- brcmfmac43455-sdio.clm_blob_2018-02-26_rpi
|
- brcmfmac43455-sdio.clm_blob_2018-02-26_rpi
|
||||||
- brcmfmac43430-sdio.bin_2018-09-11_7.45.98.65 # 30 -- from https://github.com/iiab/iiab/issues/823#issuecomment-662285202
|
- brcmfmac43430-sdio.bin_2018-09-11_7.45.98.65 # 30 -- from https://github.com/iiab/iiab/issues/823#issuecomment-662285202
|
||||||
|
|
|
||||||
|
|
@ -4,61 +4,69 @@
|
||||||
|
|
||||||
|
|
||||||
# Set 2 symlinks for RPi 3 B+ and 4 (43455)
|
# Set 2 symlinks for RPi 3 B+ and 4 (43455)
|
||||||
|
# COMPARE: update-alternatives --display cyfmac43455-sdio.bin
|
||||||
|
# https://github.com/moodlebox/moodlebox/blob/main/roles/accesspoint/tasks/main.yml#L3-L6
|
||||||
|
|
||||||
- name: Populate rpi3bplus_rpi4_wifi_firmwares dictionary (lookup table for operator-chosen .bin and .clm_blob files in /lib/firmware/brcm)
|
- name: Populate rpi3bplus_rpi4_wifi_firmwares dictionary (lookup table for operator-chosen .bin and .clm_blob files in /lib/firmware/cypress)
|
||||||
set_fact:
|
set_fact:
|
||||||
rpi3bplus_rpi4_wifi_firmwares: # Dictionary keys (left side) are always strings, e.g. "19"
|
rpi3bplus_rpi4_wifi_firmwares: # Dictionary keys (left side) are always strings, e.g. "19"
|
||||||
os:
|
os:
|
||||||
- brcmfmac43455-sdio.bin.orig
|
- cyfmac43455-sdio.bin.orig # 2023-02-25: 7.45.241 from 2021-11-01 on Ubuntu 22.04.2 too (cyfmac43455-sdio-standard.bin)
|
||||||
- brcmfmac43455-sdio.clm_blob.orig
|
- cyfmac43455-sdio.clm_blob.orig # On Ubuntu 22.04.2 too (brcmfmac43455-sdio.clm_blob_2021-11-17_rpi)
|
||||||
|
ub:
|
||||||
|
- cyfmac43455-sdio.bin.distrib # 2023-02-25: STALE 7.45.234 from 2021-04-15; on Ubuntu 22.04.2 NOT RasPiOS
|
||||||
|
- cyfmac43455-sdio.clm_blob.distrib # 4.7K instead of 2.7K w/ above "os"
|
||||||
19:
|
19:
|
||||||
- brcmfmac43455-sdio.bin_2021-11-30_minimal
|
- brcmfmac43455-sdio.bin_2021-11-30_minimal # On Ubuntu 22.04.2 too (cyfmac43455-sdio-minimal.bin)
|
||||||
- brcmfmac43455-sdio.clm_blob_2021-11-17_rpi
|
- brcmfmac43455-sdio.clm_blob_2021-11-17_rpi # On Ubuntu 22.04.2 too (cyfmac43455-sdio.clm_blob)
|
||||||
24:
|
24:
|
||||||
- brcmfmac43455-sdio.bin_2021-10-05_3rd-trial-minimal
|
- brcmfmac43455-sdio.bin_2021-10-05_3rd-trial-minimal
|
||||||
- brcmfmac43455-sdio.clm_blob_2021-11-17_rpi
|
- brcmfmac43455-sdio.clm_blob_2021-11-17_rpi # On Ubuntu 22.04.2 too (cyfmac43455-sdio.clm_blob)
|
||||||
32:
|
32:
|
||||||
- brcmfmac43455-sdio.bin_2015-03-01_7.45.18.0_ub19.10.1
|
- brcmfmac43455-sdio.bin_2015-03-01_7.45.18.0_ub19.10.1
|
||||||
- brcmfmac43455-sdio.clm_blob_2018-02-26_rpi
|
- brcmfmac43455-sdio.clm_blob_2018-02-26_rpi # 14K instead of 2.7K w/ above "os"
|
||||||
|
|
||||||
- name: Symlink /lib/firmware/brcm/brcmfmac43455-sdio.bin.iiab -> {{ rpi3bplus_rpi4_wifi_firmwares[rpi3bplus_rpi4_wifi_firmware][0] }} (as rpi3bplus_rpi4_wifi_firmware is "{{ rpi3bplus_rpi4_wifi_firmware }}")
|
- name: Symlink /lib/firmware/cypress/cyfmac43455-sdio.bin.iiab -> {{ rpi3bplus_rpi4_wifi_firmwares[rpi3bplus_rpi4_wifi_firmware][0] }} (as rpi3bplus_rpi4_wifi_firmware is "{{ rpi3bplus_rpi4_wifi_firmware }}")
|
||||||
file:
|
file:
|
||||||
src: "{{ rpi3bplus_rpi4_wifi_firmwares[rpi3bplus_rpi4_wifi_firmware][0] }}"
|
src: "{{ rpi3bplus_rpi4_wifi_firmwares[rpi3bplus_rpi4_wifi_firmware][0] }}"
|
||||||
path: /lib/firmware/brcm/brcmfmac43455-sdio.bin.iiab
|
path: /lib/firmware/cypress/cyfmac43455-sdio.bin.iiab
|
||||||
state: link
|
state: link
|
||||||
force: yes
|
force: yes
|
||||||
|
|
||||||
- name: Symlink /lib/firmware/brcm/brcmfmac43455-sdio.clm_blob.iiab -> {{ rpi3bplus_rpi4_wifi_firmwares[rpi3bplus_rpi4_wifi_firmware][1] }} (as rpi3bplus_rpi4_wifi_firmware is "{{ rpi3bplus_rpi4_wifi_firmware }}")
|
- name: Symlink /lib/firmware/cypress/cyfmac43455-sdio.clm_blob.iiab -> {{ rpi3bplus_rpi4_wifi_firmwares[rpi3bplus_rpi4_wifi_firmware][1] }} (as rpi3bplus_rpi4_wifi_firmware is "{{ rpi3bplus_rpi4_wifi_firmware }}")
|
||||||
file:
|
file:
|
||||||
src: "{{ rpi3bplus_rpi4_wifi_firmwares[rpi3bplus_rpi4_wifi_firmware][1] }}"
|
src: "{{ rpi3bplus_rpi4_wifi_firmwares[rpi3bplus_rpi4_wifi_firmware][1] }}"
|
||||||
path: /lib/firmware/brcm/brcmfmac43455-sdio.clm_blob.iiab
|
path: /lib/firmware/cypress/cyfmac43455-sdio.clm_blob.iiab
|
||||||
state: link
|
state: link
|
||||||
force: yes
|
force: yes
|
||||||
|
|
||||||
|
|
||||||
# Set 2 symlinks for RPi Zero W and 3 (43430)
|
# Set 2 symlinks for RPi Zero W and 3 (43430)
|
||||||
|
|
||||||
- name: Populate rpizerow_rpi3_wifi_firmwares dictionary (lookup table for operator-chosen .bin and .clm_blob files in /lib/firmware/brcm)
|
- name: Populate rpizerow_rpi3_wifi_firmwares dictionary (lookup table for operator-chosen .bin and .clm_blob files in /lib/firmware/cypress)
|
||||||
set_fact:
|
set_fact:
|
||||||
rpizerow_rpi3_wifi_firmwares:
|
rpizerow_rpi3_wifi_firmwares:
|
||||||
os:
|
os:
|
||||||
- brcmfmac43430-sdio.bin.orig
|
- cyfmac43430-sdio.bin.orig # 2023-02-25: 7.45.98 from 2021-07-19 on Ubuntu 22.04.2 too
|
||||||
- brcmfmac43430-sdio.clm_blob.orig
|
- cyfmac43430-sdio.clm_blob.orig # On Ubuntu 22.04.2 too
|
||||||
|
ub:
|
||||||
|
- cyfmac43430-sdio.bin.distrib # 2023-02-25: STALE 7.45.98.118 from 2021-03-30; on Ubuntu 22.04.2 NOT RasPiOS
|
||||||
|
- cyfmac43430-sdio.clm_blob.distrib # Identical to above 4.7K cyfmac43430-sdio.clm_blob
|
||||||
30:
|
30:
|
||||||
- brcmfmac43430-sdio.bin_2018-09-11_7.45.98.65
|
- brcmfmac43430-sdio.bin_2018-09-11_7.45.98.65
|
||||||
- brcmfmac43430-sdio.clm_blob_2018-09-11_7.45.98.65
|
- brcmfmac43430-sdio.clm_blob_2018-09-11_7.45.98.65 # 14K instead of 4.7K w/ above "os" & "ub"
|
||||||
|
|
||||||
- name: Symlink /lib/firmware/brcm/brcmfmac43430-sdio.bin.iiab -> {{ rpizerow_rpi3_wifi_firmwares[rpizerow_rpi3_wifi_firmware][0] }} (as rpizerow_rpi3_wifi_firmware is "{{ rpizerow_rpi3_wifi_firmware }}")
|
- name: Symlink /lib/firmware/cypress/cyfmac43430-sdio.bin.iiab -> {{ rpizerow_rpi3_wifi_firmwares[rpizerow_rpi3_wifi_firmware][0] }} (as rpizerow_rpi3_wifi_firmware is "{{ rpizerow_rpi3_wifi_firmware }}")
|
||||||
file:
|
file:
|
||||||
src: "{{ rpizerow_rpi3_wifi_firmwares[rpizerow_rpi3_wifi_firmware][0] }}"
|
src: "{{ rpizerow_rpi3_wifi_firmwares[rpizerow_rpi3_wifi_firmware][0] }}"
|
||||||
path: /lib/firmware/brcm/brcmfmac43430-sdio.bin.iiab
|
path: /lib/firmware/cypress/cyfmac43430-sdio.bin.iiab
|
||||||
state: link
|
state: link
|
||||||
force: yes
|
force: yes
|
||||||
|
|
||||||
- name: Symlink /lib/firmware/brcm/brcmfmac43430-sdio.clm_blob.iiab -> {{ rpizerow_rpi3_wifi_firmwares[rpizerow_rpi3_wifi_firmware][1] }} (as rpizerow_rpi3_wifi_firmware is "{{ rpizerow_rpi3_wifi_firmware }}")
|
- name: Symlink /lib/firmware/cypress/cyfmac43430-sdio.clm_blob.iiab -> {{ rpizerow_rpi3_wifi_firmwares[rpizerow_rpi3_wifi_firmware][1] }} (as rpizerow_rpi3_wifi_firmware is "{{ rpizerow_rpi3_wifi_firmware }}")
|
||||||
file:
|
file:
|
||||||
src: "{{ rpizerow_rpi3_wifi_firmwares[rpizerow_rpi3_wifi_firmware][1] }}"
|
src: "{{ rpizerow_rpi3_wifi_firmwares[rpizerow_rpi3_wifi_firmware][1] }}"
|
||||||
path: /lib/firmware/brcm/brcmfmac43430-sdio.clm_blob.iiab
|
path: /lib/firmware/cypress/cyfmac43430-sdio.clm_blob.iiab
|
||||||
state: link
|
state: link
|
||||||
force: yes
|
force: yes
|
||||||
|
|
||||||
|
|
@ -73,7 +81,7 @@
|
||||||
- { src: 'iiab-check-firmware.service', dest: '/etc/systemd/system/', mode: '0644' }
|
- { src: 'iiab-check-firmware.service', dest: '/etc/systemd/system/', mode: '0644' }
|
||||||
- { src: 'iiab-firmware-warn.sh', dest: '/etc/profile.d/', mode: '0644' }
|
- { src: 'iiab-firmware-warn.sh', dest: '/etc/profile.d/', mode: '0644' }
|
||||||
|
|
||||||
- name: Enable & (Re)Start iiab-check-firmware.service (also runs on each boot)
|
- name: Enable & (Re)Start iiab-check-firmware.service (also runs on each boot) -- finalizing 2-or-4 symlink chains e.g. /lib/firmware/cypress/X.{bin|blob} -> /lib/firmware/cypress/X.{bin|blob}.iiab -> CHOSEN-FIRMWARE-FILE-OR-LINK
|
||||||
systemd:
|
systemd:
|
||||||
name: iiab-check-firmware.service
|
name: iiab-check-firmware.service
|
||||||
daemon_reload: yes
|
daemon_reload: yes
|
||||||
|
|
|
||||||
|
|
@ -3,18 +3,22 @@
|
||||||
# client devices that can access your Raspberry Pi's internal WiFi hotspot.
|
# client devices that can access your Raspberry Pi's internal WiFi hotspot.
|
||||||
|
|
||||||
# If IIAB's already installed, you should then run 'cd /opt/iiab/iiab' and
|
# If IIAB's already installed, you should then run 'cd /opt/iiab/iiab' and
|
||||||
# then 'sudo ./runrole firmware' (do run iiab-check-firmware for more tips!)
|
# then 'sudo ./runrole firmware' (DO RUN iiab-check-firmware FOR MORE TIPS!)
|
||||||
|
|
||||||
# BACKGROUND AS OF 2022-01-10:
|
|
||||||
# https://github.com/iiab/iiab/issues/823#issuecomment-662285202
|
|
||||||
# https://github.com/iiab/iiab/issues/2853#issuecomment-957836892
|
|
||||||
# https://github.com/iiab/iiab/pull/3103
|
|
||||||
# https://github.com/RPi-Distro/firmware-nonfree/tree/bullseye/debian/config/brcm80211 (brcm, cypress)
|
|
||||||
# https://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/firmware-brcm80211_20190114-1+rpt11_all.deb from 2021-01-25
|
|
||||||
# https://archive.raspberrypi.org/debian/pool/main/f/firmware-nonfree/firmware-brcm80211_20210315-3+rpt4_all.deb from 2021-12-06
|
|
||||||
|
|
||||||
|
# 2018-2023 Background & Progress:
|
||||||
|
#
|
||||||
|
# Raspberry Pi 3 used to support 32 WiFi connections but is now limited to [4-10]
|
||||||
|
# https://github.com/iiab/iiab/issues/823#issuecomment-662285202
|
||||||
|
# Opinions about Pi 4B/3B+ WiFi features [practical AP firmware for schools!]
|
||||||
|
# https://github.com/iiab/iiab/issues/2853#issuecomment-957836892
|
||||||
|
# RPi WiFi hotspot firmware reliability fix, incl new/better choices for 3B+ & 4
|
||||||
|
# https://github.com/iiab/iiab/pull/3103
|
||||||
|
# Set WiFi firmware in /lib/firmware/cypress due to RasPiOS & Ubuntu changes
|
||||||
|
# https://github.com/iiab/iiab/pull/3482
|
||||||
# RISK: What USB 3.0 stick/drive patterns degrade a Raspberry Pi's 2.4GHz WiFi?
|
# RISK: What USB 3.0 stick/drive patterns degrade a Raspberry Pi's 2.4GHz WiFi?
|
||||||
# https://github.com/iiab/iiab/issues/2638
|
# https://github.com/iiab/iiab/issues/2638
|
||||||
|
|
||||||
|
# ► SEE "MONITOR FIRMWARE UPDATES in 3 places especially" in tasks/download.yml ◄
|
||||||
|
|
||||||
- name: Install firmware (for RPi internal WiFi)
|
- name: Install firmware (for RPi internal WiFi)
|
||||||
include_tasks: install.yml
|
include_tasks: install.yml
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,25 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# 2021-08-18: bash scripts using default_vars.yml &/or local_vars.yml
|
# The 1st time /usr/bin/iiab-check-firmware runs (at the end of
|
||||||
|
# firmware/tasks/install.yml) 2-4 lynchpin top links are put in place,
|
||||||
|
# finalizing symlink chains like:
|
||||||
|
#
|
||||||
|
# /lib/firmware/cypress/X.{bin|blob} ->
|
||||||
|
# /lib/firmware/cypress/X.{bin|blob}.iiab ->
|
||||||
|
# CHOSEN-FIRMWARE-FILE-OR-LINK
|
||||||
|
#
|
||||||
|
# Also backing up top-of-chain originals (file or link!) by moving these to:
|
||||||
|
#
|
||||||
|
# /lib/firmware/cypress/<ORIGINAL FILENAME>.YYYY-MM-DD-HH:MM:SS
|
||||||
|
#
|
||||||
|
# NOTE these are "doubly timestamped" to preserve BOTH last-modif & moving date.
|
||||||
|
|
||||||
|
# 2023-02-25: bash scripts using default_vars.yml &/or local_vars.yml
|
||||||
# https://github.com/iiab/iiab-factory/blob/master/iiab
|
# https://github.com/iiab/iiab-factory/blob/master/iiab
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/firmware/templates/iiab-check-firmware#L10-14
|
# https://github.com/iiab/iiab/blob/master/roles/firmware/templates/iiab-check-firmware#L10-14
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/network/templates/gateway/iiab-gen-iptables#L48-L52
|
# https://github.com/iiab/iiab/blob/master/roles/network/templates/gateway/iiab-gen-iptables#L48-L52
|
||||||
# https://github.com/iiab/maps/blob/master/osm-source/pages/viewer/scripts/iiab-install-map-region#L25-L34
|
# https://github.com/iiab/maps/blob/master/osm-source/pages/viewer/scripts/iiab-install-map-region#L23-L39
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/openvpn/templates/iiab-support READS AND WRITES, INCL NON-BOOLEAN
|
# https://github.com/iiab/iiab/blob/master/roles/0-DEPRECATED-ROLES/openvpn/templates/iiab-support READS AND WRITES, INCL NON-BOOLEAN
|
||||||
|
|
||||||
iiab_var_value() {
|
iiab_var_value() {
|
||||||
v1=$(grep "^$1:\s" /opt/iiab/iiab/vars/default_vars.yml | tail -1 | sed "s/^$1:\s\+//; s/#.*//; s/\s*$//; s/^\(['\"]\)\(.*\)\1$/\2/")
|
v1=$(grep "^$1:\s" /opt/iiab/iiab/vars/default_vars.yml | tail -1 | sed "s/^$1:\s\+//; s/#.*//; s/\s*$//; s/^\(['\"]\)\(.*\)\1$/\2/")
|
||||||
|
|
@ -14,29 +28,29 @@ iiab_var_value() {
|
||||||
}
|
}
|
||||||
|
|
||||||
link_fw() {
|
link_fw() {
|
||||||
if [[ $(readlink /lib/firmware/brcm/$1) != $1.iiab ]] ; then
|
if [[ $(readlink /lib/firmware/cypress/$1) != $1.iiab ]] ; then
|
||||||
echo
|
echo
|
||||||
mv /lib/firmware/brcm/$1 /lib/firmware/brcm/$1.$(date +%F-%T)
|
mv /lib/firmware/cypress/$1 /lib/firmware/cypress/$1.$(date +%F-%T)
|
||||||
ln -s $1.iiab /lib/firmware/brcm/$1
|
ln -s $1.iiab /lib/firmware/cypress/$1
|
||||||
echo -e "\e[1mSymlinked /lib/firmware/brcm/$1 -> $1.iiab\e[0m"
|
echo -e "\e[1mSymlinked /lib/firmware/cypress/$1 -> $1.iiab\e[0m"
|
||||||
touch /tmp/.fw_modified
|
touch /tmp/.fw_modified
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ $(iiab_var_value rpi3bplus_rpi4_wifi_firmware) != "os" ]] ; then
|
if [[ $(iiab_var_value rpi3bplus_rpi4_wifi_firmware) != "os" ]] ; then
|
||||||
link_fw brcmfmac43455-sdio.bin
|
link_fw cyfmac43455-sdio.bin
|
||||||
link_fw brcmfmac43455-sdio.clm_blob
|
link_fw cyfmac43455-sdio.clm_blob
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $(iiab_var_value rpizerow_rpi3_wifi_firmware) != "os" ]] ; then
|
if [[ $(iiab_var_value rpizerow_rpi3_wifi_firmware) != "os" ]] ; then
|
||||||
link_fw brcmfmac43430-sdio.bin
|
link_fw cyfmac43430-sdio.bin
|
||||||
link_fw brcmfmac43430-sdio.clm_blob
|
link_fw cyfmac43430-sdio.clm_blob
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f /tmp/.fw_modified ]; then
|
if [ -f /tmp/.fw_modified ]; then
|
||||||
bash /etc/profile.d/iiab-firmware-warn.sh
|
bash /etc/profile.d/iiab-firmware-warn.sh
|
||||||
else
|
else
|
||||||
echo -e "\n\e[1mWiFi Firmware links in /lib/firmware/brcm appear \e[92mCORRECT\e[0m\e[1m, per iiab/iiab#2853.\e[0m"
|
echo -e "\n\e[1mWiFi Firmware links in /lib/firmware/cypress appear \e[92mCORRECT\e[0m\e[1m, per iiab/iiab#3482\e[0m"
|
||||||
echo
|
echo
|
||||||
echo -e "\e[100;1m(No reboot appears necessary!)\e[0m"
|
echo -e "\e[100;1m(No reboot appears necessary!)\e[0m"
|
||||||
echo
|
echo
|
||||||
|
|
@ -46,7 +60,7 @@ else
|
||||||
echo -e " cd /opt/iiab/iiab"
|
echo -e " cd /opt/iiab/iiab"
|
||||||
echo -e " sudo iiab-hotspot-off # NO LONGER NEC? eg to restore 'wifi_up_down: True'"
|
echo -e " sudo iiab-hotspot-off # NO LONGER NEC? eg to restore 'wifi_up_down: True'"
|
||||||
echo -e " sudo ./runrole --reinstall firmware"
|
echo -e " sudo ./runrole --reinstall firmware"
|
||||||
echo -e " sudo ./iiab-network # SOMETIMES NECESSARY"
|
echo -e " sudo iiab-network # SOMETIMES NECESSARY"
|
||||||
echo -e " sudo iiab-hotspot-on # NO LONGER NEC? eg to restore 'wifi_up_down: True'"
|
echo -e " sudo iiab-hotspot-on # NO LONGER NEC? eg to restore 'wifi_up_down: True'"
|
||||||
echo -e " sudo reboot\n"
|
echo -e " sudo reboot\n"
|
||||||
#echo
|
#echo
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [ -f /tmp/.fw_modified ]; then
|
if [ -f /tmp/.fw_modified ]; then
|
||||||
echo -e "\n\e[41;1mWiFi Firmware link(s) modified, per iiab/iiab#2853: PLEASE REBOOT!\e[0m"
|
echo -e "\n\e[41;1mWiFi Firmware link(s) modified, per iiab/iiab#3482: PLEASE REBOOT!\e[0m"
|
||||||
echo
|
echo
|
||||||
echo -e "If you want this warning to stop, reboot to remove /tmp/.fw_modified\n"
|
echo -e "If you want this warning to stop, reboot to remove /tmp/.fw_modified\n"
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
# Info needed to install Gitea:
|
# Info needed to install Gitea:
|
||||||
|
|
||||||
gitea_version: 1.17 # 2022-01-30: Grabs latest point release from this branch. Rather than hardcoding (e.g. 1.14.5) every few weeks.
|
gitea_version: "1.22" # 2022-01-30: Grabs latest from this MAJOR/MINOR release branch. Rather than exhaustively hard-coding point releases (e.g. 1.14.5) every few weeks. Quotes nec if trailing zero.
|
||||||
iset_suffixes:
|
iset_suffixes:
|
||||||
i386: 386
|
i386: 386
|
||||||
x86_64: amd64
|
x86_64: amd64
|
||||||
|
|
@ -17,9 +17,9 @@ iset_suffixes:
|
||||||
armv6l: arm-6
|
armv6l: arm-6
|
||||||
armv7l: arm-6 # "arm-7" used to work, but no longer since 2019-04-20's Gitea 1.8.0: https://github.com/iiab/iiab/issues/1673 https://github.com/iiab/iiab/pull/1713 -- 2019-07-31: ARM7 support will return at some point, according to: https://github.com/go-gitea/gitea/pull/7037#issuecomment-516735216 (what about ARM8 support for RPi 4?)
|
armv7l: arm-6 # "arm-7" used to work, but no longer since 2019-04-20's Gitea 1.8.0: https://github.com/iiab/iiab/issues/1673 https://github.com/iiab/iiab/pull/1713 -- 2019-07-31: ARM7 support will return at some point, according to: https://github.com/go-gitea/gitea/pull/7037#issuecomment-516735216 (what about ARM8 support for RPi 4?)
|
||||||
|
|
||||||
gitea_iset_suffix: "{{ iset_suffixes[ansible_architecture] | default('unknown') }}"
|
gitea_iset_suffix: "{{ iset_suffixes[ansible_machine] | default('unknown') }}" # A bit safer than ansible_architecture (see kiwix/defaults/main.yml)
|
||||||
|
|
||||||
gitea_download_url: "https://dl.gitea.io/gitea/{{ gitea_version }}/gitea-{{ gitea_version }}-linux-{{ gitea_iset_suffix }}"
|
gitea_download_url: "https://dl.gitea.com/gitea/{{ gitea_version }}/gitea-{{ gitea_version }}-linux-{{ gitea_iset_suffix }}"
|
||||||
gitea_integrity_url: "{{ gitea_download_url }}.asc"
|
gitea_integrity_url: "{{ gitea_download_url }}.asc"
|
||||||
|
|
||||||
gitea_root_directory: "{{ content_base }}/gitea" # /library/gitea
|
gitea_root_directory: "{{ content_base }}/gitea" # /library/gitea
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
# 1. Prepare to install Gitea: create user and directory structure
|
# 1. Prepare to install Gitea: create user and directory structure
|
||||||
|
|
||||||
- name: Shut down existing Gitea instance (if we're reinstalling)
|
- name: Shut down existing Gitea instance (if we're reinstalling)
|
||||||
|
|
@ -43,10 +48,10 @@
|
||||||
msg: "Could not find a binary for the CPU architecture \"{{ ansible_architecture }}\""
|
msg: "Could not find a binary for the CPU architecture \"{{ ansible_architecture }}\""
|
||||||
when: gitea_iset_suffix == "unknown"
|
when: gitea_iset_suffix == "unknown"
|
||||||
|
|
||||||
- name: Download Gitea binary {{ gitea_download_url }} to {{ gitea_install_path }} (0775, ~108 MB, SLOW DOWNLOAD CAN TAKE ~15 MIN)
|
- name: Download Gitea binary {{ gitea_download_url }} to {{ gitea_install_path }} (0775, ~134 MB, SLOW DOWNLOAD CAN TAKE ~15 MIN)
|
||||||
get_url:
|
get_url:
|
||||||
url: "{{ gitea_download_url }}"
|
url: "{{ gitea_download_url }}"
|
||||||
dest: "{{ gitea_install_path }}" # e.g. /library/gitea/bin/gitea-1.16
|
dest: "{{ gitea_install_path }}" # e.g. /library/gitea/bin/gitea-1.21
|
||||||
mode: 0775
|
mode: 0775
|
||||||
timeout: "{{ download_timeout }}"
|
timeout: "{{ download_timeout }}"
|
||||||
|
|
||||||
|
|
@ -56,9 +61,9 @@
|
||||||
dest: "{{ gitea_checksum_path }}"
|
dest: "{{ gitea_checksum_path }}"
|
||||||
timeout: "{{ download_timeout }}"
|
timeout: "{{ download_timeout }}"
|
||||||
|
|
||||||
- name: Verify Gitea binary with GPG signature
|
- name: Verify Gitea binary with GPG signature ("BAD signature" FALSE ALARMS continue as of 2023-07-16, despite their claims at https://docs.gitea.com/installation/install-from-binary#verify-gpg-signature)
|
||||||
shell: |
|
shell: |
|
||||||
gpg --keyserver pgp.mit.edu --recv {{ gitea_gpg_key }}
|
gpg --keyserver keys.openpgp.org --recv {{ gitea_gpg_key }}
|
||||||
gpg --verify {{ gitea_checksum_path }} {{ gitea_install_path }}
|
gpg --verify {{ gitea_checksum_path }} {{ gitea_install_path }}
|
||||||
ignore_errors: yes
|
ignore_errors: yes
|
||||||
|
|
||||||
|
|
@ -105,6 +110,17 @@
|
||||||
|
|
||||||
# 5. RECORD Gitea AS INSTALLED
|
# 5. RECORD Gitea AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'gitea_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: gitea
|
||||||
|
option: gitea_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'gitea_installed: True'"
|
- name: "Set 'gitea_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
gitea_installed: True
|
gitea_installed: True
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
- include_tasks: enable-or-disable.yml
|
- include_tasks: enable-or-disable.yml
|
||||||
|
|
||||||
- name: Add 'gitea' to list of services at {{ iiab_ini_file }}
|
- name: Add 'gitea' variable values to {{ iiab_ini_file }}
|
||||||
ini_file:
|
ini_file:
|
||||||
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
section: gitea
|
section: gitea
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,8 @@
|
||||||
; Copy required sections to your own app.ini (default is custom/conf/app.ini)
|
; Copy required sections to your own app.ini (default is custom/conf/app.ini)
|
||||||
; and modify as needed.
|
; and modify as needed.
|
||||||
|
|
||||||
; see https://docs.gitea.io/en-us/config-cheat-sheet/ for additional documentation.
|
; see https://docs.gitea.com/administration/config-cheat-sheet for additional documentation.
|
||||||
|
; https://docs.gitea.com/next/administration/config-cheat-sheet
|
||||||
|
|
||||||
; App name that shows in every page title
|
; App name that shows in every page title
|
||||||
APP_NAME = {{ gitea_display_name }}
|
APP_NAME = {{ gitea_display_name }}
|
||||||
|
|
@ -23,9 +24,11 @@ DEFAULT_PRIVATE = last
|
||||||
; Global limit of repositories per user, applied at creation time. -1 means no limit
|
; Global limit of repositories per user, applied at creation time. -1 means no limit
|
||||||
MAX_CREATION_LIMIT = -1
|
MAX_CREATION_LIMIT = -1
|
||||||
; Mirror sync queue length, increase if mirror syncing starts hanging
|
; Mirror sync queue length, increase if mirror syncing starts hanging
|
||||||
MIRROR_QUEUE_LENGTH = 1000
|
; 2023-07-16 ERROR: MIRROR_QUEUE_LENGTH = 1000
|
||||||
|
; `[repository].MIRROR_QUEUE_LENGTH`. Use new options in `[queue.mirror]`
|
||||||
; Patch test queue length, increase if pull request patch testing starts hanging
|
; Patch test queue length, increase if pull request patch testing starts hanging
|
||||||
PULL_REQUEST_QUEUE_LENGTH = 1000
|
; 2023-07-16 ERROR: PULL_REQUEST_QUEUE_LENGTH = 1000
|
||||||
|
; `[repository].PULL_REQUEST_QUEUE_LENGTH`. Use new options in `[queue.pr_patch_checker]`
|
||||||
; Preferred Licenses to place at the top of the List
|
; Preferred Licenses to place at the top of the List
|
||||||
; The name here must match the filename in conf/license or custom/conf/license
|
; The name here must match the filename in conf/license or custom/conf/license
|
||||||
PREFERRED_LICENSES = Apache License 2.0,MIT License
|
PREFERRED_LICENSES = Apache License 2.0,MIT License
|
||||||
|
|
@ -201,13 +204,22 @@ PPROF_DATA_PATH = data/tmp/pprof
|
||||||
LANDING_PAGE = home
|
LANDING_PAGE = home
|
||||||
; Enables git-lfs support. true or false, default is false.
|
; Enables git-lfs support. true or false, default is false.
|
||||||
LFS_START_SERVER = false
|
LFS_START_SERVER = false
|
||||||
; Where your lfs files reside, default is data/lfs.
|
|
||||||
LFS_CONTENT_PATH = {{ gitea_lfs_root }}
|
|
||||||
; LFS authentication secret, change this yourself
|
; LFS authentication secret, change this yourself
|
||||||
LFS_JWT_SECRET =
|
LFS_JWT_SECRET =
|
||||||
; LFS authentication validity period (in time.Duration), pushes taking longer than this may fail.
|
; LFS authentication validity period (in time.Duration), pushes taking longer than this may fail.
|
||||||
LFS_HTTP_AUTH_EXPIRY = 20m
|
LFS_HTTP_AUTH_EXPIRY = 20m
|
||||||
|
|
||||||
|
; lfs [Large File Storage] storage will override storage
|
||||||
|
;
|
||||||
|
[lfs]
|
||||||
|
;STORAGE_TYPE = local
|
||||||
|
;
|
||||||
|
; Where your lfs files reside, default is data/lfs.
|
||||||
|
PATH = {{ gitea_lfs_root }}
|
||||||
|
;
|
||||||
|
; override the minio base path if storage type is minio
|
||||||
|
;MINIO_BASE_PATH = lfs/
|
||||||
|
|
||||||
; Define allowed algorithms and their minimum key length (use -1 to disable a type)
|
; Define allowed algorithms and their minimum key length (use -1 to disable a type)
|
||||||
[ssh.minimum_key_sizes]
|
[ssh.minimum_key_sizes]
|
||||||
ED25519 = 256
|
ED25519 = 256
|
||||||
|
|
@ -240,7 +252,8 @@ ISSUE_INDEXER_PATH = indexers/issues.bleve
|
||||||
; repo indexer by default disabled, since it uses a lot of disk space
|
; repo indexer by default disabled, since it uses a lot of disk space
|
||||||
REPO_INDEXER_ENABLED = false
|
REPO_INDEXER_ENABLED = false
|
||||||
REPO_INDEXER_PATH = indexers/repos.bleve
|
REPO_INDEXER_PATH = indexers/repos.bleve
|
||||||
UPDATE_BUFFER_LEN = 20
|
; 2023-07-16 ERROR: UPDATE_BUFFER_LEN = 20
|
||||||
|
; `[indexer].UPDATE_BUFFER_LEN`. Use new options in `[queue.issue_indexer]`
|
||||||
MAX_FILE_SIZE = 1048576
|
MAX_FILE_SIZE = 1048576
|
||||||
|
|
||||||
[admin]
|
[admin]
|
||||||
|
|
@ -360,7 +373,8 @@ PAGING_NUM = 10
|
||||||
[mailer]
|
[mailer]
|
||||||
ENABLED = false
|
ENABLED = false
|
||||||
; Buffer length of channel, keep it as it is if you don't know what it is.
|
; Buffer length of channel, keep it as it is if you don't know what it is.
|
||||||
SEND_BUFFER_LEN = 100
|
; 2023-07-16 ERROR: SEND_BUFFER_LEN = 100
|
||||||
|
; `[mailer].SEND_BUFFER_LEN`. Use new options in `[queue.mailer]`
|
||||||
; Name displayed in mail title
|
; Name displayed in mail title
|
||||||
SUBJECT = %(APP_NAME)s
|
SUBJECT = %(APP_NAME)s
|
||||||
; Mail server
|
; Mail server
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ Security
|
||||||
#. ``iiab-admin`` (specified by ``admin_console_group`` in `/opt/iiab/iiab/vars/default_vars.yml <../../vars/default_vars.yml>`_ and `/opt/iiab/iiab-admin-console/vars/default_vars.yml <https://github.com/iiab/iiab-admin-console/blob/master/vars/default_vars.yml>`_)
|
#. ``iiab-admin`` (specified by ``admin_console_group`` in `/opt/iiab/iiab/vars/default_vars.yml <../../vars/default_vars.yml>`_ and `/opt/iiab/iiab-admin-console/vars/default_vars.yml <https://github.com/iiab/iiab-admin-console/blob/master/vars/default_vars.yml>`_)
|
||||||
#. ``sudo``
|
#. ``sudo``
|
||||||
* Please read much more about what escalated (root) actions are authorized when you log into IIAB's Admin Console, and how this works: https://github.com/iiab/iiab-admin-console/blob/master/Authentication.md
|
* Please read much more about what escalated (root) actions are authorized when you log into IIAB's Admin Console, and how this works: https://github.com/iiab/iiab-admin-console/blob/master/Authentication.md
|
||||||
* If your IIAB includes OpenVPN, ``/root/.ssh/authorized_keys`` should be installed by `roles/openvpn/tasks/install.yml <../openvpn/tasks/install.yml>`_ to facilitate remote community support. Feel free to remove this as mentioned here: https://wiki.iiab.io/go/Security
|
* If your IIAB includes Tailscale (VPN), ``/root/.ssh/authorized_keys`` should be installed by `roles/tailscale/tasks/install.yml <../tailscale/tasks/install.yml>`_ to facilitate remote community support. Feel free to remove this as mentioned here: https://wiki.iiab.io/go/Security
|
||||||
* Auto-checking for the default/published password (as specified by ``iiab_admin_published_pwd`` in `/opt/iiab/iiab/vars/default_vars.yml <../../vars/default_vars.yml>`_) is implemented in `/etc/profile.d <templates/sshpwd-profile-iiab.sh>`_ (and `/etc/xdg/lxsession/LXDE-pi <templates/sshpwd-lxde-iiab.sh>`_ when it exists, i.e. on Raspberry Pi OS with desktop).
|
* Auto-checking for the default/published password (as specified by ``iiab_admin_published_pwd`` in `/opt/iiab/iiab/vars/default_vars.yml <../../vars/default_vars.yml>`_) is implemented in `/etc/profile.d <templates/sshpwd-profile-iiab.sh>`_ (and `/etc/xdg/lxsession/LXDE-pi <templates/sshpwd-lxde-iiab.sh>`_ when it exists, i.e. on Raspberry Pi OS with desktop).
|
||||||
|
|
||||||
Example
|
Example
|
||||||
|
|
@ -56,16 +56,16 @@ Historical Notes
|
||||||
Remote Support Tools
|
Remote Support Tools
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
The `iiab-diagnostics <../../scripts/iiab-diagnostics.README.md>`_ and `OpenVPN <https://en.wikipedia.org/wiki/OpenVPN>`_ options mentioned above can greatly help you empower your community, typically during the implementation phase of your project, even if Linux is new to you.
|
The `iiab-diagnostics <../../scripts/iiab-diagnostics.README.md>`_ and `Tailscale (VPN) <https://en.wikipedia.org/wiki/Tailscale>`_ options mentioned above can greatly help you empower your community, typically during the implementation phase of your project, even if Linux is new to you.
|
||||||
|
|
||||||
Similarly, `access.yml <tasks/access.yml>`_ adds a couple text mode tools — extremely helpful over expensive / low-bandwidth connections:
|
Similarly, `tasks/main.yml <tasks/main.yml>`_ adds a couple text mode tools — extremely helpful over expensive / low-bandwidth connections:
|
||||||
|
|
||||||
* `lynx <https://en.wikipedia.org/wiki/Lynx_(web_browser)>`_
|
* `lynx <https://en.wikipedia.org/wiki/Lynx_(web_browser)>`_
|
||||||
* `screen <https://linuxize.com/post/how-to-use-linux-screen/>`_
|
* `screen <https://linuxize.com/post/how-to-use-linux-screen/>`_
|
||||||
|
|
||||||
*More great tools to help you jumpstart community action at a distance:*
|
*More great tools to help you jumpstart community action at a distance:*
|
||||||
|
|
||||||
* http://FAQ.IIAB.IO > "How can I remotely manage my Internet-in-a-Box?"
|
* `FAQ.IIAB.IO <https://wiki.iiab.io/go/FAQ>`_ > "How can I remotely manage my Internet-in-a-Box?"
|
||||||
|
|
||||||
Admin Console
|
Admin Console
|
||||||
-------------
|
-------------
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,11 @@
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/iiab-admin/README.rst
|
# https://github.com/iiab/iiab/blob/master/roles/iiab-admin/README.rst
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: "Install text-mode packages, useful during remote access: lynx, screen"
|
- name: "Install text-mode packages, useful during remote access: lynx, screen"
|
||||||
package:
|
package:
|
||||||
name:
|
name:
|
||||||
|
|
@ -35,6 +40,17 @@
|
||||||
|
|
||||||
# RECORD iiab-admin AS INSTALLED
|
# RECORD iiab-admin AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'iiab_admin_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: iiab-admin
|
||||||
|
option: iiab_admin_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'iiab_admin_installed: True'"
|
- name: "Set 'iiab_admin_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
iiab_admin_installed: True
|
iiab_admin_installed: True
|
||||||
|
|
|
||||||
|
|
@ -2,34 +2,35 @@
|
||||||
# AND roles/network/tasks/netwarn.yml FOR iiab-network
|
# AND roles/network/tasks/netwarn.yml FOR iiab-network
|
||||||
|
|
||||||
|
|
||||||
- name: Install /etc/profile.d/sshpwd-profile-iiab.sh from template, to issue warnings (during shell/ssh logins) if iiab-admin password is the default
|
- name: Install /etc/profile.d/iiab-pwdwarn-profile.sh from template, to issue warnings (during shell/ssh logins) if iiab-admin password is the default
|
||||||
template:
|
template:
|
||||||
src: sshpwd-profile-iiab.sh.j2
|
src: iiab-pwdwarn-profile.sh.j2
|
||||||
dest: /etc/profile.d/sshpwd-profile-iiab.sh
|
dest: /etc/profile.d/iiab-pwdwarn-profile.sh
|
||||||
mode: '0644'
|
mode: '0644'
|
||||||
|
|
||||||
- name: Is /etc/xdg/lxsession/LXDE-pi a directory?
|
- name: Does directory /home/{{ iiab_admin_user }}/.config/labwc/ exist?
|
||||||
stat:
|
stat:
|
||||||
path: /etc/xdg/lxsession/LXDE-pi
|
path: /home/{{ iiab_admin_user }}/.config/labwc/
|
||||||
register: lx
|
register: labwc_dir
|
||||||
|
|
||||||
- name: "If so, install from template: /etc/xdg/lxsession/LXDE-pi/sshpwd-lxde-iiab.sh"
|
- name: "If so, install from template: /usr/local/sbin/iiab-pwdwarn-labwc"
|
||||||
template:
|
template:
|
||||||
src: sshpwd-lxde-iiab.sh.j2
|
src: iiab-pwdwarn-labwc.j2
|
||||||
dest: /etc/xdg/lxsession/LXDE-pi/sshpwd-lxde-iiab.sh
|
dest: /usr/local/sbin/iiab-pwdwarn-labwc
|
||||||
mode: '0755'
|
mode: '0755'
|
||||||
when: lx.stat.isdir is defined and lx.stat.isdir # and is_raspbian
|
when: labwc_dir.stat.exists and labwc_dir.stat.isdir
|
||||||
|
|
||||||
# 2019-03-07: This popup (/etc/xdg/lxsession/LXDE-pi/sshpwd-lxde-iiab.sh) does
|
# 2019-03-07: This pop-up (/etc/xdg/lxsession/LXDE-pi/sshpwd-lxde-iiab.sh) did
|
||||||
# not actually appear when triggered by /etc/xdg/autostart/pprompt-iiab.desktop
|
# not actually appear when triggered by /etc/xdg/autostart/pprompt-iiab.desktop
|
||||||
# (or pprompt.desktop as Raspbian has working since 2018-11-13!) Too bad as it
|
# (or pprompt.desktop as Raspbian has working since 2018-11-13!) Too bad as it
|
||||||
# would be really nice to standardize this popup across Ubermix & all distros..
|
# would be really nice to standardize pop-ups across Ubermix & all distros...
|
||||||
# Is this a permissions/security issue presumably? Official autostart spec is:
|
# Is this a permissions/security issue presumably? Official autostart spec is:
|
||||||
# https://specifications.freedesktop.org/autostart-spec/autostart-spec-latest.html
|
# https://specifications.freedesktop.org/autostart-spec/autostart-spec-latest.html
|
||||||
# Raspbian's 2016-2018 evolution here: https://github.com/iiab/iiab/issues/1537
|
# Raspbian's 2016-2018 evolution here: https://github.com/iiab/iiab/issues/1537
|
||||||
|
|
||||||
- name: ...and put a line in /etc/xdg/lxsession/LXDE-pi/autostart to trigger popups
|
- name: ...and put a line in /home/{{ iiab_admin_user }}/.config/labwc/autostart to trigger iiab-pwdwarn-labwc (& pop-up as nec)
|
||||||
lineinfile:
|
lineinfile:
|
||||||
path: /etc/xdg/lxsession/LXDE-pi/autostart
|
path: /home/{{ iiab_admin_user }}/.config/labwc/autostart # iiab-admin
|
||||||
line: "@/etc/xdg/lxsession/LXDE-pi/sshpwd-lxde-iiab.sh"
|
create: yes
|
||||||
when: lx.stat.isdir is defined and lx.stat.isdir # and is_raspbian
|
line: '/usr/local/sbin/iiab-pwdwarn-labwc &'
|
||||||
|
when: labwc_dir.stat.exists and labwc_dir.stat.isdir
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
- name: 'Install package: sudo'
|
- name: 'Install package: sudo'
|
||||||
package:
|
package:
|
||||||
name: sudo # (1) Should be installed prior to installing IIAB, (2) Can also be installed by roles/1-prep's roles/openvpn/tasks/install.yml, (3) Is definitely installed by 1-prep here, (4) Used to be installed by roles/2-common/tasks/packages.yml (but that's too late!)
|
name: sudo # (1) Should be installed prior to installing IIAB, (2) Can be installed by 1-prep's roles/tailscale/tasks/install.yml, (3) Can be installed by 1-prep's roles/iiab-admin/tasks/sudo-prereqs.yml here, (4) Used to be installed by roles/2-common/tasks/packages.yml (but that's too late!)
|
||||||
|
|
||||||
- name: Temporarily make file /etc/sudoers editable (0640)
|
- name: Temporarily make file /etc/sudoers editable (0640)
|
||||||
file:
|
file:
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,8 @@ check_user_pwd() {
|
||||||
# [ $(python3 -c "import crypt; print(crypt.crypt('$2', '\$$meth\$$salt'))") == "\$$meth\$$salt\$$hash" ]
|
# [ $(python3 -c "import crypt; print(crypt.crypt('$2', '\$$meth\$$salt'))") == "\$$meth\$$salt\$$hash" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
#grep -q "^PasswordAuthentication\s\+no\b" /etc/ssh/sshd_config && return
|
# grep -q "^PasswordAuthentication\s\+no\b" /etc/ssh/sshd_config && return
|
||||||
#systemctl is-active {{ sshd_service }} || return
|
# systemctl is-active ssh || return # #3444: Or use Ansible var sshd_service
|
||||||
|
|
||||||
if check_user_pwd "{{ iiab_admin_user }}" "{{ iiab_admin_published_pwd }}" ; then # iiab-admin g0adm1n
|
if check_user_pwd "{{ iiab_admin_user }}" "{{ iiab_admin_published_pwd }}" ; then # iiab-admin g0adm1n
|
||||||
zenity --warning --width=600 --text="Published password in use by user '{{ iiab_admin_user }}'.\n\nTHIS IS A SECURITY RISK - please change its password using IIAB's Admin Console (http://box.lan/admin) -> Utilities -> Change Password.\n\nSee 'What are the default passwords?' at http://FAQ.IIAB.IO"
|
zenity --warning --width=600 --text="Published password in use by user '{{ iiab_admin_user }}'.\n\nTHIS IS A SECURITY RISK - please change its password using IIAB's Admin Console (http://box.lan/admin) -> Utilities -> Change Password.\n\nSee 'What are the default passwords?' at http://FAQ.IIAB.IO"
|
||||||
|
|
@ -9,10 +9,10 @@
|
||||||
include_role:
|
include_role:
|
||||||
name: nodejs
|
name: nodejs
|
||||||
|
|
||||||
- name: Assert that 10.x <= nodejs_version ({{ nodejs_version }}) <= 18.x
|
- name: Assert that 10.x <= nodejs_version ({{ nodejs_version }}) <= 22.x
|
||||||
assert:
|
assert:
|
||||||
that: nodejs_version is version('10.x', '>=') and nodejs_version is version('18.x', '<=')
|
that: nodejs_version is version('10.x', '>=') and nodejs_version is version('22.x', '<=')
|
||||||
fail_msg: "Internet Archive install cannot proceed, as it currently requires Node.js 10.x - 18.x, and your nodejs_version is set to {{ nodejs_version }}. Please check the value of nodejs_version in /opt/iiab/iiab/vars/default_vars.yml and possibly also /etc/iiab/local_vars.yml"
|
fail_msg: "Internet Archive install cannot proceed, as it currently requires Node.js 10.x - 22.x, and your nodejs_version is set to {{ nodejs_version }}. Please check the value of nodejs_version in /opt/iiab/iiab/vars/default_vars.yml and possibly also /etc/iiab/local_vars.yml"
|
||||||
quiet: yes
|
quiet: yes
|
||||||
|
|
||||||
- name: "Set 'yarn_install: True' and 'yarn_enabled: True'"
|
- name: "Set 'yarn_install: True' and 'yarn_enabled: True'"
|
||||||
|
|
@ -30,6 +30,11 @@
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
# 2. CREATE 2 DIRS, WIPE /opt/iiab/internetarchive/node_modules & RUN YARN
|
# 2. CREATE 2 DIRS, WIPE /opt/iiab/internetarchive/node_modules & RUN YARN
|
||||||
|
|
||||||
- name: mkdir {{ internetarchive_dir }}
|
- name: mkdir {{ internetarchive_dir }}
|
||||||
|
|
@ -64,6 +69,17 @@
|
||||||
|
|
||||||
# 4. RECORD Internet Archive AS INSTALLED
|
# 4. RECORD Internet Archive AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'internetarchive_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: internetarchive
|
||||||
|
option: internetarchive_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'internetarchive_installed: True'"
|
- name: "Set 'internetarchive_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
internetarchive_installed: True
|
internetarchive_installed: True
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
## JupyterHub programming environment with student Notebooks
|
## JupyterHub programming environment with student Notebooks
|
||||||
|
|
||||||
|
### CAUTION: Internet-in-a-Box (IIAB) does not support JupyterHub on 32-bit OS's, where installation will likely fail ([#3639](https://github.com/iiab/iiab/issues/3639)).
|
||||||
|
|
||||||
#### Secondary schools may want to consider JupyterHub to integrate coding with dynamic interactive graphing — A New Way to Think About Programming — allowing students to integrate science experiment results and program output within their own blog-like "Jupyter Notebooks."
|
#### Secondary schools may want to consider JupyterHub to integrate coding with dynamic interactive graphing — A New Way to Think About Programming — allowing students to integrate science experiment results and program output within their own blog-like "Jupyter Notebooks."
|
||||||
|
|
||||||
* Jupyter Notebooks are widely used in the scientific community:
|
* Jupyter Notebooks are widely used in the scientific community:
|
||||||
|
|
@ -9,10 +11,11 @@
|
||||||
* [JupyterHub changelog](https://jupyterhub.readthedocs.io/en/stable/changelog.html#changelog)
|
* [JupyterHub changelog](https://jupyterhub.readthedocs.io/en/stable/changelog.html#changelog)
|
||||||
* Students create their own accounts on first use — e.g. at http://box.lan/jupyterhub — just as if they're logging in regularly (unfortunately the login screen doesn't make that clear, but the teacher _does not_ need to be involved!)
|
* Students create their own accounts on first use — e.g. at http://box.lan/jupyterhub — just as if they're logging in regularly (unfortunately the login screen doesn't make that clear, but the teacher _does not_ need to be involved!)
|
||||||
* A student can then sign in with their username and password, to gain access to their files (Jupyter Notebooks).
|
* A student can then sign in with their username and password, to gain access to their files (Jupyter Notebooks).
|
||||||
* The teacher should set and protect JupyterHub's overall `Admin` password, just in case. As with student accounts, the login screen doesn't make that clear — so just log in with username `Admin` — using any password that you want to become permanent.
|
* The teacher should set and protect JupyterHub's overall `Admin` password, just in case. As with student accounts, the login screen unfortunately doesn't make that clear — so just log in with username `Admin` — using any password that you want to become permanent.
|
||||||
* Individual student folders are created in `/var/lib/private/` on the Internet-in-a-Box (IIAB) server:
|
* Individual student folders are created in `/var/lib/private/` on your Internet-in-a-Box (IIAB) server:
|
||||||
* A student will only be able to see their own work — they do not have privileges outside of their own folder.
|
* A student will only be able to see their own work — they do not have privileges outside of their own folder.
|
||||||
* Students may upload Jupyter Notebooks to the IIAB server, and download the current state of their work via a normal browser.
|
* Students may upload Jupyter Notebooks to the IIAB server, and download the current state of their work via a normal browser.
|
||||||
|
* Linux administrators can read more about JupyterHub's [Local Users](https://github.com/jupyterhub/systemdspawner#local-users) and [c.SystemdSpawner.dynamic_users = True](https://github.com/jupyterhub/systemdspawner#dynamic_users)
|
||||||
|
|
||||||
### Settings
|
### Settings
|
||||||
|
|
||||||
|
|
@ -26,10 +29,11 @@ In some rare circumstances, it may be necessary to restart JupyterHub's systemd
|
||||||
sudo systemctl restart jupyterhub
|
sudo systemctl restart jupyterhub
|
||||||
```
|
```
|
||||||
|
|
||||||
FYI `/opt/iiab/jupyterhub` is a Python 3 virtual environment, that can be activated with the usual formula:
|
FYI `/opt/iiab/jupyterhub` is a Python 3 virtual environment, that can be activated (and deactivated) with the usual:
|
||||||
|
|
||||||
```
|
```
|
||||||
source /opt/iiab/jupyterhub/bin/activate
|
source /opt/iiab/jupyterhub/bin/activate
|
||||||
|
(jupyterhub) root@box:~# deactivate
|
||||||
```
|
```
|
||||||
|
|
||||||
Passwords are hashed using 4096 rounds of the latest Blowfish (bcrypt's $2b$ algorithm) and stored in:
|
Passwords are hashed using 4096 rounds of the latest Blowfish (bcrypt's $2b$ algorithm) and stored in:
|
||||||
|
|
@ -42,19 +46,19 @@ Passwords are hashed using 4096 rounds of the latest Blowfish (bcrypt's $2b$ alg
|
||||||
|
|
||||||
Users can change their password by logging in, and then visiting URL: http://box.lan/jupyterhub/auth/change-password
|
Users can change their password by logging in, and then visiting URL: http://box.lan/jupyterhub/auth/change-password
|
||||||
|
|
||||||
NOTE: This is the only way to change the password for user 'Admin', because Control Panel > Admin (below) does not permit deletion of this account.
|
NOTE: This is the only way to change the password for user `Admin`, because **File > Hub Control Panel > Admin** (below) does not permit deletion of this account.
|
||||||
|
|
||||||
### Control Panel > Admin page, to manage other accounts
|
### File > Hub Control Panel > Admin, to manage accounts
|
||||||
|
|
||||||
The `Admin` user (and any users given `Admin` privilege) can reset user passwords by deleting the user from JupyterHub's **Admin** page (below). This logs the user out, but does not remove any of their data or home directories. The user can then set a new password in the usual way — simply by logging in. Example:
|
The `Admin` user (and any users given `Admin` privilege) can reset user passwords by deleting the user from JupyterHub's **Admin** page (below). This logs the user out, but does not remove any of their data or home directories. The user can then set a new password in the usual way — simply by logging in. Example:
|
||||||
|
|
||||||
1. As a user with `Admin` privilege, click **Control Panel** in the top right of your JupyterHub:
|
1. As a user with `Admin` privilege, click **File > Hub Control Panel** in your JupyterHub:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
2. In the Control Panel, open the **Admin** link in the top left:
|
2. At the top of the Control Panel, click **Admin**:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
This opens up the JupyterHub Admin page, where you can add / delete users, start / stop peoples’ servers and see who is online.
|
This opens up the JupyterHub Admin page, where you can add / delete users, start / stop peoples’ servers and see who is online.
|
||||||
|
|
||||||
|
|
@ -70,6 +74,20 @@ The `Admin` user (and any users given `Admin` privilege) can reset user password
|
||||||
|
|
||||||
_WARNING: If on login users see "500 : Internal Server Error", you may need to remove ALL files of the form_ `/run/jupyter-johndoe-singleuser`
|
_WARNING: If on login users see "500 : Internal Server Error", you may need to remove ALL files of the form_ `/run/jupyter-johndoe-singleuser`
|
||||||
|
|
||||||
|
### Logging
|
||||||
|
|
||||||
|
To see JupyterHub's (typically very long!) log, run:
|
||||||
|
|
||||||
|
```
|
||||||
|
journalctl -u jupyterhub
|
||||||
|
```
|
||||||
|
|
||||||
|
Sometimes other logs might also be available, e.g.:
|
||||||
|
|
||||||
|
```
|
||||||
|
journalctl -u jupyter-admin-singleuser
|
||||||
|
```
|
||||||
|
|
||||||
### PAWS/Jupyter Notebooks for Python Beginners
|
### PAWS/Jupyter Notebooks for Python Beginners
|
||||||
|
|
||||||
While PAWS is a little bit off topic, if you have an interest in Wikipedia, please do see this 23m 42s video ["Intro to PAWS/Jupyter notebooks for Python beginners"](https://www.youtube.com/watch?v=AUZkioRI-aA&list=PLeoTcBlDanyNQXBqI1rVXUqUTSSiuSIXN&index=8) by Chico Venancio, from 2021-06-01.
|
While PAWS is a little bit off topic, if you have an interest in Wikipedia, please do see this 23m 42s video ["Intro to PAWS/Jupyter notebooks for Python beginners"](https://www.youtube.com/watch?v=AUZkioRI-aA&list=PLeoTcBlDanyNQXBqI1rVXUqUTSSiuSIXN&index=8) by Chico Venancio, from 2021-06-01.
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,20 @@
|
||||||
when: nodejs_installed is undefined
|
when: nodejs_installed is undefined
|
||||||
|
|
||||||
|
|
||||||
- name: "Install package: python3-venv"
|
- name: Record (initial) disk space used
|
||||||
package:
|
shell: df -B1 --output=used / | tail -1
|
||||||
name: python3-venv
|
register: df1
|
||||||
state: present
|
|
||||||
|
# 2025-02-16
|
||||||
|
#- name: "Install package: python3-psutil"
|
||||||
|
# package:
|
||||||
|
# name: python3-psutil
|
||||||
|
# state: present
|
||||||
|
|
||||||
|
- name: Remove previous virtual environment {{ jupyterhub_venv }}
|
||||||
|
file:
|
||||||
|
path: "{{ jupyterhub_venv }}"
|
||||||
|
state: absent
|
||||||
|
|
||||||
- name: Make 3 directories to hold JupyterHub config
|
- name: Make 3 directories to hold JupyterHub config
|
||||||
file:
|
file:
|
||||||
|
|
@ -33,17 +43,18 @@
|
||||||
global: yes
|
global: yes
|
||||||
state: latest
|
state: latest
|
||||||
|
|
||||||
- name: "pip install 3 packages into virtual environment: {{ jupyterhub_venv }} (~271 MB total, after 2 Ansible calls)"
|
- name: "pip install 3 packages into virtual environment: {{ jupyterhub_venv }} (~316 MB total, after 2 Ansible calls)"
|
||||||
pip:
|
pip:
|
||||||
name:
|
name:
|
||||||
- pip
|
- pip
|
||||||
- wheel
|
- wheel
|
||||||
- jupyterhub
|
- jupyterhub
|
||||||
virtualenv: "{{ jupyterhub_venv }}" # /opt/iiab/jupyterhub
|
virtualenv: "{{ jupyterhub_venv }}" # /opt/iiab/jupyterhub
|
||||||
virtualenv_site_packages: no
|
#virtualenv_site_packages: no
|
||||||
virtualenv_command: python3 -m venv "{{ jupyterhub_venv }}" # 2021-07-29: This works on RasPiOS 10, Debian 11, Ubuntu 20.04 and Mint 20 -- however if you absolutely must use the older Debian 10 -- you can work around errors "can't find Rust compiler" and "This package requires Rust >=1.41.0" if you (1) revert this line to 'virtualenv_command: virtualenv' AND (2) uncomment the line just below
|
virtualenv_command: python3 -m venv "{{ jupyterhub_venv }}" # 2025-02-16
|
||||||
|
#virtualenv_command: python3 -m venv --system-site-packages "{{ jupyterhub_venv }}" # 2021-07-29: This works on RasPiOS 10, Debian 11, Ubuntu 20.04 and Mint 20 -- however if you absolutely must use the older Debian 10 -- you can work around errors "can't find Rust compiler" and "This package requires Rust >=1.41.0" if you (1) revert this line to 'virtualenv_command: virtualenv' AND (2) uncomment the line just below
|
||||||
#virtualenv_python: python3 # 2021-07-29: Was needed when above line was 'virtualenv_command: virtualenv' (generally for Python 2)
|
#virtualenv_python: python3 # 2021-07-29: Was needed when above line was 'virtualenv_command: virtualenv' (generally for Python 2)
|
||||||
extra_args: "--no-cache-dir" # 2021-11-30, 2022-07-07: The "--pre" flag had earlier been needed, for beta-like pre-releases of JupyterHub 2.0.0
|
extra_args: "--no-cache-dir --prefer-binary" # 2021-11-30, 2022-07-07: The "--pre" flag had earlier been needed, for beta-like pre-releases of JupyterHub 2.0.0
|
||||||
|
|
||||||
# 2022-07-07: Attempting to "pip install" all 7 together (3 above + 4 below)
|
# 2022-07-07: Attempting to "pip install" all 7 together (3 above + 4 below)
|
||||||
# fails on OS's like 64-bit RasPiOS (but interestingly works on Ubuntu 22.04!)
|
# fails on OS's like 64-bit RasPiOS (but interestingly works on Ubuntu 22.04!)
|
||||||
|
|
@ -57,9 +68,10 @@
|
||||||
- jupyterhub-systemdspawner
|
- jupyterhub-systemdspawner
|
||||||
- ipywidgets
|
- ipywidgets
|
||||||
virtualenv: "{{ jupyterhub_venv }}"
|
virtualenv: "{{ jupyterhub_venv }}"
|
||||||
virtualenv_site_packages: no
|
#virtualenv_site_packages: no
|
||||||
virtualenv_command: python3 -m venv "{{ jupyterhub_venv }}"
|
virtualenv_command: python3 -m venv "{{ jupyterhub_venv }}" # 2025-02-16
|
||||||
extra_args: "--no-cache-dir"
|
#virtualenv_command: python3 -m venv --system-site-packages "{{ jupyterhub_venv }}"
|
||||||
|
extra_args: "--no-cache-dir --prefer-binary" # 2023-10-01: Lifesaver when recent wheels (e.g. piwheels.org) are inevitably not yet built! SEE #3560
|
||||||
|
|
||||||
- name: "Install from template: {{ jupyterhub_venv }}/etc/jupyterhub/jupyterhub_config.py"
|
- name: "Install from template: {{ jupyterhub_venv }}/etc/jupyterhub/jupyterhub_config.py"
|
||||||
template:
|
template:
|
||||||
|
|
@ -72,7 +84,7 @@
|
||||||
dest: /etc/systemd/system/jupyterhub.service
|
dest: /etc/systemd/system/jupyterhub.service
|
||||||
|
|
||||||
# 2022-07-07: No longer needed, thx to upstream fixes
|
# 2022-07-07: No longer needed, thx to upstream fixes
|
||||||
# - name: Install {{ jupyterhub_venv }}/bin/getsite.py from template, to fetch site_packages path, e.g. {{ jupyterhub_venv }}/lib/python{{ python_ver }}/site-packages
|
# - name: Install {{ jupyterhub_venv }}/bin/getsite.py from template, to fetch site_packages path, e.g. {{ jupyterhub_venv }}/lib/python{{ python_version }}/site-packages
|
||||||
# template:
|
# template:
|
||||||
# src: getsite.py.j2
|
# src: getsite.py.j2
|
||||||
# dest: "{{ jupyterhub_venv }}/bin/getsite.py"
|
# dest: "{{ jupyterhub_venv }}/bin/getsite.py"
|
||||||
|
|
@ -99,6 +111,17 @@
|
||||||
|
|
||||||
# RECORD JupyterHub AS INSTALLED
|
# RECORD JupyterHub AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'jupyterhub_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: jupyterhub
|
||||||
|
option: jupyterhub_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'jupyterhub_installed: True'"
|
- name: "Set 'jupyterhub_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
jupyterhub_installed: True
|
jupyterhub_installed: True
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,3 +1,8 @@
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: Download {{ kalite_requirements }} to {{ pip_packages_dir }}/kalite.txt
|
- name: Download {{ kalite_requirements }} to {{ pip_packages_dir }}/kalite.txt
|
||||||
get_url:
|
get_url:
|
||||||
url: "{{ kalite_requirements }}"
|
url: "{{ kalite_requirements }}"
|
||||||
|
|
@ -10,36 +15,46 @@
|
||||||
# ignore_errors: yes
|
# ignore_errors: yes
|
||||||
# when: is_raspbian
|
# when: is_raspbian
|
||||||
|
|
||||||
- name: 'Install packages: python2, python-setuptools, virtualenv (for Python 2)'
|
- name: 'Install packages: python2, python-setuptools, virtualenv (for Python 2) -- if Ubuntu 22.04 / Mint 21'
|
||||||
package:
|
package:
|
||||||
name:
|
name:
|
||||||
- python2
|
- python2
|
||||||
- python-setuptools # Provides setuptools-44 on recent OS's (last version compatible with python2)
|
- python-setuptools # Provides setuptools-44 on recent OS's (last version compatible with python2)
|
||||||
- virtualenv # For Ansible module 'pip' when used with 'virtualenv_command: /usr/bin/virtualenv' and 'virtualenv_python: python2.7' -- compare package 'python3-venv' used by roles {calibre-web, jupyterhub, lokole}
|
- virtualenv # Drags in 'python3-virtualenv' which in turn drags in 'python3-pip' -- for Ansible module 'pip' when used with 'virtualenv_command: /usr/bin/virtualenv' and 'virtualenv_python: python2.7' -- compare package 'python3-venv' used by roles {calibre-web, jupyterhub, lokole}
|
||||||
state: present
|
state: present
|
||||||
#when: not (is_debian_9 or is_debian_10 or is_ubuntu_16 or is_ubuntu_17 or is_ubuntu_18 or is_ubuntu_19)
|
when: is_ubuntu_2204 # Also covers is_linuxmint_21
|
||||||
# 2020-03-31: Testing for {is_raspbian_9, is_raspbian_10} is not currently nec, as testing for {is_debian_9, is_debian_10} covers that already.
|
|
||||||
|
|
||||||
- name: Use pip to pin setuptools to 44 in {{ kalite_venv }} # WAS: if Raspbian/Debian > 10 or Ubuntu > 19
|
- name: Run scripts/install_python2.sh to install python2 and virtualenv -- if Debian 12 or RasPiOS 12
|
||||||
|
command: "{{ iiab_dir }}/scripts/install_python2.sh"
|
||||||
|
when: is_debian_12 # Also covers is_raspbian_12
|
||||||
|
|
||||||
|
- name: Use pip to pin setuptools to 44 in {{ kalite_venv }} -- if Ubuntu 22.04 / Mint 21, Ubuntu 23.10, Debian 12 or RasPiOS 12
|
||||||
pip:
|
pip:
|
||||||
name: setuptools==44
|
name: setuptools==44
|
||||||
virtualenv: "{{ kalite_venv }}" # /usr/local/kalite/venv
|
virtualenv: "{{ kalite_venv }}" # /usr/local/kalite/venv
|
||||||
virtualenv_site_packages: no
|
virtualenv_site_packages: no
|
||||||
virtualenv_command: /usr/bin/virtualenv
|
virtualenv_command: virtualenv # Traditionally /usr/bin/virtual/env -- but install_python2.sh (for Ubuntu 23.10+) sets up /usr/local/bin/virtualenv
|
||||||
virtualenv_python: python2.7
|
virtualenv_python: python2.7
|
||||||
extra_args: "--no-use-pep517 --no-cache-dir --no-python-version-warning"
|
extra_args: "--no-use-pep517 --no-cache-dir --no-python-version-warning"
|
||||||
#when: not (is_debian_9 or is_debian_10 or is_ubuntu_16 or is_ubuntu_17 or is_ubuntu_18 or is_ubuntu_19)
|
when: is_ubuntu_2204 or is_ubuntu_2310 or is_debian_12 # Also covers is_linuxmint_21 and is_raspbian_12
|
||||||
# long form of (is_debian_11+ or is_ubuntu_20+)
|
|
||||||
|
|
||||||
- name: Use pip to install ka-lite-static to {{ kalite_venv }}
|
- name: Use pip to install ka-lite-static to {{ kalite_venv }} -- if Ubuntu 22.04 / Mint 21, Ubuntu 23.10, Debian 12 or RasPiOS 12
|
||||||
pip:
|
pip:
|
||||||
name: ka-lite-static
|
name: ka-lite-static
|
||||||
version: "{{ kalite_version }}"
|
version: "{{ kalite_version }}"
|
||||||
virtualenv: "{{ kalite_venv }}"
|
virtualenv: "{{ kalite_venv }}"
|
||||||
virtualenv_site_packages: no
|
virtualenv_site_packages: no
|
||||||
virtualenv_command: /usr/bin/virtualenv
|
virtualenv_command: virtualenv
|
||||||
virtualenv_python: python2.7
|
virtualenv_python: python2.7
|
||||||
extra_args: "--no-cache-dir"
|
extra_args: "--no-cache-dir"
|
||||||
|
when: is_ubuntu_2204 or is_ubuntu_2310 or is_debian_12 # Also covers is_linuxmint_21 and is_raspbian_12
|
||||||
|
|
||||||
|
# 2024-04-30: Sadly no longer works with Ubuntu 24.04 LTS final release (#3731).
|
||||||
|
# So roles/kalite is OS-restricted during initial install, SEE: roles/7-edu-apps/tasks/main.yml
|
||||||
|
# CLARIF: If install_python2_kalite-venv_u2404.sh proves no longer useful, it will deprecated in coming months.
|
||||||
|
- name: Run scripts/install_python2_kalite-venv_u2404.sh -- if Ubuntu 24.04+ or Mint 22
|
||||||
|
command: bash "{{ iiab_dir }}/scripts/install_python2_kalite-venv_u2404.sh"
|
||||||
|
when: is_ubuntu and not is_linuxmint and os_ver is version('ubuntu-2404', '>=') or is_linuxmint_22
|
||||||
|
|
||||||
- name: "Install from templates: venv wrapper /usr/bin/kalite, unit file /etc/systemd/system/kalite-serve.service"
|
- name: "Install from templates: venv wrapper /usr/bin/kalite, unit file /etc/systemd/system/kalite-serve.service"
|
||||||
template:
|
template:
|
||||||
|
|
@ -50,30 +65,11 @@
|
||||||
- { src: 'kalite.sh.j2', dest: '/usr/bin/kalite', mode: '0755' }
|
- { src: 'kalite.sh.j2', dest: '/usr/bin/kalite', mode: '0755' }
|
||||||
- { src: 'kalite-serve.service.j2', dest: '/etc/systemd/system/kalite-serve.service', mode: '0644' }
|
- { src: 'kalite-serve.service.j2', dest: '/etc/systemd/system/kalite-serve.service', mode: '0644' }
|
||||||
|
|
||||||
# Useless stanza, for 2 reasons: (1) http://box/kalite was never made to work
|
|
||||||
# (2) /etc/apache2/sites-available does not exist on many IIAB's w/o Apache
|
|
||||||
# - name: "Install from template: /etc/{{ apache_conf_dir }}/kalite.conf (useless, as http://box/kalite was never made to work)"
|
|
||||||
# template:
|
|
||||||
# src: kalite.conf
|
|
||||||
# dest: "/etc/{{ apache_conf_dir }}" # apache2/sites-available on debuntu
|
|
||||||
# when: apache_installed is defined
|
|
||||||
|
|
||||||
- name: Fix KA Lite bug in regex parsing ifconfig output (ifcfg/parser.py) for @m-anish's network names that contain dashes # WAS: if Raspbian/Debian > 10 or Ubuntu > 19
|
- name: Fix KA Lite bug in regex parsing ifconfig output (ifcfg/parser.py) for @m-anish's network names that contain dashes # WAS: if Raspbian/Debian > 10 or Ubuntu > 19
|
||||||
replace:
|
replace:
|
||||||
path: "{{ kalite_venv }}/lib/python2.7/site-packages/kalite/packages/dist/ifcfg/parser.py" # /usr/local/kalite/venv
|
path: "{{ kalite_venv }}/lib/python2.7/site-packages/kalite/packages/dist/ifcfg/parser.py" # /usr/local/kalite/venv
|
||||||
regexp: 'a-zA-Z0-9'
|
regexp: 'a-zA-Z0-9'
|
||||||
replace: 'a-zA-Z0-9\-'
|
replace: 'a-zA-Z0-9\-'
|
||||||
#when: not (is_debian_9 or is_debian_10 or is_ubuntu_16 or is_ubuntu_17 or is_ubuntu_18 or is_ubuntu_19)
|
|
||||||
# 2020-03-31: Testing for {is_raspbian_9, is_raspbian_10} is not currently nec, as testing for {is_debian_9, is_debian_10} covers that already.
|
|
||||||
# JV: why not just is_ubuntu_20? AH: to make this work on Ubuntu 21+ and ideally Debian/RasPiOS 11+ too?
|
|
||||||
|
|
||||||
# - name: Fix KA Lite bug in regex parsing ifconfig output (ifcfg/parser.py) for @m-anish's network names that contain dashes, if Raspbian/Debian < 11 or Ubuntu < 20
|
|
||||||
# replace:
|
|
||||||
# path: "{{ kalite_venv }}/local/lib/python2.7/site-packages/kalite/packages/dist/ifcfg/parser.py"
|
|
||||||
# regexp: 'a-zA-Z0-9'
|
|
||||||
# replace: 'a-zA-Z0-9\-'
|
|
||||||
# when: is_debian_9 or is_debian_10 or is_ubuntu_16 or is_ubuntu_17 or is_ubuntu_18 or is_ubuntu_19
|
|
||||||
# # 2020-03-31: Testing for {is_raspbian_9, is_raspbian_10} is not currently nec, as testing for {is_debian_9, is_debian_10} covers that already.
|
|
||||||
|
|
||||||
- name: Create dir {{ kalite_root }}
|
- name: Create dir {{ kalite_root }}
|
||||||
file:
|
file:
|
||||||
|
|
@ -90,6 +86,17 @@
|
||||||
|
|
||||||
# RECORD KA Lite AS INSTALLED
|
# RECORD KA Lite AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'kalite_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: kalite
|
||||||
|
option: kalite_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'kalite_installed: True'"
|
- name: "Set 'kalite_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
kalite_installed: True
|
kalite_installed: True
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ Locations
|
||||||
|
|
||||||
- Your ZIM files go in ``/library/zims/content``
|
- Your ZIM files go in ``/library/zims/content``
|
||||||
- Your ZIM index files used to go in directories under ``/library/zims/index`` (these index files are increasingly no longer necessary, as most ZIM files produced since 2017 contain an internal search index instead!)
|
- Your ZIM index files used to go in directories under ``/library/zims/index`` (these index files are increasingly no longer necessary, as most ZIM files produced since 2017 contain an internal search index instead!)
|
||||||
- The URL is http://box/kiwix or http://box.lan/kiwix (both proxied for AWStats)
|
- The URL is http://box/kiwix or http://box.lan/kiwix (both proxied for AWStats, Matomo, ETC)
|
||||||
- Use URL http://box:3000/kiwix if you want to avoid the proxy
|
- Use URL http://box:3000/kiwix if you want to avoid the proxy
|
||||||
|
|
||||||
Your ``/library/zims/library.xml`` (containing essential metadata for the ZIM files you've installed) can be regenerated if necessary, by running:
|
Your ``/library/zims/library.xml`` (containing essential metadata for the ZIM files you've installed) can be regenerated if necessary, by running:
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,11 @@
|
||||||
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
||||||
|
|
||||||
|
|
||||||
# INSTRUCTIONS TO REINSTALL Kiwix:
|
# ONLINE UPGRADE INSTRUCTIONS:
|
||||||
# (1) VERIFY THESE VARS IN /etc/iiab/local_vars.yml
|
# (1) VERIFY VARS IN /etc/iiab/local_vars.yml
|
||||||
# kiwix_install: True
|
# kiwix_install: True
|
||||||
# kiwix_enabled: True
|
# kiwix_enabled: True
|
||||||
# (2) RUN: cd /opt/iiab/iiab; ./runrole --reinstall kiwix
|
# (2) RUN: cd /opt/iiab/iiab; sudo ./runrole --reinstall kiwix
|
||||||
|
|
||||||
|
|
||||||
# FYI /library/zims contains 3 important things:
|
# FYI /library/zims contains 3 important things:
|
||||||
|
|
@ -25,13 +25,13 @@ kiwix_base_url: https://download.kiwix.org/release/kiwix-tools/
|
||||||
#kiwix_base_url: https://download.kiwix.org/nightly/2022-10-04/
|
#kiwix_base_url: https://download.kiwix.org/nightly/2022-10-04/
|
||||||
#kiwix_base_url: "{{ iiab_download_url }}/" # e.g. https://download.iiab.io/packages/
|
#kiwix_base_url: "{{ iiab_download_url }}/" # e.g. https://download.iiab.io/packages/
|
||||||
|
|
||||||
kiwix_arch_dict:
|
kiwix_arch_dict: # 'dpkg --print-architecture' key would be: (to mitigate #3516 in future, if truly nec?)
|
||||||
#i386:
|
#i386: # ?
|
||||||
i686: i586
|
i686: i586 # ?
|
||||||
x86_64: x86_64
|
x86_64: x86_64 # amd64
|
||||||
armv6l: armhf
|
armv6l: armv6 # armhf
|
||||||
armv7l: armhf
|
armv7l: armv8 # armhf BEWARE: armhf version of kiwix-tools suddenly FAILS on 64-bit RasPiOS, since 3.5.0 released 2023-04-28 -- #3574, PR #3576
|
||||||
aarch64: armhf
|
aarch64: aarch64 # arm64 BEWARE: "32-bit" RasPiOS suddenly boots 64-bit kernel since March 2023 -- #3516, explained at https://github.com/iiab/iiab/pull/3422#issuecomment-1533441463
|
||||||
|
|
||||||
# ansible_architecture might also work, if not quite as well:
|
# ansible_architecture might also work, if not quite as well:
|
||||||
# https://stackoverflow.com/questions/66828315/what-is-the-difference-between-ansible-architecture-and-ansible-machine-on-a/66828837#66828837
|
# https://stackoverflow.com/questions/66828315/what-is-the-difference-between-ansible-architecture-and-ansible-machine-on-a/66828837#66828837
|
||||||
|
|
@ -42,6 +42,7 @@ kiwix_arch: "{{ kiwix_arch_dict[ansible_machine] | default('unsupported') }}"
|
||||||
# Latest official kiwix-tools release, per Kiwix permalink redirects:
|
# Latest official kiwix-tools release, per Kiwix permalink redirects:
|
||||||
# https://www.kiwix.org/en/downloads/kiwix-serve/
|
# https://www.kiwix.org/en/downloads/kiwix-serve/
|
||||||
# https://github.com/kiwix/container-images/issues/236
|
# https://github.com/kiwix/container-images/issues/236
|
||||||
|
# https://github.com/kiwix/kiwix-tools/issues/623
|
||||||
kiwix_tar_gz: "kiwix-tools_linux-{{ kiwix_arch }}.tar.gz"
|
kiwix_tar_gz: "kiwix-tools_linux-{{ kiwix_arch }}.tar.gz"
|
||||||
#kiwix_tar_gz: "kiwix-tools_linux-{{ kiwix_arch }}-3.3.0-1.tar.gz" # Version can be hard-coded if you prefer (as was done til 2022-10-04)
|
#kiwix_tar_gz: "kiwix-tools_linux-{{ kiwix_arch }}-3.3.0-1.tar.gz" # Version can be hard-coded if you prefer (as was done til 2022-10-04)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,19 +17,35 @@
|
||||||
when: kiwix_enabled
|
when: kiwix_enabled
|
||||||
|
|
||||||
|
|
||||||
# TO DO: BOTH CRON ENTRIES BELOW *SHOULD* BE DELETED "when: not kiwix_enabled"
|
|
||||||
|
|
||||||
# In the past kiwix-serve did not stay running, so we'd been doing this hourly.
|
# In the past kiwix-serve did not stay running, so we'd been doing this hourly.
|
||||||
# @mgautierfr & others suggest kiwix-serve might be auto-restarted w/o cron in
|
# @mgautierfr & others suggest kiwix-serve might be auto-restarted w/o cron in
|
||||||
# future, whenever service fails, if this really catches all cases??
|
# future, whenever service fails, if this really catches all cases??
|
||||||
# https://github.com/iiab/iiab/issues/484#issuecomment-342151726
|
# https://github.com/iiab/iiab/issues/484#issuecomment-342151726
|
||||||
- name: Make a crontab entry to restart kiwix-serve at 4AM (debuntu)
|
|
||||||
lineinfile:
|
- name: Set cron to restart kiwix-serve 4AM daily, if kiwix_enabled
|
||||||
# mn hr dy mo day-of-week[Sunday=0] username command-to-be-executed
|
cron:
|
||||||
line: "0 4 * * * root /bin/systemctl restart kiwix-serve.service"
|
name: kiwix-serve daily restart
|
||||||
dest: /etc/crontab
|
minute: "0"
|
||||||
|
hour: "4"
|
||||||
|
job: /usr/bin/systemctl restart kiwix-serve.service
|
||||||
|
user: root
|
||||||
|
cron_file: kiwix-serve_daily # i.e. /etc/cron.d/kiwix-serve_daily instead of /var/spool/cron/crontabs/root or /etc/cron.daily/* or /etc/crontab
|
||||||
when: kiwix_enabled
|
when: kiwix_enabled
|
||||||
|
|
||||||
|
- name: Remove 4AM daily cron, if not kiwix_enabled
|
||||||
|
cron:
|
||||||
|
name: kiwix-serve daily restart
|
||||||
|
cron_file: kiwix-serve_daily
|
||||||
|
state: absent
|
||||||
|
when: not kiwix_enabled
|
||||||
|
|
||||||
|
# - name: Make a crontab entry to restart kiwix-serve at 4AM (debuntu)
|
||||||
|
# lineinfile:
|
||||||
|
# # mn hr dy mo day-of-week[Sunday=0] username command-to-be-executed
|
||||||
|
# line: "0 4 * * * root /usr/bin/systemctl restart kiwix-serve.service"
|
||||||
|
# dest: /etc/crontab
|
||||||
|
# when: kiwix_enabled
|
||||||
|
|
||||||
# - name: Make a crontab entry to restart kiwix-serve at 4AM (redhat)
|
# - name: Make a crontab entry to restart kiwix-serve at 4AM (redhat)
|
||||||
# # * * * * * user-name command to be executed
|
# # * * * * * user-name command to be executed
|
||||||
# lineinfile:
|
# lineinfile:
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,11 @@
|
||||||
when: kiwix_arch == "unsupported"
|
when: kiwix_arch == "unsupported"
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
# 1. PUT IN PLACE: /opt/iiab/downloads/kiwix-tools_linux-*.tar.gz, move /opt/iiab/kiwix/bin aside if nec, create essential dirs, and test.zim if nec (library.xml is created later, by enable-or-disable.yml)
|
# 1. PUT IN PLACE: /opt/iiab/downloads/kiwix-tools_linux-*.tar.gz, move /opt/iiab/kiwix/bin aside if nec, create essential dirs, and test.zim if nec (library.xml is created later, by enable-or-disable.yml)
|
||||||
|
|
||||||
# 2022-10-04: get_url might be removed in future (unarchive below can handle
|
# 2022-10-04: get_url might be removed in future (unarchive below can handle
|
||||||
|
|
@ -19,6 +24,24 @@
|
||||||
timeout: "{{ download_timeout }}"
|
timeout: "{{ download_timeout }}"
|
||||||
register: kiwix_dl # PATH /opt/iiab/downloads + ACTUAL filename put in kiwix_dl.dest, for unarchive ~28 lines below
|
register: kiwix_dl # PATH /opt/iiab/downloads + ACTUAL filename put in kiwix_dl.dest, for unarchive ~28 lines below
|
||||||
|
|
||||||
|
# - name: "2023-05-14: TEMPORARY PATCH REVERTING TO KIWIX-TOOLS 3.4.0 IF BUGGY 32-BIT (armhf) VERSION 3.5.0 IS DETECTED -- #3574"
|
||||||
|
# get_url:
|
||||||
|
# url: https://download.kiwix.org/release/kiwix-tools/kiwix-tools_linux-armhf-3.4.0.tar.gz
|
||||||
|
# dest: "{{ downloads_dir }}"
|
||||||
|
# timeout: "{{ download_timeout }}"
|
||||||
|
# #register: kiwix_dl # CLOBBERS kiwix_dl.dest WHEN THIS STANZA DOES NOT RUN :/
|
||||||
|
# when: kiwix_dl.dest == "/opt/iiab/downloads/kiwix-tools_linux-armhf-3.5.0.tar.gz"
|
||||||
|
#
|
||||||
|
# # Ansible does not allow changing individuals subfields in a dictionary, but
|
||||||
|
# # this crude hack works, overwriting the entire kiwix_dl dictionary var with
|
||||||
|
# # the single (needed) key/value pair. (Or "register: tmp_dl" could be set
|
||||||
|
# # above, if its other [subfields, key/value pairs, etc] really mattered...)
|
||||||
|
# - name: "2023-05-15: TEMPORARY PATCH REVERTING TO KIWIX-TOOLS 3.4.0 IF BUGGY 32-BIT (armhf) VERSION 3.5.0 IS DETECTED -- #3574"
|
||||||
|
# set_fact:
|
||||||
|
# kiwix_dl:
|
||||||
|
# dest: /opt/iiab/downloads/kiwix-tools_linux-armhf-3.4.0.tar.gz
|
||||||
|
# when: kiwix_dl.dest == "/opt/iiab/downloads/kiwix-tools_linux-armhf-3.5.0.tar.gz"
|
||||||
|
|
||||||
- name: Does {{ kiwix_path }}/bin already exist? (as a directory, symlink or file)
|
- name: Does {{ kiwix_path }}/bin already exist? (as a directory, symlink or file)
|
||||||
stat:
|
stat:
|
||||||
path: "{{ kiwix_path }}/bin" # /opt/iiab/kiwix
|
path: "{{ kiwix_path }}/bin" # /opt/iiab/kiwix
|
||||||
|
|
@ -58,6 +81,8 @@
|
||||||
src: "{{ kiwix_dl.dest }}" # See ~28 lines above, e.g. /opt/iiab/downloads/kiwix-tools_linux-x86_64-3.3.0-1.tar.gz
|
src: "{{ kiwix_dl.dest }}" # See ~28 lines above, e.g. /opt/iiab/downloads/kiwix-tools_linux-x86_64-3.3.0-1.tar.gz
|
||||||
dest: "{{ kiwix_path }}/bin"
|
dest: "{{ kiwix_path }}/bin"
|
||||||
extra_opts: --strip-components=1
|
extra_opts: --strip-components=1
|
||||||
|
owner: root # 2023-05-14: When unpacking let's avoid bogus owner/group,
|
||||||
|
group: root # arising from UID/GID on Kiwix's build machine.
|
||||||
|
|
||||||
|
|
||||||
# 3. ENABLE MODS FOR APACHE PROXY IF DEBUNTU
|
# 3. ENABLE MODS FOR APACHE PROXY IF DEBUNTU
|
||||||
|
|
@ -98,6 +123,17 @@
|
||||||
|
|
||||||
# 5. RECORD Kiwix AS INSTALLED
|
# 5. RECORD Kiwix AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'kiwix_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: kiwix
|
||||||
|
option: kiwix_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'kiwix_installed: True'"
|
- name: "Set 'kiwix_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
kiwix_installed: True
|
kiwix_installed: True
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,12 @@ if flock -n -e 200; then :
|
||||||
else
|
else
|
||||||
/usr/bin/iiab-make-kiwix-lib.py -f # force rebuild of library.xml
|
/usr/bin/iiab-make-kiwix-lib.py -f # force rebuild of library.xml
|
||||||
fi
|
fi
|
||||||
{{ systemctl_program }} stop kiwix-serve
|
/usr/bin/systemctl stop kiwix-serve
|
||||||
if [ -f $KIWIXLIB ]; then
|
if [ -f $KIWIXLIB ]; then
|
||||||
rm $KIWIXLIB
|
rm $KIWIXLIB
|
||||||
fi
|
fi
|
||||||
mv $KIWIXLIB.tmp $KIWIXLIB
|
mv $KIWIXLIB.tmp $KIWIXLIB
|
||||||
{{ systemctl_program }} start kiwix-serve
|
/usr/bin/systemctl start kiwix-serve
|
||||||
else
|
else
|
||||||
echo "Can't get wait lock for iiab-make-kiwix-lib.py";
|
echo "Can't get wait lock for iiab-make-kiwix-lib.py";
|
||||||
exit 1;
|
exit 1;
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ Please look in `/opt/iiab/iiab/roles/kolibri/defaults/main.yml <defaults/main.ym
|
||||||
Automatic Device Provisioning
|
Automatic Device Provisioning
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
When kolibri_provision is enabled (e.g. in `/etc/iiab/local_vars.yml <http://FAQ.IIAB.IO#What_is_local_vars.yml_and_how_do_I_customize_it.3F>`_) the installation will set up the following defaults::
|
When kolibri_provision is enabled (e.g. in `/etc/iiab/local_vars.yml <http://FAQ.IIAB.IO#What_is_local_vars.yml_and_how_do_I_customize_it%3F>`_) the installation will set up the following defaults::
|
||||||
|
|
||||||
kolibri_facility: Kolibri-in-a-Box
|
kolibri_facility: Kolibri-in-a-Box
|
||||||
kolibri_language: en # See KOLIBRI_SUPPORTED_LANGUAGES at the bottom of https://github.com/learningequality/kolibri/blob/develop/kolibri/utils/i18n.py
|
kolibri_language: en # See KOLIBRI_SUPPORTED_LANGUAGES at the bottom of https://github.com/learningequality/kolibri/blob/develop/kolibri/utils/i18n.py
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,21 @@
|
||||||
|
|
||||||
# kolibri_language: en # See KOLIBRI_SUPPORTED_LANGUAGES at the bottom of https://github.com/learningequality/kolibri/blob/develop/kolibri/utils/i18n.py
|
# kolibri_language: en # See KOLIBRI_SUPPORTED_LANGUAGES at the bottom of https://github.com/learningequality/kolibri/blob/develop/kolibri/utils/i18n.py
|
||||||
|
|
||||||
|
# Kolibri folder to store its data and configuration files.
|
||||||
|
# kolibri_home: "{{ content_base }}/kolibri" # /library/kolibri
|
||||||
|
|
||||||
|
# kolibri_user: kolibri # Whereas a vanilla install of Kolibri auto-identifies
|
||||||
|
# and saves a 'desktop-like' user like {iiab-admin, pi} to /etc/kolibri/username
|
||||||
|
# (generally the user with lowest UID >= 1000) to allow access to USB devices:
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/install/ubuntu-debian.html#changing-the-owner-of-kolibri-system-service
|
||||||
|
# https://github.com/learningequality/kolibri-installer-debian/issues/115
|
||||||
|
|
||||||
# kolibri_http_port: 8009
|
# kolibri_http_port: 8009
|
||||||
|
|
||||||
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
||||||
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
||||||
|
|
||||||
|
|
||||||
# 2019-09-27: Pinning to a particular version is unfortunately NOT supported
|
# 2019-09-27: Pinning to a particular version is unfortunately NOT supported
|
||||||
# with our new apt approach (.deb installer) at this time.
|
# with our new apt approach (.deb installer) at this time.
|
||||||
# 2019-06-21: Uncomment this pinning line if you want a particular version of
|
# 2019-06-21: Uncomment this pinning line if you want a particular version of
|
||||||
|
|
@ -16,8 +26,12 @@
|
||||||
# https://github.com/iiab/iiab/issues/1675
|
# https://github.com/iiab/iiab/issues/1675
|
||||||
# https://github.com/learningequality/kolibri/issues/5664
|
# https://github.com/learningequality/kolibri/issues/5664
|
||||||
|
|
||||||
# 2022-07-30: UNCOMMENT THE FOLLOWING LINE TO TEST A PARTICULAR .deb INSTALL
|
# 2024-04-08: Kolibri 0.16.1+ restores install via apt
|
||||||
|
# https://github.com/learningequality/kolibri/issues/11892#issuecomment-2043073998
|
||||||
|
# 2022-07-30: UNCOMMENT ONE OF THE FOLLOWING LINES TO TEST A PARTICULAR .deb INSTALL
|
||||||
# kolibri_deb_url: https://learningequality.org/r/kolibri-deb-latest
|
# kolibri_deb_url: https://learningequality.org/r/kolibri-deb-latest
|
||||||
|
# 2024-02-17: https://github.com/learningequality/kolibri/issues/11892
|
||||||
|
# kolibri_deb_url: https://learningequality.org/r/kolibri-deb-next
|
||||||
# 2019-11-21 issue #2045 - above URL had redirected to this broken Kolibri 0.12.9 release:
|
# 2019-11-21 issue #2045 - above URL had redirected to this broken Kolibri 0.12.9 release:
|
||||||
# https://storage.googleapis.com/le-releases/downloads/kolibri/v0.12.9/kolibri_0.12.9-0ubuntu1_all.deb
|
# https://storage.googleapis.com/le-releases/downloads/kolibri/v0.12.9/kolibri_0.12.9-0ubuntu1_all.deb
|
||||||
#
|
#
|
||||||
|
|
@ -30,19 +44,11 @@
|
||||||
# Corresponding to:
|
# Corresponding to:
|
||||||
# https://launchpad.net/~learningequality/+archive/ubuntu/kolibri
|
# https://launchpad.net/~learningequality/+archive/ubuntu/kolibri
|
||||||
|
|
||||||
# Kolibri folder to store its data and configuration files.
|
|
||||||
kolibri_home: "{{ content_base }}/kolibri" # /library/kolibri
|
|
||||||
|
|
||||||
kolibri_url_without_slash: /kolibri
|
kolibri_url_without_slash: /kolibri
|
||||||
kolibri_url: "{{ kolibri_url_without_slash }}/" # /kolibri/
|
kolibri_url: "{{ kolibri_url_without_slash }}/" # /kolibri/
|
||||||
|
|
||||||
kolibri_exec_path: /usr/bin/kolibri
|
kolibri_exec_path: /usr/bin/kolibri
|
||||||
|
|
||||||
kolibri_user: kolibri # Whereas a vanilla install of Kolibri auto-identifies
|
|
||||||
# and saves a 'desktop' user like {iiab-admin, pi} to /etc/kolibri/username,
|
|
||||||
# towards guaranteeing access to USB devices, per:
|
|
||||||
# https://kolibri.readthedocs.io/en/latest/install.html#changing-the-owner-of-kolibri-system-service
|
|
||||||
|
|
||||||
# To populate /library/kolibri with essential/minimum files and dirs. This
|
# To populate /library/kolibri with essential/minimum files and dirs. This
|
||||||
# provisions Kolibri with facility name, admin acnt / password, preset type,
|
# provisions Kolibri with facility name, admin acnt / password, preset type,
|
||||||
# and language. You can set this to 'False' when reinstalling Kolibri:
|
# and language. You can set this to 'False' when reinstalling Kolibri:
|
||||||
|
|
|
||||||
|
|
@ -4,16 +4,40 @@
|
||||||
# https://github.com/learningequality/pi-gen/blob/master/stage2/04-hostapd/offline.yml
|
# https://github.com/learningequality/pi-gen/blob/master/stage2/04-hostapd/offline.yml
|
||||||
# https://github.com/learningequality/pi-gen/blob/master/stage2/04-hostapd/online.yml
|
# https://github.com/learningequality/pi-gen/blob/master/stage2/04-hostapd/online.yml
|
||||||
|
|
||||||
|
# Install Kolibri » Debian/Ubuntu
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/install/ubuntu-debian.html
|
||||||
|
|
||||||
|
# Advanced management
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/manage/advanced.html
|
||||||
|
|
||||||
|
# Working with Kolibri from the command line
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/manage/command_line.html
|
||||||
|
|
||||||
|
# Customize Kolibri settings with the [ /library/kolibri/options.ini ] file
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/manage/options_ini.html
|
||||||
|
|
||||||
|
# Test Kolibri server performance
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/manage/performance.html
|
||||||
|
|
||||||
|
# Provisioning many servers
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/install/provision.html
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: Create Linux user {{ kolibri_user }} and add it to groups {{ apache_user }}, disk
|
- name: Create Linux user {{ kolibri_user }} and add it to groups {{ apache_user }}, disk
|
||||||
user:
|
user:
|
||||||
name: "{{ kolibri_user }}"
|
name: "{{ kolibri_user }}"
|
||||||
groups:
|
groups: "{{ apache_user }}" # 2023-03-29: Not really necessary (Kolibri is demonstrated to work without group 'www-data'). But it likely doesn't hurt.
|
||||||
- "{{ apache_user }}"
|
#- disk # 2023-03-29: Tested to be unnec with USB sticks (with 64-bit RasPiOS). FWIW group 'disk' is "Mostly equivalent to root access" according to https://wiki.debian.org/SystemGroups
|
||||||
- disk
|
|
||||||
state: present
|
state: present
|
||||||
shell: /bin/false
|
shell: /bin/false
|
||||||
system: yes
|
system: yes
|
||||||
create_home: no
|
create_home: no
|
||||||
|
home: "{{ kolibri_home }}"
|
||||||
|
|
||||||
- name: Create directory {{ kolibri_home }} for Kolibri content, configuration, sqlite3 databases ({{ kolibri_user }}:{{ apache_user }}, by default 0755)
|
- name: Create directory {{ kolibri_home }} for Kolibri content, configuration, sqlite3 databases ({{ kolibri_user }}:{{ apache_user }}, by default 0755)
|
||||||
file:
|
file:
|
||||||
|
|
@ -38,83 +62,98 @@
|
||||||
dest: /etc/kolibri/daemon.conf
|
dest: /etc/kolibri/daemon.conf
|
||||||
|
|
||||||
|
|
||||||
- name: apt install latest Kolibri .deb from {{ kolibri_deb_url }} (populates {{ kolibri_home }}, migrates database) # i.e. /library/kolibri
|
# https://kolibri.readthedocs.io/en/latest/install/ubuntu-debian.html claims:
|
||||||
|
# "When you use the PPA installation method, upgrades to newer versions
|
||||||
|
# will be automatic, provided there is internet access available."
|
||||||
|
#
|
||||||
|
# IN REALITY: apt upgrading Kolibri is messy, as up-to-5 debconf screens prompt
|
||||||
|
# PPL WHO DON'T KNOW with the wrong default username, instead of 'kolibri' :/
|
||||||
|
# https://github.com/learningequality/kolibri-installer-debian/pull/117
|
||||||
|
|
||||||
|
# 2022-08-31: keyring /etc/apt/trusted.gpg DEPRECATED as detailed on #3343
|
||||||
|
- name: Download Kolibri's apt key to /usr/share/keyrings/learningequality-kolibri.gpg
|
||||||
|
shell: |
|
||||||
|
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys DC5BAA93F9E4AE4F0411F97C74F88ADB3194DD81
|
||||||
|
gpg --yes --output /usr/share/keyrings/learningequality-kolibri.gpg --export DC5BAA93F9E4AE4F0411F97C74F88ADB3194DD81
|
||||||
|
|
||||||
|
# 2024-06-25: Strongly consider PPA "kolibri-proposed" in future...
|
||||||
|
# https://github.com/learningequality/kolibri/issues/11892
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/install/ubuntu-debian.html
|
||||||
|
- name: Add signed Kolibri PPA 'jammy'
|
||||||
|
apt_repository:
|
||||||
|
repo: "deb [signed-by=/usr/share/keyrings/learningequality-kolibri.gpg] http://ppa.launchpad.net/learningequality/kolibri/ubuntu jammy main"
|
||||||
|
# when: is_ubuntu and os_ver is version('ubuntu-2204', '>=') or is_linuxmint_21 or is_debian_12
|
||||||
|
# #when: is_ubuntu_2204 or is_ubuntu_2210 or is_debian_12 # MINT 21 COVERED BY is_ubuntu_2204
|
||||||
|
|
||||||
|
# - name: Add signed Kolibri PPA 'focal' (if other/older OS's)
|
||||||
|
# apt_repository:
|
||||||
|
# repo: "deb [signed-by=/usr/share/keyrings/learningequality-kolibri.gpg] http://ppa.launchpad.net/learningequality/kolibri/ubuntu focal main"
|
||||||
|
# when: not (is_ubuntu and os_ver is version('ubuntu-2204', '>=') or is_linuxmint_21 or is_debian_12)
|
||||||
|
# #when: not (is_ubuntu_2204 or is_ubuntu_2210 or is_debian_12)
|
||||||
|
|
||||||
|
# - name: Add Kolibri PPA repo 'ppa:learningequality/kolibri' (if is_ubuntu and not is_linuxmint)
|
||||||
|
# apt_repository:
|
||||||
|
# repo: ppa:learningequality/kolibri
|
||||||
|
# when: is_ubuntu and not is_linuxmint
|
||||||
|
|
||||||
|
# 2022-08-19: 'add-apt-repository ppa:learningequality/kolibri' works at CLI on
|
||||||
|
# Mint 21 (creating /etc/apt/sources.list.d/learningequality-kolibri-jammy.list)
|
||||||
|
# BUT equivalent Ansible command (STANZA ABOVE) failed with error...
|
||||||
|
# "Failed to update apt cache: E:The repository 'http://ppa.launchpad.net/learningequality/kolibri/ubuntu vanessa Release' does not have a Release file."
|
||||||
|
# ...so for now we special case Mint, similar to Debian (BOTH STANZAS BELOW!)
|
||||||
|
|
||||||
|
# 2022-08-19: https://github.com/learningequality/kolibri/issues/9647 also asks
|
||||||
|
# about the warning below, arising no matter if codename is 'focal' or 'jammy'
|
||||||
|
# with Kolibri 0.15.6 on Mint 21 -- if you run '/usr/bin/kolibri --version':
|
||||||
|
#
|
||||||
|
# /usr/lib/python3/dist-packages/pkg_resources/__init__.py:116: PkgResourcesDeprecationWarning: 0.1.43ubuntu1 is an invalid version and will not be supported in a future release
|
||||||
|
# warnings.warn(
|
||||||
|
|
||||||
|
# 2022-08-19: 'apt-key list' & 'apt-key del 3194 DD81' are useful if you also
|
||||||
|
# want to clear out Kolibri's key from the DEPRECATED /etc/apt/trusted.gpg
|
||||||
|
|
||||||
|
# - name: Add Kolibri PPA repo 'ppa:learningequality/kolibri' with codename 'jammy' (if is_linuxmint_21)
|
||||||
|
# apt_repository:
|
||||||
|
# repo: ppa:learningequality/kolibri
|
||||||
|
# codename: jammy # CONSOLIDATE THIS SPECIAL CASE STANZA WITH UBUNTU ABOVE IN FUTURE?
|
||||||
|
# when: is_linuxmint_21
|
||||||
|
|
||||||
|
# - name: Add Kolibri PPA repo 'ppa:learningequality/kolibri' with codename 'focal' (if is_debian or is_linuxmint_20)
|
||||||
|
# apt_repository:
|
||||||
|
# repo: ppa:learningequality/kolibri
|
||||||
|
# codename: focal # UPDATE THIS TO 'jammy' AFTER "RasPiOS Bookworm" (based on Debian 12) IS RELEASED! (ETA Q3 2023)
|
||||||
|
# when: is_debian or is_linuxmint_20
|
||||||
|
|
||||||
|
|
||||||
|
# 2024-08-07: Hack no longer needed! As Kolibri 0.17.0 now installs via "kolibri" PPA (https://launchpad.net/~learningequality/+archive/ubuntu/kolibri).
|
||||||
|
# Hopefully "kolibri-proposed" PPA will install 0.18 pre-releases soon, on Python 3.13 too! https://github.com/learningequality/kolibri/issues/11892
|
||||||
|
|
||||||
|
# - name: '2024-06-25 TEMPORARY HACK: Hard code kolibri_deb_url to Kolibri 0.17.x (pre-release or final release) if Python >= 3.12 -- kolibri-proposed PPA should do this automatically in future!'
|
||||||
|
# set_fact:
|
||||||
|
# kolibri_deb_url: https://github.com/learningequality/kolibri/releases/download/v0.17.0/kolibri_0.17.0-0ubuntu1_all.deb
|
||||||
|
# when: python_version is version('3.12', '>=') # For Ubuntu 24.04, Mint 22, pre-releases of Ubuntu 24.10, and Debian 13 (even if/when "Trixie" changes from Python 3.12 to 3.13!) Regarding PPA kolibri-proposed not quite being ready yet, see: learningequality/kolibri#11316 -> learningequality/kolibri#11892
|
||||||
|
|
||||||
|
- name: apt install kolibri (using apt source specified above, if kolibri_deb_url ISN'T defined)
|
||||||
apt:
|
apt:
|
||||||
deb: "{{ kolibri_deb_url }}" # https://learningequality.org/r/kolibri-deb-latest
|
name: kolibri
|
||||||
environment:
|
|
||||||
KOLIBRI_HOME: "{{ kolibri_home }}" # These don't do a thing for now but
|
|
||||||
KOLIBRI_USER: "{{ kolibri_user }}" # both can't hurt & Might Help Later
|
|
||||||
when: kolibri_deb_url is defined
|
|
||||||
|
|
||||||
- block: # ELSE...
|
|
||||||
|
|
||||||
# https://kolibri.readthedocs.io/en/latest/install/ubuntu-debian.html says:
|
|
||||||
# "When you use the PPA installation method, upgrades to newer versions
|
|
||||||
# will be automatic, provided there is internet access available."
|
|
||||||
#
|
|
||||||
# IN REALITY: apt upgrading Kolibri is risky, as 3 pink/blue screens prompt
|
|
||||||
# PPL WHO DON'T KNOW TO TYPE IN things like Linux username 'kolibri' :/ #3356
|
|
||||||
|
|
||||||
# 2022-08-31: keyring /etc/apt/trusted.gpg DEPRECATED as detailed on #3343
|
|
||||||
- name: Download Kolibri's apt key to /usr/share/keyrings/learningequality-kolibri.gpg
|
|
||||||
shell: |
|
|
||||||
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys DC5BAA93F9E4AE4F0411F97C74F88ADB3194DD81
|
|
||||||
gpg --yes --output /usr/share/keyrings/learningequality-kolibri.gpg --export DC5BAA93F9E4AE4F0411F97C74F88ADB3194DD81
|
|
||||||
|
|
||||||
- name: Add signed Kolibri PPA 'jammy' (if Ubuntu 22.04+ or Mint 21 or Debian 12)
|
|
||||||
apt_repository:
|
|
||||||
repo: "deb [signed-by=/usr/share/keyrings/learningequality-kolibri.gpg] http://ppa.launchpad.net/learningequality/kolibri/ubuntu jammy main"
|
|
||||||
when: is_ubuntu and os_ver is version('ubuntu-2204', '>=') or is_linuxmint_21 or is_debian_12
|
|
||||||
#when: is_ubuntu_2204 or is_ubuntu_2210 or is_debian_12 # MINT 21 COVERED BY is_ubuntu_2204
|
|
||||||
|
|
||||||
- name: Add signed Kolibri PPA 'focal' (if other/older OS's)
|
|
||||||
apt_repository:
|
|
||||||
repo: "deb [signed-by=/usr/share/keyrings/learningequality-kolibri.gpg] http://ppa.launchpad.net/learningequality/kolibri/ubuntu focal main"
|
|
||||||
when: not (is_ubuntu and os_ver is version('ubuntu-2204', '>=') or is_linuxmint_21 or is_debian_12)
|
|
||||||
#when: not (is_ubuntu_2204 or is_ubuntu_2210 or is_debian_12)
|
|
||||||
|
|
||||||
# - name: Add Kolibri PPA repo 'ppa:learningequality/kolibri' (if is_ubuntu and not is_linuxmint)
|
|
||||||
# apt_repository:
|
|
||||||
# repo: ppa:learningequality/kolibri
|
|
||||||
# when: is_ubuntu and not is_linuxmint
|
|
||||||
|
|
||||||
# 2022-08-19: 'add-apt-repository ppa:learningequality/kolibri' works at CLI on
|
|
||||||
# Mint 21 (creating /etc/apt/sources.list.d/learningequality-kolibri-jammy.list)
|
|
||||||
# BUT equivalent Ansible command (STANZA ABOVE) failed with error...
|
|
||||||
# "Failed to update apt cache: E:The repository 'http://ppa.launchpad.net/learningequality/kolibri/ubuntu vanessa Release' does not have a Release file."
|
|
||||||
# ...so for now we special case Mint, similar to Debian (BOTH STANZAS BELOW!)
|
|
||||||
|
|
||||||
# 2022-08-19: https://github.com/learningequality/kolibri/issues/9647 also asks
|
|
||||||
# about the warning below, arising no matter if codename is 'focal' or 'jammy'
|
|
||||||
# with Kolibri 0.15.6 on Mint 21 -- if you run '/usr/bin/kolibri --version':
|
|
||||||
#
|
|
||||||
# /usr/lib/python3/dist-packages/pkg_resources/__init__.py:116: PkgResourcesDeprecationWarning: 0.1.43ubuntu1 is an invalid version and will not be supported in a future release
|
|
||||||
# warnings.warn(
|
|
||||||
|
|
||||||
# 2022-08-19: 'apt-key list' & 'apt-key del 3194 DD81' are useful if you also
|
|
||||||
# want to clear out Kolibri's key from the DEPRECATED /etc/apt/trusted.gpg
|
|
||||||
|
|
||||||
# - name: Add Kolibri PPA repo 'ppa:learningequality/kolibri' with codename 'jammy' (if is_linuxmint_21)
|
|
||||||
# apt_repository:
|
|
||||||
# repo: ppa:learningequality/kolibri
|
|
||||||
# codename: jammy # CONSOLIDATE THIS SPECIAL CASE STANZA WITH UBUNTU ABOVE IN FUTURE?
|
|
||||||
# when: is_linuxmint_21
|
|
||||||
|
|
||||||
# - name: Add Kolibri PPA repo 'ppa:learningequality/kolibri' with codename 'focal' (if is_debian or is_linuxmint_20)
|
|
||||||
# apt_repository:
|
|
||||||
# repo: ppa:learningequality/kolibri
|
|
||||||
# codename: focal # UPDATE THIS TO 'jammy' AFTER "RasPiOS Bookworm" (based on Debian 12) IS RELEASED! (ETA Q3 2023)
|
|
||||||
# when: is_debian or is_linuxmint_20
|
|
||||||
|
|
||||||
- name: apt install kolibri (populates {{ kolibri_home }}, migrates database) # i.e. /library/kolibri
|
|
||||||
apt:
|
|
||||||
name: kolibri
|
|
||||||
environment:
|
|
||||||
KOLIBRI_HOME: "{{ kolibri_home }}" # These don't do a thing for now but
|
|
||||||
KOLIBRI_USER: "{{ kolibri_user }}" # both can't hurt & Might Help Later
|
|
||||||
|
|
||||||
when: kolibri_deb_url is undefined
|
when: kolibri_deb_url is undefined
|
||||||
|
# environment:
|
||||||
|
# KOLIBRI_HOME: "{{ kolibri_home }}" # 2023-03-27: These don't do a thing
|
||||||
|
# KOLIBRI_USER: "{{ kolibri_user }}" # for now.
|
||||||
|
|
||||||
|
- name: apt install {{ kolibri_deb_url }} (if kolibri_deb_url IS defined)
|
||||||
|
apt:
|
||||||
|
deb: "{{ kolibri_deb_url }}" # e.g. https://learningequality.org/r/kolibri-deb-latest
|
||||||
|
when: kolibri_deb_url is defined
|
||||||
|
# environment:
|
||||||
|
# KOLIBRI_HOME: "{{ kolibri_home }}" # 2023-03-27: These don't do a thing
|
||||||
|
# KOLIBRI_USER: "{{ kolibri_user }}" # for now.
|
||||||
|
|
||||||
|
|
||||||
|
- name: Run 'rm -rf /root/.kolibri' to remove "unavoidable" pollution created above
|
||||||
|
file:
|
||||||
|
state: absent
|
||||||
|
path: /root/.kolibri
|
||||||
|
|
||||||
- name: 'Install from template: /etc/systemd/system/kolibri.service'
|
- name: 'Install from template: /etc/systemd/system/kolibri.service'
|
||||||
template:
|
template:
|
||||||
|
|
@ -123,8 +162,8 @@
|
||||||
|
|
||||||
- name: Stop 'kolibri' systemd service, for Kolibri provisioning (after daemon_reload)
|
- name: Stop 'kolibri' systemd service, for Kolibri provisioning (after daemon_reload)
|
||||||
systemd:
|
systemd:
|
||||||
name: kolibri
|
|
||||||
daemon_reload: yes
|
daemon_reload: yes
|
||||||
|
name: kolibri
|
||||||
state: stopped
|
state: stopped
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -145,9 +184,13 @@
|
||||||
# become_user: "{{ kolibri_user }}"
|
# become_user: "{{ kolibri_user }}"
|
||||||
# when: kolibri_provision
|
# when: kolibri_provision
|
||||||
|
|
||||||
|
# Run "kolibri manage help provisiondevice" to see CLI options, e.g.:
|
||||||
|
# --facility_settings FACILITY_SETTINGS
|
||||||
|
# JSON file containing facility settings
|
||||||
|
# --device_settings DEVICE_SETTINGS
|
||||||
|
# JSON file containing device settings
|
||||||
- name: 'Provision Kolibri, while setting: facility name, admin acnt / password, preset type, and language'
|
- name: 'Provision Kolibri, while setting: facility name, admin acnt / password, preset type, and language'
|
||||||
shell: >
|
shell: >
|
||||||
export KOLIBRI_HOME="{{ kolibri_home }}" &&
|
|
||||||
"{{ kolibri_exec_path }}" manage provisiondevice --facility "{{ kolibri_facility }}"
|
"{{ kolibri_exec_path }}" manage provisiondevice --facility "{{ kolibri_facility }}"
|
||||||
--superusername "{{ kolibri_admin_user }}" --superuserpassword "{{ kolibri_admin_password }}"
|
--superusername "{{ kolibri_admin_user }}" --superuserpassword "{{ kolibri_admin_password }}"
|
||||||
--preset "{{ kolibri_preset }}" --language_id "{{ kolibri_language }}"
|
--preset "{{ kolibri_preset }}" --language_id "{{ kolibri_language }}"
|
||||||
|
|
@ -156,15 +199,22 @@
|
||||||
become: yes
|
become: yes
|
||||||
become_user: "{{ kolibri_user }}"
|
become_user: "{{ kolibri_user }}"
|
||||||
when: kolibri_provision
|
when: kolibri_provision
|
||||||
|
environment:
|
||||||
|
KOLIBRI_HOME: "{{ kolibri_home }}" # 2023-03-27: Required!
|
||||||
|
#KOLIBRI_USER: "{{ kolibri_user }}" # 2023-03-27: Not nec due to /etc/kolibri/username ?
|
||||||
|
|
||||||
- name: chown -R {{ kolibri_user }}:{{ apache_user }} {{ kolibri_home }} for good measure?
|
|
||||||
file:
|
|
||||||
path: "{{ kolibri_home }}" # /library/kolibri
|
|
||||||
owner: "{{ kolibri_user }}" # kolibri
|
|
||||||
group: "{{ apache_user }}" # www-data (on Debian/Ubuntu/Raspbian)
|
|
||||||
recurse: yes
|
|
||||||
when: kolibri_provision
|
|
||||||
|
|
||||||
|
# 2023-03-25: Likely overkill (let's strongly consider removing this stanza?)
|
||||||
|
# Certainly, setting owner (recursively) is advised when moving /library/kolibri :
|
||||||
|
# https://kolibri.readthedocs.io/en/latest/install/ubuntu-debian.html#changing-the-owner-of-kolibri-system-service
|
||||||
|
# 2023-03-27: Commented out on a provisional basis (Spring Cleaning)
|
||||||
|
# - name: chown -R {{ kolibri_user }}:{{ apache_user }} {{ kolibri_home }} for good measure?
|
||||||
|
# file:
|
||||||
|
# path: "{{ kolibri_home }}" # /library/kolibri
|
||||||
|
# owner: "{{ kolibri_user }}" # kolibri
|
||||||
|
# group: "{{ apache_user }}" # www-data (on Debian/Ubuntu/Raspbian)
|
||||||
|
# recurse: yes
|
||||||
|
# when: kolibri_provision
|
||||||
|
|
||||||
# 2019-10-07: Moved to roles/httpd/tasks/main.yml
|
# 2019-10-07: Moved to roles/httpd/tasks/main.yml
|
||||||
# 2019-09-29: roles/kiwix/tasks/kiwix_install.yml installs 4 Apache modules
|
# 2019-09-29: roles/kiwix/tasks/kiwix_install.yml installs 4 Apache modules
|
||||||
|
|
@ -176,6 +226,17 @@
|
||||||
|
|
||||||
# RECORD Kolibri AS INSTALLED
|
# RECORD Kolibri AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'kolibri_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: kolibri
|
||||||
|
option: kolibri_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'kolibri_installed: True'"
|
- name: "Set 'kolibri_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
kolibri_installed: True
|
kolibri_installed: True
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,16 @@
|
||||||
# https://github.com/iiab/iiab/blob/master/roles/www_base/templates/iiab-refresh-wiki-docs.sh#L51-L52
|
# https://github.com/iiab/iiab/blob/master/roles/www_base/templates/iiab-refresh-wiki-docs.sh#L51-L52
|
||||||
|
|
||||||
|
|
||||||
- name: "Install 8 packages for Lokole: python3, python3-pip, python3-venv, python3-dev, python3-bcrypt, libffi-dev, libssl-dev, libopenjp2-7"
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
|
- name: Install 12 packages for Lokole
|
||||||
apt:
|
apt:
|
||||||
name:
|
name:
|
||||||
- python3
|
#- python3 # 2022-12-21: IIAB pre-req, see scripts/local_facts.fact
|
||||||
- python3-pip
|
#- python3-pip
|
||||||
- python3-venv
|
|
||||||
- python3-dev
|
- python3-dev
|
||||||
- python3-bcrypt # 2019-10-14: Should work across modern Linux OS's
|
- python3-bcrypt # 2019-10-14: Should work across modern Linux OS's
|
||||||
#- bcrypt does not exist on Ubuntu 19.10
|
#- bcrypt does not exist on Ubuntu 19.10
|
||||||
|
|
@ -55,12 +59,19 @@
|
||||||
extra_args: --no-cache-dir # To avoid caching issues e.g. soon after new releases hit https://pypi.org/project/opwen-email-client/
|
extra_args: --no-cache-dir # To avoid caching issues e.g. soon after new releases hit https://pypi.org/project/opwen-email-client/
|
||||||
when: lokole_commit is undefined and lokole_version is undefined
|
when: lokole_commit is undefined and lokole_version is undefined
|
||||||
|
|
||||||
- name: Compile translations
|
# - name: Compile translations
|
||||||
|
# shell: |
|
||||||
|
# python_version=$(python3 -c 'from sys import version_info; print("%s.%s" % (version_info.major, version_info.minor));';)
|
||||||
|
# {{ lokole_venv }}/bin/pybabel compile -d {{ item }}/translations
|
||||||
|
# with_items:
|
||||||
|
# - "{{ lokole_venv }}/lib/python${python_version}/site-packages/opwen_email_client/webapp"
|
||||||
|
|
||||||
|
# 2022-12-21: python_version determined by scripts/local_facts.fact -- to match templates/lokole-nginx.conf.j2
|
||||||
|
- name: Compile translations for Python {{ python_version }}
|
||||||
shell: |
|
shell: |
|
||||||
python_version=$(python3 -c 'from sys import version_info; print("%s.%s" % (version_info.major, version_info.minor));';)
|
|
||||||
{{ lokole_venv }}/bin/pybabel compile -d {{ item }}/translations
|
{{ lokole_venv }}/bin/pybabel compile -d {{ item }}/translations
|
||||||
with_items:
|
with_items:
|
||||||
- "{{ lokole_venv }}/lib/python${python_version}/site-packages/opwen_email_client/webapp"
|
- "{{ lokole_venv }}/lib/python{{ python_version }}/site-packages/opwen_email_client/webapp"
|
||||||
|
|
||||||
- name: Create system {{ lokole_user }} user
|
- name: Create system {{ lokole_user }} user
|
||||||
ansible.builtin.user:
|
ansible.builtin.user:
|
||||||
|
|
@ -127,6 +138,17 @@
|
||||||
|
|
||||||
# RECORD Lokole AS INSTALLED
|
# RECORD Lokole AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'lokole_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: lokole
|
||||||
|
option: lokole_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'lokole_installed: True'"
|
- name: "Set 'lokole_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
lokole_installed: True
|
lokole_installed: True
|
||||||
|
|
|
||||||
|
|
@ -3,11 +3,11 @@
|
||||||
name: supervisor
|
name: supervisor
|
||||||
state: started
|
state: started
|
||||||
|
|
||||||
|
# 2022-12-21: python_version determined by scripts/local_facts.fact -- to match templates/lokole-nginx.conf.j2
|
||||||
- name: Create Lokole admin user with password, for http://box{{ lokole_url }} # http://box/lokole
|
- name: Create Lokole admin user with password, for http://box{{ lokole_url }} # http://box/lokole
|
||||||
shell: |
|
shell: |
|
||||||
while read envvar; do export "$envvar"; done < {{ lokole_run_dir }}/settings.env
|
while read envvar; do export "$envvar"; done < {{ lokole_run_dir }}/settings.env
|
||||||
python_version=$(python3 -c 'from sys import version_info; print("%s.%s" % (version_info.major, version_info.minor));';)
|
cd {{ lokole_venv }}/lib/python{{ python_version }}/site-packages/
|
||||||
cd {{ lokole_venv }}/lib/python${python_version}/site-packages/
|
|
||||||
export FLASK_APP="opwen_email_client.webapp:app"
|
export FLASK_APP="opwen_email_client.webapp:app"
|
||||||
{{ lokole_venv }}/bin/flask manage createadmin --name='{{ lokole_admin_user }}' --password='{{ lokole_admin_password }}'
|
{{ lokole_venv }}/bin/flask manage createadmin --name='{{ lokole_admin_user }}' --password='{{ lokole_admin_password }}'
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
location = {{ lokole_url }}/favicon.ico {
|
location = {{ lokole_url }}/favicon.ico {
|
||||||
alias {{ lokole_venv }}/lib/python{{ python_ver }}/site-packages/opwen_email_client/webapp/static/favicon.ico;
|
alias {{ lokole_venv }}/lib/python{{ python_version }}/site-packages/opwen_email_client/webapp/static/favicon.ico;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ ^{{ lokole_url }}/static/(.*)$ {
|
location ~ ^{{ lokole_url }}/static/(.*)$ {
|
||||||
alias {{ lokole_venv }}/lib/python{{ python_ver }}/site-packages/opwen_email_client/webapp/static/$1;
|
alias {{ lokole_venv }}/lib/python{{ python_version }}/site-packages/opwen_email_client/webapp/static/$1;
|
||||||
}
|
}
|
||||||
|
|
||||||
location {{ lokole_url }}/ {
|
location {{ lokole_url }}/ {
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ https://matomo.org/[Matomo] is a web analytics alternative to Google Analytics,
|
||||||
|
|
||||||
== Install it
|
== Install it
|
||||||
|
|
||||||
Prior to installing Matomo with IIAB, the default URL (http://box.lan/matomo) can be customized in https://wiki.iiab.io/go/FAQ#What_is_local_vars.yml_and_how_do_I_customize_it.3F[/etc/iiab/local_vars.yml]
|
Prior to installing Matomo with IIAB, the default URL (http://box.lan/matomo) can be customized in https://wiki.iiab.io/go/FAQ#What_is_local_vars.yml_and_how_do_I_customize_it%3F[/etc/iiab/local_vars.yml]
|
||||||
|
|
||||||
One way to do that is by changing these 2 lines:
|
One way to do that is by changing these 2 lines:
|
||||||
|
|
||||||
|
|
@ -41,29 +41,25 @@ Log in to your IIAB's full Matomo URL, e.g. http://box.lan/matomo, as arranged a
|
||||||
|
|
||||||
Take a look at Matomo's official guides to further set this up: https://matomo.org/guides/
|
Take a look at Matomo's official guides to further set this up: https://matomo.org/guides/
|
||||||
|
|
||||||
WARNING: If your IIAB URL is *not* http://box.lan, you may run into a big orange warning from Matomo that it has been configured to run from a different address. Here are the steps to fix this problem.
|
|
||||||
|
|
||||||
1. Copy the IP address listed in the box below "How do I fix this problem and how do I log in again?" For example, I see `trusted_hosts[] = "192.168.64.10"`, so I copy `"192.168.64.10"`.
|
|
||||||
2. Run `sudo nano /library/www/matomo/config/config.ini.php` to edit Matomo's config file.
|
|
||||||
3. Paste or type the IP address from Step 1 to replace `"box.lan"` in the `trusted_hosts` line, which should be about line 13. When I'm done, my line 13 says `trusted_hosts[] = "192.168.64.10"` instead of `trusted_hosts[] = "box.lan"`.
|
|
||||||
4. Refresh the Matomo homepage and the warning should be gone.
|
|
||||||
5. Optionally, see the https://forum.matomo.org/t/trusted-hostname/11963[advanced tips] in https://forum.matomo.org/[Matomo's Forum].
|
|
||||||
|
|
||||||
WARNING: Matomo won't show any traffic statistics until after 1 day or reboot (which are the events that trigger the log scraper!)
|
WARNING: Matomo won't show any traffic statistics until after 1 day or reboot (which are the events that trigger the log scraper!)
|
||||||
|
|
||||||
=== Getting Started
|
=== Getting Started
|
||||||
|
|
||||||
Matomo is developed with commercial websites in mind. After navigating to http://box.lan/matomo and logging in with the user name and password you set above, you will see a variety of references to revenue, marketplaces, and other terms focused on commercialization and advertising. Don't worry about that.
|
Matomo is developed with commercial websites in mind. After navigating to http://box.lan/matomo and logging in with the username and password you set above, you will see a variety of references to revenue, marketplaces, and other terms focused on commercialization and advertising. Don't worry about that.
|
||||||
|
|
||||||
The heart of Matomo's value for you is in the navigation bar on the left side of the page. Click on *Visitors* and then below *Visitors*, *Overview*, to see how many different users are visiting your site. The top of the page will show a graph of how many visits occur on each day (although your device can't keep track of time when it is off and has no connection to the Internet, so this graph might not be perfectly accurate). Below the graph, you'll see some overall statistics, like how many unique visitors you've had. Matomo thinks of visitors in terms of devices, so it won't know if two people are connecting to your Internet-in-a-Box using the same phone. There are several other interesting statistics here, like the average visit duration, or average time your visitors are spending using Internet-in-a-Box.
|
The heart of Matomo's value for you is in the navigation bar on the left side of the page. Click on *Visitors* and then below *Visitors*, *Overview*, to see how many different users are visiting your site. The top of the page will show a graph of how many visits occur on each day (although your device may not keep track of time when it is off and has no connection to the Internet, so this graph might not be perfectly accurate). Below the graph, you'll see some overall statistics, like how many unique visitors you've had. Matomo thinks of visitors in terms of devices, so it won't know if two people are connecting to your Internet-in-a-Box using the same phone. There are several other interesting statistics here, like the average visit duration, or average time your visitors are spending using Internet-in-a-Box.
|
||||||
|
|
||||||
Below the *Visitors* button is a second button, *Behavior*. Click on the *Pages* button after clicking *Behavior* and you can see the various pages that have been visited by your users. You may not see activity from the most recent day, since Matomo only updates its records once per day.
|
Below the *Visitors* button is a second button, *Behavior*. Click on the *Pages* button after clicking *Behavior* and you can see the various pages that have been visited by your users. You may not see activity from the most recent day, since Matomo only updates its records once per day.
|
||||||
|
|
||||||
=== IIAB Tips, Tricks, and Gotchas
|
=== IIAB Tips, Tricks, and Gotchas
|
||||||
|
|
||||||
1. If your Internet-in-a-Box setup is without power and Internet access, it will not be able to keep time correctly. This is okay! But it means that the time-of-visit information in Matomo will not be correct.
|
1. If your Internet-in-a-Box setup is without power and Internet access, it may not be able to keep time correctly. This is okay! But it means that the time-of-visit information in Matomo will not be correct.
|
||||||
|
|
||||||
|
2. One thing Matomo can't track correctly is navigation within KA Lite (Khan Academy) pages. If your users are spending a lot of time here, it won't be visible in the Matomo statistics.
|
||||||
|
|
||||||
|
3. Time Zones: The Matomo installer's default behavior in "Configure Matomo to track IIAB" is to pick up the system time zone when none is supplied. If this doesn't work, you can set the time zone to whatever you prefer from the Matomo home page. In testing, Matomo picked up the system time zone on a regular Multipass Ubuntu instance. However, it was unable to do so on a VirtualBox Ubuntu instance. Thus, we provide a fallback behavior "Fallback Configure Matomo to track IIAB" that picks an arbitrary time zone. The fallback fires only when the form with an empty time zone is submitted and returns a 200 status code instead of 302, indicating that form submission failed.
|
||||||
|
|
||||||
2. One thing Matomo can't track correctly is navigation within Khan Academy pages. If your users are spending a lot of time here, it won't be visible in the Matomo statistics.
|
|
||||||
|
|
||||||
== Credits
|
== Credits
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
# The sections of code interacting with the Matomo website are modified from code found at https://git.coop/webarch/matomo/. This code is distributed under
|
# The sections of code interacting with the Matomo website are modified from code found at https://git.coop/webarch/matomo/. This code is distributed under
|
||||||
# Version 3 of the GNU General Public License. We modified this code and applied it here in April 2022. The derived sections correspond to the tasks running
|
# Version 3 of the GNU General Public License. We modified this code and applied it here in April 2022. The derived sections correspond to the tasks running
|
||||||
# from "HTTP Get Welcome" through "Finish Matomo Setup", lines 45 through 156.
|
# from "HTTP Get Welcome" through "Finish Matomo Setup", lines 63 through 199.
|
||||||
|
|
||||||
|
|
||||||
- name: "WARNING: './runrole --reinstall matomo' CAN FAIL AS OF 2022-06-15, e.g. if /library/www/matomo already exists"
|
- name: "WARNING: './runrole --reinstall matomo' CAN FAIL AS OF 2022-06-15, e.g. if /library/www/matomo already exists"
|
||||||
meta: noop
|
meta: noop
|
||||||
|
|
@ -10,6 +11,43 @@
|
||||||
# TASK [matomo : HTTP Get Welcome] ***************************************************************************************************************************************
|
# TASK [matomo : HTTP Get Welcome] ***************************************************************************************************************************************
|
||||||
# fatal: [127.0.0.1]: FAILED! => {"cache_control": "private, no-cache, no-store", "changed": false, "connection": "close", "content_type": "text/html; charset=utf-8", "date": "Wed, 15 Jun 2022 05:07:41 GMT", "elapsed": 0, "expires": "Thu, 19 Nov 1981 08:52:00 GMT", "msg": "Status code was 500 and not [200]: HTTP Error 500: Internal Server Error", "pragma": "no-cache", "redirected": false, "server": "nginx/1.18.0 (Ubuntu)", "set_cookie": "MATOMO_SESSID=psak3aem27vrdrt8t2f016600f; path=/; HttpOnly; SameSite=Lax", "status": 500, "transfer_encoding": "chunked", "url": "http://box.lan/matomo/index.php?action=welcome", "x_matomo_request_id": "fbfd2"}
|
# fatal: [127.0.0.1]: FAILED! => {"cache_control": "private, no-cache, no-store", "changed": false, "connection": "close", "content_type": "text/html; charset=utf-8", "date": "Wed, 15 Jun 2022 05:07:41 GMT", "elapsed": 0, "expires": "Thu, 19 Nov 1981 08:52:00 GMT", "msg": "Status code was 500 and not [200]: HTTP Error 500: Internal Server Error", "pragma": "no-cache", "redirected": false, "server": "nginx/1.18.0 (Ubuntu)", "set_cookie": "MATOMO_SESSID=psak3aem27vrdrt8t2f016600f; path=/; HttpOnly; SameSite=Lax", "status": 500, "transfer_encoding": "chunked", "url": "http://box.lan/matomo/index.php?action=welcome", "x_matomo_request_id": "fbfd2"}
|
||||||
|
|
||||||
|
|
||||||
|
- name: "Set 'mysql_install: True' and 'mysql_enabled: True'"
|
||||||
|
set_fact:
|
||||||
|
mysql_install: True
|
||||||
|
mysql_enabled: True
|
||||||
|
|
||||||
|
- name: MYSQL - run 'mysql' role (attempt to install & enable MySQL / MariaDB)
|
||||||
|
include_role:
|
||||||
|
name: mysql
|
||||||
|
|
||||||
|
- name: FAIL (STOP THE INSTALL) IF 'mysql_installed is undefined'
|
||||||
|
fail:
|
||||||
|
msg: "Matomo install cannot proceed, as MySQL / MariaDB is not installed."
|
||||||
|
when: mysql_installed is undefined
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
|
# https://matomo.org/faq/on-premise/matomo-requirements/
|
||||||
|
- name: Install Matomo's recommended PHP extensions
|
||||||
|
package:
|
||||||
|
name:
|
||||||
|
- php{{ php_version }}-curl
|
||||||
|
- php{{ php_version }}-gd
|
||||||
|
- php{{ php_version }}-cli
|
||||||
|
- php{{ php_version }}-mysql
|
||||||
|
- php{{ php_version }}-xml
|
||||||
|
- php{{ php_version }}-mbstring
|
||||||
|
|
||||||
|
- name: "Run roles/www_options/tasks/php-settings.yml with 'nginx_high_php_limits: False' by default"
|
||||||
|
include_tasks: roles/www_options/tasks/php-settings.yml
|
||||||
|
when: php_settings_done is undefined
|
||||||
|
|
||||||
|
|
||||||
- name: Start MariaDB
|
- name: Start MariaDB
|
||||||
#action: service name=mysql state=started
|
#action: service name=mysql state=started
|
||||||
systemd:
|
systemd:
|
||||||
|
|
@ -29,7 +67,7 @@
|
||||||
priv: "{{ matomo_db_name }}.*:ALL"
|
priv: "{{ matomo_db_name }}.*:ALL"
|
||||||
#login_unix_socket: /var/run/mysqld/mysqld.sock
|
#login_unix_socket: /var/run/mysqld/mysqld.sock
|
||||||
|
|
||||||
- name: Download and Extract Matomo (~1 min)
|
- name: Download and Extract Matomo (~3 min)
|
||||||
unarchive:
|
unarchive:
|
||||||
src: "{{ matomo_dl_url }}" # e.g. https://builds.matomo.org/matomo.tar.gz
|
src: "{{ matomo_dl_url }}" # e.g. https://builds.matomo.org/matomo.tar.gz
|
||||||
dest: "{{ matomo_path }}" # e.g. /library/www
|
dest: "{{ matomo_path }}" # e.g. /library/www
|
||||||
|
|
@ -197,9 +235,41 @@
|
||||||
user: root
|
user: root
|
||||||
cron_file: "matomo_daily"
|
cron_file: "matomo_daily"
|
||||||
|
|
||||||
|
- name: Set Permissions for token.php
|
||||||
|
copy:
|
||||||
|
content: ""
|
||||||
|
dest: "{{ matomo_path }}/matomo/tmp/cache/token.php"
|
||||||
|
group: "{{ apache_user }}"
|
||||||
|
owner: "{{ apache_user }}"
|
||||||
|
|
||||||
|
- name: Set Permissions for tracker Directory
|
||||||
|
file:
|
||||||
|
path: "{{ matomo_path }}/matomo/tmp/cache/tracker"
|
||||||
|
state: directory
|
||||||
|
owner: "{{ apache_user }}"
|
||||||
|
group: "{{ apache_user }}"
|
||||||
|
|
||||||
|
- name: Don't Check for Trusted Host
|
||||||
|
ini_file:
|
||||||
|
path: "{{ matomo_path }}/matomo/config/config.ini.php"
|
||||||
|
section: General
|
||||||
|
option: enable_trusted_host_check
|
||||||
|
value: 0
|
||||||
|
|
||||||
|
|
||||||
# RECORD Matomo AS INSTALLED
|
# RECORD Matomo AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'matomo_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: matomo
|
||||||
|
option: matomo_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'matomo_installed: True'"
|
- name: "Set 'matomo_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
matomo_installed: True
|
matomo_installed: True
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
- block:
|
- block:
|
||||||
|
|
||||||
- name: Enable/Disable/Reload NGINX for OSM, if nginx_enabled
|
- name: Enable/Disable/Reload NGINX for Matomo
|
||||||
include_tasks: nginx.yml
|
include_tasks: nginx.yml
|
||||||
|
|
||||||
- name: Install Matomo if 'matomo_installed' not defined, e.g. in {{ iiab_state_file }} # /etc/iiab/iiab_state.yml
|
- name: Install Matomo if 'matomo_installed' not defined, e.g. in {{ iiab_state_file }} # /etc/iiab/iiab_state.yml
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
- name: Enable http://box/maps & http://box/matomo via NGINX, by installing {{ nginx_conf_dir }}/matomo-nginx.conf from template
|
- name: Enable http://box/matomo via NGINX, by installing {{ nginx_conf_dir }}/matomo-nginx.conf from template
|
||||||
template:
|
template:
|
||||||
src: matomo-nginx.conf.j2
|
src: matomo-nginx.conf.j2
|
||||||
dest: "{{ nginx_conf_dir }}/matomo-nginx.conf" # /etc/nginx/conf.d
|
dest: "{{ nginx_conf_dir }}/matomo-nginx.conf" # /etc/nginx/conf.d
|
||||||
when: matomo_enabled
|
when: matomo_enabled
|
||||||
|
|
||||||
- name: Disable http://box/maps & http://box/matomo via NGINX, by removing {{ nginx_conf_dir }}/matomo-nginx.conf
|
- name: Disable http://box/matomo via NGINX, by removing {{ nginx_conf_dir }}/matomo-nginx.conf
|
||||||
file:
|
file:
|
||||||
path: "{{ nginx_conf_dir }}/matomo-nginx.conf" # /etc/nginx/conf.d
|
path: "{{ nginx_conf_dir }}/matomo-nginx.conf" # /etc/nginx/conf.d
|
||||||
state: absent
|
state: absent
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
location ~ ^/matomo/(config|tmp|core|lang) { deny all; return 403; }
|
||||||
|
|
||||||
location ~ ^/matomo(.*)\.php(.*)$ {
|
location ~ ^/matomo(.*)\.php(.*)$ {
|
||||||
alias /library/www/matomo$1.php$2; # /library/www/matomo
|
alias /library/www/matomo$1.php$2; # /library/www/matomo
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
|
@ -12,6 +14,6 @@ location ~ ^/matomo(.*)\.php(.*)$ {
|
||||||
fastcgi_param PATH_INFO $2;
|
fastcgi_param PATH_INFO $2;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ ^/matomo/ {
|
location ~ ^/matomo(/)? {
|
||||||
root /library/www;
|
root /library/www;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
||||||
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
||||||
|
|
||||||
mediawiki_major_version: 1.39 # "1.35" also works
|
mediawiki_major_version: "1.43" # "1.40" quotes nec if trailing zero
|
||||||
mediawiki_minor_version: 0
|
mediawiki_minor_version: 0
|
||||||
mediawiki_version: "{{ mediawiki_major_version }}.{{ mediawiki_minor_version }}"
|
mediawiki_version: "{{ mediawiki_major_version }}.{{ mediawiki_minor_version }}"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,23 @@
|
||||||
|
- name: "Set 'mysql_install: True' and 'mysql_enabled: True'"
|
||||||
|
set_fact:
|
||||||
|
mysql_install: True
|
||||||
|
mysql_enabled: True
|
||||||
|
|
||||||
|
- name: MYSQL - run 'mysql' role (attempt to install & enable MySQL / MariaDB)
|
||||||
|
include_role:
|
||||||
|
name: mysql
|
||||||
|
|
||||||
|
- name: FAIL (STOP THE INSTALL) IF 'mysql_installed is undefined'
|
||||||
|
fail:
|
||||||
|
msg: "MediaWiki install cannot proceed, as MySQL / MariaDB is not installed."
|
||||||
|
when: mysql_installed is undefined
|
||||||
|
|
||||||
|
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
# https://www.mediawiki.org/wiki/Manual:Installation_requirements#PHP
|
# https://www.mediawiki.org/wiki/Manual:Installation_requirements#PHP
|
||||||
- name: 'Install packages: php{{ php_version }}-intl, php{{ php_version }}-mbstring, php{{ php_version }}-xml'
|
- name: 'Install packages: php{{ php_version }}-intl, php{{ php_version }}-mbstring, php{{ php_version }}-xml'
|
||||||
package:
|
package:
|
||||||
|
|
@ -95,6 +115,17 @@
|
||||||
|
|
||||||
# RECORD MediaWiki AS INSTALLED
|
# RECORD MediaWiki AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'mediawiki_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: mediawiki
|
||||||
|
option: mediawiki_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'mediawiki_installed: True'"
|
- name: "Set 'mediawiki_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
mediawiki_installed: True
|
mediawiki_installed: True
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
- name: Record (initial) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df1
|
||||||
|
|
||||||
|
|
||||||
- name: Check for Minetest world file ({{ minetest_world_dir }}/world.mt)
|
- name: Check for Minetest world file ({{ minetest_world_dir }}/world.mt)
|
||||||
stat:
|
stat:
|
||||||
path: "{{ minetest_world_dir }}/world.mt"
|
path: "{{ minetest_world_dir }}/world.mt"
|
||||||
|
|
@ -7,9 +12,6 @@
|
||||||
file:
|
file:
|
||||||
state: directory
|
state: directory
|
||||||
path: /library/games
|
path: /library/games
|
||||||
# owner: root
|
|
||||||
# group: root
|
|
||||||
# mode: '0755'
|
|
||||||
|
|
||||||
- include_tasks: minetest_install.yml
|
- include_tasks: minetest_install.yml
|
||||||
when: not minetest_world.stat.exists
|
when: not minetest_world.stat.exists
|
||||||
|
|
@ -35,8 +37,20 @@
|
||||||
url: https://content.minetest.net/packages/sfan5/worldedit/releases/13367/download/
|
url: https://content.minetest.net/packages/sfan5/worldedit/releases/13367/download/
|
||||||
when: minetest_default_game == "minetest"
|
when: minetest_default_game == "minetest"
|
||||||
|
|
||||||
|
|
||||||
# RECORD Minetest AS INSTALLED
|
# RECORD Minetest AS INSTALLED
|
||||||
|
|
||||||
|
- name: Record (final) disk space used
|
||||||
|
shell: df -B1 --output=used / | tail -1
|
||||||
|
register: df2
|
||||||
|
|
||||||
|
- name: Add 'minetest_disk_usage = {{ df2.stdout|int - df1.stdout|int }}' to {{ iiab_ini_file }}
|
||||||
|
ini_file:
|
||||||
|
path: "{{ iiab_ini_file }}" # /etc/iiab/iiab.ini
|
||||||
|
section: minetest
|
||||||
|
option: minetest_disk_usage
|
||||||
|
value: "{{ df2.stdout|int - df1.stdout|int }}"
|
||||||
|
|
||||||
- name: "Set 'minetest_installed: True'"
|
- name: "Set 'minetest_installed: True'"
|
||||||
set_fact:
|
set_fact:
|
||||||
minetest_installed: True
|
minetest_installed: True
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,18 @@
|
||||||
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
# All above are set in: github.com/iiab/iiab/blob/master/vars/default_vars.yml
|
||||||
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
# If nec, change them by editing /etc/iiab/local_vars.yml prior to installing!
|
||||||
|
|
||||||
mongodb_64bit_version: 6.0 # 2022-10-23: 4.4 fails on Debian 12 x86_64:
|
mongodb_arch_dict:
|
||||||
|
armv6l: unsupported # WAS: 3.0
|
||||||
|
armv7l: unsupported # WAS: 3.0
|
||||||
|
aarch64: 5.0
|
||||||
|
i386: unsupported
|
||||||
|
x86_64: 6.0
|
||||||
|
|
||||||
|
mongodb_version: "{{ mongodb_arch_dict[ansible_machine] | default('unknown') }}" # A bit safer than ansible_architecture (see kiwix/defaults/main.yml)
|
||||||
|
|
||||||
|
#mongodb_arm64_version: 5.0 # 2023-02-24: MongoDB 6.0.4 fails to install on
|
||||||
|
# # 64-bit RasPiOS 11, as it doesn't offer libssl3.
|
||||||
|
#mongodb_amd64_version: 6.0 # 2022-10-23: 4.4 fails on Debian 12 x86_64:
|
||||||
# "No package matching 'mongodb-org' is available". 5.0+ fail on "pre-2011"
|
# "No package matching 'mongodb-org' is available". 5.0+ fail on "pre-2011"
|
||||||
# CPU's w/o AVX, and on RPi due to MongoDB compiling these for v8.2-A (RPi 4 is
|
# CPU's w/o AVX, and on RPi due to MongoDB compiling these for v8.2-A (RPi 4 is
|
||||||
# ARM v8-A). SO IIAB ALWAYS OVERLAYS andyfelong.com's 5.0.5 IF 5.0+ SPECIFIED.
|
# ARM v8-A). SO IIAB ALWAYS OVERLAYS andyfelong.com's 5.0.5 IF 5.0+ SPECIFIED.
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue