Software

Adobe Acrobat / Adobe Reader

Adobe Acrobat / Adobe Reader

Stempel aus Adobe Acrobat exportieren

Einleitung

Wenn du die Stempel im Acrobat Reader exportieren möchtest, musst du die Stempel als Dateien sichern. Diese Dateien kannst du dann in anderen Installationen wieder integrieren. 

Speicherort Stempel

Um die Stempel zu sichern, öffnest du den Datei Explorer. Dort navigierst du zu folgendem Pfad

C:\Users\<benutzer>\AppData\Roaming\Adobe\<version>\Stamps

Dort befinden sich die PDF Dateien. Die Stempel werden als PDF Datei abgespeichert. Diese kannst du dir dann abspeichern oder in eine andere Installation wieder integrieren. 

Adobe Audition

Adobe Audition

Rauschen aus einer Tonspur entfernen

Einleitung

Wenn wir eine Audio Spur aufnehmen, möchten wir vielleicht das Hintergrundrauschen entfernen. Um dies zu bewerkstelligen können wir die in Audition integrierte Funktion nutzen um das Grundrauschen zu entfernen.

Rauschen entfernen

Um das Rauschen zu entfernen, benötigen wir einen kleinen Teil wo nichts gesagt wird. Anhand dieser Zeit kann Audition ermitteln, wie sich das Grundrauschen anhört.

Dazu markieren wir den Teil in dem die Linie Zentral ohne Ausschwingungen bleibt. Wir machen einen Rechtsklick drauf und wählen Geräuschmuster speichern.

Audition_Rauschen_1.png

Im letzten Schritt markieren wir die gesamte Tonspur. Unter Windows ist das die Tastenkombination STRG + A. Gehen dann oben auf Effekte -> Rauschminderung/Wiederherstellung und dort auf den Punkt Rauschminderung (Prozess). Wir bestätigen dies indem wir auf Anwenden drücken. Dann wird das Rauschen aus unserer Tonspur entfernt. 

GLPI-Plugin Entwicklung

GLPI-Plugin Entwicklung

GLPI Plugin Datenbank initialisieren

Einleitung

Wenn wir Daten in GLPI permanent machen wollen, müssen wir dies über Datenbanken realisieren. Da GLPI von Haus aus eine Datenbank benötigt wollen wir diese verwenden um dort unsere Datei abzulegen.

hook.php

Um unsere Plugin Datenbank zu initialisieren, müssen wir in der install Funktion ein paar Zeilen Code hinzufügen und diesen mit unserem SQL Befehl ausstatten. 

So könnte der Code aussehen.

<?php
    function plugin_debitors_install()
    {
        global $DB;
        
        $migrate = New Migration(100);

        //Überprüfen ob Tabelle existiert
        if(!$DB->tableExists('glpi_plugin_debitors_debitors'))
        {
            $query = "CREATE TABLE glpi_plugin_debitors_debitors (id INT, name VARCHAR(50))";

            $DB->queryOrDie($query, $DB->error());
        }

        $migrate->executeMigration();
        return true;
    }

  function plugin_debitors_uninstall() {
     global $DB;

     $tables = [
        'debitors'
     ];

     foreach ($tables as $table) {
        $tablename = 'glpi_plugin_debitors_' . $table;

        if ($DB->tableExists($tablename)) {
           $DB->queryOrDie(
              "DROP TABLE `$tablename`",
              $DB->error()
           );
        }
     }

     return true;
  }
GLPI-Plugin Entwicklung

GLPI Plugin programmieren

Einleitung

In dieser und weiter Anleitung werden wir ein Plugin für GLPI schreiben. Das Plugin wird dann in der Plugin Übersicht angezeigt. Weitere Funktionen fügen wir in anderen Anleitungen hinzu.

Mithilfe von Plugins können wir unsere Anwendung anpassen und weitere Funktionalitäten hinzufügen damit die Software unseren Anforderungen gerecht wird. 

setup.php & hook.php

In dieser Anleitung werden wir die setup.php und die hook.php einrichten. Diese beiden Dateien sind eine der wichtigsten. Anhand dieser Dateien werden die Plugins identifiziert und installiert als auch später wieder deinstalliert. 

Zuerst wechseln wir in das plugin Verzeichnis unseres GLPI-Servers. Dort erstellen wir einen Ordner mit dem Namen unseres Plugins. Wir nennen unser Plugin debitors

Mit dem Plugin soll es Möglich sein Debitoren hinzuzufügen und diese später mit bestimmten Daten zu verknüpfen.

In dem Verzeichnis erstellen wir eine Datei mit dem Namen setup.php. Dort fügen wir folgendes Code Gerüst ein.

<?php
    // Definiere Variablen mit Plugin Informationen
    define("PLUGIN_NAME", "Debitoren");
    define("VERSION_NUMBER", "1.0.0");
    

    // Erstelle Initialisierungsfunktion des Plugins
    function plugin_init_Debitors()
    {
        global $PLUGIN_HOOKS;
        $PLUGIN_HOOKS['csrf_compliant']['Debitors'] = true;
    }

    // Definiere Plugin Informationen
    function plugin_version_debitors()
    {
        return array(
            "name"  =>  PLUGIN_NAME,
            "version" => VERSION_NUMBER,
            "author"=>  "DEIN NAME",
            "license" => "LIZENZ",
            "homepage" => "DEINE WEBSITE",
            "minGlpiVersion" => "VERSIONS ANFORDERUNG"
        );
    }
    
    //Überprüfe ob Anforderungen für das Plugin erfüllt sind
    function plugin_debitors_check_prerequisites()
    {
        if(version_compare(GLPI_VERSION, '10', 'eq') || version_compare(GLPI_VERSION, '10', 'gt'))
        {
            return true;
        } else {
            echo "Das Plugin benötigt die Version 10.0.0 | Installiert ist Version: " . GLPI_VERSION;
            return false;
        }
    }

    //Überprüfe ob die Konfiguration übereinstimmt
    function plugin_debitors_check_config()
    {
        return true;
    }
?>

In der Datei brauchen wir nur noch den Namen, und die anderen Informationen ändern. Diese Informationen werden dann im Plugin Menü angezeigt. Im weiteren können wir in der check_prerequisites Funktion die Anforderungen an das System Überprüfen ob das Plugin überhaupt installiert werden darf. 

Als letzten Schritt für dieses Kapitel, erstellen wir eine Datei mit dem Namen hook.php. In diese Datei fügen wir folgenden Inhalt ein:

<?php
    function plugin_debitors_install()
    {
        return true;
    }

    function plugin_debitors_uninstall()
    {
        return true;
    }

In diesen Funktionen können wir sämtlichen Code hineinschreiben der ausgeführt wird wenn wir das Plugin installieren oder deinstallieren. 

Wenn wir jetzt das Plugin Menü aufrufen, können wir unser Plugin sehen und installieren.  


GNS3

GNS3

Remote-Server für GNS3 auf Ubuntu LTS installieren

Einleitung

Sobald wir unsere Kenntnisse im Bereich Netzwerk vertiefen möchten, können wir auf diverse Netzwerk Simulationstools zurückgreifen. Eines davon ist GNS3. Wir werden hier mithilfe eines Skriptes einen Remote-Server für diese Software aufsetzen. Damit können die virtuellen Maschinen auf einem extra Server laufen. Dadurch schonen wir unseren eigenen Rechner. 

Installationsskript

Um jetzt die Installation zu starten, müssen wir lediglich das nachstehende Skript ausführen. Die Installation wird dann von alleine durchgeführt. Den Hostnamen des Servers können wir dann nach der Installation nach Belieben anpassen. (Standardgemäß ist der Hostname gns3vm)

WICHTIG: Die Installation muss auf einem Ubuntu LTS Server durchgeführt werden. Auf anderen Linux Distributionen startet die Installation erst gar nicht!

Sobald die Installation durchgeführt wurde, können wir mit unserem GNS3 Desktop Client die Verbindung mit dem Server über die IP oder DNS Namen herstellen. 

Grafana

Grafana

iFrame Inhalte im Grafana Dashboard anzeigen

Einleitung

Als ich neulich versucht habe ein Observium Dashboard zu bauen, kam ich auf die Idee die Graphen in Grafana anzeigen zu lassen. Dies ist mithilfe des Text-Feldes möglich. 

Graphen einbetten

Um jetzt einen Graphen in Grafana einzubetten, müssen wir die Konfigurationsdatei von Grafana mit einem Editor unserer Wahl öffnen. 

nano /usr/share/grafana/conf/defaults.ini

Dort müssen wir zwei Einträge von false auf true ändern.

allow_embedding = true
disable_sanitize_html = true

Nachdem wir diese beiden Werte verändert haben, starten wir den Grafana Server neu.

systemctl restart grafana-server

Jetzt können wir in ein Text-Feld ein iFrame einbetten, welches dann unseren Graphen anzeigt.

<iframe 
  src="http://graphen.local" 
  style="height: 100%; width: 100%; object-fit: contain;">
</iframe>

Heimdall - Dashboard

Heimdall - Dashboard

Schaltflächen mit "Blur-Effekt" belegen

Einleitung

Beim Erstellen eines Dashboards mit Heimdall wollte ich gerne die Schaltflächen mit einem "Blur Effekt" belegen. Dafür müssen wir nur den nachstehenden CSS-Code in das System einpflegen. Dazu einfach die Einstellungen öffnen und den Code in das Textfeld eingeben.

Code

@import url("https://fonts.googleapis.com/css2?family=Raleway:wght@700;800&display=swap");
 
#app {
  background-position: right;
}
#app #sortable,
#app main {
  padding: 20px;
}
#config-buttons {
  bottom: 50%;
  transform: translateY(50%);
  border-top-left-radius: 10px;
  border-bottom-left-radius: 10px;
  box-shadow: rgba(255, 255, 255, 0.1) -1px 1px 1px 0, rgba(255, 255, 255, 0.1) 0 -1px 1px 0,
    rgba(0, 0, 0, 0.1) -1px 0 20px 5px;
  background-color: rgba(40, 40, 40, 0.25);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
}
#config-buttons a {
  background: none;
}
#config-buttons a svg {
  transition: all 0.1s ease-in-out;
  color: rgba(255, 255, 255, 0.5);
}
#config-buttons a:hover svg {
  transform: scale(1.1);
  color: rgba(255, 255, 255, 0.95);
}
 
.black {
  color: white !important;
}
 
.item {
  box-shadow: rgba(0, 0, 0, 0.05) -1px -1px 5px 0, rgba(0, 0, 0, 0.15) 0px 20px 25px -5px,
    rgba(0, 0, 0, 0.04) 0px 10px 10px -5px !important;
  border-radius: 12px;
  background-image: none;
  border: none;
  outline: none;
  height: 100px;
  width: 300px;
  margin: 1.25rem;
  padding: 1rem 55px 1rem 1rem;
  transition: all 0.25s ease-in-out;
  transition-property: transform, box-shadow, background-color;
  background-color: rgba(255, 255, 255, 0.4) !important;
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
}
.item:after {
  height: 100px;
  opacity: 0.2;
}
.item:hover {
  transform: scale(1.1);
  background-color: rgba(255, 255, 255, 0.2) !important;
  box-shadow: rgba(0, 0, 0, 0.1) 0px 60px 40px -7px !important;
}
.item .svg-inline--fa {
  height: 100px;
  vertical-align: middle;
  opacity: 0.2;
}
 
@media only screen and (max-width: 750px) {
  .item {
    padding-top: 2rem;
    padding-bottom: 2rem;
  }
  #config-buttons {
    display: none;
  }
}
 
.details * {
  color: white !important;
}
.details {
  padding: 0 0.5rem;
}
 
.app-icon {
  filter: drop-shadow(1px 1px 2px rgba(10, 0, 20, 0.1));
}
 
.livestats-container {
  margin-top: 0.5rem;
}
.livestats-container .livestats .title {
  margin-bottom: 3px;
}
.livestats-container .livestats li {
  padding-right: 1rem;
}
 
.livestats-container strong {
  font-weight: 500 !important;
  padding: 0 2px;
}
 
.details > .title {
  font-weight: 800;
  font-size: 1.3rem !important;
  letter-spacing: 1px;
  font-family: "Raleway", sans-serif;
  text-shadow: rgba(10, 0, 60, 0.25) 1px 0 5px;
  text-shadow: -1px -1px 1px rgba(255, 255, 255, 0.1), 1px 1px 2px rgba(10, 0, 60, 0.25);
  transition: all 0.25s ease-in-out;
}
.item:hover .details > .title {
  text-shadow: -1px -1px 1px rgba(255, 255, 255, 0.1), 1px 1px 5px rgba(10, 0, 60, 0.2);
}

.item-container .tooltip {z-index: -1; }

Quelle: https://www.reddit.com/r/selfhosted/comments/nzw76z/i_went_a_bit_overboard_customising_heimdall/

Invoiceninja

Invoiceninja

Invoiceninja zeigt nicht alle Währungen oder Sprachen an

Einleitung

Invoice Ninja ist ein kleines Tool mit dem man ganz schnell PDF Rechnungen erstellen kann um diese unter anderem an Kunden zu schicken. So muss man keine Excel Listen mehr pflegen. Das Programm gibt einem eine Übersicht der offenen Salden der Kunden als auch eine gesamte Übersicht der Kunden.

Dieses Programm kann bei der Installation ein Problem verursachen womit es nicht möglich ist die Software in der deutschen Sprache als auch Rechnungen mit Euro auszuweisen. Um dieses Problem zu lösen müssen wir einen Befehl in der URL Seite der Internetseite auslösen. 

Anwendung

Zuerst melden wir uns bei unserer Invoice Ninja Instanz an und gehen ganz normal auf die Startseite. In der URL Zeile schreiben wir folgenden Text hinten ran:

/update?secret=secret
https://invoiceninja.domain.de/update?secret=secret

Jetzt sollte er die Datenbank neu angefragt haben und die entsprechenden Einträge sollten jetzt verfügbar sein.

Microsoft Office

Microsoft Office

Alten Lizenz-Key von Microsoft Office entfernen

Einleitung

Bei der Neuinstallation von Microsoft Office kann es dazu kommen, dass die Office-Version, trotz erfolgreich installierten und aktivieren Office, die Version noch nach einem Lizenz-Schlüssel fragt. Anhand der nachfolgenden Schritte kann die Fehlermeldung entfernt werden, indem wir die alten Office-Versionen entfernen. 

Lizenz-Schlüssel entfernen

Um den Lizenz-Schlüssel zu entfernen, öffnen wir eine Powershell-Konsole oder eine Eingabeaufforderung mit administrativen Berechtigungen. Dort geben wir den nachfolgenden Befehl ein:

# Office 2013 64-bit
cscript "C:\Program Files\Microsoft Office\Office15\OSPP.VBS" /dstatus

# Office 2013 32-bit
cscript "C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS" /dstatus

# ab Office 2016 64-bit
cscript "C:\Program Files\Microsoft Office\Office15\OSPP.VBS" /dstatus

#ab Office 2016 32-bit
cscript "C:\Program Files (x86)\Microsoft Office\Office15\OSPP.VBS" /dstatus

Wir erhalten eine Ausgabe der installierten Lizenzen, um welche Office Version es sich handelt und ob diese Lizenz aktiviert ist. Wir suchen in der Ausgabe die Lizenz heraus, welche nicht aktiviert ist. Und kopieren uns die letzten 5 Buchstaben des Lizenz-Schlüssels heraus. Diese geben wir dann in dem nachfolgenden Befehl mit ein:

# Office 2013 64-bit
cscript "C:\Program Files\Microsoft Office\Office15\OSPP.VBS" /unpkey:<lizenz-key>

# Office 2013 32-bit
cscript "C:\Program Files\Microsoft Office (x86)\Office15\OSPP.VBS" /unpkey:<lizenz-key>

# ab Office 2016 64-bit
cscript "C:\Program Files\Microsoft Office\Office16\OSPP.VBS" /unpkey:<lizenz-key>

# ab Office 2016 32-bit
cscript "C:\Program Files\Microsoft Office (x86)\Office16\OSPP.VBS" /unpkey:<lizenz-key>

Unter Umständen muss der Lizenz-Schlüssel für die aktuelle Office-Version nochmal installiert werden. 

Microsoft Office

Microsoft Office Installation über Admin-Setup vorbereiten ohne Neustart

Einleitung

Bei der Vorabkonfiguration eines Setup-Pakets zur Installation von Microsoft Office können wir die Option einpflegen, dass kein Neustart durchgeführt werden soll. Wenn wir diesen Parameter nicht setzen, führt der Setup Assistent automatisch ein Neustart am Ende durch. Dieses wollen wir natürlich gerne vermeiden. 

Neustart verhindern

Um den Neustart verhindern, müssen wir in den "Setup Eigenschaften" einen neuen Eintrag hinzufügen. Dieser erhält den Namen SETUP_REBOOT und bekommt den Wert Never. Dadurch wird kein automatischer Neustart durchgeführt.

Name: SETUP_REBOOT
Value: Never

Microsoft Outlook

Microsoft Outlook

Kontakte aus dem Adressbuch in eigene Kontakte übertragen

Einleitung

In diesem Beitrag erkläre ich kurz, wie wir in Microsoft Outlook Kontakte aus dem Adressbuch, z.B. aus dem globalen Adressbuch, welches Ã¼ber den Exchange-Server verwaltet wird, in unsere eigenen Kontakte kopieren können. 

Kontakte kopieren

Dazu müssen wir einfach in unserem Outlook auf die E-Mails Seite navigieren. Dort können wir unter dem Reiter Start, den Punkt Adressbuch ansteuern. 

outlook_copy_contacts_1.JPG

In dem Adressbuch markieren wir jetzt alle Kontakte, die wir in unsere eigenen Kontakte kopieren möchten. Sobald wir alle markiert haben, öffnen wir das Kontextmenü, indem wir einen Rechtsklick auf ein Kontakt unserer Wahl tätigen und wählen "zu den Kontakten hinzufügen" aus. Je nach Anzahl der Elemente kann dies einen Moment dauern.

Im Anschluss finden wir unsere Kontakte in unseren eigenen Kontakten

Microsoft Outlook

Outlook sucht im Adressbuch / Kontakte nach dem Vornamen statt Nachnamen

Einleitung

In diesem Beitrag erkläre ich kurz, wie wir unter Microsoft Outlook einstellen können, dass, Outlook bei der Suche nach Namen im eigenen Adressbuch immer nach Nachnamen sucht. Laut Standard kann passieren, dass Outlook dann nur nach den Vornamen sucht. 

Durchführung

Um die Suche richtig einzustellen, klicken wir auf Datei → Informationen. Dort gehen wir nun in die Kontoeinstellungen. Sobald wir hier angekommen sind, wählen wir in dem neuen Fenster den Reiter Adressbücher aus. In diesem Fenster klicken wir das entsprechende Adressbuch an und geben beim Punkt Namen ordnen die Option wie "Speicher unter" aus.

Zum Schluss muss einmal Outlook neugestartet werden damit die Änderungen übernommen werden. 

Nextcloud

Nextcloud

Nextcloud Cron.php im Docker Container ausführen

Einleitung

Bei der Installation eines Nextcloud Servers wird empfohlen, für die Hintergrundprozesse einen Cron-Job einzurichten. Dieser führt die Aufgaben dann im Hintergrund durch.

Cron-Job im Docker Container ausführen

Um jetzt einen entsprechenden Cron-Job anzulegen, verbinden wir uns mit SSH auf unseren Docker Server / Host. Dort öffnen wir die Verwaltung der Cron-Jobs:

crontab -e

Dort fügen wir folgenden Code ein:

*/5 * * * * docker exec -u www-data <container-name> php /var/www/html/cron.php

Damit wird die cron.php alle 5 Minuten automatisch ausgeführt. Jetzt müssen wir in den Administrationseinstellungen in der Nextcloud nur noch die Art der Durchführung auf Cron-Job setzen.

Nextcloud-Cron-Job.png

Wir sehen über dem grünen Banner, ob die Durchführung des Cron-Jobs erfolgreich war. Falls nicht, ist dieser rot.

Nextcloud

Card-Dav und Cal-Dav in Nextcloud Docker einrichten

Einleitung

Sobald man eine Nextcloud Instanz installiert, die ggf. auch hinter einem Reverse Proxy läuft, bekommt man beim Sicherheitscheck gerne mal die Meldung, dass Card-Dav und Cal-Dav nicht aufgelöst werden kann. Um diese Nachricht zu entfernen, müssen wir die .htaccess Datei bearbeiten.

Einrichtung

Im ersten Schritt müssen wir eine SSH-Verbindung zum Docker-Host herstellen. Falls wir unser Nextcloud-Verzeichnis gemountet haben, dann navigieren wir in das Verzeichnis. Ansonsten müssen wir das Volume im Container öffnen.

Dort öffnen wir die .htaccess Datei und bearbeiten diese. 

cd /opt/docker/nextcloud/data
nano .htaccess

Dort sollen wir zwei Einträge finden, die wie folgt aussehen:

RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L]
RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L]

Diese zwei Einträge müssen umgeschrieben werden. Die Einträge sollen dann so aussehen:

RewriteRule ^\.well-known/carddav https://<nextcloud.local>/remote.php/dav/ [R=301,L]
RewriteRule ^\.well-known/caldav https://<nextcloud.local>/remote.php/dav/ [R=301,L]

Die <nextcloud.local> Adresse ändern wir auf unsere Nextcloud Adresse.

Jetzt schließen wir die Datei mit STRG + X  STRG + Y. Jetzt laden wir die Seite neu, und die Meldung sollte jetzt nicht mehr auftauchen. 

Observium

Observium

Benutzer für Observium anlegen

Einleitung

In dieser Anleitung erkläre ich kurz, wie wir in Observium einen neuen Benutzer anlegen können. Dazu verwenden wir die CLI vom Server, auf dem Observium installiert ist.

Benutzer anlegen

Um jetzt einen neuen Benutzer anzulegen, müssen wir zuerst in die Ordner von Observium navigieren. 

cd /opt/observium

Jetzt führne wir den nachstehenden Befehl aus, und ändern die Parameter für den Benutzernamen, Kennwort und das "Benutzerlevel". Mit dem Benutzerlevel legen wir die Berechtigungen des Benutzers fest. 

./adduser.php <benutzername> <kennwort> <benutzer-level>

Benutzerlevel

Anhand der nachstehenden Ausgabe der Software kann die benötigte Stufe entnommen werden:

USER LEVELS:
  0 - Disabled (This user disabled)
  1 - Normal User (This user has read access to individual entities)
  5 - Global Read (This user has global read access)
  7 - Global Secure Read (This user has global read access with secured info)
  8 - Global Secure Read / Limited Write (This user has secure global read access with scheduled maintenence read/write.)
  10 - Administrator (This user has full administrative access)

OpenSSL

OpenSSL

Neue Zertifikate mit OpenSSL erstellen

Einleitung

In dieser Anleitung werden wir mithilfe von OpenSSL TLS Zertifikate erstellen, mit dem wir dann unseren Web-Server über HTTPS erreichbar machen können. OpenSSL ist für diesen Zweck eine passende Alternative, da diese keine Verbindung ins Internet benötigt, und kostenlos verwendbar ist.

Um diese Zertifikate zu erstellen, müssen wir sicherstellen, dass wir das Paket openssl installiert haben. Wenn dies nicht der Fall ist, können wir dieses eben nachinstallieren.

apt update && apt install openssl -y

Erstellen von PK und CSR

In diesem Abschnitt werden wir einen PK (Private Key) und einen CSR (Certificate Signing Requests) erstellen. Mit diesen Dateien können wir dann unseren Web-Server verschlüsseln.

openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr

Wenn wir diesen Befehl abgesetzt haben, müssen wir die Abfragen, die Folgen beantworten. Der erste Parameter -newkey rsa:2048 gibt an, dass der Schlüssel 2048 bit lang sein soll, und mit dem RSA Algorithmus verschlüsselt werden soll. 

Mit dem zweiten Parameter -nodes geben wir an, dass wir den Schlüssel nicht mit einem Kennwort verschlüsseln.

CSR aus einem vorhandenen PK erstellen

Der folgende Befehl kann verwendet werden, wenn wir ein CSR (Certificate Signing Requests) erstellen möchten, wir aber schon einen Private Key besitzen, bzw. erstellt haben.  

openssl req -key domain.key -new -out domain.csr

Jetzt müssen wir beim ersten Parameter -key den Dateinamen unseres Schlüssels angeben. Sobald wir das eingetragen haben, können wir den Befehl abschicken und die CSR Datei wird erstellt.

Selbst signiertes SSL Zertifikat erstellen

Jetzt wollen wir ein TLS Zertifikat erstellen, welches nicht von einer externen Zertifizierungsstelle stammt. Dies können wir uns von Gebrauch machen, wenn wir unseren Web-Server verschlüsseln möchten. 

openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt

Der erste Parameter gibt wieder den Verschlüsselungsalgorithmus an. Der Parameter -x509 gibt an, dass wir unser Zertifikat nicht von einer externen Zertifikatsstelle signieren lassen möchten. Und der folgende Parameter -days gibt an, wie lange unser Zertifikat gültig ist.

OpenSSL

PFX Zertifikat in .crt und .key Datei exportieren

Einleitung

Um Zertifikate in bestimmte Software einspielen zu können, benötigen wir manchmal die .crt und die .key Datei. Dazu können wir uns das OpenSSL-Tool zu Hilfe nehmen. 

Zertifikat exportieren

.crt Datei exportieren

Um die .crt Datei zu erhalten, müssen wir nur den folgenden Befehl absetzen. Dabei müssen wir im ersten Schritt den Datei-Namen der .pfx-Datei anpassen. Beim Absenden des Befehls geben wir nur noch das Kennwort ein, mit dem das Zertifikat verschlüsselt wurde. 

openssl pkcs12 -in <PFX-Zertifikat> -clcerts -nokeys -out <CRT-Datei>

#Beispiel:
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.crt
.key Datei exportieren

Um jetzt die .key Datei zu erhalten, müssen wir diesmal 2 Befehle absetzen. Einmal um die .key-Datei zu erhalten, und im zweiten Schritt um die .key-Datei zu entschlüsseln.

openssl pkcs12 -in cert.pfx -nocerts -out cert-encrypted.key

Im Anschluss folgt jetzt die Entschlüsselung der .key-Datei

openssl rsa -in cert-encrypted.key -out cert.key

Damit haben wir dann beide Dateien erfolgreich exportiert, um diese dann in bestimmten Anwendungen zu verwenden. 

TrueNAS

TrueNAS

Verbindung zum AD mit TrueNAS überprüfen

Einleitung

In dieser Anleitung beschreibe ich kurz, wie wir die Verbindung zum Active Directory vom TrueNAS Server aus, testen können. Dies benötigen wir, um z.B. eine Samba-Freigabe auf eine NFTs-Sicherheitsgruppe zu erstellen.

Verbindung überprüfen

Um die Verbindung jetzt zu überprüfen, müssen wir lediglich den nachstehenden Befehl absetzen. Wenn in der Auszählung die Active Directory Gruppen auftauchen, ist eine Verbindung und die anschließende Synchronisation mit dem Active Directory erfolgreich!

# Gruppen
wbinfo -g

#Benutzer
wbinfo -u

WireGuard

WireGuard

MTU Größe für Wireguard Verbindung berechnen

Einleitung

Bei der Einrichtung von einem Wireguard Server sollte eine MTU-Size mitgegeben werden. Diese gibt an, wie groß ein VPN-Paket mit Nutzdaten voll sein darf. In dieser Anleitung berechnen wir kurz unsere MTU-Size, um so die höchste Performance aus unserem Wireguard Server herauszuholen. 

Wireguard verwendet eine Standard MTU von 1420. Dies kann zu Problemen führen wenn dadurch das Paket zu groß ist und somit nicht an den Server oder an den Client übermittelt werden kann. 

Berechnung

Die Berechnung unterscheidet sich je nachdem welchen Anschluss ihr als eure Internetanbindung verwendet. Wenn es im Einzelfall nicht funktionieren sollte, prüft bitte, welche MTU-Größe ihr für euren Provider benötigt. Ich berechne die MTU-Größe beispielsweise für DSL mit einer MTU von 1492 und für Kabel-Internet mit einer MTU von 1500.

Anhand der nachfolgenden Tabelle können die einzelnen Byte-Größen entnommen werden, die zur Berechnung der MTU benötigt werden:

Beschreibung
Byte Größe
IPv4-Verbindung 20 Bytes
IPv6-Verbindung 40 Bytes
UDP-Paket 8 Bytes
Wireguard Overhead 32 Bytes

Dementsprechend lassen sich folgende Beispiele berechnen:

Beispiel 1 Beispiel 2
MTU DSL
MTU Kabel-Internet
1492 MTU (Provider) 1500 MTU (Provider)
- 20 (IPv4) - 40 (IPv6)
- 8 (UDP) - 8 (UDP)
- 32 (Wireguard Overhead) - 32 (Wireguard Overhead)
= MTU 1432 = MTU 1420

Die DSL Wireguard Verbindung verwendet im Rechenbeispiel eine Verbindung über IPv4, wohin gegen die Kabel Wireguard Verbindung eine Verbindung über IPv6 herstellen möchte. 

WireGuard

WireGuard mit WebInterface auf Debian Server installieren

Einleitung

Wenn wir unseren eigenen WireGuard Server betreiben möchten, wollen wir diesen vielleicht ja auch über eine Weboberfläche administrieren. Als Oberfläche bedienen wir uns dann an wireguard-ui Link

Mithilfe von WireGuard können wir dann ganz einfach eine VPN-Verbindung in unser Netzwerk herstellen und so einerseits auf unser Heimnetzwerk zugreifen, als auch verschlüsselten Datenverkehr nutzen.

Vorbereitungen durchführen und WireGuard installieren

Im ersten Schritt installieren wir alle benötigen Pakete auf unserem Debian Server, damit wir WireGuard betreiben können.

apt update && apt install -y wireguard curl iptables tar
cd /etc/wireguard

Wir müssen auch sicherstellen das unsere Firewall Port 51820/udp durchlässt. Und das wir ggf. unseren WireGuard Server als Exposed Host oder durch Port NAT unseren Server von außen erreichbar machen. Wie genau das funktioniert, bitte dem Handbuch des Herstellers der Firewall entnehmen.

Jetzt müssen wir das IP-Forwarding aktivieren. Dies hat den Hintergrund, dass der gesamte Verkehr auf dem WireGuard Interface weitergeleitet wird.

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
sysctl -p

WireGuard UI installieren

 Jetzt müssen wir folgenden Code ausführen, damit wir das Startskript für WireGuard UI erstellt wird. Damit wird der Webserver gestartet, und die Datenbank unter /etc/wireguard/db/ abgelegt. 

cat <<EOF > /etc/wireguard/start-wgui.sh
#!/bin/bash
 
cd /etc/wireguard
./wireguard-ui -bind-address 0.0.0.0:5000
EOF
chmod +x start-wgui.sh

Mit dem folgenden Skript wird WireGuard UI installiert und die entsprechenden Dienste angelegt. Im Anschluss wird der Download von WireGuard UI gestartet und der Web Server wird gestartet. 

cat <<EOF > /etc/systemd/system/wgui-web.service
[Unit]
Description=WireGuard UI
 
[Service]
Type=simple
ExecStart=/etc/wireguard/start-wgui.sh
 
[Install]
WantedBy=multi-user.target
EOF

cat <<EOF > /etc/wireguard/update.sh
#!/bin/bash
 
VER=\$(curl -sI https://github.com/ngoduykhanh/wireguard-ui/releases/latest | grep "location:" | cut -d "/" -f8 | tr -d '\r')
 
echo "downloading wireguard-ui \$VER"
curl -sL "https://github.com/ngoduykhanh/wireguard-ui/releases/download/\$VER/wireguard-ui-\$VER-linux-amd64.tar.gz" -o wireguard-ui-\$VER-linux-amd64.tar.gz
 
echo -n "extracting "; tar xvf wireguard-ui-\$VER-linux-amd64.tar.gz
 
echo "restarting wgui-web.service"
systemctl restart wgui-web.service
EOF

chmod +x /etc/wireguard/update.sh
cd /etc/wireguard; ./update.sh

Änderungen der Konfiguration verarbeiten

Mit dem folgenden Skript wird die WireGuard Schnittstelle wg0 beobachtet. Bei Veränderungen an der Konfigurationsdatei wird dann WireGuard neu gestartet.

cat <<EOF > /etc/systemd/system/wgui.service
[Unit]
Description=Restart WireGuard
After=network.target
 
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart wg-quick@wg0.service
 
[Install]
RequiredBy=wgui.path
EOF
 
 
 
cat <<EOF > /etc/systemd/system/wgui.path
[Unit]
Description=Watch /etc/wireguard/wg0.conf for changes
 
[Path]
PathModified=/etc/wireguard/wg0.conf
 
[Install]
WantedBy=multi-user.target
EOF

WireGuard und WireGuard UI starten

Jetzt starten wir WireGuard und WireGuard UI.

touch /etc/wireguard/wg0.conf
systemctl enable wgui.{path,service} wg-quick@wg0.service wgui-web.service
systemctl start wgui.{path,service}

Wir können jetzt das Web Interface von WireGuard UI unter der Public IP und Port 500öffnen. Die Installation ist damit abgeschlossen!

wireguard_wireguardui_installation.png

Wordpress Entwicklung

Wordpress Entwicklung

Plugin mit Menü und Untermenü entwickeln

Einleitung

Wenn wir Wordpress Plugins programmieren, wollen wir vielleicht das der Benutzer bestimmte Menüs öffnen kann. Um nicht für jeden Eintrag Platz in der Administrator Übersicht zu verbrauchen, können wir Menüs in andere Menüs mit einbauen, so das wir dann diese über den "Hauptpunkt" ansteuern können.

Anwendung

Zuerst legen wir wie gewohnt unser Wordpress Plugin an.

Im Anschluss rufen wir in der Datei die PHP-Funktion add_action(). Als Parameter geben wir als erstes admin_menu an. Als zweiten Parameter geben wir eine Funktion an mit der wir nachher die Menüs aufrufen.

add_action('admin_menu','plugin_set_menu');

Als zweites schreiben wir die Funktion damit die Menüs erstellt werden können.

In der Funktion verwenden wir zuerst die PHP-Funktion add_menu_page(). Mit dieser können wir einen Eintrag in das Administrationsfenster vornehmen. 

In dieser Funktion haben wir 5 (optional: 6) Parameter.

Mit dem ersten Parameter geben wir den Namen an, unter welchem der Eintrag mit Admin Menü zu finden ist. Mit dem zweiten Parameter geben wir an, wie unser Menü im Browser Tab benannt wird. Im dritten Parameter geben wir einfach ein manage_options an. Als vierten Parameter geben wir unseren "slug", also unsere URI Erweiterung an (Erweiterung an die URL). Als letzten Parameter geben wir an, welche Funktion wir aufrufen um den Seiteninhalt darzustellen. Als sechsten Parameter können wir einen Pfad zu einer Bilddatei angeben um ein Icon festzulegen.

add_menu_page("Plugin Konfiguration", "Konfiguration", "manage_options", "plugin-config", "plugin_config_plugin");

Im nächsten Schritt setzen wir das Untermenü. Dazu verwenden wir wieder eine PHP-Funktion. Diese Funktion trägt den Namen add_submenu_page(). Diese Funktion hat 6 Parameter die wir angeben müssen.

Beim ersten Parameter geben wir den slug des Hauptmenüs an. Mit dem zweiten Parameter geben wir den Namen an, wie er im Menü auftaucht. Dann legen wir wieder den Browser Titel fest. Als vierten Parameter geben wir wieder manage_options an. Als fünften Parameter geben wir den neuen slug für die URL an die eingetragen wird, wenn die Seite aufgerufen wird. Als letzten Parameter geben wir jetzt an, welche Funktion wieder aufgerufen wird wenn der Punkt ausgewählt wird.

add_submenu_page("plugin-config","Plugin installieren", "Plugin installieren", "manage_options", "plugin-install", "plugin_install_func");

 

Wordpress Entwicklung

Wordpress Plugin Grundstruktur

Einleitung

Wenn uns der Umfang des normalen WordPress nicht ausreicht können wir selbst Plugins entwickeln. Die Wordpress Plugins werden komplett in PHP geschrieben. Das bedeutet, um Wordpress Plugins selbst zu entwickeln benötigen wir Kenntnisse in PHP und SQL (MySQL). 

Grundstruktur erstellen

Um ein Plugin zu erstellen, müssen wir im Plugin Ordner unserer Wordpress Installation einen Ordner in lowercase (kleingeschrieben) erstellen. Das Verzeichnis befindet sich unter folgendem Pfad:

/web-root/wp-content/plugins

In diesem Verzeichnis legen wir eine PHP Datei mit dem Namen unseres Ordners an. Unser Plugin werden wir debitoren nennen. Wir öffnen dann die PHP Datei mit dem Editor unserer Wahl.

cd /var/www/html/wp-content/plugins
sudo mkdir debitoren
sudo nano debitoren.php

In die Datei fügen wir einen Mehrzeiligen Kommentar hinzu in welcher wir Meta-Informationen über unser Plugin festlegen. Wir müssen den Plugin Namen festlegen. Ohne diese Information können wir unser Plugin nicht installieren. 

in der PHP Datei definieren wir nach folgender Syntax die Meta Informationen für das Plugin

/**
* Plugin Name: Debitoren Plugin
*/
Plugin Meta Informationen
Beschreibung
Plugin Name: Namen unseres Plugins festlegen.
Plugin URI: Websites unseres Plugins festlegen.
Description: Kleine Beschreibung über unser Plugin.
Version: Festlegung der Version des Plugins.
Requires at least: Definition der Minimalen Wordpress Version.
Requires PHP: Minimale PHP Version festlegen.
Author: Autor des Plugins festlegen.
Author URI: Website des Plugin Autors.
License: Lizenz unseres Plugins festlegen
License URI: Website zur Lizenz angeben.

In der PHP Datei legen wir jetzt den Code für unser Plugin fest. 

Zur besseren Struktur legen wir noch zwei Ordner mit den Namen admin und public an. In diesen Ordnern legen wir die Website Dateien für das Administrationspanel und für die generellen Informationen die für alle Sichtbar sein werden. In einem weiteren Ordner mit dem Namen inc legen wir die Klassen und Funktionen fest. Wenn wir unser Plugin auch verschiedenen Sprachen zugänglich machen wollen, dann erstellen wir noch einen Ordner mit dem Namen languages. Wir können auch eine uninstall.php Datei anlegen um dort die Deinstallation Routinen festlegen falls Datenbanken oder ähnliches gesäubert werden sollen.  

Die Routinen die bei einer Deinstallation durchgeführt werden legen wir dort innerhalb einer IF-Kontrollstruktur fest.

if (!defined('WP_UNINSTALL_PLUGIN'))
{
	// Füge Code hinzu
    exit;
}
Wordpress Entwicklung

Wordpress Template Tags

Einleitung

Bei der Entwicklung von Plugins für Wordpress benötigen wir Objekte die in der Wordpress Programmierung fest verankert sind. Dazu gehören unter anderem z.B. der eigentliche Beitrag den wir anfassen wollen, oder vielleicht andere Parameter?

Dazu verwenden wir die sogenannten template-tags. Mit diesen können wir verschiedene Dinge anfassen und auch die Objekte bearbeiten oder andere Attribute festlegen. 

Template Tags

In dieser Tabelle finden wir alle möglichen Template Tags.

Funktion
Beschreibung
the_ID() Die interne ID-Nummer des Beitrags.
the_permalink() Vollständiger Permalink des Beitrags.
the_title()

Der Beitragstitel.

the_excerpt()

Der Auszug.

the_content()

Beitragsinhalt.

the_category()

Die zugewiesenen Kategorien.

the_tags()

Die zugewiesenen Schlagwörter.

wp_tag_cloud()

Eine Rudimentäre formatierte Tag-Cloud.

next_post_link()
previous_post_link()

Link zum chronologisch vorherigen, also neueren oder vorherigen Beitrag.

next_image_link()
previous_image_link()

Link zum nächsten / vorherigen Bild im Beitrag.

get_author()

Beitragsautor.

the_author_link()

Link zur Autorenseite.

the_author_posts

Zur Übersichtsseite mit allen Beiträgen des Autors.

the_date()

Veröffentlichungsdatum.

the_modified_date()

Datum der letzten Bearbeitung.

the_meta()

Die Benutzerdefinierten Felder des Beitrags.

the_shortlink()

Kurzer Link zum Beitrag.

wp_list_comments()

Liste alle Kommentare auf.

in_the_loop()

Fragt ab ob der Code sich im Loop befindet.

is_home()

Wahr wenn die aktuelle Seite die Homepage ist.

is_admin()

Wahr wenn man sich momentan im Backend befindet (Administrations Menü)

is_single()

Wahr wenn die aktuelle Seite eine Beitrags Detailseite ist.

is_page()

Wahr wenn die aktuelle Webseite eine einzelne Seite ist.

is_page_template()

Wahr wenn die Seite ein bestimmtes Template verwendet. Angabe des Templates als lowercase Strings.

is_category()

Überprüft ob die Seite / Beitrag einer bestimmten Kategorie zugeordnet ist.

is_tag()

Prüft ob dem Inhalt ein Schlagwort zugewiesen ist.

is_author()

Prüft ob der Autor ein bestimmter Autor ist.

is_search()

Ist wahr wenn die Seite ein Suchergebnis war.

is_404()

Wahr wenn es sich um die Seite um eine Error 404 Seite handelt. 

has_excerpt()

Wahr wenn der Beitrag einen Auszug besitzt.

comments_link()

Link zum Kommentarabschnitt des Beitrags.

comment_id()

Interne ID eines Kommentars.

comment_author()

Kommentarautor.

comment_author_email_link()

Anklickbare E-Mail Adresse des Kommentarautors. 

comment_text()

Kommentartext.

comment_excerpt()

Maximal 20 Wörter des Kommentartextes als Auszug.

comment_date()

Kommentardatum.

get_avatar()

Zeigt den Avatar des Kommentar Autors an.

get_header()

Lädt das header.php Template.

get_footer() Lädt das footer.php Template.
get_sidebar() Lädt das sidebar.php Template.
get_search_from() Lädt das searchform.php Template.
comments_template() Lädt das Template-Fragment für den Kommentarabschnitt.