Schlagwort-Archive: Server

BitBastelei #304 – Server-Akkupacks: Was steckt drin

BitBastelei #304 - Server-Akkupacks: Was steckt drin

(73 MB) 00:17:14

2018-10-14 10:00 🛈

In professionellen Speichersystemen kommen oft Batterien oder große Kondensatoren zum Einsatz, um bei Stromausfällen die Risiken eines Datenverlustes zu minimieren. Erstere müssen regelmäßig getauscht werden um Probleme durch Alterung zuvorzukommen. Schauen wir doch mal, was da so im Inneren steckt.

BitBastelei #303 – DIY Storage-System mit SAS-Expander

BitBastelei #303 - DIY Storage-System mit SAS-Expander

(583 MB) 00:28:02

2018-10-07 10:00 🛈

Zu wenig USB? Hub. Zu wenig Netzwerk? Switch. Zu wenig S-ATA? Auch hier gibt es mit so genannten SAS-Expandern eine Art Verteiler, welche es ermöglichen mehrere Geräte an einem SAS-Anschluss zu betreiben. Und das Beste: Sie sind recht günstig zu haben. Ein solcher bildet die Basis für den Ersatz meines bisherigen Wäscheleinensystems. Und das damit ein Fake-USB-Kabel und die Flex zu tun haben? Nu das bekommen wir sicher auch noch raus.

Inhalt:

  • 00:00 Bisheriger Aufbau
  • 08:21 Server-Recycling: Storage-Gehäuse
  • 14:04 Das neue Konzept
  • 17:36 Aufbau und Fehlersuchen

BitBastelei #300 – Externe Grafikkarte am PC/Server? Quick’n’Dirty-Weg

BitBastelei #300 - Externe Grafikkarte am PC/Server? Quick'n'Dirty-Weg

(534 MB) 00:21:27

2018-09-16 10:00 🛈

Grafikkarten im Server? Was für dein Ein oder Anderen vermutlich seltsam klingt ist doch gar nicht so ungewöhnlich, denn mit diesen kann man nicht nur Spiele spielen, sondern auch hoch-parallelisierte Berechnungen durchführen. Da ich aktuell mit diversen dieser Techniken herumexperimentiere soll also auch mein Home-Server eine solche erhalten. Nur gibt es da so ein paar Hindernisse.

BitBastelei #263 – Dell Server Fehlersuche

BitBastelei #263 - Dell Server Fehlersuche

(180 MB) 00:32:22

2017-11-26 11:00 🛈

Another one bites the dust. Mein Backupserver ließ sich beim letzten Versuch nicht mehr einschalten. Schauen wir mal, was ich seinerzeit darin verbaut hatte und ob wir noch etwas retten können.

(Ja, CMOS-Reset hatte ich auch versucht…)

BitNotice #115 – SATA, SAS und Speichervoodoo

BitNotice #115 - SATA, SAS und Speichervoodoo

(58 MB) 00:05:44

2017-05-30 12:00 🛈

Den S-ATA-Stecker kennt vermutlich jeder PC-Bastler, aber wusstet Ihr auch, dass über den selben Stecker auch SAS funktioniert? Und dass man 4 dieser Datenkanäle auf ein Kabel bündeln kann? Ein kurzer Blick auf die SATA/SAS-Stecker und Protokolle, welche bei mir so herumfliegen.

Korrektur: SFF-8482 ist nur S-ATA-kompatibel, nicht 100% identisch

BitBastelei #174 – XMPP-Server mit Prosody

BitBastelei #174 - XMPP-Server mit Prosody

(36 MB) 00:15:40

2015-11-15 11:00 🛈

XMPP hatten wir ja schon mal – ein Instant Messaging Dienst wie viele ihn tagtäglich nutzen. Der Vorteil: Das Protokoll ist offen – jeder kann sich seinen Client – für welches Endgerät auch immer – aussuchen, selber welche entwickeln oder gar eigene Server betreiben. Um letzteres soll es dieses mal gehen: Mit Pros?dy lässt sich ein solcher in wenigen Minuten installieren.

XMPP-Logo: copyright (c) 1999 – 2011 by the XMPP Standards Foundation (XSF). https://xmpp.org/about-xmpp/xsf/xsf-ipr-policy/#legal
Prosody-Logo: © https://prosody.im

Q’n’D Windows-Shutdown-Daemon in PHP

Alles in Deckung, ich mache wieder unschönes Zeugs. Ich hatte ja bereits erklärt wie man über RPC/Samba einen Windows-PC von Linux herunterfahren kann. Leider ist die Installation von Samba aus Embedded-Systemen eine eher ungünstige Sache und ist in meinem Fall wegen Speichermangel nicht drin. Allerdings ist sowohl auf dem Embedded-System als auch dem betroffenen Rechner PHP verfügbar. I aim to misbehave.

Auf dem herunterzufahrenden Windows-Rechner wird per PHP ein TCP-Socket geöffnet. Dieser Code basiert auf einem Beispiel von Michael Kliewe. Um Scriptkiddies nicht direkt Zugang zu geben ist etwas (sehr schlechte) Challenge-Response-Authentifizierung drin – nunja, ist kein kritisches System. Wird der Client bestätigt folgt ein simples Shutdown per exec. Nicht viel, aber schnell Fertig und funktioniert:

<?php
class SocketChatServer {
    private $address = '0.0.0.0';   // 0.0.0.0 means all available interfaces
    private $port = 12345;          // the TCP port that should be used
    private $maxClients = 10;
 
    private $clients;
    private $socket;
    
    private $salt = 'YourSalt';
    private $pass = 'YourSecret';
 
    public function __construct() {
        // Set time limit to indefinite execution
        set_time_limit(0);
        error_reporting(E_ALL ^ E_NOTICE);
    }
 
    public function start() {
        // Create a TCP Stream socket
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        // Bind the socket to an address/port
        socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, 1);
        socket_bind($this->socket, $this->address, $this->port);
        // Start listening for connections
        socket_listen($this->socket, $this->maxClients);
 
 
        $this->clients = array('0' => array('socket' => $this->socket));
 
        while (true) {
            // Setup clients listen socket for reading
            $read[0] = $this->socket;
            for($i=1; $i<count ($this->clients)+1; ++$i) {
                if($this->clients[$i] != NULL) {
                    $read[$i+1] = $this->clients[$i]['socket'];
                }
            }
 
            // Set up a blocking call to socket_select()
            $ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL);
 
            /* if a new connection is being made add it to the client array */
            if(in_array($this->socket, $read)) {
                for($i=1; $i < $this->maxClients+1; ++$i) {
                    if(!isset($this->clients[$i])) {
                        $this->clients[$i]['socket'] = socket_accept($this->socket);
                        socket_getpeername($this->clients[$i]['socket'], $ip);
                        $this->clients[$i]['ipaddy'] = $ip;
 
                        socket_write($this->clients[$i]['socket'], 'Welcome to the Shutdown Control System'."\r\n");
                        socket_write($this->clients[$i]['socket'], 'Your personal code is '.md5($this->salt.strftime('%Y-%m-%d').$ip)."\r\n");
 
                        $this->log("New client #$i connected: " . $this->clients[$i]['ipaddy']);
                        break;
                    } elseif($i == $this->maxClients - 1) {
                        $this->log('Too many Clients connected!');
                    }
 
                    if($ready < 1) {
                        continue;
                    }
                }
            }
 
            // If a client is trying to write - handle it now
            for($i=1; $i<$this->maxClients+1; ++$i) {
                if(in_array($this->clients[$i]['socket'], $read)) {
                    $data = @socket_read($this->clients[$i]['socket'], 1024, PHP_NORMAL_READ);
 
                    if($data === FALSE) {
                        unset($this->clients[$i]);
                        $this->log('Client disconnected!');
                        continue;
                    }
 
                    $data = trim($data);
 
                    if(!empty($data)) {
                        switch ($data) {
                            case 'exit':
                            case 'quit':
                                socket_write($this->clients[$i]['socket'], "Disconnecting without any action, Goodbye.\r\n");
                                $this->log("Client #$i is exiting");
                                unset($this->clients[$i]);
                                continue;
                            case 'shutdown-'.md5($this->pass.md5($this->salt.strftime('%Y-%m-%d').$ip)):
                                // first write a message to all connected clients
                                for($j=1; $j < $this->maxClients+1; ++$j) {
                                    if(isset($this->clients[$j]['socket'])) {
                                        if($this->clients[$j]['socket'] != $this->socket) {
                                            socket_write($this->clients[$j]['socket'], "System will be shut down now...\r\n");
                                        }
                                    }
                                }
                                // Close the master sockets, server termination requested
                                exec('shutdown /s /t 15 /c "System wurde per Fernbedienung ausgeschaltet"');
                                $this->log("Terminated server (requested by client #$i)");
                                exit;
                            case 'whoami':
                                // first write a message to all connected clients
                                socket_write($this->clients[$i]['socket'], "You are registred with the source IP ".$this->clients[$i]['ipaddy']." - your Code was ".md5($this->salt.strftime('%Y-%m-%d').$ip)." \r\n");
                                
                                break(2);
                            default:
                                for($j=1; $j < $this->maxClients+1; ++$j) {
                                    if(isset($this->clients[$j]['socket'])) {
                                        if(($this->clients[$j]['socket'] != $this->socket)) {
                                            $this->log($this->clients[$i]['ipaddy'] . ' is sending a message to ' . $this->clients[$j]['ipaddy'] . '!');
                                            socket_write($this->clients[$j]['socket'], '[' . $this->clients[$i]['ipaddy'] . '] says: ' . $data . "\r\n");
                                        }
                                    }
                                }
                                break(2);
                        }
                    }
                }
            }
        } // end while
    }
 
    private function log($msg) {
        // instead of echoing to console we could write this to a database or a textfile
        echo "[".date('Y-m-d H:i:s')."] " . $msg . "\r\n";
    }
}

$srv = new SocketChatServer;
$srv->start();
?>

Der Client bastelt sich eine passende Authentifizierung und spielt Zündknopf:

function pc_shutdown() {                                                                                                                                                                                                              
                $pass = 'YoutSecret';                                                                                                                                                                                                         
                                                                                                                                                                                                                                              
                $fp = fsockopen('pc.name', 12345, $errno, $errstr, 2);                                                                                                                                                                              
                if(!$fp) return false;                                                                                                                                                                                                        
                                                                                                                                                                                                                                              
                $line = fgets($fp); //Greeting                                                                                                                                                                                                
                $line = fgets($fp); //Hash                                                                                                                                                                                                    
                                                                                                                                                                                                                                              
                preg_match('/code is ([\w\d]{32})/', $line, $match);                                                                                                                                                                          
                $seed = $match[1];                                                                                                                                                                                                            
                                                                                                                                                                                                                                              
                $cmd = 'shutdown-'.md5($pass.$seed)."\n";                                                                                                                                                                                     
                                                                                                                                                                                                                                              
                fwrite($fp, $cmd);                                                                                                                                                                                                            
                                                                                                                                                                                                                                              
                var_dump(fgets($fp));                                                                                                                                                                                                         
                                                                                                                                                                                                                                              
                fclose($fp);                                                                                                                                                                                                                  
        }

Hoffen wir, dass es läuft und ich nie wieder drauf schauen muss, denn irgendwo tut sowas selbst mir weh 😉

UEFI – wir verschlimmbessern?

Was war das doch früher einfach: Ins CMOS-Setup, ein paar wenige Einstellungen anpassen und meist konnte man danach sein System starten – auch, wenn der nötige “Treiber” erst per Option-ROM hinterher kam. Heute läuft das anders: Vor das ohnehin schon in einen Hypervisor verfrachtete OS hängt man einen weiteren Systemlayer: UEFI. Ganz toll mit ganz vielen Modulen und ganz vielen Möglichkeiten (die sicher auch Sicherheitstechnisch in Zukunft einigen Spaß machen dürften). Soweit die Theorie. Inzwischen hatte ich das große Vergnügen mehrere UEFI-Systeme vorgesetzt zu bekommen. Nummer eins war ein kleines AMD-Fusion-Board, welches recht pflegeleicht war. Das neue Setup glänzt mit Mausunsterstützung und selbsterklärender GUI, an vernünftige Einstellungen gelangt man über einen Expertenmodus. Das System startet flott und zeigt keine Fehler, zwar “no Points so far”, dann auch ältere PCs mit BIOS hatten zum Teil schon grafische Menüs, aber ich sah auch keine Nachteile für mach, also “macht wenn ihr euch besser fühlt” – die 2TB-Grenze des alten BIOS dürfte demnächst ja erreicht sein. Die weiteren Rechner waren IBM xServer und hierzu kann ich nur eins sagen: You are doing it wrong. IBM war ja noch nie für durchdachte Menüs oder Konzepte im BIOS zu haben, aber was sie bei diesen Kisten geritten hat wissen sie wohl selbst nicht – je nach PCI-Karten benötigen die Kisten über 20 Minuten um den BIOS-Nachfolger zu durchlaufen und mit dem OS zu beginnen. Das Booten einer internen RAID-Karte wird zur Geduldsprobe: Diese versteckt sich hinter kryptischen PCI-IDs, welche erst in eine Bootwarteschlange eingefügt und in einem weiteren Schritt entsprechend priorisiert werden müssen. Selbst dann booten ältere Systeme nicht, denn ohne ein höher priorisiertes “Legacy Devices”, welches als Dummy-Boot-Device dient und beim Booten diverse Einstellungen ändert, werden nur EFI-fähige Betriebssysteme unterstützt. “Mal schnell” etwas machen fällt hier definitiv aus. Aus den UEFI-Zielen der einfacheren Bedienbarkeit und schnelleren Bootzeiten wurde hier eher das exakte Gegenteil. Ich habe jetzt nach 2 Stunden jedenfalls das nicht (ganz planmäßig abgesägte) OS wieder am laufen – wie der letzte Nutzer es gebootet hatte wird wohl ein Geheimnis bleiben.