1

So here is what I want to do:

On my Raspi a python program is running. On a wordpress site the current state of the program should be displayed and some configurations should be changeable.

Here is the problem:

Whenever I want to execute the python script, I get a 500 error code. It doesn't matter if I just want to display the value or change it. I'm new to html, cgi and apache, tried a lot but now I have no clue how to continue. I'd appreciate it a lot if someone could point me in the right direction.

Here are my configurations:

Apache:

Edited the file /etc/apache2/apache2.conf:

<Directory /var/www/>
    Options +ExecCGI +Indexes +FollowSymLinks 
    AddHandler cgi-script .cgi .py
    AllowOverride None
    Require all granted
</Directory>

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
   Require all granted
</Directory>

<Directory "/var/www/cgi-bin">
    Options All
</Directory>

I also ran sudo a2enmod cgi

The webserver directory (/var/www/) looks like this:

.
├── cgi-bin
└── html
    ├── pma
    │   └── ...
    └── wordpress
        └── ...

Wordpress:

On a wordpress site, I go into the "text" mode and have the following html code:

Curent Value: <form action="/cgi-bin/apfautostartval.py" method="get"></form>

<form action="/cgi-bin/apfcgi.py" method="post" target="_blank">
<input name="autoTest" type="radio" value="True" /> True (do automatic scan)
<input name="autoTest" type="radio" value="False" /> False (do manual scan)
<input type="submit" value="Submit" /></form>

Python files:

The apfautostartval.py should just get the value from the config.ini and post it:

#!/usr/bin/python3

import configparser
import os
import cgi, cgitb 

cgitb.enable()    
# Create config parser
config = configparser.ConfigParser()
configFilePath = os.path.join(os.path.sep,"home","pi",..., "config.ini")

config.read(configFilePath)
print("Content-type: text/html")
print()
print("<!DOCTYPE html>")
print("<html>")
print("<body>")
print(str(config['SETTINGS']["autoTest"]))  
print("</body>")
print("</html>")

And finally the apfcgi.py should receive the submitted new value and write it to the config.ini:

#!/usr/bin/python3

import configparser
import os
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 
cgitb.enable()    
# Create config parser
config = configparser.ConfigParser()
configFilePath = os.path.join(os.path.sep,"home","pi",..., "config.ini")

print("Content-type: text/html")
print()
print("<!DOCTYPE html>")
print("<html>")
print("<body>")

# Receive autotest command from  web site 
if form.getvalue("autoTest"):
    config.read(configFilePath)
    if form.getvalue("autoTest").lower() == "true":
        config['SETTINGS']["autoTest"] = "True"
    else:
        config['SETTINGS']["autoTest"] = "False"

    with open(configFilePath, 'w') as configfile:
        config.write(configfile)    

print("</body>")
print("</html>")

2 Answers 2

1

I had the same problem. The problem was in the encoding. By default, ConfigParser.read() uses the encoding=none parameter. I specified utf-8 and it worked.

config = configparser.ConfigParser()
config.read(configFilePath, encoding='utf-8')
Sign up to request clarification or add additional context in comments.

Comments

0

Ok I have found the solution for one part of the problem:

When changing the value make sure, you granted permissions to the file for cgi scripts:

in /etc/apache2/apache2.config add:

<Directory "/home/pi/dirToTheConfigFile/">
    Options +ExecCGI +Indexes +FollowSymLinks 
    AddHandler cgi-script .cgi .py
    AllowOverride None
    Require all granted
</Directory>

And make sure, the user www-data is allowed to modify the file.

In general add cgitb.enable() to your python scripts, so for html 500 errors you will get a detailed error message in the /var/log/apache2/error.log file

For receiving data the following Solution was found: The Python script was unfortunately owned by root and therefore cound not be executed. I changed the permissions.

The receiving html in the wordpress has been rewritten, too:

<iframe src="/cgi-bin/apfautostartval.py" width="100" height="29.5" frameborder="0" marginwidth="8" marginheight="0" scrolling="no" align="bottom"></iframe>

It's now an iframe and displays whatever is returned.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.