Bash-Neuling
Anmeldungsdatum: 29. August 2022
Beiträge: 4
|
Hinweis: Auswahl Ubuntu 21.04 (bullseye/sid) stand nicht zur Verfügung! Hallo Forum-Mitglieder und Profis, habe ein Projekt bekommen, worin ich in Bash etwas aufsetzten musste. Habe sehr viel durchgelesen und in fast 6 Monaten ca. 620 Zeilen zusammengestellt.
Meine Tests an verschiedenen einzelnen Rechnern funktionierten prima.
Im Feld jedoch (immer gleiche Rechnerkonfiguration) nur in ca. 70% der Fälle. Bevor ich weit aushole, wollte ich erst Fragen, ob ein Profi gewillt ist, dem Problem auf die Schliche zu kommen? LG Anfänger
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Bash-Neuling schrieb: Hinweis: Auswahl Ubuntu 21.04 (bullseye/sid) stand nicht zur Verfügung!
Das hat einen Grund. 😉
Bevor ich weit aushole, wollte ich erst Fragen, ob ein Profi gewillt ist, dem Problem auf die Schliche zu kommen?
Der Profi bist Du, weil Du das Programm am besten kennst. Ich habe immer folgende Zeile oben in Skripten: | [ -z "$DEBUG" ] || set -x
|
Wenn Du vor dem Start in der Umgebung die Variable "DEBUG" auf irgendetwas setzt, dann bekommst Du alle ausgeführten Befehle mit Argumenten auf Stderr ausgegeben. Das ist oft sehr hilfreich um Fehler zu finden. Man kann das auch beim Aufruf einmalig setzen: | $ DEBUG=x das-script und die/Argumente
|
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Willkommen auf uu.de! Bash-Neuling schrieb: Hinweis: Auswahl Ubuntu 21.04 (bullseye/sid) stand nicht zur Verfügung!
Die Versionsangabe ist auch irreführend. Falls du 21.04 verwendest, dann ist das aus dem Support und braucht eine Neuinstallation mit 22.04. Falls du Debian bullseye verwendest, dann ist das kein 21.04. Prüfen kannst du das bspw. mit cat /usr/lib/os-release .
Bevor ich weit aushole, wollte ich erst Fragen, ob ein Profi gewillt ist, dem Problem auf die Schliche zu kommen?
Ist eine Metafrage und hängt wohl sehr davon ab, was du da genau zusammengebastelt hast. Generell sind im hiesigen Subforum einige willige Helfer. Falls du das Script, bzw. eine Minimalversion des Fehlers online posten möchtest, kannst du das im PasteService tun → Lizenz beachten!
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
ChickenLipsRfun2eat schrieb: Willkommen auf uu.de!
Oh ja, das habe ich ganz übersehen. Auch von mir ein herzliches Willkommen!
|
Bash-Neuling
(Themenstarter)
Anmeldungsdatum: 29. August 2022
Beiträge: 4
|
Danke vorerst für die Anregungen und Hinweise. @rklm Für das Debug habe ich eine Funktion eingebaut, das ich bei Bedarf an bestimmten Stellen einschalten konnte. Das konnte ich aber nicht während der Serienfertigung eingeschalten lassen. | Debug()
{
set -x
set -u
PS4='[- $LINENO: ]'
}
|
Leider konnte ich den Zustand bei mir nicht reproduzieren, um der Sache auf die Spur zu kommen. Wir stellen PC´s her. Zum Testen verwenden wir ein Testtool gebootet vom USB-Stick. Bisher hatten wir ein Menü, in dem der Benutzer nach einem neustart jeweils eine Auswahl treffen musste, was als nächstes dran ist. Das Menü sah so aus: Ersttest starten MAC-Adresse überprüfen Burntest starten Endtest starten Protokolle senden Neue Daten auf den Stick kopieren. 1. Formatierter Text
Meine Aufgabe war es, diese so anzupassen, dass alles automatisch gewählt und gestartet wird. Der Ablauf des Script sieht folgendermaßen aus: Es wird vom Stick gebootet vars.sh wird eingelesen (Benutzerdaten und Variable von Zustände) Der Zustand wird anhand von Testprotokollen und der "vars.sh" festgelegt Der Test wird gestartet, Protokolle erstellt und der Test wieder beendet Es wird nach diversen Fehlern durchsucht (Konfiguration und Wörter) Ausgabe des Zustands Senden der Testprotokolle aufs Netz Formatierter Text. Stick löschen um für nächsten Rechner vorzubereiten
Das Bild im Anhang stammt aus der Fertigung nach dem Endtest. Der rote Rahmen wird in Zeile 629 erzeugt. Anschließend sollte der clear Befehl kommen.Die Fehlerüberprüfung sollte anschlagen, da im Protokoll Fehler waren. Doch zumindest sollte eine Ausgabe kommen, dass die Protokolle OK oder NOK sind. Das Script macht aber irgendwo weiter und löscht den Stick. Mir geht es Vorrangig um das besagte Verhalten. Dennoch hätte ich auch gern Infos darübe, wo "No-Go"´s enthalten sind. Schönheitsfehler sind mir derzeit jedoch egal. 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 | #!/bin/bash
# V2 (allgemeine Hilfestellungen und Erklärungen siehe Ende des Dokuments)
Clean_Stick() # Ein paar Lösch-Befehle, um den LX-Stick in unbenutzten Fertigungs-Stick zu versetzen
{
clear
echo
echo Lösche Dateien ...
rm -f -r /testlx/data
rm -f /*.TXT
rm -f /*.pdf
rm -f /*.PDF
rm -f /*.ttsx
rm -f /*.TTSX
rm -f /testlx/*.LOG
rm -f /testlx/*.log
rm -f /testlx/*.txt
rm -f /testlx/*.TXT
rm -f /testlx/*.pdf
rm -f /testlx/*.PDF
rm -f /testlx/*.ttsx
rm -f /testlx/*.TTSX
}
New_TestData() # LX-Stick mit neuen Benutzerdaten vorbereiten
{
if [ -d "/mnt/install/std" ]; then
clear
echo
echo
echo " Bitte neue Testdaten eingeben:"
echo " ====================================="
echo
read -p " Artikelnummer: " PCName
if [ ! -d "/mnt/install/$PCName" ] || [ "$PCName" == "" ]; then # Überprüfen ob es die Artikelnr. gibt
echo
echo
echo "Der eingegebenen Rechnername konnte nicht gefunden werden."
read -n 1 -p "Bitte die Eingabe wiederholen - weiter mit Enter"
New_TestData
else
read -p " PC-Seriennummer: " SN
if [ -d "/mnt/rechner/$SN" ]; then # SN-Ordner im Berichte-Ordner bereits vorhanden?
echo
echo " Auf dem Netzwerk ist bereits ein Ordner mit der $SN angelegt."
echo " !!! Bitte vor dem Fortfahren die Unstimmigkeit überprüfen !!!"
echo
echo " (w) = Eingabe wiederholen."
echo
echo " Jede andere Taste um Daten zu bestätigen."
echo
read -n 1 -p " Bitte auswaehlen: " snexist
if [ "$snexist" == "w" ]; then
clear
echo " Bitte Testdaten vervollständigen:"
echo " ====================================="
echo
echo " Artikelnummer: ""$PCName"
read -p " PC-Seriennummer: " SN
else
clear
echo " Bitte neue Testdaten eingeben:"
echo " ====================================="
echo
echo " Artikelnummer: ""$PCName"
echo " PC-Seriennummer: ""$SN"
fi
fi
read -p " Testername: " Testername
clear
echo
echo
echo " Sind die Angaben korrekt?"
echo " ====================================="
echo
echo " Artikelnummer: ""$PCName"
echo " PC-Seriennummer: ""$SN"
echo " Testername: ""$Testername"
echo
echo
echo
echo " (w) = Eingabe wiederholen."
echo " (h) = Rechner herunterfahren"
echo
echo " Jede andere Taste um Daten zu bestätigen."
echo
echo
read -n 1 -p " Bitte Auswahl treffen? ? " data
[ "$data" == "w" ] && New_TestData
[ "$data" == "h" ] && poweroff
mkdir /testlx/data
# Erstellen der vars.sh
echo "#!/bin/bash" > /testlx/data/vars.sh
echo " " >> /testlx/data/vars.sh
echo "export PCName=$PCName" >> /testlx/data/vars.sh
echo "export SN=$SN" >> /testlx/data/vars.sh
echo "export Testername=$Testername" >> /testlx/data/vars.sh
echo "export Ersttest_ok=0" >> /testlx/data/vars.sh
echo "export Burntest_ok=0" >> /testlx/data/vars.sh
echo "export Endtest_ok=0" >> /testlx/data/vars.sh
echo "Kopiere Inhalt vom config-Ordner."
cp /mnt/install/$PCName/*.* /testlx/data
if [ ! -e "/testlx/data/testlx.ini" ]; then
cp /mnt/install/std/testlx.ini /testlx/testlx.ini # Kopiere STD testlx.ini
else
cp /testlx/data/testlx.ini /testlx/testlx.ini # kopiere Benutzerdefinierte testlx.ini
fi
cp /mnt/install/std/prestart.sh /testlx/prestart.sh # Zum Aktualisieren des Sticks.
# Erstellen, Ausführen und anschließendes Löschen der restart.sh
# wird benötigt um die richtige start.sh aktiv zu stellen
echo "#!/bin/bash" > /testlx/restart.sh
echo " " >> /testlx/restart.sh
echo 'if [ -e /testlx/data/start.sh ]; then' >> /testlx/restart.sh
echo 'echo "Kopiere benutzerdefinierte start.sh"' >> /testlx/restart.sh
echo 'cp /testlx/data/start.sh /testlx/start.sh' >> /testlx/restart.sh
echo 'else' >> /testlx/restart.sh
echo 'echo "Kopiere Standard start.sh"' >> /testlx/restart.sh
echo 'cp /mnt/install/std/start.sh /testlx/data/start.sh' >> /testlx/restart.sh
echo 'cp /testlx/data/start.sh /testlx/start.sh' >> /testlx/restart.sh
echo 'fi' >> /testlx/restart.sh
echo '/testlx/start.sh' >> /testlx/restart.sh
/testlx/restart.sh
fi
else
echo
echo
echo "Es konnte keine Netzwerkverbindung hergestellt werden."
echo "Bitte Netzwerkverbindung überprüfen und ggf. das Gerät neustarten."
echo
read -n 1 -p "Gerät mit beliebiger Taste neustarten ..."
reboot
fi
}
Start_TestLX() # Starte Erst-, Burn- bzw. Endtest
{
if [ $LOG_Description == "Burntest" ]; then # Zum Start des Burntests
if dmesg | grep -i 'early_memtest' >/dev/null; then #Überprüfung ob LX mit der Option memtest gestartet wurde. Text befindet sich im Kernelmessage. Ausgelesen mit dmesg
clear
echo
echo "Starte Burntest nach 50 Sekunden automatisch."
echo "(h) = Zum herunterfahren."
echo
echo "Jede weitere Taste startet den Burntest sofort."
echo
read -t 50 -n 1 -p "Bei Bedarf Auswahl treffen: " Burnstart
if [ "$Burnstart" == "h" ]; then
poweroff
else
clear
echo Starte Burntest ...
./testlx BIAutostart=1 BIAutostartScript=$script_path PCName=$PCName PCSN=$SN TesterName=$Testername CompanyName="BEG Buerkle GmbH & Co. KG"
fi
else
clear
echo
echo "Für den Burntest bitte TestLX immer mit der Option \"Mit Bootram-Test\" starten."
echo
echo "Führe in 5 Sekunden ein Reboot durch."
echo "(h) = Zum herunterfahren."
echo
echo "Jede weitere Taste führt sofort ein Reboot durch."
echo
read -t 5 -n 1 -p "Bei Bedarf Auswahl treffen: " Memtest_err
[ "$Memtest_err" == "h" ] && poweroff || reboot
fi
else
clear
echo
echo "Starte $LOG_Description nach 10 Sekunden automatisch."
echo "(h) = Zum herunterfahren."
echo
echo "Jede weitere Taste startet den $LOG_Description sofort."
echo
read -t 10 -n 1 -p "Bei Bedarf Auswahl treffen: " key_LXstart
if [ "$key_LXstart" == "h" ]; then
poweroff
else
Set_time
clear
echo Starte $LOG_Description ...
./testlx BIAutostart=1 BIAutostartScript=$script_path PCName=$PCName PCSN=$SN TesterName=$Testername CompanyName="BEG Buerkle GmbH & Co. KG"
fi
fi
}
CheckError_4All_LOGS() # Suche nach den Strings "toolstar" und "FEHLER"; benötigt für alle Protokolle
{
find_error_tstring_count=`grep -c toolstar* $LOG` # Anzahl von "toolstar" in find_error_tstring
[ $((find_error_tstring_count % 2 )) -eq 0 ] && find_error_tstring=0 || find_error_tstring=1 # % = Modulo-Zeichen. Gibt den Rest der Division aus. Bei geradem vorkommen ist dies immer 0. bei ungeradem vorkommen immer 1. Beispiel: 3x Vorkommen von toolstar ( 3 / 2 = 1 "!Rest 1!");
find_error_string_count=`grep -c FEHLER $LOG` # Anzahl der gefundenen Zeilen mit dem String "FEHLER" im Protokoll
[ $find_error_string_count -eq 0 ] && find_error_string=0 || find_error_string=1
find_error_total=$((find_error_tstring+find_error_string))
}
CheckError_verify_MAC() #Überprüfung auf Konfiguration (verify.sh) und MAC-Adressen (plausibilität und einmaligkeit)
{
# Überprüfen ob MAC_List.BEG auf dem Netz vorhanden
[ ! -e "/mnt/install/MAC_List.BEG" ] && error_LAN=1 || error_LAN=0
# Zeilen zum Überprüfen der MAC-Adresse auf korrekten Vendor
> /tmp/find_mac_error #Protokoll-Datei für MAC-Fehler wird angelegt
Array_Counter=0
while read line; do
if [[ "$line" == "MAC:"* ]] || [[ "$line" == "MAC "* ]]; then # Der ERST.LOG wird Zeile für Zeile nach dem Text MAC durchsucht (Fund z.B. "MAC 3: 00-01-29-33-33-33")
line=$(echo "$line" | cut -d: -f2) #Aus "MAC 3: 00-01-29-33-33-33" wird "00-01-29-33-33-33"
MAC_Array[$Array_Counter]="$line" #MAC-Adresse wird in Array gespeichert
line=$(echo "$line" | cut -d- -f1,2,3) # aus 00-01-29-33-33-33 wird 00-01-29
if [ $(grep -i -c $line /mnt/install/MAC_List.BEG) == 0 ]; then #Vendor wird verglichen
find_error_mac=1
echo "MAC-Adresse "$line>> /tmp/find_mac_error
fi
((Array_Counter=Array_Counter+1))
fi
done < $LOG
echo "export MAC=`echo ${MAC_Array[0]} | cut -c1-17 | tr - :`" >> /testlx/data/vars.sh #MAC-Adresse zum zuordnen des Sticks
counter_MACerr=`wc -l < /tmp/find_mac_error` #Anzahl der nicht gefundenen MAC-Adressen
> /tmp/find_double_mac #Protokoll-Datei für MAC-Fehler wird angelegt
# Prüfung auf doppelte MAC-Adressen je Rechner
for ((g=0;g<Array_Counter;g++)); do
for ((i=g;i<Array_Counter;i++)); do
if [ $g != $i ]; then
if [ ${MAC_Array[$g]} == ${MAC_Array[$i]} ]; then
echo
echo "MAC-Adresse: ${MAC_Array[$i]}" >> /tmp/find_double_mac
find_double_mac=1
fi
fi
done
done
# Zeilen zum Überprüfen der Konfiguration (verify.tmp bearbeitete Version von verify.sh)
> /tmp/diffs_verify #Leere Datei für aktuelle Unterschiede zur verify.tmp wird erstellt
#Im Script wird die verify.tmp genutzt, um bei Verlusst durch hartes ausschalten bzw. Absturz die originale verify.sh zu erhalten
[ $Ersttest_ok -eq 0 ] && grep -v "1000 mbps" /testlx/data/verify.sh > /testlx/data/verify.tmp || cp /testlx/data/verify.sh /testlx/data/verify.tmp #Vorbereitung der verify.sh für das Protokoll ohne Netzwerktest. Zeilen die nicht "1000 mbps" in tmp-File schreiben
while read line; do
if grep -Fq "$line" $LOG; then
echo found >/dev/null
else
echo "$line" >> /tmp/diffs_verify #Unterschied wird in Datei gespeichert um später anzuzeigen
find_error_verify=1
fi
done < /testlx/data/verify.tmp
rm -f /testlx/data/verify.tmp
counter_not_found=`wc -l < /tmp/diffs_verify` #Anzahl der nicht gefundenen verfy.sh Zeilen
}
CheckError_Endtest() # Überprüfung auf korrekten USB-Test
{
# minPlugsNum=`grep "minPlugsNum=" ./data/end.ttsx | cut -d\" -f10` # hier wird die Anzahl der Dongles aus dem Endtest-Script ausgelesen (Mindestanzahl)
count_usb_dongles=`grep "Anzahl getesteter Stecker" /testlx/END.TXT | cut -d: -f2 | sed -e 's/\r//' | sed 's/^ //'` # um die Anzahl zu bekommen, muss der gefundene text 3x barbeitet werden
count_errfree_usb_lines=`grep -a "Fehlerhaft empfangen: 0" /testlx/END.TXT | wc -l` #Anzahl fehlerfrei empfangene Zeilen - je dongle 1x
count_5000_usb_lines=`grep -a ": 5.000" /testlx/END.TXT | wc -l` #Anzahl 5000ér zeilen: Blöcke, gesendet, empfangen - soll je dongle 3x
[ $count_usb_dongles -eq $count_errfree_usb_lines ] && [ $(($count_usb_dongles * 3 )) -eq $count_5000_usb_lines ] && find_error_usb=0 || find_error_usb=1
}
Check_Stick() # Wurde der Stick im Ersttest verwendet?
{
ifconfig | grep -i ${MAC} >/dev/null && false_stick=0 || false_stick=1 #Wurde der Ersttest mit diesem Stick gestartet?
[ $false_stick -eq 1 ] && ShowErrors
}
ShowErrors() # Fehlerauswertung und Ausgabe
{
find_error_total=$(($find_error_usb+$find_error_tstring+$find_error_string+$find_error_verify+$find_error_mac+$false_stick+$find_double_mac)) # Summe aller gefundener Fehler
lineno=1
clear
if [ $find_error_total -eq 0 ]; then
export ${LOG_Description}_ok=1
echo "export ${LOG_Description}_ok=1" >> /testlx/data/vars.sh
export ${LOG_Description}_fail=0
echo "export ${LOG_Description}_fail=0" >> /testlx/data/vars.sh
echo
echo
echo "Es wurden keine Fehler bei der Überprüfung der Protokolle gefunden!"
echo
echo
read -n 1 -p "Taste drücken um Rechner herunter zu fahren... "
[ $LOG_Description == "Endtest" ] && Send_Logs
poweroff
else
export ${LOG_Description}_ok=0
echo "export ${LOG_Description}_ok=0" >> /testlx/data/vars.sh
export ${LOG_Description}_fail=1
echo "export ${LOG_Description}_fail=1" >> /testlx/data/vars.sh
echo
[ $find_error_total -eq 1 ] && echo "Achtung: Folgender Fehlerfall ist aufgetreten!"
[ $find_error_total -gt 1 ] && echo "Achtung: Folgende $find_error_total Fehlerfälle sind aufgetreten!"
echo
[ $find_error_tstring -eq 1 ] && echo "${lineno}. Protokoll $Filename wurde nicht sauber geschrieben." && ((lineno=lineno+1))
if [ $Burntest_fail -eq 1 ]; then
echo
echo "Endtest kann nicht gestartet werden."
echo "Der Stick wird für den Burntest wie folgt vorbereitet."
echo
echo "1. Die Protokolle BURN.TXT und/oder BURNLANG.TXT ins Netzwerk kopiert ggf. ÜBERSCHRIEBEN!"
echo "2. Protokolle vom Stick gelöscht und"
echo "3. der Rechner heruntergefahren."
echo
read -n 1 -p "Beliebige Taste drücken, um fortzufahren."
[ ! -d "/mnt/rechner/$SN" ] && mkdir "/mnt/rechner/$SN"
[ -e /testlx/BURN.TXT ] && cp /testlx/BURN.TXT /mnt/rechner/$SN/BURN.TXT
[ -e /testlx/BURNLANG.TXT ] && cp /testlx/BURNLANG.TXT /mnt/rechner/$SN/BURNLANG.TXT
rm -f /testlx/*.TXT
export ${LOG_Description}_ok=0
echo "export ${LOG_Description}_ok=0" >> /testlx/data/vars.sh
export ${LOG_Description}_fail=0
echo "export ${LOG_Description}_fail=0" >> /testlx/data/vars.sh
poweroff
fi
[ $find_error_string -gt 0 ] && echo "${lineno}. Das Wort \"FEHLER\" wurde ${find_error_string_count}x in der Datei $Filename gefunden." && ((lineno=lineno+1))
if [ $LOG_Description == "Ersttest" ] || [ $LOG_Description == "Endtest" ]; then
[ $error_LAN -eq 1 ] && echo "${lineno}. MAC-List.BEG wurde nicht gefunden. Bitte LAN-Verbindung überprüfen." && ((lineno=lineno+1))
[ $false_stick -eq 1 ] && echo "${lineno}. Im Ersttest gespeicherte MAC-Adresse stimmt nicht mit der aktuellen überein." && ((lineno=lineno+1))
[ $find_error_usb -eq 1 ] && echo "${lineno}. USB-Dongles nicht richtig getestet!" && ((lineno=lineno+1))
[ $find_error_verify -eq 1 ] && echo "${lineno}. Fehler in der Konfiguration des Rechners gefunden." && ((lineno=lineno+1))
[ $find_error_mac -eq 1 ] && echo "${lineno}. Fehler beim Vergleich der MAC-Adresse gefunden." && ((lineno=lineno+1))
[ $find_double_mac -eq 1 ] && echo "${lineno}. Mindestens eine doppelte MAC-Adresse gefunden." && ((lineno=lineno+1))
echo
read -n 1 -p "Beliebige Taste zum fortzusetzen: "
echo
if [ $find_error_verify -eq 1 ]; then
[ $counter_not_found -eq 1 ] && echo " Folgende Zeile passt laut Vergleich nicht."
[ $counter_not_found -gt 1 ] && echo " Folgende Zeilen passen laut Vergleich nicht."
echo
cat -n /tmp/diffs_verify
echo
read -n 1 -p "Beliebige Taste zum fortzusetzen: "
echo
fi
if [ $find_error_mac -eq 1 ]; then
echo
[ $counter_MACerr -eq 1 ] && echo " Eine MAC-Adresse wurde in MAC_List.BEG nicht gefunden."
[ $counter_MACerr -gt 1 ] && echo " $counter_MACerr MAC-Adressen wurden in MAC_List.BEG nicht gefunden."
echo
cat -n /tmp/find_mac_error
echo
read -n 1 -p "Beliebige Taste zum fortzusetzen: "
echo
fi
if [ $find_double_mac -gt 0 ]; then
echo
echo " Liste der doppelten MAC-Adressen."
echo
cat -n /tmp/find_double_mac
echo
read -n 1 -p "Beliebige Taste zum fortzusetzen: "
echo
fi
fi
echo
echo "Folgende Auswahlmöglichkeiten stehen zur Verfügung."
echo
echo "(h) Rechner herunterfahren."
echo "(r) Rechner neu starten."
[ ! $LOG_Description == "Burntest" ] && echo "(t) $LOG_Description erneut starten."
echo
echo
read -n 1 -p "Bitte Auswahl treffen... " key_err
[ "$key_err" == "h" ] && poweroff
[ "$key_err" == "r" ] && reboot
[ "$key_err" == "t" ] && [ ! $LOG_Description == "Burntest" ] && echo "Starte $LOG_Description ..." && Start_TestLX
fi
}
Send_Logs() # Funktion um die Protokolle zu senden
{
count_LAN_TXT=`ls -1 /mnt/rechner/$SN/*.[Tt][Xx][Tt] 2>/dev/null | wc -l` # Anzahl der TXT Dateien im Netzwerk in Variablen schreiben
count_Local_TXT=`ls -1 /testlx/*.[Tt][Xx][Tt] 2>/dev/null | wc -l` # Anzahl der TXT-Dateien auf dem Stick in Variable schreiben
if [ $count_LAN_TXT -eq 0 ]; then # Wenn Keine TXT-Dateien auf dem Netz vorhanden
echo
echo
ls -1 *.TXT
[ ! -d "/mnt/rechner/$SN" ] && mkdir /mnt/rechner/$SN
cp /testlx/*.TXT /mnt/rechner/$SN/
echo
echo
echo "Testergebnisse erfolgreich gesendet!"
echo
echo "Loesche alle vom User bzw. Test-LX angelegte Dateien."
echo
read -n 1 -p "Weiter mit beliebiger Taste ..."
cp /mnt/install/std/testlx.ini /testlx/testlx.ini #Kopiere Standard-Ini vom Netz auf den Stick für Boots ohne Scripte
Clean_Stick
else
echo
echo "ACHTUNG !!!"
echo "-----------"
echo
echo "Für den Rechner $SN sind auf dem Netzwerk bereits folgende TXT Dateien abgelegt."
echo
ls -w1 /mnt/rechner/$SN/*.[Tt][Xx][Tt] | cut -d/ -f5 # die Ausgabe wird auf die Ausgabe alleiniger Dateinamen beschränkt
echo
echo "!!! Bitte vor dem fortfahren die Unstimmigkeit überprüfen !!!"
echo
read -n 1 -p "Bitte Auswahl treffen? (u = Überschreiben / a = Abbrechen ? " Key_Send
echo
case $Key_Send in
u)
cp /testlx/*.TXT /mnt/rechner/$SN/
if [ -e "/mnt/rechner/$SN/BURN.TXT" ] && [ -e "/mnt/rechner/$SN/BURNLANG.TXT" ] && [ -e "/mnt/rechner/$SN/END.TXT" ]; then
ls -w1 /mnt/rechner/$SN/*.TXT | cut -d/ -f5
echo
echo "Testergebnisse erfolgreich gesendet!"
echo
echo "Lösche alle vom User bzw. Test-LX angelegte Dateien und fahre Rechner herunter."
echo
read -n 1 -p "Weiter mit beliebiger Taste ..."
cp /mnt/install/std/testlx.ini /testlx/testlx.ini #Kopiere Standard-Ini vom Netz auf den Stick für Boots ohne Scripte
Clean_Stick
else
echo
echo "Folgende Protokolle Fehlen"
fi
;;
a)
echo "Vorgang durch Benutzer abgebrochen. Fahre Rechner herunter."
echo
read -n 1 -p "Weiter mit beliebiger Taste ..."
;;
esac
fi
poweroff
}
Var()
{
if [ $1 == "Erst" ]; then
LOG_Description="Ersttest"
script_path="/testlx/data/erst.ttsx"
LOG="/testlx/ERST.LOG"
Filename="ERST.LOG"
elif [ $1 == "Burnlng" ]; then
LOG_Description="Burntest"
script_path="/testlx/data/burn.ttsx"
LOG="/testlx/BURNLANG.TXT"
Filename="BURNLANG.TXT"
elif [ $1 == "Burnsrt" ]; then
LOG_Description="Burntest"
script_path="/testlx/data/burn.ttsx"
LOG="/testlx/BURN.TXT"
Filename="BURN.TXT"
elif [ $1 == End ]; then
LOG_Description="Endtest"
script_path="/testlx/data/end.ttsx"
LOG="/testlx/END.TXT"
Filename="END.TXT"
fi
}
Set_time()
{
timedatectl set-local-rtc 1
timedatectl set-timezone "Europe/Berlin"
hwclock -w
}
Debug()
{
set -x
set -u
PS4='[- $LINENO: ]'
}
# Hauptteil
# Anzahl der Zeilen wird festgelegt
stty rows 37
# Anzahl der Spalten wird festgelegt
stty cols 100
# Initialisierung und Beschreibung der eingesetzten Variablen
count_LAN_TXT=0 #Anzahl TXT-Dateien im Berichte-Ordner
count_Local_TXT=0 #Anzahl TXT-Dateien auf dem LX-Stick
counter_MACerr=0 #Anzahl nicht gefundener MAC-Adressen
counter_not_found=0 #Anzahl nicht gefundener Verify-Zeilen
find_error_tstring=0 #Fehler wenn Rest einer Division = 1
find_error_tstring_count=0 #Anzahl "toolstar" im Protokoll
find_error_total=0 #Summe aller Fehler
find_error_string=0 #Anzahl "FEHLER" im Protokoll
find_error_mac=0 #Fehler bezgl. MAC-Adressen
find_double_mac=0 #Doppelte MAC-Adresse
find_error_verify=0 #verify.sh passt nicht
count_usb_dongles=0 #Anzahl getesteter USB-Dongles
count_5000_usb_lines=0 #Anzahl der Zeilen in der ": 5000" vorkommt
count_errfree_usb_lines=0 #Anzahl der Zeilen in der "fehlerfrei empfangene" vorkommt
find_error_usb=0 #Fehler mit USB-Dongle
find_error_burn=0 # Fehler beider Burn Protokolle
find_error_brnlng=0 # Fehler im Burnlang Protokoll
find_error_brnsrt=0 # Fehler im Burn Protokoll
Burntest_ok=0 #
Ersttest_ok=0 #
Endtest_ok=0 #
miss_brnsrt=0 # BURN.TXT fehlt
miss_brnlng=0 # BURNLANG.TXT fehlt
false_stick=0 # Rechner im falschen Rechner
error_LAN=0 # MAC_List.BEG fehlt
burnlng_lan_exist=0 # Burnlang.txt auf dem Netzwerk vorhanden
burnsrt_lan_exist=0 # Burn.txt auf dem Netzwerk vorhanden
burn_lan_exist=0 # Eines der Burns auf dem Netzwerk vorhanden
Ersttest_fail=0 # Protokolle im Ersttest fehlerhaft.
Burntest_fail=0 # Protokolle im Burntest fehlerhaft.
Endtest_fail=0 # Protokolle im Endtest fehlerhaft.
#vars.sh wird als Marker für "Stick war in Gebrauch" bzw. "Stick ist neu" verwendet. sie wird nach dem Protokolle senden automatisch gelöscht.
if [ -e "/testlx/data/vars.sh" ]; then
source /testlx/data/vars.sh #Einlesen aus vars.sh: PC-Seriennummer, PC-Name und Benutzer, MAC-Adresse
else
Clean_Stick
New_TestData
fi
# Starte entsprechendes Testscripts. Auswahl des Tests nach Ausschlussverfahren
# Start von Ersttest, wenn alles ok
if [ $Ersttest_ok -eq 0 ]; then
Var Erst
Start_TestLX
until [ $Ersttest_ok -eq 1 ]; do
CheckError_4All_LOGS
CheckError_verify_MAC
ShowErrors
done
# Starten von Burntest wenn: BURNLANG.TXT und BURN.TXT nicht vorhanden
elif [ ! -e "/testlx/BURNLANG.TXT" ] && [ ! -e "/testlx/BURN.TXT" ]; then
Var Burnlng
Start_TestLX
CheckError_4All_LOGS
[ $find_error_total -eq 0 ] && find_error_brnlng=0 || find_error_brnlng=1
Var Burnsrt
CheckError_4All_LOGS
[ $find_error_total -eq 0 ] && find_error_brnsrt=0 || find_error_brnsrt=1
find_error_burn=$((find_error_brnlng+find_error_brnsrt))
if [ $find_error_burn -eq 0 ]; then
echo "export Burntest_ok=1" >> /testlx/data/vars.sh
echo "export Burntest_fail=0" >> /testlx/data/vars.sh
else
echo "export Burntest_ok=0" >> /testlx/data/vars.sh
echo "export Burntest_fail=1" >> /testlx/data/vars.sh
fi
poweroff
# Fehlerfall: eines der Protokolle (Burn- bzw. Burnlang fehlt)
elif [ ! -e "/testlx/BURNLANG.TXT" ] || [ ! -e "/testlx/BURN.TXT" ]; then
[ ! -e "/testlx/BURN.TXT" ] && miss_brnsrt=1 && stick_not_exist="BURN.TXT" && stick_exist="BURNLANG.TXT"
[ ! -e "/testlx/BURNLANG.TXT" ] && miss_brnlng=1 && stick_not_exist="BURNLANG.TXT" && stick_exist="BURN.TXT"
[ -e "/mnt/rechner/$SN/BURNLANG.TXT" ] && burnlng_lan_exist=1 && burn_lan_exist=1 && lan_exist="BURNLANG.TXT"
[ -e "/mnt/rechner/$SN/BURN.TXT" ] && burnsrt_lan_exist=1 && burn_lan_exist=1 && lan_exist="BURN.TXT"
clear
echo
[ $burn_lan_exist -eq 1 ] && echo " Achtung: Es sind Fehler aufgetreten."
[ $burn_lan_exist -eq 0 ] && echo " Achtung: Es ist ein Fehler aufgetreten."
echo
echo " 1. Auf dem Stick fehlt das Protokoll $stick_not_exist."
[ $burn_lan_exist -eq 1 ] && echo " 2. Im Berichteordner existiert bereits das Protokoll $lan_exist !!!"
echo
echo " Bitte Gegebenheit überprüfen!!!"
echo
echo
echo "Beim Fortfahren wird:"
echo
[ $burn_lan_exist -eq 0 ] && echo "1. das Protokoll in den Berichte-Ordner auf dem Netzwerk kopiert,"
[ $burn_lan_exist -eq 1 ] && echo "1. das Protokoll in den Berichte-Ordner auf dem Netzwerk ÜBERSCHRIEBEN,"
echo "2. das Protokoll vom Stick gelöscht und"
echo "3. der Rechner heruntergefahren."
echo
read -n 1 -p "Beliebige Taste drücken, um fortzufahren."
[ ! -d "/mnt/rechner/$SN" ] && mkdir "/mnt/rechner/$SN"
cp /testlx/$stick_exist /mnt/rechner/$SN/$stick_exist
rm -f /testlx/$stick_exist
echo "export Burntest_ok=0" >> /testlx/data/vars.sh
echo "export Burntest_fail=1" >> /testlx/data/vars.sh
poweroff
# Fehlerfall: Endetest bereits duchgeführt. Jedoch Script nicht sauber durchgelaufen
elif [ $Endtest_ok -eq 1 ]; then
echo
echo "Achtung: Der Endtest wurde erfolgreich durchgeführt."
echo
echo "Folgende Optionen stehen zur Verfügung:"
echo "(t) Endtest erneut starten."
echo "(s) Protokolle erneut senden."
echo "(r) Rechner neu starten."
echo
read -n 1 -p "Jede weitere Taste fährt den Rechner herunter ... " endok
if [ $endok == "t" ]; then
Endtest_ok=0
echo "export Endtest_ok=0" >> /testlx/data/vars.sh
Var End
Check_Stick
Start_TestLX
clear
until [ $Endtest_ok -eq 1 ]; do
CheckError_4All_LOGS
CheckError_verify_MAC
CheckError_Endtest
ShowErrors
Send_Logs
done
fi
if [ $endok == "s" ]; then
Var End
Check_Stick
CheckError_4All_LOGS
CheckError_verify_MAC
CheckError_Endtest
ShowErrors
Send_Logs
fi
if [ $endok == "r" ]; then
reboot
fi
poweroff
#Start von Endtest, wenn alles ok
elif [ $Burntest_ok -eq 1 ]; then
Var End
Check_Stick
Start_TestLX
clear
until [ $Endtest_ok -eq 1 ]; do
CheckError_4All_LOGS
CheckError_verify_MAC
CheckError_Endtest
ShowErrors
Send_Logs
done
# Fehlerfall: Fehler im Burnprotokoll
elif [ $Burntest_fail -eq 1 ]; then
Var Burnlng
CheckError_4All_LOGS
ShowErrors
Var Burnsrt
CheckError_4All_LOGS
ShowErrors
poweroff
# Unbekannter Fehler
else
clear
echo "Ein nicht bekannter bzw. unbedachter Zustand ist eingetreten."
echo
echo
read -n 1 -p "Bitte Taste drücken, um den Rechner herunter zu fahren."
poweroff
fi
echo "Fehler: Ende von Start.sh erreicht. Darf nicht passieren. Poweroff folgt"
echo "Taste für Poweroff"
read
poweroff
|
- Bilder
|
Akedia
Anmeldungsdatum: 3. Januar 2018
Beiträge: 83
|
Das sieht mir erstmal weniger nach einem Fehler im Script aus, sondern Wayland (Display-Server) hat ein Problem mit einem Eingabegerät (Maus, Tastatur ...). Da müsste jemand helfen, der sich mit Wayland auskennt ...
|
ChickenLipsRfun2eat
Anmeldungsdatum: 6. Dezember 2009
Beiträge: 12067
|
Versuchst du da eine grafische Oberfläche als root zu starten? Welche Grafikkarten/-chips sind da verbaut? (Hab mich jetzt nicht ins Script eingelesen, nur das Bild angeguckt 😉 )
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
Eine Sache, die mir spontan auffällt: sollte sein (kommt an mehreren Stellen vor). Kann sein, dass die bash das netterweise mitmacht, aber POSIX und die Doku sagen, dass da ein Gleichheitszeichen hingehört. Und oft ist es auch besser zu quoten - mindestens, wenn die Variable auch leer sein kann.
|
juribel
Anmeldungsdatum: 20. April 2014
Beiträge: 1089
|
Moin, nur aus Neugier: Müsste es dann nicht heissen: if [ "$endok" == "t" ]
? Grüsse, juribel
|
karzer
Wikiteam
Anmeldungsdatum: 10. April 2022
Beiträge: 1312
Wohnort: Bad Oeynhausen
|
juribel schrieb: Moin, nur aus Neugier: Müsste es dann nicht heissen: if [ "$endok" == "t" ]
? Grüsse, juribel
Das meine ich auch. Ohne die Quotes dürfte das nur mit doppelten eckigen Klammern gehen, also [[ $endok == "t" ]]
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12832
|
karzer schrieb:
Das meine ich auch. Ohne die Quotes dürfte das nur mit doppelten eckigen Klammern gehen, also [[ $endok == "t" ]]
Nein, das stimmt nicht. Das geht auch ohne Quoting. Wenn die Variable leer sein kann oder Leerzeichen zwischen anderen enthalten kann, sollte man quoten. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | $ sh -c 'x="a b"; [ $x = b ]; echo $?'
sh: 1: [: a: unexpected operator
2
$ sh -c 'x="a b"; [ "$x" = b ]; echo $?'
1
$ sh -c 'x=a; [ $x = b ]; echo $?'
1
$ sh -c 'x=a; [ "$x" = b ]; echo $?'
1
$ bash -c 'x="a b"; [ $x = b ]; echo $?'
bash: line 1: [: too many arguments
2
$ bash -c 'x="a b"; [ "$x" = b ]; echo $?'
1
$ bash -c 'x=a; [ $x = b ]; echo $?'
1
$ bash -c 'x=a; [ "$x" = b ]; echo $?'
1
|
Das, was in der sh funktioniert, gilt auch für die bash .
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
Hm. Ich weiß nicht, wo da ein Problem mit Wayland sein soll, außer das die Logs zu groß sind, aber das sieht mir nach Meldungen und einer Warnung aus, nicht nach einem Fehler. Bei Endtest_ok aber sehe ich nicht, wer das je auf etwas anderes als 0 setzen könnte: | grep -n Endtest_ok endtest.sh
102: echo "export Endtest_ok=0" >> /testlx/data/vars.sh
505:Endtest_ok=0 #
587:elif [ $Endtest_ok -eq 1 ]; then
598: Endtest_ok=0
599: echo "export Endtest_ok=0" >> /testlx/data/vars.sh
604: until [ $Endtest_ok -eq 1 ]; do
631: until [ $Endtest_ok -eq 1 ]; do
|
In 505 wird es mit 0 initialisiert, in 587 gelesen, in 598 wieder mit 0 besetzt, in 599 eine Initialisierung nach vars.sh geschrieben, in 604 auf 1 getestet und in 631, aber wer setzt die Variable je auf 1, oder übersehe ich da was? Mit shellcheck kannst Du übrigens nach Syntaxfehlern oder mögl. solchen fahnden. Das Tool ist übersensibel, aber manchmal eben doch nützlich. Es meldet jede Menge unused Variables zum Beispiel.
|
Bash-Neuling
(Themenstarter)
Anmeldungsdatum: 29. August 2022
Beiträge: 4
|
Hallo Leute, tut mir leid, dass ich so lange nichts von mir habe hören lassen.
Habe bis auf die erste leider keine weitere Mitteilungen bekommen, dass etwas neues beigetragen wurde. ChickenLipsRfun2eat schrieb: Versuchst du da eine grafische Oberfläche als root zu starten? Welche Grafikkarten/-chips sind da verbaut? (Hab mich jetzt nicht ins Script eingelesen, nur das Bild angeguckt 😉 )
Es wird von der Testsoftware eine Grafische Oberfläche gestartet. Die Grafikchips sind unterschiedlich. Dezidiert, Onboard oder in der CPU. rklm schrieb: Eine Sache, die mir spontan auffällt: sollte sein (kommt an mehreren Stellen vor). Kann sein, dass die bash das netterweise mitmacht, aber POSIX und die Doku sagen, dass da ein Gleichheitszeichen hingehört. Und oft ist es auch besser zu quoten - mindestens, wenn die Variable auch leer sein kann.
Werde alle Stellen ausbessern. Danke! rklm schrieb: karzer schrieb:
Das meine ich auch. Ohne die Quotes dürfte das nur mit doppelten eckigen Klammern gehen, also [[ $endok == "t" ]]
Nein, das stimmt nicht. Das geht auch ohne Quoting. Wenn die Variable leer sein kann oder Leerzeichen zwischen anderen enthalten kann, sollte man quoten. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | $ sh -c 'x="a b"; [ $x = b ]; echo $?'
sh: 1: [: a: unexpected operator
2
$ sh -c 'x="a b"; [ "$x" = b ]; echo $?'
1
$ sh -c 'x=a; [ $x = b ]; echo $?'
1
$ sh -c 'x=a; [ "$x" = b ]; echo $?'
1
$ bash -c 'x="a b"; [ $x = b ]; echo $?'
bash: line 1: [: too many arguments
2
$ bash -c 'x="a b"; [ "$x" = b ]; echo $?'
1
$ bash -c 'x=a; [ $x = b ]; echo $?'
1
$ bash -c 'x=a; [ "$x" = b ]; echo $?'
1
|
Das, was in der sh funktioniert, gilt auch für die bash .
Die Variable wird mit 0 initialisiert und kann nicht leer sein. Wenn es Sicherheit bringt, werde ich es dennoch quoten. Bringt was für die Erfahrung. user_unknown schrieb: Hm. Ich weiß nicht, wo da ein Problem mit Wayland sein soll, außer das die Logs zu groß sind, aber das sieht mir nach Meldungen und einer Warnung aus, nicht nach einem Fehler. Bei Endtest_ok aber sehe ich nicht, wer das je auf etwas anderes als 0 setzen könnte: | grep -n Endtest_ok endtest.sh
102: echo "export Endtest_ok=0" >> /testlx/data/vars.sh
505:Endtest_ok=0 #
587:elif [ $Endtest_ok -eq 1 ]; then
598: Endtest_ok=0
599: echo "export Endtest_ok=0" >> /testlx/data/vars.sh
604: until [ $Endtest_ok -eq 1 ]; do
631: until [ $Endtest_ok -eq 1 ]; do
|
In 505 wird es mit 0 initialisiert, in 587 gelesen, in 598 wieder mit 0 besetzt, in 599 eine Initialisierung nach vars.sh geschrieben, in 604 auf 1 getestet und in 631, aber wer setzt die Variable je auf 1, oder übersehe ich da was? Mit shellcheck kannst Du übrigens nach Syntaxfehlern oder mögl. solchen fahnden. Das Tool ist übersensibel, aber manchmal eben doch nützlich. Es meldet jede Menge unused Variables zum Beispiel.
Die genannte Variable wird durch die Variable ${LOG_Description}_ok generiert ☺ Sie wird in Zeilen 280 bzw. Zeile 293 auf 1 gesetzt. Ich werde noch Versuchen, eine andere grafische Oberfläche "X11-Server?" zu starten. Tip vom Supporter der Testsoftware.
|
Bash-Neuling
(Themenstarter)
Anmeldungsdatum: 29. August 2022
Beiträge: 4
|
Liebe Mitglieder Der Support der Testsoftware hat mir eine neue Version zur Verfügung gestellt.
Mit der funktionieren auch die Scripte wieder. Bekannte Änderung ist ein neuer Kernel. Vielen Dank für Eure Hilfen. Frohe Weihnachten, guten rutsch ins neue Jahr und macht´s gut. Bis zum nächsten Problem 😉
|