Ajax, PHP, Javascript: Wertübergabe zwischen JS und PHP

Hallo,

ich muss das Thema nochmal hochholen, denn ich habe immer noch Schwierigkeiten mit der PHP-Programmierung.
Mein Wunsch war ja noch zu wissen, ob irgendwer vom Netzwerk auf den Server zugreift. Das scheiterte bisher an der Widerspenstigkeit des Servers, einen Lesezugriff auf die offenen Dateien zuzulassen.
Inzwischen habe ich eine Lösung gefunden: Ich kopiere mittels Batch die offenen Dateien als Textdatei auf das html-Verzeichnis des Pi. Das klappt auch wunderbar. Auch die Abfrage, ob überhaupt zugegriffen wird, funktioniert.

Datei zugriff.php:
PHP:
<?php
$lines = file('offen.txt');
$search = 'D:';
foreach ($lines as $line)
{
    if(strpos($line, $search)!==false)
    {
        $ergebnis = $line;
    }
}
?>

In der index.php wird dann der Hintergrund meiner Statusbilder rot statt grün.

PHP:
<?php include 'zugriff.php'; ?>
.....
                    <!-- Statusbild anzeigen -->
                    <?php if((shell_exec('gpio -g read ' . $computer['gpioPort']) == 1)): ?>
                    <?php if(isset($ergebnis)): ?>
                             <img src="<?php echo $computer['imageZu']; ?>">
                        <?php else: ?>[/COLOR]
                        <img src="<?php echo $computer['imageOn']; ?>">
                        <?php endif; ?>
                    <?php else: ?>
                        <img src="<?php echo $computer['imageOff']; ?>">
                    <?php endif; ?>
                    <div class="warning"><?php echo $computer['message']; ?></div>
                </div>

Die Nachteile: alle Statusbilder der eingeschalteten Festplatten und des Servers werden rot dargestellt (ist ja logisch, da ja nur ausgewertet wird, ob der Wert $ergebnis existiert oder nicht).
Außerdem wird nur nach einem Laufwerk abgefragt (D: ist die interne Platte des Servers), so dass nicht überprüft wird, ob auf die externen (E: F: M: ) zugegriffen wird.

Wie kann ich jetzt die "offen.txt" so abfragen und die Bilder so steuern, dass nur die Festplatten rot hinterlegt werden, die auch wirklich angesprochen werden?

Eine Beispieldatei von "offen.txt" habe ich hier:

Code:
Files opened remotely on SERVER-PC:

[50] E:\
    User:   Guest
    Locks:  0
    Access: Read 
[60] E:\CD-Cover
    User:   Guest
    Locks:  0
    Access: Read 
[61] M:\
    User:   Guest
    Locks:  0
    Access: Read 
[73] D:\Webseiten
    User:   Guest
    Locks:  0
    Access: Read 
[100] E:\
    User:   Guest
    Locks:  0
    Access: Read 
[109] E:\Desktopbilder
    User:   Guest
    Locks:  0
    Access: Read 
[255] E:\FOTOS 2004 BACKUP
    User:   Guest
    Locks:  0
    Access: Read 
[328] M:\
    User:   Guest
    Locks:  0
    Access: Read 
[329] M:\Abenteuer
    User:   Guest
    Locks:  0
    Access: Read

Ich könnte "spaghetticodemäßig" mehrere Abfragen in die "zugriff.php" schreiben, habe aber keine Ahnung, wie man die Abfrage in der "index.php" lösen könnte.
Vielleicht hat jemand von euch Programmierprofis so etwas schonmal gemacht?

Gruß

Holgip
 
Die Option "laufwerk" bei jedem Computer in der config.php hinzufuegen.

Code ergaenzen:
PHP:
/**
 * Liest die angegebene Datei in ein Array
 */
function readOpenFilesText($openFilesText)
{
    if(!file_exists($openFilesText)) return array();

    return file($openFilesText);
}

/**
 * Ueberprueft ob Dateien auf dem angegeben Laufwerk geoeffnet sind
 */
function driveHasOpenFiles($drive, $lines)
{
    if(empty($lines)) return false;

    foreach ($lines as $line)
    {
        return strpos($line, $drive) !== false;
    }
}

// offen.txt lesen und ergebnis zwischenspeichern
$openFiles = readOpenFilesText('offen.txt');

Code anpassen:
PHP:
    <?php if((shell_exec('gpio -g read ' . $computer['gpioPort']) == 1)): ?>
        <!-- Bei jedem Computer pruefen ob Dateien offen sind -->
        <?php if(driveHasOpenFiles($computer['laufwerk'], $openFiles)): ?>
             <img src="<?php echo $computer['imageZu']; ?>">
        <?php else: ?>
            <img src="<?php echo $computer['imageOn']; ?>">
        <?php endif; ?>
    <?php else: ?>
        <img src="<?php echo $computer['imageOff']; ?>">
    <?php endif; ?>
    <div class="warning"><?php echo $computer['message']; ?></div>

Lizenz: http://unlicense.org/UNLICENSE
 
Zuletzt bearbeitet:
Hallo r15ch13,

vielen Dank für deine Antwort und den Code.
Habe die Variable 'laufwerk' => 'D:' im Abschnitt 'server' und bei den anderen entsprechend eingegeben.

Ich habe leider nochwas vergessen: Filme12 ist ein USB-Gehäuse mit zwei Festplatten (Laufwerk G: und H: ). Wie kann man das regeln? Kann ich in das Array für 'filme12' die Variable 'laufwerk' zweimal eingeben?

Den Abschnitt "Code ergänzen" kommt in die index.php, oder? Und dafür fällt die "zugriff.php" ganz weg, wenn ich das richtig verstanden habe. Wenn nicht, korrigiere mich bitte.
 
Hier wird soviel zusammen gebastelt, dass nur einer Person direkt nutzt. Tut euch doch mal zusammen, setzt einen Scope der generell einsetzbar ist und zieht ein kleines Projekt ala "OpenSource Homeautomation" auf.

Die Szene ist ja nun nicht wirklich klein und da sollten sich bestimmt ein paar freiwillige finden lassen, die dein Vorhaben auf ein ordentliches Fundament setzen. Denn ich denke mir, dass sowas definitiv Anklang finden wird.

Aber das ist nur meinen Meinung :)
 
So, 'laufwerke' kann jetzt ein array oder ein string sein. Ergebnis:

PHP:
<!doctype html>
<html class="no-js" lang="">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <link rel="stylesheet" href="css/main.css">
    </head>
    <body>
        <?php include 'config.php'; ?>

        <div class="container">
            <?php
                /**
                 * Liest die angegebene Datei in ein Array
                 */
                function readOpenFilesText($openFilesText)
                {
                    if(!file_exists($openFilesText)) return array();

                    return file_get_contents($openFilesText);
                }

                /**
                 * Ueberprueft ob Dateien auf dem angegeben Laufwerk geoeffnet sind
                 */
                function driveHasOpenFiles($drive, $openFiles)
                {
                    if($drive === false) return false;
                    if(empty($openFiles)) return false;

                    return preg_match('/\[.*\] ('.$drive.'\\\)/i', $openFiles) === 1;
                }

                function drivesHaveOpenFiles($drives, $openFiles)
                {
                    if(empty($openFiles)) return false;
                    if(!is_array($drives)) return driveHasOpenFiles($drives, $openFiles);

                    $retVal = false;

                    foreach ($drives as $drive)
                    {
                        if(driveHasOpenFiles($drive, $openFiles))
                        {
                            $retVal = true;
                        }
                    }

                    return $retVal;
                }

                // offen.txt lesen und ergebnis zwischenspeichern
                $openFiles = readOpenFilesText($config['openFilesText']);

                // Nur wenn Form abgeschickt wurde
                if(isset($_POST['computer']))
                {
                    // Wenn Computer existiert
                    if(isset($config['computer'][$_POST['computer']]))
                    {
                        // Python Script ausfuehren
                        $computer = $config['computer'][$_POST['computer']];
                        if(isset($_POST['action_on_x']))
                        {
                            echo 'sudo python ' . $computer['pythonOnScript'];
                            shell_exec('sudo python ' . $computer['pythonOnScript']);
                        }
                        else if(isset($_POST['action_off_x']))
                        {
                            echo 'sudo python ' . $computer['pythonOffScript'];
                            shell_exec('sudo python ' . $computer['pythonOffScript']);
                        }
                    }
                }
            ?>

            <!-- Computer anzeigen -->
            <?php foreach($config['computer'] as $computerKey => $computer): ?>
                <div class="computer">
                    <div class="left">
                        <h1><?php echo $computer['name']; ?></h1>
                        <form name="<?php echo $computerKey ?>" method="post" action="index.php" class="switches">
                            <input type="hidden" name="computer" value="<?php echo $computerKey ?>">
                            <input type="image" src="img/ein.png" alt="An" name="action_on">
                            <input type="image" src="img/aus.png" alt="Aus" name="action_off">
                        </form>
                    </div>
                    <div class="right">
                        <!-- Statusbild anzeigen -->
                        <?php if((shell_exec('gpio -g read ' . $computer['gpioPort']) == 1)): ?>
                            <!-- Bei jedem Computer pruefen ob Dateien offen sind -->
                            <?php if(drivesHaveOpenFiles($computer['laufwerke'], $openFiles)): ?>
                                 <img src="<?php echo $computer['imageZu']; ?>">
                            <?php else: ?>
                                <img src="<?php echo $computer['imageOn']; ?>">
                            <?php endif; ?>
                        <?php else: ?>
                            <img src="<?php echo $computer['imageOff']; ?>">
                        <?php endif; ?>

                        <div class="warning">ACHTUNG! <?php echo $computer['message']; ?></div>
                    </div>
                </div>
            <?php endforeach; ?>
        </div>

        <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
        <script src="js/main.js"></script>
    </body>
</html>

PHP:
<?php
$config = array();
$config['openFilesText'] = 'offen.txt';
$config['computer'] = array(
    'server' => array(
        'name' => 'Server',
        'imageOn' => 'img/server.png',
        'imageOff' => 'img/server_off.png',
        'imageZu' => 'img/server_zu.png',
        'gpioPort' => '17',
        'pythonOnScript' => '/home/pi/ServerOn.py',
        'pythonOffScript' => '/home/pi/ServerOff.py',
        'message' => 'Vergewissern, dass niemand mehr auf den Server zugreift! Hiermit wird alles ausgeschaltet!',
        'laufwerke' => 'D:',
    ),
    'filme' => array(
        'name' => 'Filme Festplatte',
        'imageOn' => 'img/filme.png',
        'imageOff' => 'img/filme_off.png',
        'imageZu' => 'img/filme_zu.png',
        'gpioPort' => '18',
        'pythonOnScript' => '/home/pi/FilmeOn.py',
        'pythonOffScript' => '/home/pi/FilmeOff.py',
        'message' => 'Vergewissern, dass niemand mehr auf die Filme zugreift!',
        'laufwerke' => false,
    ),
    'filme12' => array(
        'name' => 'Filme 1 und 2',
        'imageOn' => 'img/filme12.png',
        'imageOff' => 'img/filme12_off.png',
        'imageZu' => 'img/filme12_zu.png',
        'gpioPort' => '22',
        'pythonOnScript' => '/home/pi/Filme12On.py',
        'pythonOffScript' => '/home/pi/Filme12Off.py',
        'message' => 'Vergewissern, dass niemand mehr auf die Filme zugreift!',
        'laufwerke' => array('G:', 'H:'),
    ),
    'backup' => array(
        'name' => 'Backup Festplatte',
        'imageOn' => 'img/backup.png',
        'imageOff' => 'img/backup_off.png',
        'imageZu' => 'img/backup_zu.png',
        'gpioPort' => '23',
        'pythonOnScript' => '/home/pi/BackupOn.py',
        'pythonOffScript' => '/home/pi/BackupOff.py',
        'message' => 'Vergewissern, dass niemand mehr auf die Filme zugreift!',
        'laufwerke' => false,
    ),
);

Lizenz: http://unlicense.org/UNLICENSE
 
Zuletzt bearbeitet: (Logikfehler behoben :D)
blablub1212 schrieb:
Hier wird soviel zusammen gebastelt, dass nur einer Person direkt nutzt. Tut euch doch mal zusammen, setzt einen Scope der generell einsetzbar ist und zieht ein kleines Projekt ala "OpenSource Homeautomation" auf.

Die Szene ist ja nun nicht wirklich klein und da sollten sich bestimmt ein paar freiwillige finden lassen, die dein Vorhaben auf ein ordentliches Fundament setzen. Denn ich denke mir, dass sowas definitiv Anklang finden wird.

Aber das ist nur meinen Meinung :)

Hab sowas als kleines Heimprojekt geschrieben, die spezielleren Bedürfnisse des Threaderstellers werden zwar nicht erfüllt, aber die grundlegende Funktionalität ist gegeben. :)

https://github.com/0xFelix/home-control
 
@r15ch13:

habe alles so eingefügt, aber leider hat sich nur die Anzeige "invertiert", soll heißen, die Geräte die aus sind, sind grün unterlegt (eigentlich 'imageOn'), die Eingeschalteten sind ohne Hintergrund (also 'imageOff') und die auf die zugegriffen wird, sind ebenfalls ohne Hintergrund.

Ich habe jetzt leider nicht die Zeit, um den Fehler zu suchen und kann mich wahrscheinlich erst morgen wieder melden.

@blablub: Meinst du, ich sollte mein Projekt mal vollständig vorstellen? Das lässt sich machen.
Ich finde, r15ch13 hat so hervorragende Arbeit geleistet, dass man die Programme leicht an etwas anderes anpassen kann, so dass es nicht nur mir nutzt.

Vielen Dank erstmal soweit und bis morgen.

Gruß

Holgip
 
Ah oh, das mit dem invertieren kommt davon das ich zum testen die Abfrage if((shell_exec('gpio -g read ' . $computer['gpioPort']) != 1 geaendert habe xD

Einfach ein == 1 draus machen :D
 
So, jetzt bin ich doch noch dazu gekommen.
Vielen Dank r15ch13, das war's.
Funktioniert, wie ich mir das gewünscht habe. Großartig!
 
Hallo,

ich muss meinen alten Thread mal wieder hochholen, da ich jetzt mit Hilfe des Forums eine neue "offen.txt" erzeugen kann, in der auch der Zugreifende Computer beinhaltet ist und nicht mehr nur "Guest".
Die offen.txt sieht jetzt z.B. so aus:

Code:
Path                                                        Computer                                                   
----                                                        --------                                                   
D:\                                                         Buezi-PC...                                                
D:\Ahnenblatt                                               Buezi-PC...                                                
D:\Buchliebhaber_8                                          Buezi-PC...                                                
D:\Buecher                                                  Buezi-PC...                                                
D:\CD-Datenbank                                             Buezi-PC...                                                
D:\CrystalDiskInfo_portable6_2_1                            Buezi-PC...                                                
D:\CrystalDiskInfo6_3_2                                     Buezi-PC...                                                
D:\D                                                        Buezi-PC...                                                
D:\Downloads                                                Buezi-PC...                                                
D:\EMDB                                                     Wozi-PC...                                                
D:\Excel                                                    Buezi-PC...                                                
D:\Faxe                                                     Buezi-PC...                                                
D:\HTML                                                     Mobil-PC...                                                
D:\HTML Tutorial                                            Mobil-PC...                                                
D:\impexus                                                  Buezi-PC...

Das PHP-Script "index.php" habe ich dahingehend geändert, dass die Zugriffsanzeige wieder funktioniert.

PHP:
                function driveHasOpenFiles($drive, $openFiles)
                {
                    if($drive === false) return false;
                    if(empty($openFiles)) return false;

                    return preg_match('/\.*('.$drive.'\\\)/i', $openFiles) === 1;
                 }

Da es aber über ein Jahr her ist, seitdem r15ch13 das Script geschrieben hat und ich mich in der Zwischenzeit nicht mehr mit PHP-Programmierung beschäftigt habe, wäre es schön, wenn ich nochmal Hilfe bekommen könnte.
Ich will den oder die Benutzer mit bei den Laufwerken anzeigen lassen. Dazu muss -glaube ich- die "config.php" ergänzt und die Benutzerstrings in der "index.php" verarbeitet werden. Ich weiß allerdings nicht, wie ich das machen soll. Wie kann es funktionieren?

PHP:
    <?php
    $config = array();
    $config['openFilesText'] = 'offen.txt';
    $config['computer'] = array(
        'server' => array(
            'name' => 'Server Zotac',
            'laufwerke' => array('D:', 'E:'),
            'imageOn' => 'img/Server_on.png',
            'imageOff' => 'img/Server.png',
            'imageZu'  => 'img/Server_zu.png',
            'gpioPort' => '17',
            'pythonScriptEin' => '/home/pi/Server.py',
            'pythonScriptAus' => '/home/pi/AlleAus.py',
            'message' => 'ACHTUNG! Vergewissern, dass niemand mehr zugreift! Hiermit wird alles ausgeschaltet!',
        ),
        'filme' => array(
            'name' => 'Filme Festplatte',
            'laufwerke' => 'M:',
            'imageOn' => 'img/Filme_on.png',
            'imageOff' => 'img/Filme.png',
            'imageZu'  => 'img/Filme_zu.png',
            'gpioPort' => '18',
            'pythonScriptEin' => '/home/pi/FilmeEin.py',
            'pythonScriptAus' => '/home/pi/FilmeAus.py',
            'message' => 'ACHTUNG! Vergewissern, dass niemand mehr auf die Filme zugreift!',
        ),
        'filme12' => array(
            'name' => 'Filme 1 und 2',
            'laufwerke' => array('K:', 'L:'),
            'imageOn' => 'img/Filme12_on.png',
            'imageOff' => 'img/Filme12.png',
            'imageZu'  => 'img/Filme12_zu.png',
            'gpioPort' => '22',
            'pythonScriptEin' => '/home/pi/12FilmeEin.py',
            'pythonScriptAus' => '/home/pi/12FilmeAus.py',
            'message' => 'ACHTUNG! Vergewissern, dass niemand mehr auf die Filme zugreift! Anzeige kommt etwas sp&auml;ter!',
        ),
        'backup' => array(
            'name' => 'Backup Festplatte',
            'laufwerke' => 'F:',
            'imageOn' => 'img/Backup_on.png',
            'imageOff' => 'img/Backup.png',
            'imageZu'  => 'img/Backup_zu.png',
            'gpioPort' => '23',
            'pythonScriptEin' => '/home/pi/Backup.py',
            'pythonScriptAus' => '/home/pi/BackupAus.py',
            'message' => '',
        ),
    );
    ?>

So sieht es im Moment aus:
PHP.JPG

So soll es aussehen:
PHP_soll.jpg
 
Code:
function driveHasOpenFiles($drive, $openFiles)
{
    if($drive === false) return false;
    if(empty($openFiles)) return false;

    return preg_match('/('.$drive.'\\\)/i', $openFiles) === 1;
}

function getAccessingComputers($drive, $openFiles)
{
    if($drive === false) return false;
    if(empty($openFiles)) return false;

    if(is_array($drive)) {
        $drive = '[' . implode('|', $drive) . ']';
    }

    $rows = explode("\n", $openFiles);
    $result = [];

    foreach ($rows as $row)
    {
        if(preg_match('/^'.$drive.'.*\s+(?<name>.*)[.]{3}$/i', $row, $matches) === 1)
        {
            if(!in_array($matches['name'], $result))
            {
                $result[] = $matches['name'];
            }
        }
    }
    return $result;
}

Habe die driveHasOpenFiles() Funktion noch mal ein klein wenig geaendert.

getAccessingComputers($computer['laufwerke'], $openFiles) spuckt ein Array mit den Computernamen aus.
Die kannst du jetzt beliebig irgendwo einbauen. (z.B. einfach mit implode(', ', $liste) Komma getrennt anzeigen)
 
Hi r15ch13,
erstmal Danke für deine Mühe. Ich habe da noch ein paar Fragen zu der Ergänzung:

1. 'name' soll der Name des zugreifenden Computers sein? Wenn Ja: 'name' ist in der config.php schon vergeben für den Namen des Laufwerks bzw. Servers. Dann muss ich das umbenennen (z.B. in 'user'), oder?

2. 'user' muss ja dann auch in der config.php eingetragen sein, z.B.:
PHP:
'zugriff' =>array(
'user' => array('Buezi-PC','Wozi-PC','Mobil-PC'),
),
damit die Variable 'user' auch definiert ist.
Ist das so richtig? Und kann ich das dann in die Anzeige so einbauen, wie z.B. 'message'?

3. Das mit dem implode habe ich gar nicht kapiert. Wenn du es mir erklären könntest...:)
 
Der Teil mit dem 'name' ist nur innerhalb der Funktion getAccessingComputers gueltig. Das hat nichts mit der config.php zu tun.

Code:
$computers = getAccessingComputers('D:', $openFiles);
print_r($computers);

/*
Die Ausgabe sieht dann so aus:
Array
(
    [0] => Buezi-PC
    [1] => Wozi-PC
    [2] => Mobil-PC
)
*/

$computers = implode(', ', $computers);
echo "Zugriff von $computers";

/*
Die Ausgabe sieht dann so aus:
Zugriff von Buezi-PC, Wozi-PC, Mobil-PC
*/

Du kannst die beiden Funktion oben einfuegen wo drivesHaveOpenFiles usw. stehen.
Und unten in der Ausgabe kannst du beim imageZu folgendes anfuegen.

Code:
Zugriff von <?php echo implode(', ', getAccessingComputers($computer['laufwerke'], $openFiles, $openFiles)); ?>
 
OK. Ich habe die offen.txt so geändert, dass für jedes "Laufwerk" jeweils eine Datei geöffnet ist:
Code:
Path                                                        Computer       

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

                                            
D:\                                                         Buezi-PC...    
                                            
F:\Ahnenblatt                                               Buezi-PC...    
                                            
L:\AIDA64 Reports                                           Buezi-PC...    
                                            
M:\Buchliebhaber_8                                          Buezi-PC...

Dann habe ich die zweite Funktion in die "function drivesHaveOpenFiles" gepackt (die erste ist ja wg. dem festen Buchstaben nicht geeignet und ich möchte die Liste auch mit Kommas getrennt):
PHP:
                function drivesHaveOpenFiles($drives, $openFiles)
                {
                    if(empty($openFiles)) return false;
                    if(!is_array($drives)) return driveHasOpenFiles($drives, $openFiles);
                    $retVal = false;

                    foreach ($drives as $drive)
                    {
                        if(driveHasOpenFiles($drive, $openFiles))
                        {
                            $retVal = true;
                        }
                    }
$computers = implode(', ', $computers);
print_r($computers);
                    return $retVal;
                }

Und schließlich habe ich hinter "ImageZu" die Ausgabe gesetzt.

Leider bringt die Ausgabe keine Werte auf den Bildschirm.
Daraufhin habe ich in der "function getAccessingComputers" zwei Ausgaben gesetzt, um mal zu schauen, was da los ist:
PHP:
                function getAccessingComputers($drive, $openFiles)
                {
                    if($drive === false) return false;
                    if(empty($openFiles)) return false;

                    if(is_array($drive)) {
                        $drive = '[' . implode('|', $drive) . ']';
                    }

                    $rows = explode("\n", $openFiles);
                    $result = [];

                    foreach ($rows as $row)
                    {
                        if(preg_match('/^'.$drive.'.*\s+(?<name>.*)[.]{3}$/i', $row, $matches) === 1)
                        {
                            if(!in_array($matches['name'], $result))
                            {
                                $result[] = $matches['name'];
                            }
                        }
                    }
print_r($result);
print_r($drive);
                    return $result;
                }

Das Ergebnis:
Komisch.JPG

Es scheint, als ob das Array "$result" leer wäre, obwohl hier doch eigentlich die Computer stehen müssten. Auf jeden Fall werden die Zugriffscomputer nicht angezeigt. Auch die Variable "$computers" scheint leer zu sein.

Was ist hier noch falsch?
 
Die Variable $computers ist in der Funktion drivesHaveOpenFiles() ja auch gar nicht verfuegbar.
Das was du eingefuegt hast kannst du wieder rausnehmen (also das print_r und implode). Das war nur Beispielkram von mir.


Aendere mal in der Funktion getAccessingComputers()

$rows = explode("\n", $openFiles);
nach
$rows = explode("\r\n", $openFiles);

Vielleicht hast du andere Zeilenumbrueche in der offen.txt
 
Leider funktioniert es immer noch nicht. $result ist nach wie vor leer.

Was mir noch aufgefallen ist: Als ich deine print_r ($computers) in der Funktion drivesHaveOpenFiles() hatte, habe ich die Variable mal durch ein "Hallo" ersetzt. Dieses "Hallo" zeigte sich aber nur hinter dem Bild des Servers und von "Filme 1 und 2". Hinter "Filme" und "Backup" war es nicht zu sehen.
D.h. doch, dass die Funktion nicht ganz durchgelaufen ist, oder?

Nochwas: die Zugriffscomputer müssen nicht in der config.php eingetragen werden, oder?
 
Gerne.

index.php:
PHP:
<!doctype html>
<html class="no-js" lang="">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title></title>
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <link rel="stylesheet" href="css/main.css">
    </head>
<body>
<?php include 'config.php'; ?>

    <div class="container">
        <?php
                /**
                 * Liest die angegebene Datei in ein Array
                 */
                function readOpenFilesText($openFilesText)
                {
                    if(!file_exists($openFilesText)) return array();

                    return file_get_contents($openFilesText);
                }

                /**
                 * Ueberprueft ob Dateien auf dem angegeben Laufwerk geoeffnet sind
                 */
                function driveHasOpenFiles($drive, $openFiles)
                {
                    if($drive === false) return false;
                    if(empty($openFiles)) return false;

                    return preg_match('/('.$drive.'\\\)/i', $openFiles) === 1;
                  }

                /**
                 * Ueberprueft, welche Computer gerade zugreifen
                 */
                function getAccessingComputers($drive, $openFiles)
                {
                    if($drive === false) return false;
                    if(empty($openFiles)) return false;

                    if(is_array($drive)) {
                        $drive = '[' . implode('|', $drive) . ']';
                    }

                    $rows = explode("\r\n", $openFiles);
                    $result = [];

                    foreach ($rows as $row)
                    {
                        if(preg_match('/^'.$drive.'.*\s+(?<name>.*)[.]{3}$/i', $row, $matches) === 1)
                        {
                            if(!in_array($matches['name'], $result))
                            {
                                $result[] = $matches['name'];
                            }
                        }
                    }
print_r($result);
print_r($drive);
                    return $result;
                }


                function drivesHaveOpenFiles($drives, $openFiles)
                {
                    if(empty($openFiles)) return false;
                    if(!is_array($drives)) return driveHasOpenFiles($drives, $openFiles);
                    $retVal = false;

                    foreach ($drives as $drive)
                    {
                        if(driveHasOpenFiles($drive, $openFiles))
                        {
                            $retVal = true;
                        }
                    }
                    return $retVal;
                }

                // offen.txt lesen und ergebnis zwischenspeichern
                $openFiles = readOpenFilesText($config['openFilesText']);

            // Nur wenn Form abgeschickt wurde
                if(isset($_POST) && isset($_POST['computer']))
                {

            // Wenn Computer existiert
                    if(isset($config['computer'][$_POST['computer']]))
                    {

            // Python Script ausfuehren
                        $computer = $config['computer'][$_POST['computer']];
                        if(isset($_POST['action_on_x']))
                        {
                            shell_exec('sudo python ' . $computer['pythonScriptEin']);
                        }
                        else if(isset($_POST['action_off_x']))
                        {
                        shell_exec('sudo python ' . $computer['pythonScriptAus']);
                        }
                    }
                }
        ?>

        <!-- Computer anzeigen -->
        <?php foreach($config['computer'] as $computerKey => $computer): ?>
            <div class="computer">
                <div class="left">
                    <h1><?php echo $computer['name']; ?></h1>
                    <form name="<?php echo $computerKey ?>" method="post" action="index.php" class="switches">
                        <input type="hidden" name="computer" value="<?php echo $computerKey ?>">
                        <input type="image" src="img/ein.png" alt="An" name="action_on">
                        <input type="image" src="img/aus.png" alt="Aus" name="action_off">
                    </form>
                </div>
                <div class="right">
                        <!-- Statusbild anzeigen -->
                        <?php if((shell_exec('gpio -g read ' . $computer['gpioPort']) == 1)): ?>
                            <!-- Bei jedem Computer pruefen ob Dateien offen sind -->
                            <?php if(drivesHaveOpenFiles($computer['laufwerke'], $openFiles)): ?>
                                 <img src="<?php echo $computer['imageZu']; ?>">
                                         Zugriff von <?php echo implode(', ', getAccessingComputers($computer['laufwerke'], $openFiles, $openFiles)); ?>
                            <?php else: ?>
                                <img src="<?php echo $computer['imageOn']; ?>">
                            <?php endif; ?>
                        <?php else: ?>
                            <img src="<?php echo $computer['imageOff']; ?>">
                        <?php endif; ?>
                    <div class="warning"><?php echo $computer['message']; ?></div>
                </div>
            </div>
        <?php endforeach; ?>
     </div>

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<script src="js/main.js"></script>
</body>
</html>

config.php:
PHP:
    <?php
    $config = array();
    $config['openFilesText'] = 'offen.txt';
    $config['computer'] = array(
        'server' => array(
            'name' => 'Server Zotac',
            'laufwerke' => array('D:', 'E:'),
            'imageOn' => 'img/Server_on.png',
            'imageOff' => 'img/Server.png',
            'imageZu'  => 'img/Server_zu.png',
            'gpioPort' => '17',
            'pythonScriptEin' => '/home/pi/Server.py',
            'pythonScriptAus' => '/home/pi/AlleAus.py',
            'message' => 'ACHTUNG! Vergewissern, dass niemand mehr zugreift! Hiermit wird alles ausgeschaltet!',
        ),
        'filme' => array(
            'name' => 'Filme Festplatte',
            'laufwerke' => 'M:',
            'imageOn' => 'img/Filme_on.png',
            'imageOff' => 'img/Filme.png',
            'imageZu'  => 'img/Filme_zu.png',
            'gpioPort' => '18',
            'pythonScriptEin' => '/home/pi/FilmeEin.py',
            'pythonScriptAus' => '/home/pi/FilmeAus.py',
            'message' => 'ACHTUNG! Vergewissern, dass niemand mehr auf die Filme zugreift!',
        ),
        'filme12' => array(
            'name' => 'Filme 1 und 2',
            'laufwerke' => array('K:', 'L:'),
            'imageOn' => 'img/Filme12_on.png',
            'imageOff' => 'img/Filme12.png',
            'imageZu'  => 'img/Filme12_zu.png',
            'gpioPort' => '22',
            'pythonScriptEin' => '/home/pi/12FilmeEin.py',
            'pythonScriptAus' => '/home/pi/12FilmeAus.py',
            'message' => 'ACHTUNG! Vergewissern, dass niemand mehr auf die Filme zugreift! Anzeige kommt etwas sp&auml;ter!',
        ),
        'backup' => array(
            'name' => 'Backup Festplatte',
            'laufwerke' => 'F:',
            'imageOn' => 'img/Backup_on.png',
            'imageOff' => 'img/Backup.png',
            'imageZu'  => 'img/Backup_zu.png',
            'gpioPort' => '23',
            'pythonScriptEin' => '/home/pi/Backup.py',
            'pythonScriptAus' => '/home/pi/BackupAus.py',
            'message' => '',
        ),
    );
    ?>


Die main.css und die main.js haben sich nicht geändert, wenn du sie trotzdem nochmal brauchst, melde dich.
 
Dann jetzt noch eine offen.txt als Anhang, nicht hier rein kopiert. :)
Mit meiner Datei gehts naemlich... :/
 
Zurück
Oben