November 8, 2020

Mit Node.js gegen den Rest der Welt - Heute Webserver

Webserver in Node.js

Weiterlesen
November 3, 2020

linux shell skript immer als administrator ausführen

hilfreiches skripttool

Weiterlesen
Cover Image

Mit Node.js gegen den Rest der Welt - Heute Webserver

Webserver in Node.js

November 8, 2020 - Lesezeit: 28 Minuten

Mit Node.js lässt sich JavaScript in einer Konsolenumgebung starten, ohne dass dazu eín Browser notwendig wäre. Das eröffnet ganz neue Möglichkeiten, da so JavaScript aus der Sandbox des Browsers herauskommt und die bisherigen Beschränkungen, wie Dateizugriff und betriebssytemspezifische Abfragen nun entweder direkt möglich sind oder unkomplitziert implementiert werden können. Node.js kommt mit einem Paketverwaltungssytem auf den Rechner. Dieser Manager liefert Zugriff auf eine große Zahl von Paketen, in denen viele Funktionen in Node.js bereits realisiert sind oder Node.js durch z.B. Platform invokes sinnvoll erweitert.

Diese Pakete wiederum können Verweise auf andere Pakete haben, falls sie diese benutzen. Ganz ähnlich zu dem Paketmanager von Debian. Wenn z.B. ein FTP Paket geladen wird, wird im Hintergrund das Paket für den Dateizugriff ebenfalls installiert. Mithilfe einer kleinen Konfigurationsdatei und einem ordnerbasierten Paketmanagement, können verschiedene Versionen auf einem Rechner nebeneinander installiert werden. Dies ermöglicht verschiedene Projekte in verschiedenen Versionständen nebeneinander zu betreiben. Weiterhin ist der Anspruch, auf jedem System lauffähig zu sein und das Prinzip "Write once, run anywhere" passend umzusetzen. Intressant wird es immer dann, wenn man versucht betriebssystemspezifische Implementierungen zu nutzen.

Da Node.js unkompliziert sowohl unter Windows als auch unter Linux verwendet werden kann, ist es naheligend, als JavaScriptentwickler einen Blick zu wagen. Man kann im Gegensatz zu anderen Systemen den Know How Aufbau für eine Skriptsprache minimal halten und schnell Ergebnisse erzielen. Um mit der ganzen Umgebung etwas warm zu werden und weil ich für die Entwicklung einen kleinen Webserver benötigt habe, hab ich das Ganze mal mit einem Nodeskript umgesetzt. Natürlich ist dieser Server nicht vergleichbar mit der voll ausgestatteten Variante eines Symolo Servers, aber für kleine Zwecke ist auch ein solches Skript durchaus hilfreich.

Die Funktion des Skriptes umfasst lediglich das Starten eines Webservers, der eine begrenze Anzahl von Dateien aus einem Ordner und dessen Unterordnern laden kann. Dieses Skript ist nicht für Produktivumgebungen gedacht. So, genug chitchat, los gehts:

const http = require("http");
const path = require('path');
const fs = require('fs');

const HOST = "localhost";
const PORT = 8190;
const HOMEPATH = "dmf";

const requestListener = (requestresponse=> {

  let filePath = './' + request.url;
  if (filePath == './/'filePath = './' + HOMEPATH + '/index.html';
  else filePath = './' + HOMEPATH + request.url;

  filePath = filePath.split('?')[0];

  let extname = path.extname(filePath).split('?')[0]; // filter the queryparams

  let contentType = 'text/html'// set default content type
  switch (extname) {
    case '.js'contentType = 'text/javascript'break;
    case '.css'contentType = 'text/css'break;
    case '.json'contentType = 'application/json'break;
    case '.png'contentType = 'image/png'break;
    case '.jpg'contentType = 'image/jpg'break;
  }

  fs.readFile(filePath, (errorcontent=> {
    if (error) {
      if (error.code == 'ENOENT') {
        fs.readFile('./404.html', (errorcontent=> { // some nice error handling
          response.writeHead(200, { 'Content-Type': contentType });
          response.end(content'utf-8');
        });
      }
      else {
        response.writeHead(500);
        response.end('Sorry, check with the site admin for error: ' + error.code + ' ..\n');
      }
    }
    else {
      response.writeHead(200, { 'Content-Type': contentType });
      response.end(content'utf-8');
    }
  });
};

const server = http.createServer(requestListener);
server.listen(PORTHOST, () => { console.log(`Server is running on http://${HOST}:${PORT}`); });

Ein minimalistischer Server auf nur 50 Zeilen. Natürlich wird hier Gebrauch von einigen Paketen gemacht, die viele der Grundarbeiten bereits erledigen. Trotzdem kann sich das Ergebnis sehen lassen. Dieses Skript, unter und für Windows entwickelt, ist auch aus dem Stand unter Linux und MacOS lauffähig. Da hier Dateizugriffe verwendet werden, ist dieses Skript leider nicht für den direkten Einsatz im Browser verwendbar. Dafür beim nächsten Mal ein Beispiel.


Cover Image

linux shell skript immer als administrator ausführen

hilfreiches skripttool

November 3, 2020 - Lesezeit: 78 Minuten

Problemstellung:
Wir haben ein Serverskript das wir immer als Administrator ausführen.
Dieses Skript führt ein Serverupdate bei uns durch.
Wenn das Skript nicht als Administrator ausgeführt, wird führt dies zu einem unvollständigen Update, da für bestimmte Dateien die Berechtigung fehlt.
Daraus resultiert unter Umständen eine unvollständige Installation.
Um eine Fehlerquelle auszuschließen haben wir nach einer Möglichkeit gesucht wie sichergestellt werden kann, dass das Skript immer als Administrator ausgeführt wird.

Lösung:

if [[ $EUID -ne 0 ]]; then
  sudo PATH/ScriptToExecute.sh
else
  #ScriptCode
fi

$EUID stellt die Identität des angemeldeten Users dar der für die Rechteprüfung genutzt wird hierbei hat er root Nutzer die 0.

-ne ist der Operator für ungleich

Das Skript prüft ob es sich bei dem angemeldeten Benutzer um den Root handelt.

Ist das nicht der Fall: Ruft sich das Skript erneut mit Rootrechten auf.


Cover Image

Testen - Wichtiger als man vielleicht denkt

Oktober 20, 2020 - Lesezeit: ~1 Minute

Heute möchte ich kurz über einen Teil der Softwareentwicklung sprechen, der oftmals zu kurz kommt, obwohl es der wichtigste überhaupt ist.

Das TESTEN

Die Entwicklung und Programmierung kann noch so schnell gegangen sein und die allerneusten Methoden verwenden, wenn nichts funktioniert, bringt es niemandem etwas.

Eine ungetestete Software ist so wie ein Auto ohne Tüv. Kann laufen, muss es aber nicht.

Also haben Sie ein Augenmerk darauf, dass sie fähige Mitarbeiter die Software inhouse testen lassen. Ein Entwickler kann zwar dafür Sorge tragen, dass die Software läuft, aber ob sie so läuft wie Sie das wollen und benötigen, dass kann er nicht unbedingt wissen.


Cover Image

Was ist eine Nummer in Javascript

Javascript und die Datentypen. Heute: was ist eigentlich eine Zahl.

September 21, 2020 - Lesezeit: 6 Minuten

um schnell mal zu überprüfen ob ein Wert eine Zahl ist in Javascript gibt es jede Menge Möglichkeiten. Nun sind Programmierer immer ein bisschen schreibfaul. Also entscheidet man sich für die kürzeste Methode einen Wert auf eine Zahl zu prüfen:

    isNaN(valueToCheck)

Alternativ kann auch folgende Prüfung verwendet werden:

   typeof valueToCheck == 'number'

Ist aber länger, also irgendwie uncool. Sollte aber besser verwendet werden. Sonst könnte folgendes Szenario problematisch werden:

    {
      "Auftragsnummer" : "200123",
      "Menge" : 2
   }

Auftragsnummer ist per Definition ein Text, auch wenn in dem Text eine Nummer steckt:

   isNaN("200123"// Text wird als Nummer interpretiert // liefert gültige Nummer
    isNaN(2)        // liefert gültige Nummer
    isNaN("TEST")   // liefert KEINE gültige Nummer

    typeof "200123" == 'number'   // liefert KEINE gültige Nummer
    typeof 2 == 'number'          // liefert gültige Nummer

Kommt natürlich wieder auf das Szenario an. Aber das Verhalten kann zu komischen Programmabläufen führen. Typensicherheit (soweit man in Javascript davon reden kann ;) ist aber immer hilfreich.


Über

Symolo - systems of mobile logistics
Wir sind Anbieter für Softwarelösungen im Logistikbereich und darüber hinaus.
https://symolo.de