Salut,
je n'ai pas l'impression qu'il veuille exécuter quoi que ce soit sur le poste utilisateur, mais bien sur le poste qui lui sert de serveur PHP (c'est un peu le principe de PHP de tout faire côté serveur non ?)
J'ai eu le même problème hier soir et un ami m'a aiguillé, et je pense pouvoir dire que c'est bon.
Deux fichiers : un index.html et un action.php
Chez moi, bootstrap et ses extensions sont installés sur le serveur, d'où l'absence de chemin HTTP pour les CSS et JS
index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| <!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="robots" content="index, follow">
<meta name="revisit-after" content="1 month">
<title>GPIO Tests</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/highlight.css" rel="stylesheet">
<link href="https://getbootstrap.com/assets/css/docs.min.css" rel="stylesheet">
<link href="css/main.css" rel="stylesheet">
<link href="css/bootstrap-switch.css" rel="stylesheet">
<script src="js/bootstrap-switch.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/github.min.css" rel="stylesheet" >
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
<link href="doc/stylesheet.css" rel="stylesheet">
<link href="css/bootstrap-toggle.css" rel="stylesheet">
<script src="js/jquery-3.2.1.min.js"></script>
</head>
<header>
</header>
<body>
<div class="container-fluid" role="main">
<h3>PIN 1</h3>
<p>Lumière de gauche</p>
<div class="container">
<script src="js/jquery-3.2.1.min.js"></script>
<input id="pin1" type="checkbox" data-toggle="toggle" data-onstyle="success" data-offstyle="danger">
<div id="console-event"></div>
<script>
$(function() {
$('#pin1').change(function() {
$('#console-event').html('Pin 1 status : ' + $(this).prop('checked'));
$.ajax({
type: 'POST',
url: 'action.php',
data: { pin:1, state:$(this).prop('checked') }
});
})
})
</script>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/highlight.min.js"></script>
<script src="doc/script.js"></script>
<script src="js/jquery-3.2.1.min.js"</script>
<script src="js/bootstrap.min.js"></script>
<script src="js/highlight.js"></script>
<script src="https://unpkg.com/bootstrap-switch"></script>
<script src="js/bootstrap-toggle.js"></script>
<script src="js/main.js"></script>
</body>
</html> |
action.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>GPIO Pins Control</title>
</head>
<body>
<?php
if(isset($_POST['pin'])){
//PIN1
if ($_POST['pin'] == '1' AND $_POST['state'] == 'true') {
$gpio_on = shell_exec("sudo /home/pi/gpio.sh 5 1");
echo "PIN1 is on<br/>";
}
else if ($_POST['pin'] == '1' AND $_POST['state'] == 'false') {
$gpio_off = shell_exec("sudo /home/pi/gpio.sh 5 0");
echo "PIN1 is off<br/>";
}
// FIN PIN 1
}
?>
</body>
</html> |
Pour que mon user www-data puisse faire un sudo sur mon .sh, j'ai du faire :
Grant adequate permissions (550 mean root and group www-data can read and execute, nobody can write)
1 2
| sudo chown root:www-data /home/pi/gpio.sh
sudo chmod 550 /home/pi/gpio.sh |
And allow apache to sudo on this script:
sudo nano /etc/sudoers.d/020_www-data-nopasswd
www-data ALL=(ALL) NOPASSWD:GPIO
# Cmnd alias specification
Cmnd_Alias GPIO = /home/pi/gpio.sh
Et, pour info, donner les droits à www-data pour interagir avec les GPIO :
sudo addgroup www-data gpio
Et pour finir, donner les droits à www-data pour lancer
/opt/vc/bin/vcgencmd measure_temp | cut -d= -f2 | cut -d. -f1
sur mon Raspberry Pi 3
sudo addgroup www-data video
Partager