[ Gelöst] Homebridge Steuerung aus FHEM und Anbindung IOS Geräte

Begonnen von UweUwe, 27 Dezember 2018, 11:06:14

Vorheriges Thema - Nächstes Thema

UweUwe

Hallo,

ich habe in den letzten Tagen mit sehr viel und guter Unterstützung von MadMax-FHEM die Homebridge Installation und das INIT Skript für den automatischen Service erstellt und zum Laufen gebracht. Vielen Dank nochmals an Madmax.

Unterlagen waren weiterhin:

Wiki: Homebridge einrichten & Wiki Homebridge_Start_und_Status_in_FHEM.

ZitatMeine Ausstattung ist:

Hardware und Software:
1. Hardware Raspberry 3
2. FHEM 5.9 auf neuestem Stand
3. Distributor ID: Raspbian, Description:    Raspbian GNU/Linux 9.6 (stretch), Release:        9.6, Codename:       stretch
4. IOS 12 auf den Zielgeräte für Homebridge

Ich starte auf dem Raspberry die homebridge mit dem user pi.

Folgenden Stand habe ich heute.
1. Homebridge starte ich mit sudo /etc/init.d/homebridge start. Ich kann stoppen und status machen. Alles soweit ok.
Logfile ist unten angehängt. Homebridge sieht meinen SYS_Dummy im Raum Homekit in FHEM.

2. Aus FHEM heraus kann ich homebridge nicht starten, stoppen, etc. Ich sehe im Event-Monitor:

2018-12-27 10:50:11 dummy SYS_Homebridge start
2018-12-27 10:50:11 dummy SYS_Homebridge OnStateChange: -1


Im Logile sehe ich:

sudo: no tty present and no askpass program specified

Kann leider diese Nachricht nicht deuten..

Die Installation war ein für mich schwieriger Prozess mit Rückschlägen. Zwischenzeitlich gab es auch einen Stand, bei dem ich nach manueller Start von homebridge über die IOS-Geräte einen Zugriff bekam und auch mein SYS_Dummy per SIRI starten konnte. Dies ist aber heute nicht mehr möglich.

ZitatStand der Siri Geräte heute, auch nach Löschung der "Home" und "EVE" Apps, wenn ich versuche die IOS anzumelden:

1. Beim Scanen: Gerät bereits hinzugefügt. Um dieses Gerät zu deinem Zuhause hinzuzufügen, musst du es zuerst zurücksetzen..

2. Über den Code: Wähle ein Gerät zum Hinzufügen zu "home" aus..

Wie gesagt, es tats schon mal. Habe APPS gelöscht, Code geändert, mehrere IOS Geräte verwendet.

Hier die Details:

config.json:

pi@raspberrypi:~/homebridge/log $ cat ~/.homebridge/config.json
{
    "bridge":{


      "name": "Homebridge",
      "username":"CC:22:3D:E3:CE:30",
      "port":51826,
      "pin":"123-12-123"
    },

    "platforms":[
      {
        "platform":"FHEM",
        "name":"FHEM",
        "server":"127.0.0.1",
        "port":"8085",
        "auth": {"user": "", "pass": ""},
        "filter":"room=Homekit"
       }
      ],
      "accessories":[]
     }


Pass und User geixxt.

Hombridge Service Datei :

pi@raspberrypi:~/homebridge/log $ cat /etc/init.d/homebridge
#
#
#
#
#
#
#

############===========
#!/bin/sh
### BEGIN INIT INFO
# Provides: homebridge
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time for homebridge
# Description: Enable service provided by daemon.
### END INIT INFO
export PATH=$PATH:/usr/local/bin
export NODE_PATH=$NODE_PATH:/usr/local/lib/node_modules
# export LOGPATH="/etc/init.d/.homebridge/log"
  export LOGPATH="/home/pi/homebridge/log"
PID=`pidof homebridge`
  homeBridgeUser="pi"
  fhemHost=127.0.0.1
  fhemHostTelnetPort=7072
  fhemDefine="SYS_Homebridge"

case "$1" in
start)
if ps -p $PID > /dev/null 2>&1; then
        echo "Homebridge is already running"
else

#        su - "pi" -c "homebridge > /dev/null 2>&1 &"
#       su - "fhem" -c "homebridge > $LOGPATH/homebridge-`date +%Y-%m`.log 2>&1 &"
        su - "pi" -c "homebridge > $LOGPATH/homebridge-`date +%Y-%m`.log 2>&1 &"

        echo "Homebridge starting"
        sleep 2
    $0 status
fi
;;
stop)
if ! ps -p $PID > /dev/null 2>&1; then
        echo "Homebridge is not running"
else
        kill $PID
        echo "Homebridge closed"
fi
;;
restart)
if ! ps -p $PID > /dev/null 2>&1; then
        $0 start
else
        $0 stop
        $0 start
fi
;;
status)
if ps -p $PID > /dev/null 2>&1; then
        echo "Homebridge is running PID $PID"
else
        echo "Homebridge is not running"
fi
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
;;
esac
exit 0


LOG Datei nach Start sudo /etc/init.d/homebridge unter PI:

pi@raspberrypi:~/homebridge/log $ nano homebridge-2018-12.log
  GNU nano 2.7.4                                    File: homebridge-2018-12.log

[12/27/2018, 9:37:28 AM] Loaded config.json with 0 accessories and 1 platforms.
[12/27/2018, 9:37:28 AM] ---
[12/27/2018, 9:37:28 AM] Loaded plugin: homebridge-fhem
homebridge API version: 2.2
this is homebridge-fhem 0.4.5
[12/27/2018, 9:37:28 AM] Registering platform 'homebridge-fhem.FHEM'
[12/27/2018, 9:37:28 AM] ---
[12/27/2018, 9:37:28 AM] Loading 1 platforms...
[12/27/2018, 9:37:28 AM] [FHEM] Initializing FHEM platform...
starting longpoll: http://127.0.0.1:8085/fhem?XHR=1&inform=type=status;addglobal=1;filter=.*;since=null;fmt=JSON&timestamp=15$
[12/27/2018, 9:37:29 AM] [FHEM] Fetching FHEM devices...
[12/27/2018, 9:37:29 AM] Loading 0 accessories...
Server listening on: http://<ip>:8282
[12/27/2018, 9:37:29 AM] [FHEM] Checking devices and attributes...
[12/27/2018, 9:37:29 AM] [FHEM]   executing: http://127.0.0.1:8085/fhem?cmd=%7BAttrVal(%22global%22,%22userattr%22,%22%22)%7D$
[12/27/2018, 9:37:29 AM] [FHEM]   executing: http://127.0.0.1:8085/fhem?cmd=jsonlist2%20TYPE=siri&fwcsrf=csrf_192894397093198$
[12/27/2018, 9:37:29 AM] [FHEM] siri device is siri
[12/27/2018, 9:37:29 AM] [FHEM]   executing: http://127.0.0.1:8085/fhem?cmd=%7B$defs%7Bsiri%7D-%3E%7B%22homebridge-fhem%20ver$
[12/27/2018, 9:37:29 AM] [FHEM] Fetching FHEM devices...
[12/27/2018, 9:37:29 AM] [FHEM] fetching: http://127.0.0.1:8085/fhem?cmd=jsonlist2%20room=Homekit&fwcsrf=csrf_192894397093198$
[12/27/2018, 9:37:29 AM] [FHEM] got: 1 results
[12/27/2018, 9:37:29 AM] [FHEM] SYS_Dummy is switch
[12/27/2018, 9:37:29 AM] [FHEM] SYS_Dummy has
[12/27/2018, 9:37:29 AM] [FHEM]   On [state;on,off]
  2018-12-27 09:37:29 caching: SYS_Dummy-state: off
[12/27/2018, 9:37:29 AM] [FHEM]     caching: On: false (as boolean; from 'off')
[12/27/2018, 9:37:29 AM] [FHEM] Initializing platform accessory 'SYS_Dummy'...
[12/27/2018, 9:37:29 AM] [FHEM] creating services for SYS_Dummy
[12/27/2018, 9:37:29 AM] [FHEM]   information service for SYS_Dummy
[12/27/2018, 9:37:29 AM] [FHEM]     manufacturer, model and serial number characteristics for SYS_Dummy
[12/27/2018, 9:37:29 AM] [FHEM]   Switch service for SYS_Dummy
[12/27/2018, 9:37:29 AM] [FHEM]     On characteristic for SYS_Dummy:state
Setup Payload:
X-HM://0023O9G6Z54MJ
Scan this code with your HomeKit app on your iOS device to pair with Homebridge:


Kann ich von euch um Unterstützung bitten?


















MadMax-FHEM

#1
askpass klingt nach Abfrage von Passwort bzgl. sudo...

Also den User fhem in die sudoers für den Service-Aufruf beim Dummy (nehme ich an) ohne Passwort eintragen...

Sollte evtl. in dem im anderen Thread verlinkten Thread zu finden sein...

Oder suchen nach sudoers sudo ohne Passwort...

Neuerdings ist allerdings besser für jeden User eine Datei unter /etc/sudoers.d/ anlegen.

Dort sollte bereits eine Datei für den User "pi" liegen...
...die kann (sudo cp DateinameAktuell DateinameNeu) kopiert werden und als Basis für den User "fhem" dienen...

Bin dann mal unterwegs...
...daher nicht alles gelesen und nur kurz geantwortet...

EDIT: nicht wieder rätseln, wenn du auf den Dummy drückst wird der Startbefehl (mit sudo notwendig) vom User "fhem" ausgeführt. Keine Angst da im Startscript (das wird auch benutzt) der User "pi" eingetragen ist bleibt alles wie gewohnt. (den sudoers Eintrag bräuchtest du auch selbst wenn im Startscript "fhem" stünde)... Leider kann ich das jetzt nicht ausführlicher erläutern...

EDIT2: und wie immer im Verzeichnis /etc vorsichtig sein! ;)

Viel Erfolg, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

KernSani

Ich glaube mich zu erinnern, dass es geholfen hat, beim username in der config hinten die 30 durch eine 31 zu ersetzen. Dann erkennt Home deine Bridge als neues Gerät.


Kurz, weil mobil
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

UweUwe

Hallo @ Joachim, du bist unglaublich , Merci.. Schaue ich mir gleich an. Aber das Schwierigere habe ich ans Ende gestellt.

@ KernSani: Tool, das war die Lösung (30 auf 31 setzen). Home konnte sich problemlos anmelden und Siri spricht mit FHEM, bisher fehlerlos, ganz zum Unterschied mit mir. Aber sag mal, wie soll da ein "verklemmter" Anwender drauf kommen?

Jetzt muss ich noch das Theme mit der Kopplung FHEM mit Homebridge lösen, aber Joachim gab ja schon einen Tip. Damit werde ich mich jetzt rum"schlagen".

Merci

Uwe

KernSani

Zitat von: UweUwe am 27 Dezember 2018, 13:16:50
Aber sag mal, wie soll da ein "verklemmter" Anwender drauf kommen?
Steht im Wiki ;)


Kurz, weil mobil
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

UweUwe

Erwischt  ;), immer diese ,,verklemmten" Analphabeten .. ;) :)

UweUwe

Hallo Joachim,

ich hab die Änderung der sudoers Datei gemäss Wiki durchgeführt. bzw. richtig gehabt.
Es gibt auch Forum Beiträge, die dasselbe Thema als ich haben, mit dem Willi-sudoers jedoch die Lösung gefunden haben.

Der Hinweis im Wiki sieht folgendermassen aus:
ZitatDamit aus FHEM das Script ausgeführt werden kann benötigt dieser Benutzer entsprechende Berechtigungen. Dazu ist in der sudoers ein Eintrag zu ergänzen. Dazu wird die sudoers Datei im Nano Editor geöffnet

Mein FHEM user sollte aber fhem sein, deshalb benötige ich keine Anpassung.

Mein sudoers sieht folgendermassen aus, ich weiss, dass ich wieder mal was übersehen habe:

pi@raspberrypi:~ $ sudo nano /etc/sudoers
  GNU nano 2.7.4                                 File: /etc/sudoers


# User alias specification
# Cmnd alias specification

# User privilege specificationroot    ALL=(ALL:ALL) ALL

fhem ALL=(ALL) NOPASSWD:/etc/init.d/homebridge
#pi ALL=(ALL) NOPASSWD:/etc/init.d/homebridge

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d


Auch dies gibt mir das Gefühl, dass ich nicht unbedingt ganz schlecht liege:

Zitatich habe jetzt auch nach der Anleitung im Wiki "Homebridge Start und Status in FHEM" die Homebridge zum Laufen bekommen, FHEM und Homebridge laufen jetzt auf 2 verschiedenen Rpi.

Ich hatte auch noch im Logfile von FHEM folgende Meldung...

Code: [Auswählen]

sudo: no tty present and no askpass program specified


die ich durch folgende Anpassung/ Ergänzung der /etc/sudoers gelöst bekommen habe..

Code: [Auswählen]

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
fhem ALL=(ALL) NOPASSWD: ALL


Jetzt klappt es perfekt, vielen Dank an alle, auch an den Ersteller des Wiki und der Lösung... :)

Dies steht hier: https://forum.fhem.de/index.php?topic=66841.0

Könntest du nochmals draufschauen, bitte.

Uwe




MadMax-FHEM

Poste doch mal ein list von dem dummy für den Start/Restart aus fhem...

Und wie geschrieben: eigentlich wird neuerdings (Stretch) nicht mehr die sudoers Datei angepasst sondern eine Datei (pro User) unter /etc/sudoers.d/ angelegt...

Dort müsste eigentlich eine für den User "pi" liegen...

Der Grund: bei einem System-Update kann nicht ausgeschlossen werden, dass die sudoers nicht "überschrieben" wird...
Einträge unter /etc/sudoers.d/ sind davon nicht betroffen...

Hat aber nichts mit dem Problem zu tun...

Hast du mal den Thread welcher im anderen Thread verlinkt wurde (homebridge für unerfahrenen oder so) angesehen?
Dort steht glaube ich auch einiges bzgl. starten aus fhem...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

UweUwe

Hi Joachim,

hier ist das list SYS-Homebridge

Internals:
   NAME       SYS_Homebridge
   NR         122
   STATE      start
   TYPE       dummy
   READINGS:
     2018-12-27 22:00:33   OnStateChange   -1


     2018-12-27 22:00:33   state           start
Attributes:
   DbLogExclude .*
   devStateIcon .*on:general_an .*off:general_aus .*:audio_rec
   eventMap   status:status start:start stop:stop restart:restart
   icon       it_router
   room       GERAETE
   userReadings OnStateChange:(start|stop|restart|status) {  system ("sudo service homebridge ".ReadingsVal($NAME,"state","restart")." &" );  }
   webCmd     status:start:stop:restart


Den Thread Homebridge für Unbegabte hab ich schon gelesen.
https://forum.fhem.de/index.php/topic,93540.msg865627.html#msg865627

Kann es ein, dass mir dieses Modul fehlt?
Thema: Neues Modul: 98_serviced.pm - systemd und initd Dienste steuern
https://forum.fhem.de/index.php/topic,79952.msg719659.html#msg719659

Und wie geschrieben: eigentlich wird neuerdings (Stretch) nicht mehr die sudoers Datei angepasst sondern eine Datei (pro User) unter /etc/sudoers.d/ angelegt...

Das gehe ich morgen als Beispiel in meinem Linux Kurs an..

Zitat
Dort müsste eigentlich eine für den User "pi" liegen...

Der Grund: bei einem System-Update kann nicht ausgeschlossen werden, dass die sudoers nicht "überschrieben" wird...
Einträge unter /etc/sudoers.d/ sind davon nicht betroffen...

Hat aber nichts mit dem Problem zu tun.
..


Merci für die Unterstützung.



Uwe




MadMax-FHEM

#9
Der Befehl der beim Dummy Start fhem benutzt wird ist "sudo service homebridge start" etc.

Daher musst du nat. das in sudoers erlauben...
...also "Ausführung" des "Programms" service ohne Passwort...
...oder beim Dummy "sudo /etc/init.d/homebridge start" etc. eintragen...

Sonst wird (trotz [eingeschränktem: nur auf /etc/init.d/homebridge] sudoers Eintrag) nach einem Passwort gefragt... ;)

EDIT: wird Zeit für den Linux-Kurs ;) Wobei fraglich, ob du hiernach noch was lernen kannst... ;)

EDIT2: hier noch ein Link bzgl. sudo und fhem etc. https://heinz-otto.blogspot.com/2017/08/raspberry-ausschalten-mit-fhem.html?m=1. Dank an Otto!

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

UweUwe

Hallo,

das mit Otto123 werde ich auch implementieren. Aber eines nach dem anderen.

Aktuell kämpfe ich noch mit dem
sudo: no tty present and no askpass program specified
Ich meine aber doch dem user fhem die Rechte gegeben zu haben:

fhem ALL=(ALL) NOPASSWD:/etc/init.d/homebridge

in meinem /etc/sudoers:

pi@raspberrypi:~ $ sudo nano /etc/sudoers
  GNU nano 2.7.4                                 File: /etc/sudoers

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

fhem ALL=(ALL) NOPASSWD:/etc/init.d/homebridge

*pi ALL=(ALL) NOPASSWD:/etc/init.d/homebridge


Hier sudo einzufügen.. Syntaxthemen ??
Ich könnt mir vorstellen, dass dies so geht:

        su - "pi" -c "sudo /etc/init.d/homebridge > $LOGPATH/homebridge-`date +%Y-%m`.log 2>&1 &"

korrekt?

Ich hoffe, dass ich mit meinen Fragen bald erlösen kann. Linux Kurs ist bei meinem Sohn. Er programmiert beruflich auf Linux aund ist admin .. Er wohnt aber zu weit weg und die Jugend..

MadMax-FHEM

Noch mal: der Befehl im Dummy lautet:

sudo service homebridge start etc.

Dein Eintrag in der sudoers ermöglicht fhem die Ausführung von sudo /etc/init.d/homebridge

das passt ja nicht zusammen...

Lesen, vergleichen, lernen, ...

Genauer kann ich's nicht mehr beschreiben...

Der Link zu Otto sollte nur dem Verständnis von sudo/sudoers etc. dienen...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

UweUwe

Hallo Joachim:

ich habe das folgende Verständnis, besser gesagt folgende Vremutung:

aufgrund des List SYS_Hombridge

Internals:
   NAME       SYS_Homebridge
   NR         122
   STATE      stop
   TYPE       dummy
   READINGS:
     2018-12-28 12:13:22   OnStateChange   -1
     2018-12-28 12:13:22   state           stop
Attributes:
   DbLogExclude .*
   devStateIcon .*on:general_an .*off:general_aus .*:audio_rec
   eventMap   status:status start:start stop:stop restart:restart
   icon       it_router
   room       GERAETE
   userReadings OnStateChange:(start|stop|restart|status) {  system ("sudo service homebridge ".ReadingsVal($NAME,"state","restart")." &" );  }
   webCmd     status:start:stop:restart


setzt das Modul folgenden Befehl ab:

sudo service homebridge ".ReadingsVal($NAME,"state","restart")." &

wie wir wissen, bringt dieser Befehl folgende Fehlermeldung bei mir :

pi@raspberrypi:~ $ sudo service homebridge start
Warning: homebridge.service changed on disk. Run 'systemctl daemon-reload' to reload units.
Job for homebridge.service failed because the control process exited with error code.
See "systemctl status homebridge.service" and "journalctl -xe" for details.


Damit brauche ich diesen Befehl auch nicht im sudoers abfangen, da er eh nichts bei mir bringt, sondern sollte den Befehl in dem SYS_Homebridge ändern.

Alles andere ist doch nicht zielführend? Ankommen am Raspberry muss doch : /etc/init.d/homebridge start  (..stop) (.. restart).. (..status), oder irre ich mich wieder?
Wie gesagt, Vermutung. Ist ja Neuland für mich.

Uwe


MadMax-FHEM

Es ist beides das selbe (letztendlich):

die Datei die ausgführt wird (letzten Endes) ist immer:

/etc/init.d/homebridge

Welche start|stop|restart|status kann...

Die Datei liegt im Startverzeichnis für Services...

Daher (wenn registriert: update-rc.d) kann auch das "Service-Programm" zur "Kontrolle" verwendet werden (was der Dummy tut).

Wenn du für fhem sudo ohne Passwort für /etc/init.d/homebridge einträgst muss auch der abgesetzte Befehl vom Dummy so lauten...

Also entweder fhem erlauben (dazu ist sudo notwendig -> Eintrag sudoers) Services zu steuern und da das Ganze ohne interaktion (Passworteingabe) passieren soll/muss auch den Eintrag in der sudoers ohne Passwort erlauben.

Oder eben den /etc/init.d/homebridge Aufruf in den Dummy einbauen...

Ansonsten mal bzgl. Services lesen und dabei vielleicht auch die beiden Varianten "studieren": initd (was du nutzt) und systemd ("neu")...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

UweUwe

Hi Joachim,

ich glaube, jetzt hab ich was angerichtet:

pi@raspberrypi:~ $ sudo shutdown -r 0
>>> /etc/sudoers: syntax error near line 21 <<<
sudo: parse error in /etc/sudoers near line 21
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
pi@raspberrypi:~ $ vi /etc/sudoers
pi@raspberrypi:~ $ sudo vi /etc/sudoers
>>> /etc/sudoers: syntax error near line 21 <<<
sudo: parse error in /etc/sudoers near line 21
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin