Micropython auf ESP8266

16.03.2019 - Lesezeit: ~1 Minute

Micropython auf ESP übertragen

$ esptool.py erase_flash
$ esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect -fm dio 0 /home/ESP8266/esp8266-20190125-v1.10.bin

Dateien auf dem ESP lesen / schreiben

sudo pip3 install adafruit-ampy
Tags: ESP8266

Apache2 startet täglich neu um 6:25 Uhr

02.03.2019 - Lesezeit: ~1 Minute

Apache2 startet täglich neu um 6:25 Uhr, was auf einem Rechner, der 24/7 läuft wenig Sinn macht. (Denn es gibt Leute, die zu dieser Zeit schon arbeiten.;-)

Deshalb habe ich den täglichen cron-job auf 2:25 Uhr umgestellt.

$ sudo nano /etc/crontab
# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 2    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 2    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 2    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
$ sudo service cron reload

Hintergrund

  • damit die Logdateien von Apache nicht zu groß werden werden diese mit Logrotate umbenannt und gepackt.
  • Logrotate stoppt deshalb den Apache bearbeitet die Logdateien und startet den Apache wieder
    /etc/logrotate.conf
    /etc/logrotate.d/apache2
  • Logrotate selbst wird vom cron.dayly aufgerufen
    /etc/cron.daily/logrotate
Tags: Apache logrotate cron

PHP-Abfallkalender

20.02.2019 - Lesezeit: 7 Minuten

<?php

function naechstertermin($image, $ueberschrift, $arr_termine, $firma = " ")
{
$heute = date("Y/m/d");
$termin="";    foreach ($arr_termine as $value) {
  if (($value>=$heute) and ($termin=="")) $termin=$value;
  };
$retval="";
if ($termin<>"") {
  $arr2 = explode("/",$termin);
  $retval = "<p style='height:30px'> <img src='$image'  alt='$ueberschrift' width='25' height='35'  style='float:left; margin-right:5px; margin-top:-5px;' /> $arr2[2].$arr2[1].$arr2[0] $firma</p>\n";
  };
  return $retval;
}

function kecl_termine() {

//Termine fuer die Blauen Tonnen in der Schreibweise YYYY/MM/TT //erzeugt durch wnfAbfallkalender (Lazarus) $bttermine = array ( "2019/02/27", "2019/03/13", "2019/03/27", "2019/04/10", "2019/04/24", "2019/05/08", "2019/05/22", "2019/06/05", "2019/06/19", "2019/07/03", "2019/07/17", "2019/07/31", "2019/08/14", "2019/08/28", "2019/09/11", "2019/09/25", "2019/10/09", "2019/10/23", "2019/11/06", "2019/11/21", "2019/12/04", "2019/12/18", "2020/01/02", "2020/01/15", "2020/01/29", "2020/02/12", "2020/02/26", "2020/03/11", "2020/03/25", "2020/04/08", "2020/04/22", "2020/05/06", "2020/05/20", "2020/06/03", "2020/06/17", "2020/07/01", "2020/07/15", "2020/07/29", "2020/08/12", "2020/08/26", "2020/09/09", "2020/09/23", "2020/10/07", "2020/10/21", "2020/11/04", "2020/11/19", "2020/12/02", "2020/12/16", "2020/12/30" );

//Termine fuer die Gelben Tonnen in der Schreibweise YYYY/MM/TT //erzeugt durch wnfAbfallkalender (Lazarus) $gstermine = array ( "2019/03/01", "2019/03/15", "2019/03/29", "2019/04/12", "2019/04/26", "2019/05/10", "2019/05/24", "2019/06/07", "2019/06/21", "2019/07/05", "2019/07/19", "2019/08/02", "2019/08/16", "2019/08/30", "2019/09/13", "2019/09/27", "2019/10/11", "2019/10/25", "2019/11/08", "2019/11/22", "2019/12/06", "2019/12/20", "2020/01/03", "2020/01/17", "2020/01/31", "2020/02/14", "2020/02/28", "2020/03/13", "2020/03/27", "2020/04/11", "2020/04/24", "2020/05/08", "2020/05/22", "2020/06/05", "2020/06/19", "2020/07/03", "2020/07/17", "2020/07/31", "2020/08/14", "2020/08/28", "2020/09/11", "2020/09/25", "2020/10/09", "2020/10/23", "2020/11/06", "2020/11/20", "2020/12/04", "2020/12/18" );

//Termine fuer die Restabfall in der Schreibweise YYYY/MM/TT //erzeugt durch wnfAbfallkalender (Lazarus) $ratermine = array ( "2019/02/27", "2019/03/13", "2019/03/27", "2019/04/10", "2019/04/24", "2019/05/08", "2019/05/22", "2019/06/05", "2019/06/19", "2019/07/03", "2019/07/17", "2019/07/31", "2019/08/14", "2019/08/28", "2019/09/11", "2019/09/25", "2019/10/09", "2019/10/23", "2019/11/06", "2019/11/21", "2019/12/04", "2019/12/18", "2020/01/02", "2020/01/15", "2020/01/29", "2020/02/12", "2020/02/26", "2020/03/11", "2020/03/25", "2020/04/08", "2020/04/22", "2020/05/06", "2020/05/20", "2020/06/03", "2020/06/17", "2020/07/01", "2020/07/15", "2020/07/29", "2020/08/12", "2020/08/26", "2020/09/09", "2020/09/23", "2020/10/07", "2020/10/21", "2020/11/04", "2020/11/19", "2020/12/02", "2020/12/16", "2020/12/30" );

//Termine fuer die Bio-Tonnen in der Schreibweise YYYY/MM/TT //erzeugt durch wnfAbfallkalender (Lazarus) $bio_kecl_termine = array ( "2019/02/28", "2019/03/14", "2019/03/28", "2019/04/11", "2019/04/25", "2019/05/09", "2019/05/23", "2019/06/06", "2019/06/20", "2019/07/04", "2019/07/18", "2019/08/01", "2019/08/15", "2019/08/29", "2019/09/12", "2019/09/26", "2019/10/10", "2019/10/24", "2019/11/07", "2019/11/21", "2019/12/05", "2019/12/19", "2020/01/02", "2020/01/16", "2020/01/30", "2020/02/13", "2020/02/27", "2020/03/12", "2020/03/26", "2020/04/09", "2020/04/23", "2020/05/07", "2020/05/22", "2020/06/04", "2020/06/18", "2020/07/02", "2020/07/16", "2020/07/30", "2020/08/13", "2020/08/27", "2020/09/10", "2020/09/24", "2020/10/08", "2020/10/22", "2020/11/05", "2020/11/19", "2020/12/03", "2020/12/17", "2020/12/31" );

//Termine fuer die Bio-Tonnen in der Schreibweise YYYY/MM/TT //erzeugt durch wnfAbfallkalender (Lazarus) $bio_veolia_termine = array ( "2019/02/22", "2019/03/08", "2019/03/22", "2019/04/05", "2019/04/20", "2019/05/03", "2019/05/17", "2019/05/31", "2019/06/14", "2019/06/28", "2019/07/12", "2019/07/26", "2019/08/09", "2019/08/23", "2019/09/06", "2019/09/20", "2019/10/04", "2019/10/18", "2019/11/01", "2019/11/15", "2019/11/29", "2019/12/13", "2019/12/27", "2020/01/10", "2020/01/24", "2020/02/07", "2020/02/21", "2020/03/06", "2020/03/20", "2020/04/03", "2020/04/17", "2020/05/02", "2020/05/15", "2020/05/29", "2020/06/12", "2020/06/26", "2020/07/10", "2020/07/24", "2020/08/07", "2020/08/21", "2020/09/04", "2020/09/18", "2020/10/02", "2020/10/16", "2020/10/30", "2020/11/13", "2020/11/27", "2020/12/11", "2020/12/28" );

//echo "

Abfallkalender

"; $s = naechstertermin("sites/default/files/bilder/tonne-gelb.jpg","Gelbe Säcke",$gstermine); echo $s; $s = naechstertermin("sites/default/files/bilder/tonne-blau.jpg","Blaue Tonne",$bttermine); echo $s; $s = naechstertermin("sites/default/files/bilder/tonne-grau.jpg","Graue Tonne",$ratermine); echo $s; $s = naechstertermin("sites/default/files/bilder/tonne-gruen.jpg","Grüne Tonne KECL",$bio_kecl_termine,"KECL"); echo $s; $s = naechstertermin("sites/default/files/bilder/tonne-gruen.jpg","Grüne Tonne Veolia",$bio_veolia_termine,"Veolia"); echo $s; }

kecl_termine(); echo 'KECL Hotline Tel.: 03763 404-0'; echo '
'; echo 'Veolia Hotline Tel.: 0800 088 70 887';

?>

Tags: php

Letsencrypt auf BBB erneuern

20.02.2019 - Lesezeit: 3 Minuten

Von Letsencrypt kommen E-Mails mit der Nachricht

You may need to update your client to the latest version in case it is still using the deprecated TLS-SNI-01 validation method. https://community.letsencrypt.org/t/february-13-2019-end-of-life-for-all-tls-sni-01-validation-support/74209

  • Neue Version von certbot 0.28 installieren

  • Mit dem neuen certbot das Zertifikat erneuern:

    $ certbot --version || /path/to/certbot-auto --version
    certbot 0.28.0
    $ sudo sh -c "sed -i.bak -e 's/^\(pref_challs.*\)tls-sni-01\(.*\)/\1http-01\2/g' /etc/letsencrypt/renewal/*; rm -f /etc/letsencrypt/renewal/*.bak"
    $ sudo certbot renew --dry-run
  • Jetzt kommt die Fehlermeldung:

    IMPORTANT NOTES:
    - The following errors were reported by the server:
    
    Domain: bone.nfix.de
    Type:   connection
    Detail: Fetching
    http://bone.nfix.de/.well-known/acme-challenge/C1ye-gE-z3kMKFE-UQxZ-pkGaLD19E9FA7bHa6malik:
    Error getting validation data
  • Da certbot den http Zugriff auf bone.nfix.de benötigt, muss in der Fritzbox das Port 80 freigegeben sein.

$ sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/bone.nfix.de.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator nginx, Installer nginx
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for bone.nfix.de
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/bone.nfix.de/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/bone.nfix.de/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Tags: beaglebone letsencrypt

Radicale auf BBB (Logging: OSError: [Errno 30] Read-only file system: '/var/log/radicale/log')

16.02.2019 - Lesezeit: ~1 Minute

Nachdem ich auf meinen BBB von Ubuntu 16.04 auf Ubuntu 18.04 gewechselt hatte musste ich feststellen, dass das der Radicale-Server nicht mehr lief.

Der Befehl $ journalctl --unit radicale.service -e liefert u.a. diese Fehlermeldung:

OSError: [Errno 30] Read-only file system: '/var/log/radicale/log'

den Radicale-Server anhalten

$ sudo systemctl stop radicale

Da ich nicht herausgefunden habe, warum das Filesystem Read-Only sein soll habe ich in

$ sudo nano /etc/radicale/config

das Logging ausgeschaltet

[logging]
## config = /etc/radicale/logging
## debug = True

den Radicale-Server wieder starten

$ sudo systemctl start radicale
Tags: beaglebone Radicale

pyperclip unter Kubuntu 18.04

21.01.2019 - Lesezeit: 2 Minuten

Mit pyperclip möchte ich einen Text ins Clipboard kopieren.


import pyperclip

def main():
    aClipboard = "Dieser Text soll ins Clipboard"
    print(aClipboard)
    pyperclip.copy(aClipboard)
    print("beendet.")
    return 0

if __name__ == '__main__':
    main()

Das Script liefert die folgenden Warnungen und der Text wird nicht ins Clipboard kopiert. Dieser Text soll ins Clipboard (test_pyperclip.py:17789): Gtk-WARNING **: 06:38:59.827: Theme parsing error: gtk.css:68:35: The style property GtkButton:child-displacement-x is deprecated and shouldn't be used anymore. It will be removed in a future version

(test_pyperclip.py:17789): Gtk-WARNING **: 06:38:59.827: Theme parsing error: gtk.css:69:35: The style property GtkButton:child-displacement-y is deprecated and shouldn't be used anymore. It will be removed in a future version

(test_pyperclip.py:17789): Gtk-WARNING **: 06:38:59.827: Theme parsing error: gtk.css:73:46: The style property GtkScrolledWindow:scrollbars-within-bevel is deprecated and shouldn't be used anymore. It will be removed in a future version beendet.

Da ich die KDE benutze gehe ich davon aus, dass pyperclip das falsche Clipboard anspricht. Mit pyperclip.set_clipboard('klipper') kann pyperclip dazu übereredet werden klipper als Clipboard zu benutzen:

import pyperclip

def main(): aClipboard = "Dieser Text soll ins Clipboard" print(aClipboard) pyperclip.set_clipboard('klipper') pyperclip.copy(aClipboard) print("beendet.") return 0

if name == 'main': main()

Tags: Python