Browse Source

kidsControl created by mo2mo, under GPLv3

Moritz Montag 9 years ago
commit
bab780258b

+ 50 - 0
kc/Anleitung

@@ -0,0 +1,50 @@
+Anleitung für "kidsControl"
+
+Als "root" in fünf Schritten am Ziel!
+
+1. Das "kidsControl"-Archiv nach "/usr/local" entpacken.
+2. Die Tabelle "Limits4Kids.csv" mit einem Editor oder Tabellen-Programm mit eigenen Werten befüllen.
+3. In der Datei "kidsControl.ini" die Variablen "log_Out", "message", "PC_down" und "timePic" ans eigene System anpassen.
+4. Den Starter "Zeit-Kontrolle.desktop" nach "/etc/xdg/autostart" verschieben oder an den Ort
+   für einen systemweiten Autostart. Kopieren in die Nutzer-Autostart-Ordner ist auch möglich.
+5. In der Datei "/etc/../PostSession/Default" (".." sind vom Linux-System und Desktop abhängig) folgender Eintrag vor "exit 0" zu machen:
+
+# PC-Nutzungs-Dauer auswerten
+/usr/local/kc/kidsControl out
+
+
+   
+Fertig! Zu beachten ist: Eigentümer aller Programmdateien und -ordner muss "root" sein.
+Die dazugehörende Rechte-Verteilung, ist in der "Liesmich" nachzulesen.
+------------------------------------------------------------------------------------------------
+Ein eigener Starter sollte mindestens diese Zeilen enthalten:
+
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+Name[de_DE]=Zeit-Kontrolle
+Comment[de]=Zuteilung und Kontrolle von PC-Zeiten
+Categories=System;
+Exec=sh /usr/local/kc/kidsControl
+
+------------------------------------------------------------------------------------------------
+Test des Skript sind im Terminal möglich:
+
+"kidsControl test momo" oder nur: "kidsControl test"
+
+------------------------------------------------------------------------------------------------
+Abkürzungen in der Tabelle "Limits4Kids.csv":
+
+LD = longDay, Tages-Zusatz-Zeit verlängert die abendliche Ausschaltzeit. Werte: ja --
+PD = PC-Day, ein Tag pro Woche mit Extrazeit aus dem Wochenguthaben. Mo - So 
+WB = Wochenbeginn, So oder Mo
+WL = Wochen-Guthaben, kann in der Summe den Einzelwerten pro entsprechen, mehr oder weniger sein
+
+------------------------------------------------------------------------------------------------
+
+Weitere Hinweise zum Einsatz und Anpassung ans System im Skript oder unter:
+https://wiki.ubuntuusers.de/Howto/kidsControl
+
+Anregungen oder Kritik an mo2mo auf Bitbucket:
+https://bitbucket.org/mo2mo/kidscontrol
+Version 1.42, 2015-11-24

+ 45 - 0
kc/Liesmich

@@ -0,0 +1,45 @@
+Hinweise für "kidsControl"
+
+Der Skript steht unter GNU General Public License (GPLv3). Hinweise dazu dort:
+http://www.gnu.de/documents/gpl.de.html
+
+Geschrieben für Bourne-Shell: "#! /bin/sh"
+Dürfte damit auf vielen Linux-Systemen laufen. 
+
+Dient der Zeit-Kontrolle für PC-Benutzer
+Deren Zeiten können über eine Tabelle in Form einer csv-Datei gepflegt werden.
+
+Zum Testen im Terminal    : kidsControl test momo
+oder, falls das nicht geht: sh kidsControl test momo
+
+
+Verzeichnis in den Ordner /usr/local entpacken.
+Dann funktioniert auch die .desktop Datei. Diese kann dann an beliebiger Stelle
+im System, am besten dort: "/etc/xdg/autostart" oder an ähnlicher Stelle, damit
+diese systemweit im Autostart der Benutzer landen. Den Starter nur in bestimmte
+Autostart-Ordner der Nutzer zu kopieren, geht auch.
+
+Die Rechte sind bereits richtig gesetzt - beim hist-Ordner analog zum System-tmp.
+Denoch bitte überprüfen, im Terminal "ls -al" sollte das anzeigen:
+
+drwxr-xr-x 3 root  root   4096 Nov 24 19:59 .
+drwxr-xr-x 5 root  root   4096 Nov 24 20:12 ..
+-rw-r--r-- 1 root  root   2216 Nov 24  2015 Anleitung
+drwxrwxrwt 2 root  root   4096 Nov 24  2015 hist
+drwxr-xr-x 2 root  root   4096 Nov 24  2015 info
+-rwxr-xr-x 1 root  root  20953 Nov 24  2015 kidsControl
+-rw-r--r-- 1 root  root    865 Nov 24  2015 kidsControl.ini
+-rw-r--r-- 1 root  root   1837 Nov 24  2015 Liesmich
+-rw-r--r-- 1 root  root    645 Nov 24  2015 Limits4Kids.csv
+-rwxr-xr-x 1 root  root    179 Nov 24  2015 Zeit-Kontrolle.desktop
+
+
+Hinweise zum Einsatz und Anpassung ans System im Skript oder unter:
+https://wiki.ubuntuusers.de/Howto/kidsControl
+
+Getestet unter Freetz m. BusyBox v1.23.2, auf FB 7490, Linux Mint 17.2 Cinnamon und Ubuntu 15.04 
+
+Anregungen oder Kritik an mo2mo auf Bitbucket:
+https://bitbucket.org/mo2mo/kidscontrol
+Version 1.42, 2015-11-24
+ 

+ 7 - 0
kc/Limits4Kids.csv

@@ -0,0 +1,7 @@
+Woche,LD,PD,TZ,WB,WG,Mo,Di,Mi,Do,Fr,Sa,So,Arbeitstage,Freitag,Samstag,Ferien
+Name1,ja,Fr,ja,So,690,100,90,80,70,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00
+Name2,ja,Fr,ja,So,690,100,90,80,70,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00
+Name3,--,So,--,So,690,100,90,80,70,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00
+Momo,--,--,--,Mo,690,100,90,80,70,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00
+Max,--,Sa,ja,So,690,100,90,80,70,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00
+Moritz,ja,So,ja,Mo,690,100,90,80,70,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00

+ 8 - 0
kc/Zeit-Kontrolle.desktop

@@ -0,0 +1,8 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=Application
+Name[de_DE]=Zeit-Kontrolle
+Comment[de]=Zuteilung und Kontrolle von PC-Zeiten
+Categories=System;
+Exec=sh /usr/local/kc/kidsControl
+

+ 6 - 0
kc/hist/2015_mo2mo_year.csv

@@ -0,0 +1,6 @@
+KW,Benutzer,Sitzungen,Verbrauch,Guthaben
+43,Moritz,5,138,492
+44,Moritz,11,148,482
+43,Momo,5,188,442
+44,Momo,12,270,360
+45,Moritz,5,114,576,

+ 1 - 0
kc/hist/43_max_week

@@ -0,0 +1 @@
+KW=43,Sitzungen=5,Verbrauch=138,Guthaben=492,

+ 1 - 0
kc/hist/43_momo_week

@@ -0,0 +1 @@
+KW=43,Sitzungen=5,Verbrauch=188,Guthaben=442,

+ 1 - 0
kc/hist/43_moritz_week

@@ -0,0 +1 @@
+KW=43,Sitzungen=5,Verbrauch=138,Guthaben=492,

+ 1 - 0
kc/hist/44_max_week

@@ -0,0 +1 @@
+KW=44,Sitzungen=11,Verbrauch=148,Guthaben=482,

+ 1 - 0
kc/hist/44_momo_week

@@ -0,0 +1 @@
+KW=44,Sitzungen=12,Verbrauch=270,Guthaben=360,

+ 1 - 0
kc/hist/44_moritz_week

@@ -0,0 +1 @@
+KW=44,Sitzungen=11,Verbrauch=148,Guthaben=482,

+ 2 - 0
kc/hist/45_max_20151103-ut

@@ -0,0 +1,2 @@
+3
+54

+ 1 - 0
kc/hist/45_max_20151105-ut

@@ -0,0 +1 @@
+50

+ 2 - 0
kc/hist/45_momo_20151103-ut

@@ -0,0 +1,2 @@
+23
+54

+ 5 - 0
kc/hist/45_momo_20151104-ut

@@ -0,0 +1,5 @@
+11
+18
+12
+5
+9

+ 4 - 0
kc/hist/45_momo_20151105-ut

@@ -0,0 +1,4 @@
+8
+10
+12
+24

+ 2 - 0
kc/hist/45_moritz_week

@@ -0,0 +1,2 @@
+KW,Benutzer,Sitzungen,Verbrauch,Guthaben,
+45,Moritz,5,114,576,

+ 1 - 0
kc/hist/46_momo_20151113-ut

@@ -0,0 +1 @@
+0

+ 12 - 0
kc/hist/46_moritz_20151113-ut

@@ -0,0 +1,12 @@
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0

BIN
kc/info/kidsControl_1_Start.png


BIN
kc/info/kidsControl_2_Start.png


BIN
kc/info/kidsControl_3_Start.png


BIN
kc/info/kidsControl_4_Start.png


+ 385 - 0
kc/kidsControl

@@ -0,0 +1,385 @@
+#! /bin/sh
+#
+#  "kidsControl" by mo2mo, Vers. 1.42, 2015-11-24
+#  Der Skript steht unter GNU General Public License (GPLv3). Hinweise dazu dort:
+#  http://www.gnu.de/documents/gpl.de.html
+#
+#  Der Skript "kidsControl" dient zur Begrenzung der Nutzungszeit der User. Er kann durch
+#  einen entsprechenden Aufruf im Ordner "/etc/xdg/autostart" gestartet oder besser, weil
+#  dann nicht vom Nutzer abschaltbar, durch einen Eintrag in der Datei ../PostLogin/Default.
+#  Die Idee zum Skript basiert auf "JueWe" im deutschen Forum von ubuntuusers.
+#
+#  Das Skript bietet die Möglichkeit, für verschiedene Nutzer täglich wechselnde Zeitlimits
+#  in Minuten und durch Uhrzeiten, zu denen unabhängig von der genutzten Zeit ausgeloggt wird.
+#  Diese Zeiten sind alle in einer einfachen Tabelle "Limits4Kids.csv" einzutragen. Das Skript
+#  prüft, welche Restriktion zuerst greift. Es sind verschiendene Zeit-Optionen möglich.
+#
+#  Mögliche Zusatzzeiten errechnen sich automatisch aus dem unverbrauchten Wochen-Limit.
+#  Diese wird unter Woche auf max. eines Tages-Limit begrenzt. Doch am pcDay kann, wenn
+#  während der Woche der PC nicht genutzt wurde, ein ganzes Wochen-Limit verbraucht werden.
+#  Der Sonntag ist im Skript der Tag mit dem max. möglichen Tages-Guthaben (s. "pcDay")
+#  Im Terminal kann durch "kidsControl test" ein Test-Modus gestartet werden.
+#
+#  Die abgelaufene Nutzungszeit wird täglich in eine neue Datei geschrieben, welche die Dauer
+#  der einzelnen Sitzungen des Tages festhält.
+#
+#  Beim Einloggen erzeugt das Skript "kidsControl" eine Datei "/tmp/$file_name" und schreibt
+#  in diese einen Zeitwert (in Sekunden seit 1970) hinein. Die Funktion "kc_consumed" fügt,
+#  darin, aufgerufen beim Ausloggen durch Eintrag in der Datei "/etc/../PostSession/Default",
+#  einen zweiten Zeitwert hinzu, liest die beiden Werte aus, berechnet die Sitzungsdauer in
+#  Minuten und schreibt diesen Wert dann in eine Datei "./hist/$file_name-ut".
+#
+#  Diese ut-Dateien werden für die Analyse der Nutzerzeiten benötigt. Die berechnete PC-Zeit
+#  wird genutzt, um vorherige Sitzungen des Nutzers am gleichen Tag zu berückschtigen sowie
+#  die Woche auszuwerten und eine Tages-Zusatzzeit zu berechnen. So kann "gesparte" Zeit an
+#  anderen Tagen der gleichen Woche zu nutzen werden.
+#
+#    Anregungen oder Kritik an mo2mo auf Bitbucket:
+#LNK https://bitbucket.org/mo2mo/kidscontrol
+#
+#
+#===============================================================================================
+### Funktionen
+#-----------------------------------------------------------------------------------------------
+
+# Die Anzahl der Minuten bis zum Logout-Zeitpunkt ermitteln
+kc_calc() {
+    Hnow="$(date +%H | sed -e 's/^0*//')" && [ -z "$Hnow" ] && Hnow=0				# Start-Stunden
+    Mnow="$(date +%M | sed -e 's/^0*//')" && [ -z "$Mnow" ] && Mnow=0				# Start-Minuten
+    Hanf="${UZanf%:*}" && [ -z $Hanf ] && Hanf=0						# PCanfangs-Stunde
+    Manf="${UZanf#*:}" && [ -z $Manf ] && Manf=0						# PCanfangs-Minuten
+    Hend="${UZend%:*}" && [ -z $Hend ] && Hend=0						# PCend-Stunde
+    Mend="${UZend#*:}" && [ -z $Mend ] && Mend=0						# PCend-Minuten
+    [ $ferr -ge 2 ] && echo "lgDay=$lgDay ud dwghCRDT=$dwghCRDT ud Hend=$Hend ud Mend=$Mend"
+    if [ "$lgDay" = "ja" ] && [ $dwghCRDT -gt 0 ] ; then
+	Htzz=$(($Hend+($Mend+$dwghCRDT)/60))
+	Mtzz=$(($Mend+$dwghCRDT-(($Mend+$dwghCRDT)/60)*60))
+	UHR="$Htzz:$Mtzz" && Hend="$Htzz" && Mend="$Mtzz"
+    else
+	UHR="$UZend"
+    fi
+    [ $ferr -ge 2 ] && echo UHR="$UHR ud Hend=$Hend ud Mend=$Mend"
+    MIN1="$((($Hnow - $Hanf) * 60 + $Mnow - $Manf))"						# Gesamt-Anfangs-Differenz in Minuten
+    MIN2="$((($Hend - $Hnow) * 60 + $Mend - $Mnow))"						# Gesamt-End-Differenz in Minuten
+    [ "$lgDay" = "ja" ] && MIN2=$(($MIN2 + $TZzit))						# abends länger "surfen"
+    MIN3=$(($MIN2 - 3))										# Gesamt-End-Differenz abzüglich 3 Minuten für den Count-Down
+    INFO="Hanf Manf Hnow Mnow Hend Mend MIN1 MIN2 MIN3"
+    [ $ferr -ge 2 ] && for i in $INFO; do echo "$i = $((${i}))"; done				# Zur Fehlersuche: Anzeige der berechneten Zahlenwerte
+    [ $MIN1 -lt 0 ] && kc_message "M2" && $line && sleep 5 && kc_logout				# ist Wert negativ = PC zu früh gestartet, PC wird ausgeloggt.
+    [ $MIN3 -lt 0 ] && kc_message "M9" && $line && sleep 2 && kc_logout shtdwn			# ist Wert negativ = PC-Zeit abgelaufen, PC wird ausgeschaltet.
+}
+
+# in laufender Sitzung verbrauchte Zeit ermitteln, Login-Versuche auswerten
+kc_consumed() {
+    echo "$(date +"%s")" >> /tmp/$file_name							# Zeit in Sekunden seit „1970-01-01 00:00:00 UTC“
+    kc_read "R4" "/tmp/$file_name" && echo "$read_DIF" >> ./hist/${file_name}-ut
+#NEW Auswerten der Dauer: 0= außerhalb von Tageszeit oder Guthaben; 1= Testlauf; 3<X = Sitzung?
+#NEW Zeitwerte aus "/tmp/$file_name" in lesbare Form umwandeln und in "_week" eintragen.
+    echo "UT   = $read_DIF min aktuell verbrauchte PC-Zeit" && $line				# in aktueller Sitzung verbrauchte PC-Zeit in Minuten
+}
+
+#  Anfangs-, Endzeit, Wochenlimit, PC-Day und longDay in der Datei "Limits4Kids.csv" und	# Bearbeitung ist mit jedem calc-Programm (LibreOffice) möglich
+#  die jeweilige Nutzer nach diesem Muster anlegen:
+#
+# Woche,LD,PD,TZ,WB, WG,Mo,Di,Mi,Do, Fr, Sa, So,Arbeitstage,   Freitag,    Samstag,    Ferien,
+# Name1,ja,Fr,ja,Mo,690,90,80,70,60,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00,
+# Name2,ja,Fr,--,So,690,90,80,70,60,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00,
+# Name3,--,So,ja,Mo,690,90,80,70,60,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00,
+#  Momo,ja,Fr,ja,So,630,90,80,70,60,120,130,100,10:00-19:30,11:00-21:00,12:00-22:00,08:00-22:00,
+##COL=1; 2; 3; 4; 5;  6; 7; 8; 9;10; 11; 12; 13;    14;         15;         16;         17;
+
+# Limits für den Nutzer abhängig vom Wochentag ermitteln
+kc_limit() {
+    echo "$(date +"%s")" > /tmp/$file_name							# Zeit in Sekunden seit „1970-01-01 00:00:00 UTC“
+    kc_read "R1" "$Name" "1" "UR"
+    if [ -z "$read_COL" ] ; then kc_message "M10"  ; exit ; fi 					# UR: Benutzer fehlt in Konfigurations-Datei.conf
+    kc_read "R1" "$Name" "2" "LD" && [ "$read_COL" = "ja" ] && lgDay="$read_COL" || lgDay=nein	# LD: abends länger surfen
+    kc_read "R1" "$Name" "3" "PD" && pcDay="$read_COL"						# PD: PC-Day = Tag mit max. Guthaben
+    kc_read "R1" "$Name" "4" "TZ" && [ "$read_COL" = "ja" ] && TZzit="$read_COL" || TZzit=nein	# TZ: Tages-Zusatzzeit, ja oder --
+    kc_read "R1" "$Name" "5" "WB" && WBday="$read_COL" && [ -z $WBday ] && WBday=So		# WB: Wochenbeginn, So oder Mo
+    kc_read "R1" "$Name" "6" "WG" &&  WEEK="$read_COL" && CZ="$COLzahl"				# WG: Wochen-Limit in Minuten
+    echo "WBday = Wochenbeginn: -$WBday-"
+    for i in $(date +%u) ; do
+	[ $ferr -gt 1 ] && echo "Wochentag --$i--"
+	COL=$(($CZ+$i)) && kc_read "R1" "$Name" "$COL" "Limit" && LIMIT="$read_COL"		# Zeit-Limit pro Wochentag
+	echo "LIMIT = Tages-Limit : $LIMIT min"							# Tages-Limit in Minuten
+	[ ! -z "$pcDay" ] && kc_read "R1" "Woche" "$COL" "WT" || dayZl=6			# PC-Day: COL11 = Samstag oder dayZl=6
+        [ $ferr -gt 1 ]   && echo "Zeile-97: [ $pcDay = $read_COL ] ud dayZl="$i" od dayZl=0" 	# Fehler-Anzeige
+	[ $pcDay = $read_COL ] && dayZl="$i" || dayZl=0						# pcDay=aktueller Wochentag oder nicht
+	[ $ferr -gt 1 ] && echo "Si=$i ud COL=$COL ud CZ=$CZ"
+	if [ "${WBday}" = "Mo" ] ; then								# Mo = WT= Mo-Fr = die "normale" Woche
+	     [ $i -le 5 ] && COL=$(($CZ+8))							# Zeit-Fenster für Wochentage: WT=$CZ+8; Mo-Fr
+	     [ $i -eq 6 ] && COL=$(($CZ+9)) || ( [ $i -eq 7 ] && COL=$(($CZ+10)) )		# Zeit-Fenster fürs WochenEnde: Sa=$CZ+9; So=$CZ+10
+	     [ $ferr -gt 1 ] && echo "Zeile-103: Si=$i ud COL=$COL ud CZ=$CZ - Mo"	
+	else											# So = Tag, nach dem es an fünf Folgetagen früh raus geht.
+	     [ $i -le 4 ] && COL=$(($CZ+8)) || ( [ $i -eq 7 ] && COL=$(($CZ+8))  )		# Zeit-Fenster für Wochentage: WT=$CZ+8; So-Do
+	     [ $i -eq 5 ] && COL=$(($CZ+9)) || ( [ $i -eq 6 ] && COL=$(($CZ+10)) )		# Zeit-Fenster fürs WochenEnde: Fr=$CZ+9; Sa=$CZ+10
+	     [ $ferr -gt 1 ] && echo "Zeile-107: Si=$i ud COL=$COL ud CZ=$CZ - So"
+	fi
+	kc_read "R1" "$Name" "$COL" && LIM="$read_COL"						# Wochen-Guthaben
+    done
+#NEW  Ferien-Zeiten aus dem Internet?								# Zeit-Fenster für Ferientage: FT=$CZ+11
+    UZanf=${LIM%-*} && echo "UZanf = Beginn: $UZanf Uhr"					# Startzeit, z.B.: 10:00 Uhr
+    UZend=${LIM#*-} && echo "UZend =   Ende: $UZend Uhr"					#  End-Zeit, z.B.: 20:30 Uhr
+    echo "pcDay = PC-Day: -${pcDay}-"								# PC-Day
+    echo "WEEK  = Wochenguthaben: $WEEK min"
+    echo "lgDay = PC später aus : $lgDay"
+}
+
+# Log-out oder PC abschalten - Aktionen, die im eigenen Linux anders sind, bitte oben anpassen!
+kc_logout() {
+    if [ -z "$DESKTOP_SESSION" ] ; then
+	DESK="\"$HN\", Desktop unbekannt"
+    else
+	kc_replace "$DESKTOP_SESSION" && DESK="\"$HN\" mit \"${RP}\"-Desktop"
+    fi
+    if [ "$1" =  "shtdwn" ] ; then
+	echo "Starte Abschalten für Computer $DESK"
+	[ ! $ferr -ge 1 ] && `$PC_down`
+    else
+	echo "Starte Log-out für Computer $DESK"
+    	[ ! $ferr -ge 1 ] && `$log_Out`
+    fi
+    exit
+}
+
+# Definitionen und Versand der Nachrichten - Inhalte dem Nutzeralter entsprechend anpassen ;-)
+kc_message() {
+    for i in $1; do
+	case "$i" in
+	   M0a) Mx="$Name, $sessINFO"							   ;;
+	   M0b) Mx="Du hast Deinen Rechner bereits $UT Minuten genutzt."		   ;;
+	    M1) Ma="Deine Rechnerzeit für heute"
+		[ $AT -gt 0 ] && Mx="${Ma} beträgt insgesamt" || Mx="${Ma} beträgt"
+		[ $AT -gt 0 ] || [ $UT -gt 0 ] && Mx="Deshalb hast Du heute noch"
+		Mx="$Mx $PCtime Minuten."						   ;;
+	    M2) Mx="$Name, Du bist zu früh! Deine PC-Zeit beginnt um $UZanf Uhr."	   ;;
+	    M3) Mx="$Name, das Ende naht. Du hast noch drei Minuten."			   ;;
+	    M4) Mx="$Name, jetzt ist aus die Maus. Schließe Deine offenen Dateien."	   ;;
+	    M5) Mx="Du wirst jetzt abgemeldet. Bis morgen!"				   ;;
+	    M6) Mx="$Name, Du hast für heute $AT Minuten zusätzlich bekommen."		   ;;
+	    M7) Mx="$Name, heute ist spätestens um $UHR Uhr der PC aus."		   ;;
+	    M8) Mx="Du hast diese Woche genug am PC gespielt. Ab Montag gibt's neue Zeit!" ;;
+	    M9) Mx="Deine Zeit für heute ist aus. Du wirst jetzt abgemeldet. Bis morgen!"  ;;
+	   M10) Mx="Benutzer $Name muss in der Konfig-Datei noch anlegt werden."	   ;;
+	   M11) Mx="Die Datei $(basename $0).ini\" wurde nicht gefunden."		   ;;
+	esac
+	`$message "$timePic" "$Mx"`; MN=$?							# Programm und Bild s. "kidsControl.ini" 
+	[ $MN -ge 1 ] && (echo "Desk-Info-$1: $Mx" ; $line)	
+    done
+}
+
+# Not-Schalter, Mutti-Freigabe
+kc_parents() {
+#NEW Not-Schalter
+    echo "Mutti-Freigabe"
+}
+
+# Unterfunktion zum Auslesen der Tabellen
+kc_read() {
+    read_COL=; read_SUM=;
+    case "$1" in
+	R1) L4K="Limits4Kids.csv"
+	    read_COL=$(awk -F',' -v name=$2 -v col=$3 'match($1,name) {print $col}' "$L4K")	# Werte für Benutzer aus der Konfig-Tabelle einlesen
+	    read_COL=$(echo $read_COL | sed 's/ //')
+	    ;;
+	R2) read_SUM=$(awk '{ sum += $0 } END { printf sum }' "$2")				# Summe bilden
+	    ;;
+	R3) read_SUM=$(awk -F',' -v name=$2 -v col=$3 'match($2,name) NR>1 {summe += $col
+		} END {
+	    print summe}' "$4")									# Summe einer bestimmten Spalte bilden
+	    ;;
+	R4) read_DIF=$(awk '{getline n; printf "%.0f\n", (n - $0)/60}' $2)			# Differenz, (Zeile 1 minus Zeile 2) geteilt durch 60 = min
+	    ;;
+    esac
+    [ -z $read_SUM ] && INFO="$read_COL" || INFO="${read_COL}\" u. SUM: \"$read_SUM"
+    [ $ferr -gt 1 ]  && echo "read-$4, COL$3: \"${INFO}\"" && COLzahl="$3" || COLzahl="$3"	#LNK https://wiki.ubuntuusers.de/awk#Spalten-ausgeben
+}
+
+# 1. Buchstabe groß
+kc_replace() {
+    RP="$(echo $(echo $1|cut -c1|tr [a-z] [A-Z];echo $1|cut -c2-)|sed 's/ //')"			# läuft auch auf einem Router
+}
+
+# Bereits genutzte PC-Zeit aus Datei ermitteln
+kc_residual() {
+    UT=0 && datName="./hist/${file_name}-ut"
+    [ -f ${datName} ] && kc_read "R2" "$datName" && UT="$read_SUM"
+    echo "UT   = $UT min = bereits verbrauchte PC-Zeit" && $line				# insgesamt verbrauchte PC-Zeit in Minuten
+}
+
+# Anzahl der heutigen Sitzungen.
+kc_sess() {
+    [ -z "$1" ] && file_sess="./hist/$file_name-ut" || file_sess="$1"
+    [ ! -f ${file_sess} ] && sessZahl=0 || sessZahl=$(cat ${file_sess} | wc -l)
+    [ $sessZahl -gt 1 ] && szl=2 || szl=$sessZahl
+#NEW Aanzahl der 0-Sitzungen = test separat zählen
+    case "$szl" in
+	0) sessINFO="dies ist heute Deine erste Sitzung."		;;
+	1) sessINFO="Du hattest heute schon eine Sitzung."		;;
+	2) sessINFO="Du hattest heute schon $sessZahl Sitzungen."	;;
+    esac
+    [ -z "$1" ] && kc_message "M0a"								# Programm und Bild s. "kidsControl.ini"
+}
+
+# PC--Nutzungs-Zeit in Abhängigkeit von End-, verbrauchter und Zusatz-Zeit
+kc_time() {
+    PCtime="$(($LIMIT  + $AT - $UT))"								# PC-Zeit in Minuten = Limit + Zusatz - verbrauchter Zeit
+    [ $UT -gt 0 ] && kc_message "M0b"								# Anzeige der bereits verbrauchten PC-Zeit
+    if [ $MIN2 -lt $PCtime ] ; then
+	PCtime="$MIN3"										# PC-Zeit in Minuten bis End-Zeit
+        [ $AT -gt 0 ] && kc_message "M6 M7"
+    else
+	if [ $MIN2 -gt $PCtime ] && [ $(($LIMIT + $AT)) -gt $(($UT + 1)) ] ; then
+	    [ $AT -gt 0 ] && kc_message "M6 M1 M7" || kc_message "M1"				# Info-Anzeige zur PC-Zeit: M6, M1 und M7 oder M1
+	else
+	    kc_message "M9"									# Info-Anzeige zur PC-Zeit: M9; Zeit bereits abgelaufen
+	    kc_logout										# PC wird ausgeloggt
+	fi
+    fi
+    echo "PC-Freigabe für $PCtime min, max. bis $UHR Uhr" && $line				# max. mögliche PC-Zeit in min und Uhrzeit
+    [ $ferr -ge 1 ] && sleep 10 || sleep ${PCtime}m
+}
+
+# Programm-Variable aus kidsControl.ini einlesen						Anpassung in der ini.-Datei vornehmen!
+kc_variable() {
+#NEW  "session / desktop" automatisch finden, zwecks Wahl des richtigen Logout-Kommandos
+    if [ -f "$0.ini" ] ; then
+	# 'INFO="PC_down log_Out message timePic" && for i in $INFO; do echo "$i" ; done'
+	PC_down=$(grep -m1 "PC_down" "$0.ini" | cut -d= -f2)					# Abschalten, s. Funktion "kc_logout"
+	log_Out=$(grep -m1 "log_Out" "$0.ini" | cut -d= -f2)					# Ausloggen, s. dito.
+	message=$(grep -m1 "message" "$0.ini" | cut -d= -f2)					# Desktop-Nachrichten s. "kc_message" 
+	timePic=$(grep -m1 "timePic" "$0.ini" | cut -d= -f2)					# Nachrichten-Bild, s. dito
+    else
+	echo "Die Datei \"$0.ini\" wurde nicht gefunden."
+	kc_message "M11" && exit
+    fi
+}
+
+# Warnungen kurz vor Ende der Nutzungs-Zeit
+kc_warn() {
+    kc_message "M3"
+    echo "Warn1: $Mx" && [ $ferr -ge 1 ] && sleep 2 || sleep 2m
+    kc_message "M4"
+    echo "Warn2: $Mx" && [ $ferr -ge 1 ] && sleep 2 || sleep 55
+    kc_message "M5"
+    echo "Warn3: $Mx" && [ $ferr -ge 1 ] && sleep 2 || sleep 5
+}
+
+# Auswertung der Nutzungsdauer aller Sitzungen einer Woche
+kc_week() {
+    anz=0; dwghCRDT=0; maxCREDT=0; kw=$(date +%V); kw1=0; nr=0; weekVRBR=0; ws=0		# Variable vorbelegen
+    file_heat="KW,Benutzer,Sitzungen,Verbrauch,Guthaben,"
+    file_year="./hist/$(date +%G)_${HN}_year.csv" && FY="$file_year"				# Name der Jahres-Tabelle: "Jahr_PC-Name_year.csv"
+    kc_read "R3" "$Name" "5" "$FY" && SY=$read_SUM						# Addieren der Guthaben-Spalte pro Nutzer
+    [ ! -z $SY ] && dwghCRDT=$(($SY / $(grep -ic "$Name" "$FY") * $LIMIT / $WEEK))		# Tages-Zusatz, ermittelt dem Durchschnitt der Wochen-Guthaben
+    var_d=$(date --help|grep -m1 univer) 2> /dev/null && [ $? -eq 0 ] &&var_d=||var_d="0000.00"	# Checken, ob Datei-Datum zu modifizieren ist  
+    if [ ! "$TZzit" = "ja" ] ; then
+	echo "TZzit = Tages-Zuschlag: gesperrt" && TZzit=0 && $line
+    else
+	echo "TZzit = $dwghCRDT min Tages-Zuschlag" && TZzit=$dwghCRDT && $line
+    fi
+    for i in ./hist/*_$USER*-ut ; do
+	[ $ferr -gt 1 ] && echo "Si : --$i"--
+	[ "$i" = "./hist/*_$USER*-ut" ] && break						# gibt's vom Nutzer ut-Dateien?
+	kw=${i%%_*} && kw=${kw##*/}
+	[ $ferr -gt 1 ] && echo "Zeile-265: kw = --$kw--"
+	[ $(date +%V) -ne $kw ] && MELD="einer vergangenen" || MELD="der aktuellen"
+	if [ $kw1 -ne $kw ] && [ $kw1 -ne 0 ] ; then
+	    if [ $(date +%V) -ne $kw1 ] ; then
+		file_turn="$kw1,$Name,$weekSESS,$weekVRBR,$weekCRDT,"
+		kc_year	"$FW" "$FY"								# Erstellen von Einträgen in der Wochen- und Jahres-Tabelle
+	    fi
+	    ws=0 && weekVRBR=0 
+	fi
+	[ $ferr -gt 1 ] && echo "1--$kw--"
+	nr=$(($nr + 1 ))
+	ws=$(($ws + 1 ))
+        for j in ./hist/${kw}_${USER}_*-ut ; do
+	    while true; do
+		file_week="${kw}_${USER}_week" && FW="$file_week"				# Name der Wochen-Tabelle: "Kalenderwoche_Nutzer_week"
+		[ -f ./hist/${file_week} ] && break						# Wochen-Auswertung bereits vorhanden
+		[ $ws -eq 1 ] && echo "---- Berechnung $MELD Woche ----"
+		anz=$(($anz + 1 ))
+		[ $ferr -gt 1 ] && echo "Nr.$anz = $i"						# Anzahl aller ut-Dateien des Nutzers
+		var_i=$(echo ${i##*_} | cut -d- -f1)${var_d}
+		[ $ferr -gt 1 ] && echo "var_i=${var_i}"
+		echo "ws   = ${ws}. PC-Nutzungstag der Woche: $(date -d "${var_i}" +%d.%m.%Y)"	# Datum des Nutzungstag in der Woche anzeigen
+		[  -f "$i" ] && kc_read "R2" "$i" && UT="$read_SUM" || break
+		kc_sess "$i"
+		weekSESS=$(($weekSESS + $sessZahl))
+		weekVRBR=$(($weekVRBR + $UT ))
+		weekCRDT=$(($WEEK - $weekVRBR ))
+		maxCREDT=$(($weekCRDT / (8 / $(date +%u)) - ($LIMIT * (8 - $(date +%u)))))
+		echo "Dses = $sessZahl x am Tag am PC gesessen."
+		echo "UT   = $UT min am Tag den PC benutzt."
+		echo "mxPd = $maxCREDT min max. Guthaben für PC-Day"				# Das Guthaben wird vor der 1. Tages-Sitzung gutgeschrieben
+		echo "Dwgh = $dwghCRDT min Tages-Zusatz im Wochen-Durchschnitt"			# Berechnung aus Jahresliste
+		echo "Wses = $weekSESS x in der Woche am PC gesessen."
+		echo "Wvbr = $weekVRBR min in der Woche den PC benutzt."
+		echo "Wgth = $weekCRDT min Wochen-Rest-Guthaben" && $line
+		#echo "[ "$(date +%u)" -eq "$dayZl" ] ud maxCREDT=$maxCREDT od maxCREDT=$TZzit"
+		[ "$(date +%u)" -eq "$dayZl" ] && maxCREDT=$maxCREDT || maxCREDT=$TZzit		# Zusatz-Guthaben in Abhängigkeit vom PC-Day
+	        [ $ferr -gt 1 ] && echo "Zeile-301: [ $(date +%V) -eq $kw ] und break"
+		[ $(date +%V) -eq $kw ] && break
+		break
+	    done
+	    [ $ferr -gt 1 ] && echo "Zeile-305: [ $nr -eq 1 ] und nr=0 + kw1="$kw" und break"
+	    [ $nr -eq 1 ] && nr=0 && kw1="$kw" && break
+	done
+	[ $ferr -gt 1 ] && echo "Zeile-307: kw1 = --$kw1--"
+    done
+    [ $ferr -gt 1 ] && echo "Zeile-309: [ $(date +%V) -eq $kw ] und AT=$maxCREDT"
+    [ $(date +%V) -eq $kw ] && AT=$maxCREDT || AT=0						# Zusatz-Guthaben
+#NEW Zusatz-Zeit übers Home-Netz // Internet // Cloud?
+    echo "AT   = $AT min = zusätzliche PC-Zeit"							# zusätzliche PC-Zeit für den Tag in Minuten
+}
+
+# Jahres- und Wochen-Tabellen, als Unter-Funktion von "kc_week", erstellen
+kc_year() {
+    [ $ferr -gt 1 ] && echo "Zeile-317: --$1-- und --$2--"
+    for i in $1; do
+	[ -f "./hist/$1" ] && break								# Abbruch, wenn Wochen-Tabelle vorhanden
+	echo "$file_heat" >  "./hist/$1"							# Erstellen einer Wochen-Tabelle mit den
+	echo "$file_turn" >> "./hist/$1"							# Werten der bereits abgelaufenen Woche
+	if [ ! -f "$2" ] ; then
+	    echo "$file_heat" >  "$2"								# Erstellen einer neuen Jahres-Tabelle
+	    echo "$file_turn" >> "$2"								# Befüllen einer vorhandenen Jahres-Tabelle
+	else											# mit den Werten der abgelaufenen Woche(n)
+	    echo "$file_turn" >> "$2"								# dito.
+	fi
+	find . -name ${kw1}_${USER}*-ut -exec rm {} \;						# Löschen der ausgewerteten ut-Dateien (Taginfo)
+    done
+}
+
+#===============================================================================================
+### main
+#-----------------------------------------------------------------------------------------------
+# preparing script
+kc_variable											# Skript-Variable aus "kidsControl.ini" einlesen
+    [ "$1" = "test" ] && [ ! -z "$2" ] && USER="$2" && HN=mo2mo || HN=$(hostname -s)		# Test-User : momo, max oder moritz und hostName=mo2mo
+  file_name=$(date +%V)_${USER}_$(date +%Y%m%d)							# Datei-Name: Kalenderwoche_Nutzer_Tagesdatum
+kc_replace "$USER" && Name="$RP"								# Nutzername: 1. Buchstabe groß
+ if [ "$1" = "test" ] ; then
+    ferr=1 && find /tmp/ -type f -name $file_name* -exec rm {} \; 2> /dev/null			# Im Test-Modus werden beim Start die tmp-Dateien gelöscht
+    [ "$3" = "deep" ] && ferr=2
+    kc_replace "$3$1" && echo "Start = $(date); $RP mit Nutzer $Name"				# Datum komplett und Nutzer mit Testmodi anzeigen
+else
+    ferr=0
+fi
+# script at work
+cd $(dirname $0)  && line="echo -------------------------------------------"			# In den Ordner wechseln, in dem sich der Skript befindet.
+if [ "$1" = "out" ] ; then	## out = Nutzer meldet sich ab
+    kc_consumed			#   Dauer der aktuellen Sitzung berechnen
+else				## Nutzer hat sich angemeldet
+    kc_limit			#   Limits ermitteln
+    kc_week			#   PC-Woche auswerten und Zusatz-Zeit berechnen
+    kc_calc			#   Zeiten berechnen
+    kc_residual			#   bereits verbrauchte PC-Zeit ermitteln
+    kc_sess			#   Anzahl der Sitzungen
+    kc_time			#   max. mögliche PC-Zeit
+    kc_warn			#   Warnung vor dem Ende
+    kc_consumed			#   Dauer der aktuellen Sitzung berechnen
+    kc_logout shtdwn		#   Ausloggen des Nutzers oder Ausschalten des PC
+fi
+### END

+ 22 - 0
kc/kidsControl.ini

@@ -0,0 +1,22 @@
+#  Dateiname: "kidsControl.ini"
+#  Dient zur Systemanpassung für den Skript "kidsControl" von mo2mo
+
+#  Bei Bedarf oder Notwendigkeit anpassen
+## Es  wird jeweils der erste Eintrag zu jeder Variablen verwendet!
+
+# Log-Out für Gnome-Desktops wie Linux Mint Cinnamon
+log_Out=gnome-session-quit --logout --no-prompt  	
+
+# Log-Out für xfce-Desktops
+#log_Out=xfce4-session-logout --logout
+
+# Nachrichten-Anzeigedienst für den Desktop
+message=notify-send -t 5000 -i
+## 5000 = Anzeigedauer der Nachricht in Millisek. = 5 s 
+
+# Abschalten für Ubuntu u.ä. Linux-Systeme, dazu muss eine System-Datei angepasst werden						
+# s. Link: http://wiki.ubuntuusers.de/herunterfahren#Herunterfahren-per-Terminal
+PC_down=sudo shutdown -P now
+
+# Pfad zum Anzeigebild für die Desktop-Nachrichten von "kidsControl"
+timePic=/usr/share/icons/gnome/48x48/status/appointment-soon.png