-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstart.html
More file actions
1497 lines (1386 loc) · 90.4 KB
/
Copy pathstart.html
File metadata and controls
1497 lines (1386 loc) · 90.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
---
permalink: /start.html
layout: detailpage
containsCode: "true"
containsImage: "true"
containsCopylinks: "true"
containsVideos: "true"
description: "Guida iniziale progetto201"
---
<!-- CONTAINER CON IL RESTO DELLA PAGINA -->
<div class="container grow">
<h3>Come iniziare</h3>
<p>
Anche se questo e' il successore del progetto 100+100 potrebbe essere utile leggere la sua documentazione per capire
il funzionamento alla base del progetto201. (a destra e' presente l'indice dei contenuti)
<a class="btn orange lighten-2" href="https://github.com/mario33881/progetto_100/wiki">Wiki del progetto 100+100</a>
</p>
<blockquote>
<p>
Se occorre operare su una rete con restrizioni e su computer con account senza diritti
di amministratore consiglio di utilizzare un portatile connesso all'hotspot del proprio telefono:
per installare software e per il processo di flash del sistema operativo occorre avere diritti di amministrazione.
</p>
<p>
Utilizzare dispositivi personali aggira molti problemi e spesso velocizza le operazioni.
</p>
<p>
Un'altra valida soluzione per i diritti di amministrazione
consiste nell'utilizzare una macchina virtuale.
</p>
</blockquote>
<blockquote>
<p>
Nella guida quando viene indicato di modificare un file e' possibile utilizzare l'editor di testo "nano".
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# Sostituire <percorso_file> con il percorso del file da modificare
nano <percorso_file>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
Per salvare il file premere Ctrl + X per uscire e specificare di salvare le modifiche digitando "y" e premendo invio.
</p>
</blockquote>
<blockquote>
<p>
Nella guida quando viene indicato di copiare un file utilizzare il comando "cp".
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# Sostituire <orig> con il percorso del file da copiare e
# <dest> con il percorso della cartella di destinazione
cp <orig> <dest>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
Per copiare le cartelle usare il comando "cp" con la flag "-r" (recursive, ricorsivo)
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# Sostituire <orig> con il percorso della cartella da copiare e
# <dest> con il percorso della cartella di destinazione
cp -r <orig> <dest>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</blockquote>
<!-- INDICE DEI CONTENUTI -->
<h5>Indice dei contenuti:</h5>
<br>
{% include html/parsedtoc.html %}
<br><hr><br>
<ol class="collection">
<!-- SEZIONE: RASPBIAN -->
<li class="collection-item">
<h4 id="raspbian">
Raspbian
</h4>
<p>Installare Raspbian/Raspberry Pi OS su Raspberry Pi (la centralina), configurarlo e aggiornarlo.</p>
<h5 class="hide-on-print">Videoguida:</h5>
<video class="responsive-video" controls>
<source src="/assets/video/raspbianinstall.mp4" type="video/mp4">
</video>
{% include html/videospeed_control.html %}
<h5 class="hide-on-print">Guida testuale:</h5>
<ul class="collection">
<li class="collection-item">
<p>
Ci sono due metodi per caricare il sistema operativo sulla scheda SD:
</p>
<blockquote>
Entrambe i metodi cancellano tutto il contenuto della periferica per installarci il sistema operativo,
essere sicuri di selezionare la scheda SD corretta e di non avere file importarti sopra.
</blockquote>
<blockquote>
Entrambe i software citati qui sotto (Etcher e Raspberry Pi Imager) effettuano prima il processo di flash
e poi eseguono una verifica per assicurarsi che l'immagine sia stata caricata correttamente sulla scheda SD.
</blockquote>
<p>Primo metodo: Scaricare dal sito ufficiale l'immagine del sistema operativo (<a href="https://www.raspberrypi.org/downloads/raspberry-pi-os/">Link</a>)</p>
<div class="center-align container">
<img class="materialboxed mx-auto resp-img" src="/assets/img/raspbian/downloadpage.png" alt="Pagina download Raspbian">
</div>
<blockquote>
<p>
Se si desidera utilizzare un monitor collegato a Raspberry Pi per visualizzare l'interfaccia: installare "Raspberry Pi OS (32-bit) with desktop and recommended software"
che include il desktop e altri software utili (ad esempio il browser chromium).
</p>
<p>
Se si desidera affidare la responsabilita' di visualizzare l'interfaccia ad un altro dispositivo e utilizzare Raspberry Pi come puro server
(e installarci sopra solamente il software necessario) si consiglia
di installare "Raspberry Pi OS (32-bit) Lite"
</p>
</blockquote>
<p>
e utilizzare un software per eseguire il flash sulla scheda SD (tipo etcher, <a href="https://www.balena.io/etcher/">link</a> )
</p>
<blockquote>
Consiglio di scompattare il file zip e di eseguire il flash direttamente con l'immagine al suo interno poiche' diverse volte
che ho provato a flashare il file zip il flash falliva o il sistema operativo non si avviava...
</blockquote>
<div class="center-align container">
<img class="materialboxed mx-auto resp-img" src="/assets/img/raspbian/etcher.png" alt="Raspberry Pi Imager">
</div>
<p>
Premere su "Select Image" e selezionare il file immagine del sistema operativo, cliccare su "Select target" e selezionare la scheda SD di destinazione e infine premere "Flash!"
per iniziare il processo.
</p>
<hr>
<p>
Secondo metodo: utilizzare Raspberry Pi Imager, il software consigliato dalla Raspberry Pi foundation ( <a href="https://www.raspberrypi.org/downloads/">Link</a>).
Con questo metodo non occorre neppure scaricare l'immagine, ci pensa il software.
</p>
<div class="center-align container">
<img class="materialboxed mx-auto resp-img" src="/assets/img/raspbian/rpiimager.png" alt="Raspberry Pi Imager">
</div>
<p>
Premere su "CHOOSE OS" per scegliere il sistema operativo da installare.
Selezionare "Raspberry Pi OS (Other)", perche' la prima opzione include il desktop ma senza software aggiuntivo,
e scegliere "Raspberry Pi OS (lite)" per installare il sistema operativo senza interfaccia (server puro)
oppure "Raspberry Pi OS (full)" per installare il sistema operativo con interfaccia e software aggiuntivo (Raspberry Pi visualizzera' l'interfaccia grafica su un monitor via HDMI).
</p>
<p>
Premere su "CHOOSE SD CARD" per scegliere la scheda SD su cui installare il sistema operativo e premere "WRITE" per iniziare il processo di flash.
</p>
<blockquote>
Verra' chiesto se si e' sicuri di cancellare il contenuto della periferica per installare il sistema, premere "YES"
</blockquote>
<hr>
<p>
Se il processo di flash fallisce provare a formattare la scheda SD, per Windows consiglio il software "SD card formatter":
</p>
<p>
Andare nella <a href="https://www.sdcard.org/downloads/formatter/">pagina download cliccando qui</a>
</p>
<p>
Sotto a "SD Memory Card Formatter Download for Windows/Mac" cliccare su "For Windows", andare in fondo alla pagina e cliccare "Accept".
</p>
<p>
Estrarre l'eseguibile dal file zip e installare il software.
</p>
<div class="center-align container">
<img class="materialboxed mx-auto resp-img" src="/assets/img/raspbian/sdcardformatter.png" alt="SD Card Formatter">
</div>
<p>
Per utilizzare il software scegliere la scheda SD cliccando su "Select card", scegliere un nome qualsiasi del volume sotto a "Volume label"
e cliccare su "Format".
</p>
</li>
<li class="collection-item">
<blockquote>
Consiglio fin da subito di collegare Raspberry alla rete locale con il cavo Ethernet e non con il Wi-Fi poiche' nel momento in cui si creera' la rete Wi-Fi con Hostapd l'interfaccia wireless
sara' occupata e non sara' possibile utilizzarla per installare altri software, cercare online soluzioni di problemi, controllare Raspberry via SSH, ...
</blockquote>
Se si e' scelto di installare il sistema operativo senza GUI consiglio di lavorare su Raspberry da "remoto" utilizzando SSH in modo da poter copiare e incollare i comandi da questa pagina.
Per abilitarlo subito al primo avvio creare un file chiamato "ssh" (senza estensione, anche vuoto) e inserirlo nella root della scheda SD (il volume si chiama "boot" ed e' formattato in FAT32).
<blockquote>
Se il computer non permette di accedere al volume della scheda SD disconnettere la periferica e reinserirla nel computer.
</blockquote>
<p>
Per connettersi via SSH occorre conoscere l'indirizzo IP del raspberry e la password.
</p>
<blockquote>
Se si cerca di connettersi da un computer sulla rete locale (come in questo caso, dobbiamo ancora configurare Raspberry per creare la rete Wi-Fi),
utilizzare l'IP del Raspberry sulla rete locale,
altrimenti se si e' collegati alla rete di Hostapd utilizzare l'IP del Raspberry della rete Hostapd
<div class="center-align container">
<img class="materialboxed mx-auto resp-img" src="/assets/svg/network.svg" alt="Rete del progetto201">
</div>
</blockquote>
<p>
Se l'indirizzo IP del raspberry e' da impostare staticamente allora si conosce gia' l'IP del raspberry.
</p>
<blockquote>
<p>Per impostare l'indirizzo IP eseguire da terminale il comando:</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# se non dovesse funzionare provare "ip a add <ip>/<subnet_mask> dev <interface>"
# > Sostituire <ip> con l'ip, <subnet_mask> con la subnet mask e <interface> con l'interfaccia ("eth0", "wlan0", ...)
ifconfig <interface> <ip> netmask <subnet_mask>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
Se occorre impostare l'indirizzo IP potrebbe essere necessario anche impostare il gateway, utilizzare il comando:
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# Sostituire <ip_gateway> con l'IP del gateway, <interface> con l'interfaccia ("eth0")
sudo route add default gw <ip_gateway> <interface>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
E potrebbe essere necessario impostare i server DNS, per fare questo occorre modificare il file "/etc/resolv.conf".
</p>
<p>
Per ogni server DNS da impostare aggiungere una riga come la seguente:
</p>
<pre class="language-ini">
<code class="language-ini">
{% capture code %}
# Sostituire <ip_dns> con l'IP del server DNS
nameserver <ip_dns>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
Il modo piu' semplice per sapere se e' necessario impostare qualcosa e' guardare alle impostazioni dei computer
gia' presenti nella rete locale:
</p>
<p>
su Windows provare a guardare su
"Impostazioni Rete e Internet -> Opzioni scheda -> tasto destro sulla interfaccia Ethernet (puo' avere altri nomi), Proprieta' -> clicca su 'Protocollo Internet versione 4' e poi su Proprieta".
Da qui e' possibile vedere il "gateway predefinito" e gli IP dei server DNS. (se presenti, impostarli con i comandi qua sopra)
</p>
</blockquote>
<p>
Se l'indirizzo IP e' assegnato dinamicamente sul terminale digitare il seguente comando per visualizzare l'IP delle interfacce:
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# se non dovesse funzionare provare "ip a"
ifconfig
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
L'utente e' "pi" e la password di default e' "raspberry".
</p>
A questo punto utilizzare un client SSH tipo putty (<a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html">link</a>) per connettersi a Raspberry Pi via SSH.
<div class="center-align container">
<img class="materialboxed mx-auto resp-img" src="/assets/img/raspbian/putty.png" alt="Putty">
</div>
<p>
Inserire l'indirizzo IP sotto a "Hostname (or IP address)" e assicurarsi che "Port", la porta del servizio SSH, sia 22.
</p>
<p>
Premere su "Open", scrivere "pi" per "Login as", dare invio e poi inserire la password "raspberry" e premere invio.
</p>
</li>
<li class="collection-item">
Se si e' scelto di installare il sistema operativo con la GUI seguire la wizard per la configurazione iniziale che fara' configurare Wi-Fi, password di root, layout della tastiera, ...
e infine far aggiornare il software e far riavviare il raspberry.
<blockquote>
Per non collegarsi alla rete Wi-Fi premere su "skip" quando viene richiesto su quale rete si desidera collegarsi.
</blockquote>
<blockquote>
Anche se il sistema operativo ha la GUI puo' comunque risultare piu' comodo utilizzare SSH per controllare il Raspberry Pi
perche' non e' piu' necessario collegare monitor, mouse e tastiera.
</blockquote>
</li>
</ul>
</li>
<!-- SEZIONE: AUTOINSTALL -->
<li class="collection-item">
<h4 id="autoinstall">
AUTOINSTALL
</h4>
<p>Utilizzare AUTOINSTALL per installare e configurare automaticamente (quasi) tutto quello che serve. Il Raspberry si riavviera' automaticamente un paio di volte</p>
<h5 class="hide-on-print">Videoguida:</h5>
<video class="responsive-video" controls>
<source src="/assets/video/autoinstall.mp4" type="video/mp4">
</video>
{% include html/videospeed_control.html %}
<blockquote class="hide-on-print">
Nel video, dopo aver abilitato VNC, si vede l'utilizzo del terminale come se si fosse davanti al desktop
del Raspberry ma tutti i comandi sono riproducibili anche sulla shell remota via SSH.
</blockquote>
<blockquote class="hide-on-print">
Per scaricare AUTOINSTALL e' stato utilizzato il comando git ma e' possibile anche andare sul repository Github
di AUTOINSTALL, scaricare lo zip ed estrarlo da interfaccia grafica.
</blockquote>
<h5 class="hide-on-print">Guida testuale:</h5>
<ul class="collection">
<li class="collection-item">
<p>Leggere la documentazione e scaricare AUTOINSTALL dal <a class="btn orange lighten-2" href="https://github.com/progetto201/progetto201-autoinstall">repository qui</a></p>
<blockquote>
La documentazione contiene alcuni dei possibili errori e le relative soluzioni e quindi e' consigliato leggerla
poiche' potrebbe essere necessario eseguire debugging/throubleshooting
</blockquote>
<blockquote>
La documentazione e' anche utile a capire se ha senso installare e configurare tutti i software...
Ad esempio commentare o cancellare le istruzioni che installano i seguenti software e eventualmente eseguirli successivamente manualmente:
<ol class="collection">
<li class="collection-item">internalfunctions.sh installa Unclutter, che rende difficile lavorare su raspberry poiche' nasconde il cursore del mouse (utile in ambiente di produzione se si usa uno schermo touch)</li>
<li class="collection-item">internalfunctions.sh imposta il wallpaper del 100+100, se il comando da errore ignorarlo/decommentarlo poiche' il wallpaper non e' fondamentale</li>
<li class="collection-item">internalfunctions.sh importa il database del 100+100, e' possibile saltare l'import e eseguirlo dopo con il database del progetto201</li>
<li class="collection-item">automysql.sh modifica il metodo di accesso all'account root di MySQL: se eseguito prima della importazione l'importazione fallira'</li>
<li class="collection-item">internalfunctions.sh scarica dal repository del 100+100 e posiziona nella cartella "/var/www/html" i file che Apache restituira' ai client web (browser)</li>
<li class="collection-item">
Valutare se e' necessario "correre al debugging" per errori di PHPMyAdmin: ad esempio se qualcosa va storto durante la sua installazione e' consigliabile saltarla e
permettere allo script di installare e configurare servizi piu' importanti prima di cercare di risolvere il problema di PHPMyAdmin.
PHPMyAdmin NON e' <a href="https://en.wikipedia.org/wiki/Mission_critical">mission critical</a>.
</li>
</ol>
<p>Se un comando da errore e' anche possibile commentare tutte le righe precedenti per evitare di ripetere l'intera esecuzione dello script</p>
</blockquote>
<blockquote>
Ogni script richiamato da AUTOINSTALL ha la sua documentazione
</blockquote>
</li>
<li class="collection-item">
<p>
Aprire lo script "autoinstall.sh" e modificare a piacere i valori delle variabili sotto a "# -- VARIABLES"
</p>
<blockquote>
SUGGERIMENTO: le variabili piu' importanti sono:
<ol class="collection">
<li class="collection-item">devmode: true installa PHPMyAdmin per avere una UI per gestire i database, false installa Unclutter, software che nasconde il mouse (adatto per schermi touch screen)</li>
<li class="collection-item">mysqlpass: password dell'utente root di MySQL. Verra' utilizzata da PHP per eseguire operazioni sul database del progetto, nome del database: "db100_100"</li>
<li class="collection-item">hostapd_ssid: SSID della rete Wi-Fi generata da Raspberry Pi (identifica la rete)</li>
<li class="collection-item">hostapd_password: password della rete Wi-Fi</li>
</ol>
<p>Le altre possono essere lasciate a valori di default
<blockquote>
<p>
ESEMPIO: anche se vengono create piu' reti wireless con lo stesso range di indirizzi non c'e' pericolo di conflitti di IP...
Le reti non si vedono perche' Raspberry si comporta da NAT (IP Masquerade) e quindi l'unico indirizzo IP che puo' andare
in conflitto con altri indirizzi e' l'indirizzo dell'interfaccia ethernet "eth0" (rete cablata).
</p>
<p>
MIGLIORAMENTO: disattivare, per motivi di sicurezza (riduciamo i diritti dei dispositivi al minimo), il masquerade per isolare i nodi nelle comunicazioni verso l'esterno (verso Internet e rete sulla eth0): <a href="https://www.raspberrypi.org/documentation/configuration/wireless/access-point-routed.md">link documentazione ufficiale</a>
</p>
</blockquote>
</p>
</blockquote>
</li>
<li class="collection-item">
Salvare e eseguire lo script da terminale con il comando
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# posizionarsi prima con il terminale nella cartella dello script
./autoinstall.sh
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</li>
</ul>
<br>
<hr>
<br>
<blockquote>
Se si desidera uscire dall'interfaccia visualizzata con chromium occorre chiuderlo premendo alt + f4
</blockquote>
<blockquote>
<p>
Se si desidera fermare unclutter per visualizzare di nuovo il cursore fino al prossimo riavvio
occorre conoscere il PID, numero identificativo del processo.
</p>
<p>
Con il seguente comando e' possibile conoscere il PID di unclutter:
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# top visualizza i processi e "| grep" serve per vedere
# se l'output del comando precedente contiene "unclutter"
# > occorre attendere qualche secondo, quando appare premere Ctrl + C per terminare il comando
top | grep unclutter
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
Il primo numero e' il PID. Eseguire il seguente comando per terminare il processo:
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# Sostituire <pid> con il PID di unclutter
kill <pid>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</blockquote>
<blockquote>
<p>
Come specificato precedentemente, lo script autoinstall.sh installa di default i vecchi file del progetto 100+100
e per questo motivo ha senso scaricare e modificare manualmente lo script.
</p>
<p>
In futuro sara' possibile automatizzare anche il download con i seguenti comandi (modificare i valori delle variabili prima di eseguire i comandi):
</p>
<blockquote>
E' possibile eseguire i comandi anche adesso ma poi occorrera' cancellare i file in /var/www e il database del progetto 100+100.
</blockquote>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# -- VARIABILI
# booleans that differ the scripts result
DEVMODE=false # development mode
DHCPDNS=true # true = install and configure dnsmasq
# mysql related
MYSQLPASS="mysqlpassword" # mysql password
# chromium related
TOUCHDEVICE="Virtual core XTEST pointer" # touch device name
# hostapd related
HOSTAPD_ID="192.168.4.1/24" # raspberry ip/cidr
HOSTAPD_SSID="nameofnetwork" # SSID of the access point
HOSTAPD_PASSWORD="longerthan8charspassword" # PWD of the access point
# dnsmasq related
DHCPRANGE_START="192.168.4.2" # first ip of dhcp range
DHCPRANGE_STOP="192.168.4.20" # last ip of dhcp range
DHCPRANGE_SUBMASK="255.255.255.0" # subnet mask for dhcp
DOMAIN="progetto201.com" # domain name
DNSMASQ_CONF="/etc/dnsmasq.conf" # dnsmasq's config file
DNSMASQ_DNSFILE="/etc/hosts-dns" # dnsmasq's hosts file
# -- DOWNLOAD
cd /home/pi/Documents/
git clone https://github.com/progetto201/progetto201-autoinstall.git
cd progetto201-autoinstall
# -- MODIFICA FILE
sed -i autoinstall.sh -e "s|devmode=false|devmode='${DEVMODE}'|g" \
-e "s|dhcpdns=true|dhcpdns='${DHCPDNS}'|g" \
-e "s|mysqlpass=\"mysqlpassword\"|mysqlpass='${MYSQLPASS}'|g" \
-e "s|touchdevice=\"Virtual core XTEST pointer\"|touchdevice='${TOUCHDEVICE}'|g" \
-e "s|hostapd_ip=\"192.168.4.1/24\"|hostapd_ip='${HOSTAPD_ID}'|g" \
-e "s|hostapd_ssid=\"nameofnetwork\"|hostapd_ssid='${HOSTAPD_SSID}'|g" \
-e "s|hostapd_password=\"longerthan8charspassword\"|hostapd_password='${HOSTAPD_PASSWORD}'|g" \
-e "s|dhcprange_start=\"192.168.4.2\"|dhcprange_start='${DHCPRANGE_START}'|g" \
-e "s|dhcprange_stop=\"192.168.4.20\"|dhcprange_stop='${DHCPRANGE_STOP}'|g" \
-e "s|dhcprange_submask=\"255.255.255.0\"|dhcprange_submask='${DHCPRANGE_SUBMASK}'|g" \
-e "s|domain=\"progetto201.com\"|domain='${DOMAIN}'|g" \
-e "s|dnsmasq_conf=\"/etc/dnsmasq.conf\"|dnsmasq_conf='${DNSMASQ_CONF}'|g" \
-e "s|dnsmasq_dnsfile=\"/etc/hosts-dns\"|dnsmasq_dnsfile='${DNSMASQ_DNSFILE}'|g" \
autoinstall.sh
# -- ESEGUI LO SCRIPT
./autoinstall.sh
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
ATTENZIONE: i comandi vengono memorizzati in una cronologia visibile con il comando "history"
e quindi le password sono visibili in chiaro.
</p>
<p>
Cancellare la cronologia dei comandi con il comando:
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
history -c
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</blockquote>
</li>
<!-- SEZIONE: TEST DI AUTOINSTALL -->
<li class="collection-item">
<h4 id="test-autoinstall">
Test di AUTOINSTALL
</h4>
<p>
A questo punto dovrebbero essere installati e configurati MySQL, Apache, PHP, dnsmasq, Hostapd.
</p>
<p>
Verificare che tutto funzioni correttamente.
</p>
<h5 class="hide-on-print">Videoguida:</h5>
<video class="responsive-video" controls>
<source src="/assets/video/testautoinstall.mp4" type="video/mp4">
</video>
{% include html/videospeed_control.html %}
<h5 class="hide-on-print">Guida testuale:</h5>
<ul class="collection">
<li class="collection-item">
Provare con un cellulare a collegarsi alla rete Wi-Fi creata da Raspberry:
se funziona significa che Hostapd ha creato la rete ed e' possibile collegarsi senza problemi
</li>
<li class="collection-item">
Provare poi ad aprire il browser su Raspberry e andare sulla pagina "localhost":
se viene visualizzata la pagina di benvenuto di Apache vuol dire che Apache riesce a rispondere alle richieste.
<blockquote>
Se e' stata restituita la pagina del progetto 100+100 vuol dire
che prima di eseguire lo script AUTOINSTALL non sono state commentate quelle istruzioni
di internalfunctions.sh che scaricavano i vecchi file.
Se la pagina viene restituita vuol dire comunque che Apache funziona.
</blockquote>
</li>
<li class="collection-item">
Provare a collegarsi da telefono con il browser alla pagina web restituita da Apache:
se funziona vuol dire che Apache e' accessibile sulla rete locale creata da Raspberry ma soprattutto
che dnsmasq (funzionante come server DHCP) ha fornito un IP automaticamente.
<blockquote>
Per accedere alla pagina web e' necessario sapere l'indirizzo IP del raspberry: in AUTOINSTALL
era presente la variabile "hostapd_ip", se non e' stata modificata l'IP e' "192.168.4.1",
altrimenti e' il valore della variabile. (Ignorando il CIDR, il numero che e' dopo la slash "/", slash compresa)
E' possibile anche utilizzare il comando:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# se non dovesse funzionare provare "ip a"
ifconfig
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
E controllare l'IP della "wlan0", l'interfaccia wireless del raspberry.
Se si vuole provare a collegarsi da un computer sulla rete cablata inserire l'IP della interfaccia "eth0".
</blockquote>
<blockquote>
E' possibile accertare il suo funzionamento anche andando da smartphone nella pagina per collegarsi alle reti Wi-Fi
e cercare nei sotto menu' "Indirizzo IP". (provare a cliccare di nuovo sulla rete, provare a guardare nella sezione avanzate, ...)
</blockquote>
</li>
<li class="collection-item">
<p>
Provare a creare in "/var/www/html", la cartella di Apache, un file PHP e inserire qualcosa di semplice tipo:
</p>
<pre class="language-php">
<code class="language-php">
{% capture code %}
<?php
echo "hei! Questo e' un test! se vedi solo questa stringa (senza 'php' e i tag) vuol dire che PHP e' installato correttamente";
?>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
E dopo provare a richiederlo da browser: se appare il messaggio senza "<?php", "echo", ";" e "?>" vuol dire che PHP funziona.
</p>
<blockquote>
Se era apparsa la pagina del progetto 100+100 ed e' apparsa la planimetria
vuol dire che PHP funziona (e anche MySQL).
</blockquote>
</li>
<li class="collection-item">
Per testare dnsmasq come server DNS provare a collegarsi alla pagina web inserendo nella barra degli
indirizzi "raspberry" e "raspberry.progetto201.com", dovrebbero funzionare entrambe.
</li>
<li class="collection-item">
Provare MySQL cercando di creare un database via PHPMyAdmin (se e' stato installato, e' possibile accedervi alla pagina "localhost/phpmyadmin" su raspberry)
e poi importare il file SQL dalla sezione import:
<br> <br>
<div class="center-align container">
<img class="materialboxed mx-auto resp-img" src="/assets/img/phpmyadmin/import.jpg" alt="Pagina importazione">
</div>
<br><br>
<p>
Cliccare su "Importa", cliccare su "Scegli il file" e cercare sul computer il file .sql del progetto 201.
Infine cliccare su "Esegui".
</p>
<br>
<hr>
<br>
oppure
importando il file .sql del progetto 201 (presente nel repository <a href="https://github.com/progetto201/progetto201-api">progetto201-api</a>) con il comando:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# sostituisci <path> con il percorso del file sql
sudo mysql < "<path>"
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
E provare a eseguire una query:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
sudo mysql -e "SELECT * FROM db100_100.t_options"
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
Dovrebbe apparire una tabella simile a questa:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
+----+--------------+---------------+---------------+-----------+
| id | color_scheme | min_timestamp | max_timestamp | map |
+----+--------------+---------------+---------------+-----------+
| 1 | red darken-2 | 0 | 0 | realistic |
+----+--------------+---------------+---------------+-----------+
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<blockquote>
Se non si ha i permessi apparira' un errore simile a questo:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
Se e' stato eseguito lo script AUTOINSTALL senza modifiche
probabilmente automysql.sh ha modificato la password.
Prima di eseguire i comandi occorre accedere con la nuova password,
sostituire nei comandi "sudo mysql" con il seguente comando:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# sostutisci <username> con il nome utente
# > nota: non c'e' spazio tra il nome utente e la "-u"
# > nota 2: dopo "-p" e' possibile aggiungere "-e" e poi una istruzione SQL per eseguirla
# > nota 3: se si desidera eseguire istruzioni di un file sql dopo "-p"
# > inserire "< <path>" dove <path> e' il percorso del file
sudo mysql -u<username> -p
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
Premere invio e verra' chiesta la password.
E' possibile conoscere la password guardando la variabile "mysqlpass" in autoinstall.sh.
</p>
<p>
Eseguire la query SQL per ottenere la tabella con i dati:
</p>
<pre class="language-sql">
<code class="language-sql">
{% capture code %}
SELECT * FROM db100_100.t_options;
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
Dovrebbe apparire la tabella indicata sopra.
Uscire dal client MySQL digitando "quit" e premendo invio.
</blockquote>
</li>
</ul>
</li>
<!-- SEZIONE: MODIFICA PASSWORD MYSQL -->
<li class="collection-item">
<h4 id="modifica-password-mysql">
Modifica password MySQL
</h4>
<p>
Se fino ad ora non e' stata modificata la password di MySQL occorre modificarla per permettere
a PHP di collegarsi al database.
</p>
<p>
Ci sono due opzioni:
</p>
<blockquote>
Entrambe le opzioni fanno la stessa cosa,
scegliere quella che in quel momento sembra la piu' veloce.
E' possibile fare un copia incolla? Eseguire la query SQL e' molto probabilmente la soluzione piu' veloce.
</blockquote>
<ul class="collection">
<li class="collection-item">
Eseguire automysql.sh di AUTOINSTALL in questo modo:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# posizionarsi prima con il terminale nella cartella dello script e
# sostituire <pass> con la nuova password per l'utente root
./automysql.sh -mysqlpass <pass>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</li>
<li class="collection-item">
Eseguire la query SQL senza automysql.sh:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# sostituisci <pass> con la nuova password di MySQL dell'utente root
sudo mysql -e "GRANT ALL PRIVILEGES on *.* to 'root'@'localhost' IDENTIFIED BY '<pass>';FLUSH PRIVILEGES;"
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</li>
</ul>
</li>
<!-- SEZIONE: FRONTEND E API -->
<li class="collection-item">
<h4 id="frontend-api">
Frontend e API
</h4>
<p>
Installare la frontend e l'api del progetto201.
</p>
<blockquote>
<p>
Prima di spostare/copiare i file del progetto201 cancellare i file in "/var/www/html" con il comando:
</p>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
sudo rm -rf /var/www/html/*
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</blockquote>
<h5 class="hide-on-print">Videoguida:</h5>
<video class="responsive-video" controls>
<source src="/assets/video/installfrontendapi.mp4" type="video/mp4">
</video>
{% include html/videospeed_control.html %}
<h5 class="hide-on-print">Guida testuale:</h5>
<ul class="collection">
<li class="collection-item">
<p>
Scaricare la backend API dal suo repository: <a href="https://github.com/progetto201/progetto201-api" class="btn orange lighten-2">Clicca qui</a>
</p>
<p>
Posizionare il contenuto della cartella "www" in "/var/www": dovrebbe ora contenere la cartella "credentials" e "html".
La cartella "credentials" contiene il file "credentials.ini" con le credenziali che verranno usate da PHP
per accedere a MySQL e al database. La cartella "html" contiene i file accessibili dai browser che si collegano ad Apache.
</p>
<p>
Modificare il file credentials.ini:
<pre class="language-ini">
<code class="language-ini">
{% capture code %}
DB_HOST=localhost
DB_USER100=user
DB_PASS100=pwd
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
Sostituire "user" con lo username (se non sono stati creati altri account usare "root")
e al posto di "pwd" digitare la password.
Puo' essere utile cambiare "DB_HOST" solo se il database si trova su un altro server.
<blockquote>
Per verificare l'installazione dell'API provare ad accedere alla pagina "http://localhost/api/colors/usercolor.php"
dal browser di raspberry.
Se appare un JSON senza errori, simile a questo l'API funziona:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
{"errors":[],"data":{"id":"6","color_name":"red","color_hex":"#f44336"}}
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</blockquote>
</p>
</li>
<li class="collection-item">
<p>
Scaricare la frontend dal suo repository: <a href="https://github.com/progetto201/progetto201-frontend" class="btn orange lighten-2">Clicca qui</a>
</p>
<p>
Posizionare il contenuto della cartella "www" in "/var/www": adesso nella cartella "/var/www/html"
dovrebbe essere presente un file, "index.html" e due cartelle, "static" e "api" (cartella dell'API)
<blockquote>
<p>
Per verificare l'installazione della frontend provare ad accedere alla pagina "localhost" dal browser di raspberry.
</p>
<p>
Dovrebbe apparire una pagina simile a questa:
</p>
<div class="container center-align">
<img class="materialboxed mx-auto resp-img" src="/assets/img/frontend/home.png" alt="Home del progetto201">
</div>
</blockquote>
</p>
</li>
</ul>
</li>
<!-- SEZIONE: MOSQUITTO -->
<li class="collection-item">
<h4 id="mosquitto">
Mosquitto
</h4>
<p>Installare mosquitto, broker MQTT per gestire i dati ricevuti via MQTT dai nodi e configurarlo per accettare solo nodi con username e password.
Digita i seguenti comandi oppure copia e incolla.
</p>
<h5 class="hide-on-print">Videoguida:</h5>
<video class="responsive-video" controls>
<source src="/assets/video/mosquitto.mp4" type="video/mp4">
</video>
{% include html/videospeed_control.html %}
<h5 class="hide-on-print">Guida testuale:</h5>
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
# Aggiorniamo i repository di sistema
sudo apt-get update
# Installiamo mosquitto
sudo apt-get install mosquitto mosquitto-clients -y
# Assicuriamoci che parta all'avvio del OS
sudo systemctl enable mosquitto.service
# Creiamo un utente e una password (sostituisci <user> con il nome utente desiderato).
# Il terminale chiedera la password desiderata dopo aver premuto invio
sudo mosquitto_passwd -c /etc/mosquitto/passwd <user>
# Occorre configurare il file di configurazione di mosquitto:
# opzione 1:
# digita:
#
# sudo nano /etc/mosquitto/conf.d/default.conf"
#
# e poi scrivi nel file:
#
# allow_anonymous false
# password_file /etc/mosquitto/passwd
#
# opzione 2: digita questo comando che automatizza i passaggi descritti qui sopra:
sudo printf "allow_anonymous false\npassword_file /etc/mosquitto/passwd" >> "/etc/mosquitto/conf.d/default.conf"
# E riavvia mosquitto
sudo systemctl restart mosquitto
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</li>
<!-- SEZIONE: MQTT_MANAGER -->
<li class="collection-item">
<h4 id="mqtt-manager">
MQTT_MANAGER
</h4>
<p>
Scaricare lo script MQTT_MANAGER, configurarlo e abilitare la sua esecuzione all'avvio.
</p>
<h5 class="hide-on-print">Videoguida:</h5>
<video class="responsive-video" controls>
<source src="/assets/video/mqtt_manager.mp4" type="video/mp4">
</video>
{% include html/videospeed_control.html %}
<h5 class="hide-on-print">Guida testuale:</h5>
<ul class="collection">
<li class="collection-item">
Scaricare MQTT_MANAGER dal suo repository: <a href="https://github.com/progetto201/mqtt_manager" class="btn orange lighten-2">Clicca qui</a>
</li>
<li class="collection-item">
Installare le dipendenze del software (dopo essersi posizionati nella cartella di mqtt_manager) eseguendo questo comando:
<pre class="language-bash">
<code class="language-bash">
{% capture code %}
pip3 install -r requirements.txt
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
</li>
<li class="collection-item">
<p>
Creare un file ini di configurazione con la seguente struttura:
</p>
<pre class="language-ini">
<code class="language-ini">
{% capture code %}
[Database]
username = <username DB>
password = <password DB>
host = <dominio/IP DB>
database = <nome DB>
[MQTT broker]
username = <username MQTT>
password = <password MQTT>
host = <dominio/IP MQTT>
port = <porta MQTT>
{% endcapture %}
{% include html/code.html html=code %}
</code>
</pre>
<p>
Dove:
</p>
<ul class="collection">
<li class="collection-item">username, sezione "[Database]": nome utente per connettersi a MySQL ("root")</li>
<li class="collection-item">password, sezione "[Database]": password per connettersi a MySQL (la password configurata precedentemente)</li>
<li class="collection-item">host, sezione "[Database]": indirizzo IP o nome dominio del server MySQL ("localhost")</li>
<li class="collection-item">database, sezione "[Database]": nome del database ("db100_100")</li>
<li class="collection-item">username, sezione "[MQTT broker]": nome utente per connettersi al broker MQTT (in questo caso a mosquitto, scegliere il nome utente configurato precedentemente)</li>
<li class="collection-item">password, sezione "[MQTT broker]": password per connettersi al broker MQTT</li>