Webserver en GPIO python-script (geen toegang tot/dev/mem. Probeer als root te draaien!)

Ik gebruik Linux on the Pi, waarin ik Apache, Python en mod_python heb geïnstalleerd voor de integratie van python met Apache.

Na het uitvoeren van de server kan het een eenvoudig hello-wereldprogramma uitvoeren. Maar na het schrijven van het programma voor toegang tot de GPIO-pin, wordt hieronder de volgende fout weergegeven:

Ik typ deze URL in de browser 192.168.0.102/test4.py/LED .

Dit is mijn code in test4.py bestand:

import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(26,GPIO.OUT)

def LED(req):
        print "Led on"
        GPIO.output(26,1)

Hieronder staat een fout in de browser:

MOD_PYTHON ERROR

ProcessId:      2704
Interpreter:    '127.0.1.1'

ServerName:     '127.0.1.1'
DocumentRoot:   '/var/www'

URI:            '/test4.py/LED'
Location:       None
Directory:      '/var/www/'
Filename:       '/var/www/test4.py'
PathInfo:       '/LED'

Phase:          'PythonHandler'
Handler:        'mod_python.publisher'

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 1537, in HandlerDispatch
    default=default_handler, arg=req, silent=hlist.silent)
  File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 1229, in _process_target
    result = _execute_target(config, req, object, arg)
  File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 1128, in _execute_target
    result = object(arg)
  File "/usr/lib/python2.7/dist-packages/mod_python/publisher.py", line 204, in handler
    module = page_cache[req]
  File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 1059, in __getitem__
    return import_module(req.filename)
  File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 296, in import_module
    log, import_path)
  File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 680, in import_module
    execfile(file, module.__dict__)
  File "/var/www/test4.py", line 6, in 
    GPIO.setup(26,GPIO.OUT)

RuntimeError: No access to /dev/mem.  Try running as root!

MODULE CACHE DETAILS
Accessed:       Tue Dec  8 20:21:29 2015
Generation:     0

_mp_0dc35a1ecc84e788f45a0f43ed4d3629 {
  FileName:     '/var/www/test4.py'
  Instance:     1 [IMPORT]
  Generation:   0 [ERROR]
  Modified:     Tue Dec  8 19:21:44 2015
}
2
De gebruiker die uw webserver uitvoert (en test4.py-bestand - waarschijnlijk heeft www-data geen toegang tot de hoofdmap). U hebt root-toegang nodig om toegang te krijgen tot de GPIO-pinnen. U kunt dit omzeilen door een nieuwe regel te maken in het bestand/etc/sudoers waarmee (www-data de GPIO-opdracht kan uitvoeren zonder een wachtwoord). Merk op dat je dit bestand moet bewerken met visudo om te voorkomen dat je jezelf uit het systeem sluit vanwege een slechte bewerking. U kunt verifiëren dat dit het probleem is door test4.py in de terminal aan te doen met sudo: sudo python test4.py als de LED gaat branden weet u dat dit het probleem is
toegevoegd de auteur doekman, de bron
U kunt ook de manier wijzigen waarop u de GPIO-code belt. Als u een nieuw bestand maakt met daarin de GPIO-code (led.py) met de bovenstaande code erin. Wijzig vervolgens test4.py om dit bestand te bellen met sudo - sudo python led.py. Mogelijk moet u het volledige pad naar het Python-binaire bestand en uw script gebruiken. Dit heeft ook een sudoer-regel zoals deze www-data ALL = (ALL) NOPASSWD: ALL nodig om te voorkomen dat je jezelf uitsluit van het systeem, bewerk dit bestand alleen met visudo
toegevoegd de auteur doekman, de bron
@Wilf Goed punt, hoewel dat mijn opmerkingen nog dichter zou hebben gemaakt en als en wanneer ik terug zou horen van het OP dat dit werkt. Ik zal het beveiligingsprobleem aanpakken.
toegevoegd de auteur doekman, de bron
@ Jacobm001 had eenvoudigweg geen tijd om het te doen. Ik kom er misschien morgen aan. Blijkbaar als je je vrij wilt voelen.
toegevoegd de auteur doekman, de bron
@SteveRobillard: Is er een reden dat je dat als commentaar plaatste en geen antwoord?
toegevoegd de auteur Jacobm001, de bron
Klinkt als een goed idee. Het is een goed antwoord zoals het is: P
toegevoegd de auteur Jacobm001, de bron
@SteveRobillard - dat telt waarschijnlijk als 2 antwoorden :) Maar als er enige vorm van beveiliging nodig is, zou het een goed idee zijn om aan te geven welke scripts als root met sudo moeten worden uitgevoerd door ze in te geven > NOPASSWD in plaats van alles toe te staan.
toegevoegd de auteur Wilf, de bron

1 antwoord

You don't so much need root access as permission to access the gpio device. Raspbian has a user group 'gpio' to enable this. By default the 'pi' user is in the gpio group and can access GPIOs. If you add the apache user (www-data normally) to the gpio group then the web server will be able to access the GPIOs without requiring root access. You can do that with usermod -a -G gpio www-data

Mogelijk moet u de apache-service opnieuw starten om de nieuwe groeps-ID op te halen wanneer u deze wijziging doorvoert (of de machine opnieuw op te starten). Let op: er is ook een 'spi'-groep en een' i2c'-groep.

Dit wordt feitelijk bereikt door de pythoncode eerst te proberen /dev/gpiomem te gebruiken (zie de code op regel 72) die leestoegang tot de gpio-groep heeft. Als dat niet lukt, probeert het /dev/mem waarvoor kmem-groepstoegang of root nodig is om te lezen en schrijven.

7
toegevoegd
Bedankt, dit loste het probleem voor mij op en redde dat ik iets stoms moest doen met root.
toegevoegd de auteur Alex Holsgrove, de bron