kidsControl 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. #! /bin/sh
  2. #
  3. # "kidsControl" by mo2mo, Vers. 1.42, 2015-11-24
  4. # Der Skript steht unter GNU General Public License (GPLv3). Hinweise dazu dort:
  5. # http://www.gnu.de/documents/gpl.de.html
  6. #
  7. # Der Skript "kidsControl" dient zur Begrenzung der Nutzungszeit der User. Er kann durch
  8. # einen entsprechenden Aufruf im Ordner "/etc/xdg/autostart" gestartet oder besser, weil
  9. # dann nicht vom Nutzer abschaltbar, durch einen Eintrag in der Datei ../PostLogin/Default.
  10. # Die Idee zum Skript basiert auf "JueWe" im deutschen Forum von ubuntuusers.
  11. #
  12. # Das Skript bietet die Möglichkeit, für verschiedene Nutzer täglich wechselnde Zeitlimits
  13. # in Minuten und durch Uhrzeiten, zu denen unabhängig von der genutzten Zeit ausgeloggt wird.
  14. # Diese Zeiten sind alle in einer einfachen Tabelle "Limits4Kids.csv" einzutragen. Das Skript
  15. # prüft, welche Restriktion zuerst greift. Es sind verschiendene Zeit-Optionen möglich.
  16. #
  17. # Mögliche Zusatzzeiten errechnen sich automatisch aus dem unverbrauchten Wochen-Limit.
  18. # Diese wird unter Woche auf max. eines Tages-Limit begrenzt. Doch am pcDay kann, wenn
  19. # während der Woche der PC nicht genutzt wurde, ein ganzes Wochen-Limit verbraucht werden.
  20. # Der Sonntag ist im Skript der Tag mit dem max. möglichen Tages-Guthaben (s. "pcDay")
  21. # Im Terminal kann durch "kidsControl test" ein Test-Modus gestartet werden.
  22. #
  23. # Die abgelaufene Nutzungszeit wird täglich in eine neue Datei geschrieben, welche die Dauer
  24. # der einzelnen Sitzungen des Tages festhält.
  25. #
  26. # Beim Einloggen erzeugt das Skript "kidsControl" eine Datei "/tmp/$file_name" und schreibt
  27. # in diese einen Zeitwert (in Sekunden seit 1970) hinein. Die Funktion "kc_consumed" fügt,
  28. # darin, aufgerufen beim Ausloggen durch Eintrag in der Datei "/etc/../PostSession/Default",
  29. # einen zweiten Zeitwert hinzu, liest die beiden Werte aus, berechnet die Sitzungsdauer in
  30. # Minuten und schreibt diesen Wert dann in eine Datei "./hist/$file_name-ut".
  31. #
  32. # Diese ut-Dateien werden für die Analyse der Nutzerzeiten benötigt. Die berechnete PC-Zeit
  33. # wird genutzt, um vorherige Sitzungen des Nutzers am gleichen Tag zu berückschtigen sowie
  34. # die Woche auszuwerten und eine Tages-Zusatzzeit zu berechnen. So kann "gesparte" Zeit an
  35. # anderen Tagen der gleichen Woche zu nutzen werden.
  36. #
  37. # Anregungen oder Kritik an mo2mo auf Bitbucket:
  38. #LNK https://bitbucket.org/mo2mo/kidscontrol
  39. #
  40. #
  41. #===============================================================================================
  42. ### Funktionen
  43. #-----------------------------------------------------------------------------------------------
  44. # Die Anzahl der Minuten bis zum Logout-Zeitpunkt ermitteln
  45. kc_calc() {
  46. Hnow="$(date +%H | sed -e 's/^0*//')" && [ -z "$Hnow" ] && Hnow=0 # Start-Stunden
  47. Mnow="$(date +%M | sed -e 's/^0*//')" && [ -z "$Mnow" ] && Mnow=0 # Start-Minuten
  48. Hanf="${UZanf%:*}" && [ -z $Hanf ] && Hanf=0 # PCanfangs-Stunde
  49. Manf="${UZanf#*:}" && [ -z $Manf ] && Manf=0 # PCanfangs-Minuten
  50. Hend="${UZend%:*}" && [ -z $Hend ] && Hend=0 # PCend-Stunde
  51. Mend="${UZend#*:}" && [ -z $Mend ] && Mend=0 # PCend-Minuten
  52. [ $ferr -ge 2 ] && echo "lgDay=$lgDay ud dwghCRDT=$dwghCRDT ud Hend=$Hend ud Mend=$Mend"
  53. if [ "$lgDay" = "ja" ] && [ $dwghCRDT -gt 0 ] ; then
  54. Htzz=$(($Hend+($Mend+$dwghCRDT)/60))
  55. Mtzz=$(($Mend+$dwghCRDT-(($Mend+$dwghCRDT)/60)*60))
  56. UHR="$Htzz:$Mtzz" && Hend="$Htzz" && Mend="$Mtzz"
  57. else
  58. UHR="$UZend"
  59. fi
  60. [ $ferr -ge 2 ] && echo UHR="$UHR ud Hend=$Hend ud Mend=$Mend"
  61. MIN1="$((($Hnow - $Hanf) * 60 + $Mnow - $Manf))" # Gesamt-Anfangs-Differenz in Minuten
  62. MIN2="$((($Hend - $Hnow) * 60 + $Mend - $Mnow))" # Gesamt-End-Differenz in Minuten
  63. [ "$lgDay" = "ja" ] && MIN2=$(($MIN2 + $TZzit)) # abends länger "surfen"
  64. MIN3=$(($MIN2 - 3)) # Gesamt-End-Differenz abzüglich 3 Minuten für den Count-Down
  65. INFO="Hanf Manf Hnow Mnow Hend Mend MIN1 MIN2 MIN3"
  66. [ $ferr -ge 2 ] && for i in $INFO; do echo "$i = $((${i}))"; done # Zur Fehlersuche: Anzeige der berechneten Zahlenwerte
  67. [ $MIN1 -lt 0 ] && kc_message "M2" && $line && sleep 5 && kc_logout # ist Wert negativ = PC zu früh gestartet, PC wird ausgeloggt.
  68. [ $MIN3 -lt 0 ] && kc_message "M9" && $line && sleep 2 && kc_logout shtdwn # ist Wert negativ = PC-Zeit abgelaufen, PC wird ausgeschaltet.
  69. }
  70. # in laufender Sitzung verbrauchte Zeit ermitteln, Login-Versuche auswerten
  71. kc_consumed() {
  72. echo "$(date +"%s")" >> /tmp/$file_name # Zeit in Sekunden seit „1970-01-01 00:00:00 UTC“
  73. kc_read "R4" "/tmp/$file_name" && echo "$read_DIF" >> ./hist/${file_name}-ut
  74. #NEW Auswerten der Dauer: 0= außerhalb von Tageszeit oder Guthaben; 1= Testlauf; 3<X = Sitzung?
  75. #NEW Zeitwerte aus "/tmp/$file_name" in lesbare Form umwandeln und in "_week" eintragen.
  76. echo "UT = $read_DIF min aktuell verbrauchte PC-Zeit" && $line # in aktueller Sitzung verbrauchte PC-Zeit in Minuten
  77. }
  78. # Anfangs-, Endzeit, Wochenlimit, PC-Day und longDay in der Datei "Limits4Kids.csv" und # Bearbeitung ist mit jedem calc-Programm (LibreOffice) möglich
  79. # die jeweilige Nutzer nach diesem Muster anlegen:
  80. #
  81. # Woche,LD,PD,TZ,WB, WG,Mo,Di,Mi,Do, Fr, Sa, So,Arbeitstage, Freitag, Samstag, Ferien,
  82. # 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,
  83. # 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,
  84. # 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,
  85. # 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,
  86. ##COL=1; 2; 3; 4; 5; 6; 7; 8; 9;10; 11; 12; 13; 14; 15; 16; 17;
  87. # Limits für den Nutzer abhängig vom Wochentag ermitteln
  88. kc_limit() {
  89. echo "$(date +"%s")" > /tmp/$file_name # Zeit in Sekunden seit „1970-01-01 00:00:00 UTC“
  90. kc_read "R1" "$Name" "1" "UR"
  91. if [ -z "$read_COL" ] ; then kc_message "M10" ; exit ; fi # UR: Benutzer fehlt in Konfigurations-Datei.conf
  92. kc_read "R1" "$Name" "2" "LD" && [ "$read_COL" = "ja" ] && lgDay="$read_COL" || lgDay=nein # LD: abends länger surfen
  93. kc_read "R1" "$Name" "3" "PD" && pcDay="$read_COL" # PD: PC-Day = Tag mit max. Guthaben
  94. kc_read "R1" "$Name" "4" "TZ" && [ "$read_COL" = "ja" ] && TZzit="$read_COL" || TZzit=nein # TZ: Tages-Zusatzzeit, ja oder --
  95. kc_read "R1" "$Name" "5" "WB" && WBday="$read_COL" && [ -z $WBday ] && WBday=So # WB: Wochenbeginn, So oder Mo
  96. kc_read "R1" "$Name" "6" "WG" && WEEK="$read_COL" && CZ="$COLzahl" # WG: Wochen-Limit in Minuten
  97. echo "WBday = Wochenbeginn: -$WBday-"
  98. for i in $(date +%u) ; do
  99. [ $ferr -gt 1 ] && echo "Wochentag --$i--"
  100. COL=$(($CZ+$i)) && kc_read "R1" "$Name" "$COL" "Limit" && LIMIT="$read_COL" # Zeit-Limit pro Wochentag
  101. echo "LIMIT = Tages-Limit : $LIMIT min" # Tages-Limit in Minuten
  102. [ ! -z "$pcDay" ] && kc_read "R1" "Woche" "$COL" "WT" || dayZl=6 # PC-Day: COL11 = Samstag oder dayZl=6
  103. [ $ferr -gt 1 ] && echo "Zeile-97: [ $pcDay = $read_COL ] ud dayZl="$i" od dayZl=0" # Fehler-Anzeige
  104. [ $pcDay = $read_COL ] && dayZl="$i" || dayZl=0 # pcDay=aktueller Wochentag oder nicht
  105. [ $ferr -gt 1 ] && echo "Si=$i ud COL=$COL ud CZ=$CZ"
  106. if [ "${WBday}" = "Mo" ] ; then # Mo = WT= Mo-Fr = die "normale" Woche
  107. [ $i -le 5 ] && COL=$(($CZ+8)) # Zeit-Fenster für Wochentage: WT=$CZ+8; Mo-Fr
  108. [ $i -eq 6 ] && COL=$(($CZ+9)) || ( [ $i -eq 7 ] && COL=$(($CZ+10)) ) # Zeit-Fenster fürs WochenEnde: Sa=$CZ+9; So=$CZ+10
  109. [ $ferr -gt 1 ] && echo "Zeile-103: Si=$i ud COL=$COL ud CZ=$CZ - Mo"
  110. else # So = Tag, nach dem es an fünf Folgetagen früh raus geht.
  111. [ $i -le 4 ] && COL=$(($CZ+8)) || ( [ $i -eq 7 ] && COL=$(($CZ+8)) ) # Zeit-Fenster für Wochentage: WT=$CZ+8; So-Do
  112. [ $i -eq 5 ] && COL=$(($CZ+9)) || ( [ $i -eq 6 ] && COL=$(($CZ+10)) ) # Zeit-Fenster fürs WochenEnde: Fr=$CZ+9; Sa=$CZ+10
  113. [ $ferr -gt 1 ] && echo "Zeile-107: Si=$i ud COL=$COL ud CZ=$CZ - So"
  114. fi
  115. kc_read "R1" "$Name" "$COL" && LIM="$read_COL" # Wochen-Guthaben
  116. done
  117. #NEW Ferien-Zeiten aus dem Internet? # Zeit-Fenster für Ferientage: FT=$CZ+11
  118. UZanf=${LIM%-*} && echo "UZanf = Beginn: $UZanf Uhr" # Startzeit, z.B.: 10:00 Uhr
  119. UZend=${LIM#*-} && echo "UZend = Ende: $UZend Uhr" # End-Zeit, z.B.: 20:30 Uhr
  120. echo "pcDay = PC-Day: -${pcDay}-" # PC-Day
  121. echo "WEEK = Wochenguthaben: $WEEK min"
  122. echo "lgDay = PC später aus : $lgDay"
  123. }
  124. # Log-out oder PC abschalten - Aktionen, die im eigenen Linux anders sind, bitte oben anpassen!
  125. kc_logout() {
  126. if [ -z "$DESKTOP_SESSION" ] ; then
  127. DESK="\"$HN\", Desktop unbekannt"
  128. else
  129. kc_replace "$DESKTOP_SESSION" && DESK="\"$HN\" mit \"${RP}\"-Desktop"
  130. fi
  131. if [ "$1" = "shtdwn" ] ; then
  132. echo "Starte Abschalten für Computer $DESK"
  133. [ ! $ferr -ge 1 ] && `$PC_down`
  134. else
  135. echo "Starte Log-out für Computer $DESK"
  136. [ ! $ferr -ge 1 ] && `$log_Out`
  137. fi
  138. exit
  139. }
  140. # Definitionen und Versand der Nachrichten - Inhalte dem Nutzeralter entsprechend anpassen ;-)
  141. kc_message() {
  142. for i in $1; do
  143. case "$i" in
  144. M0a) Mx="$Name, $sessINFO" ;;
  145. M0b) Mx="Du hast Deinen Rechner bereits $UT Minuten genutzt." ;;
  146. M1) Ma="Deine Rechnerzeit für heute"
  147. [ $AT -gt 0 ] && Mx="${Ma} beträgt insgesamt" || Mx="${Ma} beträgt"
  148. [ $AT -gt 0 ] || [ $UT -gt 0 ] && Mx="Deshalb hast Du heute noch"
  149. Mx="$Mx $PCtime Minuten." ;;
  150. M2) Mx="$Name, Du bist zu früh! Deine PC-Zeit beginnt um $UZanf Uhr." ;;
  151. M3) Mx="$Name, das Ende naht. Du hast noch drei Minuten." ;;
  152. M4) Mx="$Name, jetzt ist aus die Maus. Schließe Deine offenen Dateien." ;;
  153. M5) Mx="Du wirst jetzt abgemeldet. Bis morgen!" ;;
  154. M6) Mx="$Name, Du hast für heute $AT Minuten zusätzlich bekommen." ;;
  155. M7) Mx="$Name, heute ist spätestens um $UHR Uhr der PC aus." ;;
  156. M8) Mx="Du hast diese Woche genug am PC gespielt. Ab Montag gibt's neue Zeit!" ;;
  157. M9) Mx="Deine Zeit für heute ist aus. Du wirst jetzt abgemeldet. Bis morgen!" ;;
  158. M10) Mx="Benutzer $Name muss in der Konfig-Datei noch anlegt werden." ;;
  159. M11) Mx="Die Datei $(basename $0).ini\" wurde nicht gefunden." ;;
  160. esac
  161. `$message "$timePic" "$Mx"`; MN=$? # Programm und Bild s. "kidsControl.ini"
  162. [ $MN -ge 1 ] && (echo "Desk-Info-$1: $Mx" ; $line)
  163. done
  164. }
  165. # Not-Schalter, Mutti-Freigabe
  166. kc_parents() {
  167. #NEW Not-Schalter
  168. echo "Mutti-Freigabe"
  169. }
  170. # Unterfunktion zum Auslesen der Tabellen
  171. kc_read() {
  172. read_COL=; read_SUM=;
  173. case "$1" in
  174. R1) L4K="Limits4Kids.csv"
  175. 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
  176. read_COL=$(echo $read_COL | sed 's/ //')
  177. ;;
  178. R2) read_SUM=$(awk '{ sum += $0 } END { printf sum }' "$2") # Summe bilden
  179. ;;
  180. R3) read_SUM=$(awk -F',' -v name=$2 -v col=$3 'match($2,name) NR>1 {summe += $col
  181. } END {
  182. print summe}' "$4") # Summe einer bestimmten Spalte bilden
  183. ;;
  184. R4) read_DIF=$(awk '{getline n; printf "%.0f\n", (n - $0)/60}' $2) # Differenz, (Zeile 1 minus Zeile 2) geteilt durch 60 = min
  185. ;;
  186. esac
  187. [ -z $read_SUM ] && INFO="$read_COL" || INFO="${read_COL}\" u. SUM: \"$read_SUM"
  188. [ $ferr -gt 1 ] && echo "read-$4, COL$3: \"${INFO}\"" && COLzahl="$3" || COLzahl="$3" #LNK https://wiki.ubuntuusers.de/awk#Spalten-ausgeben
  189. }
  190. # 1. Buchstabe groß
  191. kc_replace() {
  192. RP="$(echo $(echo $1|cut -c1|tr [a-z] [A-Z];echo $1|cut -c2-)|sed 's/ //')" # läuft auch auf einem Router
  193. }
  194. # Bereits genutzte PC-Zeit aus Datei ermitteln
  195. kc_residual() {
  196. UT=0 && datName="./hist/${file_name}-ut"
  197. [ -f ${datName} ] && kc_read "R2" "$datName" && UT="$read_SUM"
  198. echo "UT = $UT min = bereits verbrauchte PC-Zeit" && $line # insgesamt verbrauchte PC-Zeit in Minuten
  199. }
  200. # Anzahl der heutigen Sitzungen.
  201. kc_sess() {
  202. [ -z "$1" ] && file_sess="./hist/$file_name-ut" || file_sess="$1"
  203. [ ! -f ${file_sess} ] && sessZahl=0 || sessZahl=$(cat ${file_sess} | wc -l)
  204. [ $sessZahl -gt 1 ] && szl=2 || szl=$sessZahl
  205. #NEW Aanzahl der 0-Sitzungen = test separat zählen
  206. case "$szl" in
  207. 0) sessINFO="dies ist heute Deine erste Sitzung." ;;
  208. 1) sessINFO="Du hattest heute schon eine Sitzung." ;;
  209. 2) sessINFO="Du hattest heute schon $sessZahl Sitzungen." ;;
  210. esac
  211. [ -z "$1" ] && kc_message "M0a" # Programm und Bild s. "kidsControl.ini"
  212. }
  213. # PC--Nutzungs-Zeit in Abhängigkeit von End-, verbrauchter und Zusatz-Zeit
  214. kc_time() {
  215. PCtime="$(($LIMIT + $AT - $UT))" # PC-Zeit in Minuten = Limit + Zusatz - verbrauchter Zeit
  216. [ $UT -gt 0 ] && kc_message "M0b" # Anzeige der bereits verbrauchten PC-Zeit
  217. if [ $MIN2 -lt $PCtime ] ; then
  218. PCtime="$MIN3" # PC-Zeit in Minuten bis End-Zeit
  219. [ $AT -gt 0 ] && kc_message "M6 M7"
  220. else
  221. if [ $MIN2 -gt $PCtime ] && [ $(($LIMIT + $AT)) -gt $(($UT + 1)) ] ; then
  222. [ $AT -gt 0 ] && kc_message "M6 M1 M7" || kc_message "M1" # Info-Anzeige zur PC-Zeit: M6, M1 und M7 oder M1
  223. else
  224. kc_message "M9" # Info-Anzeige zur PC-Zeit: M9; Zeit bereits abgelaufen
  225. kc_logout # PC wird ausgeloggt
  226. fi
  227. fi
  228. echo "PC-Freigabe für $PCtime min, max. bis $UHR Uhr" && $line # max. mögliche PC-Zeit in min und Uhrzeit
  229. [ $ferr -ge 1 ] && sleep 10 || sleep ${PCtime}m
  230. }
  231. # Programm-Variable aus kidsControl.ini einlesen Anpassung in der ini.-Datei vornehmen!
  232. kc_variable() {
  233. #NEW "session / desktop" automatisch finden, zwecks Wahl des richtigen Logout-Kommandos
  234. if [ -f "$0.ini" ] ; then
  235. # 'INFO="PC_down log_Out message timePic" && for i in $INFO; do echo "$i" ; done'
  236. PC_down=$(grep -m1 "PC_down" "$0.ini" | cut -d= -f2) # Abschalten, s. Funktion "kc_logout"
  237. log_Out=$(grep -m1 "log_Out" "$0.ini" | cut -d= -f2) # Ausloggen, s. dito.
  238. message=$(grep -m1 "message" "$0.ini" | cut -d= -f2) # Desktop-Nachrichten s. "kc_message"
  239. timePic=$(grep -m1 "timePic" "$0.ini" | cut -d= -f2) # Nachrichten-Bild, s. dito
  240. else
  241. echo "Die Datei \"$0.ini\" wurde nicht gefunden."
  242. kc_message "M11" && exit
  243. fi
  244. }
  245. # Warnungen kurz vor Ende der Nutzungs-Zeit
  246. kc_warn() {
  247. kc_message "M3"
  248. echo "Warn1: $Mx" && [ $ferr -ge 1 ] && sleep 2 || sleep 2m
  249. kc_message "M4"
  250. echo "Warn2: $Mx" && [ $ferr -ge 1 ] && sleep 2 || sleep 55
  251. kc_message "M5"
  252. echo "Warn3: $Mx" && [ $ferr -ge 1 ] && sleep 2 || sleep 5
  253. }
  254. # Auswertung der Nutzungsdauer aller Sitzungen einer Woche
  255. kc_week() {
  256. anz=0; dwghCRDT=0; maxCREDT=0; kw=$(date +%V); kw1=0; nr=0; weekVRBR=0; ws=0 # Variable vorbelegen
  257. file_heat="KW,Benutzer,Sitzungen,Verbrauch,Guthaben,"
  258. file_year="./hist/$(date +%G)_${HN}_year.csv" && FY="$file_year" # Name der Jahres-Tabelle: "Jahr_PC-Name_year.csv"
  259. kc_read "R3" "$Name" "5" "$FY" && SY=$read_SUM # Addieren der Guthaben-Spalte pro Nutzer
  260. [ ! -z $SY ] && dwghCRDT=$(($SY / $(grep -ic "$Name" "$FY") * $LIMIT / $WEEK)) # Tages-Zusatz, ermittelt dem Durchschnitt der Wochen-Guthaben
  261. 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
  262. if [ ! "$TZzit" = "ja" ] ; then
  263. echo "TZzit = Tages-Zuschlag: gesperrt" && TZzit=0 && $line
  264. else
  265. echo "TZzit = $dwghCRDT min Tages-Zuschlag" && TZzit=$dwghCRDT && $line
  266. fi
  267. for i in ./hist/*_$USER*-ut ; do
  268. [ $ferr -gt 1 ] && echo "Si : --$i"--
  269. [ "$i" = "./hist/*_$USER*-ut" ] && break # gibt's vom Nutzer ut-Dateien?
  270. kw=${i%%_*} && kw=${kw##*/}
  271. [ $ferr -gt 1 ] && echo "Zeile-265: kw = --$kw--"
  272. [ $(date +%V) -ne $kw ] && MELD="einer vergangenen" || MELD="der aktuellen"
  273. if [ $kw1 -ne $kw ] && [ $kw1 -ne 0 ] ; then
  274. if [ $(date +%V) -ne $kw1 ] ; then
  275. file_turn="$kw1,$Name,$weekSESS,$weekVRBR,$weekCRDT,"
  276. kc_year "$FW" "$FY" # Erstellen von Einträgen in der Wochen- und Jahres-Tabelle
  277. fi
  278. ws=0 && weekVRBR=0
  279. fi
  280. [ $ferr -gt 1 ] && echo "1--$kw--"
  281. nr=$(($nr + 1 ))
  282. ws=$(($ws + 1 ))
  283. for j in ./hist/${kw}_${USER}_*-ut ; do
  284. while true; do
  285. file_week="${kw}_${USER}_week" && FW="$file_week" # Name der Wochen-Tabelle: "Kalenderwoche_Nutzer_week"
  286. [ -f ./hist/${file_week} ] && break # Wochen-Auswertung bereits vorhanden
  287. [ $ws -eq 1 ] && echo "---- Berechnung $MELD Woche ----"
  288. anz=$(($anz + 1 ))
  289. [ $ferr -gt 1 ] && echo "Nr.$anz = $i" # Anzahl aller ut-Dateien des Nutzers
  290. var_i=$(echo ${i##*_} | cut -d- -f1)${var_d}
  291. [ $ferr -gt 1 ] && echo "var_i=${var_i}"
  292. echo "ws = ${ws}. PC-Nutzungstag der Woche: $(date -d "${var_i}" +%d.%m.%Y)" # Datum des Nutzungstag in der Woche anzeigen
  293. [ -f "$i" ] && kc_read "R2" "$i" && UT="$read_SUM" || break
  294. kc_sess "$i"
  295. weekSESS=$(($weekSESS + $sessZahl))
  296. weekVRBR=$(($weekVRBR + $UT ))
  297. weekCRDT=$(($WEEK - $weekVRBR ))
  298. maxCREDT=$(($weekCRDT / (8 / $(date +%u)) - ($LIMIT * (8 - $(date +%u)))))
  299. echo "Dses = $sessZahl x am Tag am PC gesessen."
  300. echo "UT = $UT min am Tag den PC benutzt."
  301. echo "mxPd = $maxCREDT min max. Guthaben für PC-Day" # Das Guthaben wird vor der 1. Tages-Sitzung gutgeschrieben
  302. echo "Dwgh = $dwghCRDT min Tages-Zusatz im Wochen-Durchschnitt" # Berechnung aus Jahresliste
  303. echo "Wses = $weekSESS x in der Woche am PC gesessen."
  304. echo "Wvbr = $weekVRBR min in der Woche den PC benutzt."
  305. echo "Wgth = $weekCRDT min Wochen-Rest-Guthaben" && $line
  306. #echo "[ "$(date +%u)" -eq "$dayZl" ] ud maxCREDT=$maxCREDT od maxCREDT=$TZzit"
  307. [ "$(date +%u)" -eq "$dayZl" ] && maxCREDT=$maxCREDT || maxCREDT=$TZzit # Zusatz-Guthaben in Abhängigkeit vom PC-Day
  308. [ $ferr -gt 1 ] && echo "Zeile-301: [ $(date +%V) -eq $kw ] und break"
  309. [ $(date +%V) -eq $kw ] && break
  310. break
  311. done
  312. [ $ferr -gt 1 ] && echo "Zeile-305: [ $nr -eq 1 ] und nr=0 + kw1="$kw" und break"
  313. [ $nr -eq 1 ] && nr=0 && kw1="$kw" && break
  314. done
  315. [ $ferr -gt 1 ] && echo "Zeile-307: kw1 = --$kw1--"
  316. done
  317. [ $ferr -gt 1 ] && echo "Zeile-309: [ $(date +%V) -eq $kw ] und AT=$maxCREDT"
  318. [ $(date +%V) -eq $kw ] && AT=$maxCREDT || AT=0 # Zusatz-Guthaben
  319. #NEW Zusatz-Zeit übers Home-Netz // Internet // Cloud?
  320. echo "AT = $AT min = zusätzliche PC-Zeit" # zusätzliche PC-Zeit für den Tag in Minuten
  321. }
  322. # Jahres- und Wochen-Tabellen, als Unter-Funktion von "kc_week", erstellen
  323. kc_year() {
  324. [ $ferr -gt 1 ] && echo "Zeile-317: --$1-- und --$2--"
  325. for i in $1; do
  326. [ -f "./hist/$1" ] && break # Abbruch, wenn Wochen-Tabelle vorhanden
  327. echo "$file_heat" > "./hist/$1" # Erstellen einer Wochen-Tabelle mit den
  328. echo "$file_turn" >> "./hist/$1" # Werten der bereits abgelaufenen Woche
  329. if [ ! -f "$2" ] ; then
  330. echo "$file_heat" > "$2" # Erstellen einer neuen Jahres-Tabelle
  331. echo "$file_turn" >> "$2" # Befüllen einer vorhandenen Jahres-Tabelle
  332. else # mit den Werten der abgelaufenen Woche(n)
  333. echo "$file_turn" >> "$2" # dito.
  334. fi
  335. find . -name ${kw1}_${USER}*-ut -exec rm {} \; # Löschen der ausgewerteten ut-Dateien (Taginfo)
  336. done
  337. }
  338. #===============================================================================================
  339. ### main
  340. #-----------------------------------------------------------------------------------------------
  341. # preparing script
  342. kc_variable # Skript-Variable aus "kidsControl.ini" einlesen
  343. [ "$1" = "test" ] && [ ! -z "$2" ] && USER="$2" && HN=mo2mo || HN=$(hostname -s) # Test-User : momo, max oder moritz und hostName=mo2mo
  344. file_name=$(date +%V)_${USER}_$(date +%Y%m%d) # Datei-Name: Kalenderwoche_Nutzer_Tagesdatum
  345. kc_replace "$USER" && Name="$RP" # Nutzername: 1. Buchstabe groß
  346. if [ "$1" = "test" ] ; then
  347. 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
  348. [ "$3" = "deep" ] && ferr=2
  349. kc_replace "$3$1" && echo "Start = $(date); $RP mit Nutzer $Name" # Datum komplett und Nutzer mit Testmodi anzeigen
  350. else
  351. ferr=0
  352. fi
  353. # script at work
  354. cd $(dirname $0) && line="echo -------------------------------------------" # In den Ordner wechseln, in dem sich der Skript befindet.
  355. if [ "$1" = "out" ] ; then ## out = Nutzer meldet sich ab
  356. kc_consumed # Dauer der aktuellen Sitzung berechnen
  357. else ## Nutzer hat sich angemeldet
  358. kc_limit # Limits ermitteln
  359. kc_week # PC-Woche auswerten und Zusatz-Zeit berechnen
  360. kc_calc # Zeiten berechnen
  361. kc_residual # bereits verbrauchte PC-Zeit ermitteln
  362. kc_sess # Anzahl der Sitzungen
  363. kc_time # max. mögliche PC-Zeit
  364. kc_warn # Warnung vor dem Ende
  365. kc_consumed # Dauer der aktuellen Sitzung berechnen
  366. kc_logout shtdwn # Ausloggen des Nutzers oder Ausschalten des PC
  367. fi
  368. ### END