Go to English page

Neuigkeiten

Projektbeschreibung:

OIDplus ist eine OpenSource-Datenbanklösung zum Verwalten von Objekt-Identifiern ("OIDs") und vielen anderen Objekttypen (z.B. COM+ GUIDs). Mit OIDplus können Sie Ihre eigene "Registration Authority" betreiben, und ihre erzeugten Objekte entweder öffentlich zur Verfügung stellen, oder nur intern verwalten (versteckt für die Öffentlichkeit). Ihre Objekte und die Schreibrechte darauf können Sie an untergeordnete RAs, also andere Benutzer im System, vererben, sodass diese autonom arbeiten und ihre eigene RA betreiben können.

Die ViaThinkSoft Registration Authority setzt OIDplus 2.0 bereits produktiv ein und bietet Anwendern sogar die Möglichkeit, kostenlose OIDs zu erzeugen.

Wir sind dankbar für jede Person, die OIDplus auf ihrem System installieren möchte, da wir es lieben, wenn sich unser Produkt verbreitet und wir Feedback zur Benutzererfahrung erhalten. Wenn wir Ihnen bei der Installation von OIDplus und der Migration Ihrer Daten nach OIDplus helfen können, teilen Sie uns dies bitte mit. Wir unterstützen Sie dabei kostenlos!

Downloaden/Updaten über SVN (empfohlen):
svn co https://svn.viathinksoft.com/svn/oidplus/trunk/

Systemanforderungen:
- PHP-Kompatibler web server (getestet mit Apache 2, nginx und Microsoft IIS)
- PHP 7.0 oder höher
- PHP-Erweiterung GMP oder BCMath
- PHP-Erweiterung MBString
- PHP-Erweiterung MySQLi, PostgreSQL, PDO oder ODBC
- Datenbank: MySQL/MariaDB (empfohlen), PostgreSQL oder Microsoft SQL Server
- Unabhängig vom Betriebssystem (getestet mit Linux und Windows)

Demo-System anschauen
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:



Abstract

ViaThinkSoft Currency Converter is a library developed by Daniel Marschall which converts currencies. The latest exchange data is automatically downloaded and cached.

To use ViaThinkSoft Currency Converter, you need an API key from CurrencyLayer.com. Keys with limited access are available for free, and there are paid subscriptions available, too.

Usage for online applications, with PHP

Download framework and example script from the SVN

Try it now! Use the online tool

For Windows users

If you are not a developer, you can download the ready-to-use demo EXE file.

Download Windows demo application, written in Delphi



For Windows developers

The Currency Converter is implemented as a Windows DLL (Source code for Delphi), which can be used by most other programming languages as well as VBA (Visual Basic for Applications). Therefore, you can use Currency Calculator in Microsoft Office products.

Download compiled DLL for Win32 and Win64

Download source code for usage in ...

Before using the DLL, please place the API key in your registry:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\ViaThinkSoft\CurrencyConverter]
"APIKey"="....."

Specification of the exported DLL methods
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:



Abstract

ViaThinkSoft Currency Converter is a library developed by Daniel Marschall which converts currencies. The latest exchange data is automatically downloaded and cached.

To use ViaThinkSoft Currency Converter, you need an API key from CurrencyLayer.com. Keys with limited access are available for free, and there are paid subscriptions available, too.

Usage for online applications, with PHP

Download framework and example script from the SVN

Try it now! Use the online tool

For Windows users

If you are not a developer, you can download the ready-to-use demo EXE file.

Download Windows demo application, written in Delphi



For Windows developers

The Currency Converter is implemented as a Windows DLL (Source code for Delphi), which can be used by most other programming languages as well as VBA (Visual Basic for Applications). Therefore, you can use Currency Calculator in Microsoft Office products.

Download compiled DLL for Win32 and Win64

Download source code for usage in ...

Before using the DLL, please place the API key in your registry:

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\ViaThinkSoft\CurrencyConverter]
"APIKey"="....."

Specification of the exported DLL methods
Daniel Marschall
ViaThinkSoft Mitbegründer
Downloadbeschreibung:

StackManager für Linux, insbesondere über SSH Verbindungen.

Verwendet MySQL als Datenbank.

Eine automatisierte Migration auf StackMan for Windows 5.1 ist geplant.
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:

An API written in PHP for the OID repository oid-info.com.

The majority of the functions provided by this API helps developers in creating XML files which can be uploaded to the OID repository to add multiple OIDs, but the API also contains other helpful utilities related to OIDs, UUIDs and the OID repository in general. The XML generation can be useful for Registration Authorities (RAs) that want to deliver their assignments to oid-info.com , but also for people who want to support the OID repository by adding OIDs from public sources.
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:

VGWhoIs is a fork of the tool GWhoIs (currently not actively developed). It allows users to find information about domains, IP addresses, ASN numbers etc by querying the best fitting WhoIs service automatically. The information about the whois services is stored in a pattern file and can be altered or extended by new pattern files.

The usage is pretty simple:

vgwhois example.com
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:

FastPHP ist ein einfacher und dennoch komfortabler Editor/IDE für PHP.

Besondere Funktionen:
  • Sehr schnelle Ladezeit, ähnlich Notepad
  • Syntax-Highlighting
  • Code-Explorer
  • Ausführen von PHP-Dateien in der IDE ohne Browser
  • PHP Lint
  • Automatisches Umwandeln von Leerzeichen in Tabs
  • Integrierte PHP-Hilfe zu jeder Funktion per F1-Tastendruck
  • Möglichkeiten, PHP-Dateien ähnlich wie HTA-Dateien per Doppelklick auszuführen.
  • Dunkles und Helles Design
  • Formatierungszeichen anzeigen
Daniel Marschall
ViaThinkSoft Mitbegründer
This is an Example with GitHub user "danielmarschall" and Repository "oidplus".
Adjust the things to your environment!

1. INITIAL SETUP

# Install GitSVN
aptitude install git-svn

# Only do this if you want that GitHub credentials are saved to disk
# see details here https://stackoverflow.com/questions/35942754/how-to-save-username-and-password-in-git-gitextension
git config --global credential.helper store

# Create authors.txt for all your SVN users (mapping SVN users to GitHub accounts)
echo "daniel-marschall = Daniel Marschall <........email here.........>" > authors.txt
echo "victor = Victor-Philipp Negoescu <..........email here..........>" >> authors.txt
echo "www-data = ViaThinkSoft <.........email here...........>" >> authors.txt

2. FIRST SYNC FROM SVN TO GITHUB

# First, create a repository in GitHub using the web interface:
# https://github.com/new

# Download SVN into a new GIT repo
# "-s" assumes that default trunk/tags/branches structure is used
git svn --authors-file=authors.txt clone -s https://svn.viathinksoft.com/svn/oidplus/ oidplus-gitsvn cd oidplus-gitsvn

cd oidplus-gitsvn/

# Pushes the mirror to the new GitHub repository
git push --mirror https://github.com/danielmarschall/oidplus.git

3. REGULAR UPDATE

cd oidplus-gitsvn/
git svn rebase git push origin --all git push origin

# Pushes the mirror to the new GitHub repository
git push --mirror https://github.com/danielmarschall/oidplus.git

Empty folders

Attention: Empty folders will not be transferred to GIT! You need to make sure that there is a file like ".gitkeep" so that the folders are not empty.
Unfortunately, there is a bug since 2013 that prevents using --keep-empty-dirs if trunk/branch/tag structure was added afterwards, see:
https://www.mail-archive.com/git@vger.kernel.org/msg24484.html
Daniel Marschall
ViaThinkSoft Mitbegründer
Downloadbeschreibung:

Der YouTube Downloader ist ein Tool für Linux. Es basiert auf dem Tool youtube-dl und bietet einige Zusatzfunktionen wie z.B. das Herunterladen und Suchen in Kanälen oder das Herunterladen von Playlists. Es können sowohl Videos als auch Audio-Dateien heruntergeladen werden. Youtube-IDs können in die ID-Tags von heruntergeladenen MP3-Dateien eingebunden werden. Eine automatisch verwaltete Liste mit bereits heruntergeladenen Videos erlaubt es, die heruntergeladenen Dateien zu verschieben, ohne dass die Videos neu heruntergeladen werden. YouTube Downloader ist vollständig kommandozeilenbasiert und für Cronjobs optimiert.

Anforderungen:
- PHP CLI
- Paket "youtube-dl"
- Falls MP3-Dateien extrahiert werden sollen: "avconv" oder "ffmpeg", sowie optional "id3v2"
- Ein Youtube API-Key (hier kostenlos beantragen)
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:

LogViewer ist ein kleines Tool für Linux, das Logdateien (üblicherweise von PHP) ausliest und in eine MySQL-Datenbank speichert.
Dort werden die Fehler kategorisiert und nach Eintrittszeitpunkt und Anzahl zusammengefasst.
Über ein Webinterface können die Fehler sortiert und gefiltert werden. Da es das Ziel ist, die Fehler zu korrigieren, kann mit einem Klick der Fehler ausgeblendet werden. Er wird dann nur noch eingeblendet, wenn er trotzdem nocheinmal auftritt.
Daniel Marschall
ViaThinkSoft Mitbegründer
Downloadbeschreibung:

Beta-Release von ViaThinkSoft CryptoChat.
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:

In this project, you will find various downloads about the PC version of the ancient game "Plumbers Don't Wear Ties".
Daniel Marschall
ViaThinkSoft Mitbegründer
Downloadbeschreibung:

Mit diesem Editor kann die GAME.BIN-Datei geändert werden, um die Szenen des Spiels zu ändern oder neue hinzuzufügen.
Daniel Marschall
ViaThinkSoft Mitbegründer
Downloadbeschreibung:

This engine replaces the original 16-bit engine. It is compatible with all Windows Operating Systems beginning with Windows 95.

If a file called INTRO.AVI is existing, the 32-bit engine will play it at the beginning at the game.
Daniel Marschall
ViaThinkSoft Mitbegründer
32/64 Bit Delphi (Windows 95+):

uses
  MMSystem, Windows;

function Supports16BitWaveout: boolean;
var
  caps: TWaveOutCaps;
begin
  ZeroMemory(@caps, sizeof(caps));
  waveOutGetDevCaps(0, @caps, sizeof(caps));
  result := caps.dwFormats and $CCCCCCCC <> 0;
end;

16 Bit Delphi (Windows 3.x):

uses
  MMSystem;

function Supports16BitWaveout: boolean;
var
  caps: TWaveOutCaps;
begin
  waveOutGetDevCaps(0, @caps, sizeof(caps));
  result := caps.dwFormats and $CCCC <> 0;
end;

Funktionsweise:

{ 11.025 kHz, Mono,   8-bit  }  WAVE_FORMAT_1M08   00000001 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 11.025 kHz, Stereo, 8-bit  }  WAVE_FORMAT_1S08   00000002 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 11.025 kHz, Mono,   16-bit }  WAVE_FORMAT_1M16   00000004 and CCCCCCCC = 00000004 ==> "16 Bit"
{ 11.025 kHz, Stereo, 16-bit }  WAVE_FORMAT_1S16   00000008 and CCCCCCCC = 00000008 ==> "16 Bit"

{ 22.05  kHz, Mono,   8-bit  }  WAVE_FORMAT_2M08   00000010 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 22.05  kHz, Stereo, 8-bit  }  WAVE_FORMAT_2S08   00000020 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 22.05  kHz, Mono,   16-bit }  WAVE_FORMAT_2M16   00000040 and CCCCCCCC = 00000040 ==> "16 Bit"
{ 22.05  kHz, Stereo, 16-bit }  WAVE_FORMAT_2S16   00000080 and CCCCCCCC = 00000080 ==> "16 Bit"

{ 44.1   kHz, Mono,   8-bit  }  WAVE_FORMAT_44M08  00000100 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 44.1   kHz, Stereo, 8-bit  }  WAVE_FORMAT_44S08  00000200 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 44.1   kHz, Mono,   16-bit }  WAVE_FORMAT_44M16  00000400 and CCCCCCCC = 00000400 ==> "16 Bit"
{ 44.1   kHz, Stereo, 16-bit }  WAVE_FORMAT_44S16  00000800 and CCCCCCCC = 00000800 ==> "16 Bit"

{ 48     kHz, Mono,   8-bit  }  WAVE_FORMAT_48M08  00001000 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 48     kHz, Stereo, 8-bit  }  WAVE_FORMAT_48S08  00002000 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 48     kHz, Mono,   16-bit }  WAVE_FORMAT_48M16  00004000 and CCCCCCCC = 00004000 ==> "16 Bit"
{ 48     kHz, Stereo, 16-bit }  WAVE_FORMAT_48S16  00008000 and CCCCCCCC = 00008000 ==> "16 Bit"

{ 96     kHz, Mono,   8-bit  }  WAVE_FORMAT_96M08  00010000 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 96     kHz, Stereo, 8-bit  }  WAVE_FORMAT_96S08  00020000 and CCCCCCCC = 00000000 ==> "8 Bit"
{ 96     kHz, Mono,   16-bit }  WAVE_FORMAT_96M16  00040000 and CCCCCCCC = 00040000 ==> "16 Bit"
{ 96     kHz, Stereo, 16-bit }  WAVE_FORMAT_96S16  00080000 and CCCCCCCC = 00080000 ==> "16 Bit"
Daniel Marschall
ViaThinkSoft Mitbegründer

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.Linq;

namespace ConsoleApp6
{

    class Program
    {


        public class AtomzeitAsync
        {
            public struct Atomzeit
            {
                public string server;
                public DateTime zeit;
            }

            protected static DateTime GetNetworkTime(string ntpServer, bool utc = false)
            {
                // https://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-using-c

                // NTP message size - 16 bytes of the digest (RFC 2030)
                var ntpData = new byte[48];

                //Setting the Leap Indicator, Version Number and Mode values
                ntpData[0] = 0x1B; //LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)

                var addresses = Dns.GetHostEntry(ntpServer).AddressList;

                //The UDP port number assigned to NTP is 123
                var ipEndPoint = new IPEndPoint(addresses[0], 123);
                //NTP uses UDP

                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
                {
                    socket.Connect(ipEndPoint);

                    //Stops code hang if NTP is blocked
                    socket.ReceiveTimeout = 3000;

                    socket.Send(ntpData);
                    socket.Receive(ntpData);
                    socket.Close();
                }

                //Offset to get to the "Transmit Timestamp" field (time at which the reply 
                //departed the server for the client, in 64-bit timestamp format."
                const byte serverReplyTime = 40;

                //Get the seconds part
                ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);

                //Get the seconds fraction
                ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);

                //Convert From big-endian to little-endian
                intPart = SwapEndianness(intPart);
                fractPart = SwapEndianness(fractPart);

                var milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000L);

                //**UTC** time
                var networkDateTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds((long)milliseconds);

                return utc ? networkDateTime : networkDateTime.ToLocalTime();
            }

            private static uint SwapEndianness(ulong x)
            {
                // https://stackoverflow.com/questions/1193955/how-to-query-an-ntp-server-using-c
                // stackoverflow.com/a/3294698/162671
                return (uint)(((x & 0x000000ff) << 24) +
                               ((x & 0x0000ff00) << 8) +
                               ((x & 0x00ff0000) >> 8) +
                               ((x & 0xff000000) >> 24));
            }

            static AtomzeitAsync()
            {
                string zeitServerFile = "TimeserverNTP.txt";
                if (File.Exists(zeitServerFile))
                {
                    bool containsSomething = false;
                    var lines = File.ReadAllLines(zeitServerFile);
                    foreach (var line in lines)
                    {
                        if (line.Trim() == "") continue;
                        if (line.Trim().Substring(0, 1) == "#") continue;
                        containsSomething = true;
                        break;
                    }
                    if (containsSomething)
                    {
                        Array.Resize(ref servers, 0);
                        foreach (var line in lines)
                        {
                            if (line.Trim() == "") continue;
                            if (line.Trim().Substring(0, 1) == "#") continue;
                            Array.Resize(ref servers, servers.Length + 1);
                            servers[servers.Length - 1] = line.Trim();
                        }
                    }
                }
                else
                {
                    string[] dummyList = { };
                    File.WriteAllLines(zeitServerFile, dummyList.ToList());
                }
            }
            public static string[] servers = {
        "ptbtime1.ptb.de",
        "ptbtime2.ptb.de",
        "ptbtime3.ptb.de"
        };

            public static Atomzeit? GetAtomzeit(int timeout = 1000)
            {
                List<Task<Atomzeit>> tasks = new List<Task<Atomzeit>>();

                int bakWorkerThreads = 0;
                int bakCompletionPortThreads = 0;
                ThreadPool.GetMinThreads(out bakWorkerThreads, out bakCompletionPortThreads);
                ThreadPool.SetMinThreads(bakWorkerThreads + servers.Length, bakCompletionPortThreads + servers.Length);
                try
                {
                    for (int i = 0; i < servers.Length; i++)
                    {
                        tasks.Add(GetFileLengthsAsync(servers[i], false));
                    }

                    Thread.Sleep(timeout);

                    for (int ctr = 0; ctr < tasks.Count; ctr++)
                    {
                        if (tasks[ctr].Status == TaskStatus.RanToCompletion)
                        {
                            return tasks[ctr].Result;
                        }
                    }

                    return null;
                }
                finally
                {
                    ThreadPool.SetMinThreads(bakWorkerThreads, bakCompletionPortThreads);
                }
            }

            private static Task<Atomzeit> GetFileLengthsAsync(string serverIp, bool utc)
            {
                return Task.Factory.StartNew(() =>
                {
                    // Variable für Fehlermeldungen
                    string errors = null;

                    try
                    {
                        Atomzeit res = new Atomzeit();
                        res.server = serverIp;
                        res.zeit = GetNetworkTime(serverIp, utc);
                        return res;
                    }
                    catch (Exception ex)
                    {
                        // Fehler dokumentieren
                        if (errors != null) errors += "\r\n";
                        errors += "Fehler bei der Abfrage von '" +
                           serverIp + ": " + ex.Message;
                    }

                    // Wenn die Methode hier ankommt, sind bei allen Abfragen
                    // Fehler aufgetreten, also eine Ausnahme werfen
                    throw new Exception(errors);
                });
            }

        }

        public static void Main()
        {
            AtomzeitAsync.Atomzeit? az = AtomzeitAsync.GetAtomzeit();
            if (az == null)
            {
                Console.WriteLine("Atomzeit konnte nicht ermittelt werden");
            }
            else
            {
                Console.WriteLine("Atomzeit: {0} gemeldet durch {1}", ((AtomzeitAsync.Atomzeit)az).zeit, ((AtomzeitAsync.Atomzeit)az).server);
            }

            Console.ReadLine();
        }

    }
}
Daniel Marschall
ViaThinkSoft Mitbegründer
ATTENTION: The DayTime-Protocol is outdated! Please use the NTP variant here.

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net.Sockets;

namespace ConsoleApp6
{

    class Program
    {
        public class AtomzeitAsync
        {
            public struct Atomzeit
            {
                public string server;
                public DateTime zeit;
            }
            public static string[] servers = { "time-a.nist.gov", "time-b.nist.gov", "time.nist.gov", "utcnist.colorado.edu", "nist1.datum.com" };
            public static Atomzeit? GetAtomzeit(int timeout = 1000)
            {
                List<Task<Atomzeit>> tasks = new List<Task<Atomzeit>>();

                int bakWorkerThreads = 0;
                int bakCompletionPortThreads = 0;
                ThreadPool.GetMinThreads(out bakWorkerThreads, out bakCompletionPortThreads);
                ThreadPool.SetMinThreads(bakWorkerThreads + servers.Length, bakCompletionPortThreads + servers.Length);
                try
                {
                    for (int i = 0; i < servers.Length; i++)
                    {
                        tasks.Add(GetFileLengthsAsync(servers[i], false));
                    }

                    Thread.Sleep(timeout);

                    for (int ctr = 0; ctr < tasks.Count; ctr++)
                    {
                        if (tasks[ctr].Status == TaskStatus.RanToCompletion)
                        {
                            return tasks[ctr].Result;
                        }
                    }
                    return null;
                }
                finally
                {
                    ThreadPool.SetMinThreads(bakWorkerThreads, bakCompletionPortThreads);
                }
            }

            private static Task<Atomzeit> GetFileLengthsAsync(string serverIp, bool utc)
            {
                return Task.Factory.StartNew/*Task.Run*/(() =>
                {


                        // Variable für Fehlermeldungen
                        string errors = null;

                    TcpClient tcpClient = null;
                    try
                    {
                            // TcpClient erzeugen und den Empfangs-Timeout auf eine Sekunde
                            // setzen
                            tcpClient = new TcpClient();
                        tcpClient.ReceiveTimeout = 1000;

                            // Versuch zum aktuellen Server eine Verbindung aufzubauen
                            tcpClient.Connect(serverIp, 13);

                            // Den NetworkStream referenzieren
                            NetworkStream networkStream = tcpClient.GetStream();

                        string result = null;
                        if (networkStream.CanWrite && networkStream.CanRead)
                        {
                                // Das Ergebnis empfangen und in ASCII konvertieren
                                byte[] bytes = new byte[tcpClient.ReceiveBufferSize];
                            try
                            {
                                networkStream.Read(bytes, 0,
                                   (int)tcpClient.ReceiveBufferSize);
                                result = Encoding.ASCII.GetString(bytes);
                            }
                            catch (Exception ex)
                            {
                                    // Fehler dokumentieren
                                    if (errors != null) errors += "\r\n";
                                errors += "Fehler bei der Abfrage von '" + serverIp +
                                   ": " + ex.Message;
                            }
                        }

                        if (result != null)
                        {
                                // Das Ergebnis, das die Form JJJJJ YR-MO-DA HH:MM:SS TT L H msADV 
                                // UTC(NIST) OTM besitzt, in einzelne Token aufsplitten
                                string[] token = result.Split(' ');

                                // Anzahl der Token überprüfen
                                if (token.Length >= 6)
                            {
                                    // Den Health-Status auslesen und überprüfen
                                    string health = token[5];
                                if (health == "0")
                                {
                                        // Alles ok:  Datums- und Zeitangaben auslesen
                                        string[] dates = token[1].Split('-');
                                    string[] times = token[2].Split(':');

                                        // DateTime-Instanz mit diesen Daten erzeugen
                                        System.DateTime utcDate =
                                   new System.DateTime(Int32.Parse(dates[0]) + 2000,
                                   Int32.Parse(dates[1]), Int32.Parse(dates[2]),
                                   Int32.Parse(times[0]), Int32.Parse(times[1]),
                                   Int32.Parse(times[2]));

                                        // Lokale Zeit berechnen und zurückgeben
                                        if (utc)
                                    {
                                        Atomzeit res = new Atomzeit();
                                        res.server = serverIp;
                                        res.zeit = utcDate;
                                        return res;
                                    }
                                    else
                                    {
                                        Atomzeit res = new Atomzeit();
                                        res.server = serverIp;
                                        res.zeit = TimeZone.CurrentTimeZone.ToLocalTime(utcDate);
                                        return res;
                                    }
                                }
                                else
                                {
                                        // Fehler dokumentieren
                                        if (errors != null) errors += "\r\n";
                                    errors += "Fehler bei der Abfrage von '" + serverIp +
                                       ": Der Health-Status ist " + health;
                                }
                            }
                            else
                            {
                                    // Fehler dokumentieren
                                    if (errors != null) errors += "\r\n";
                                errors += "Fehler bei der Abfrage von '" + serverIp +
                                   ": Die Anzahl der Token ist kleiner als 6";
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                            // Fehler dokumentieren
                            if (errors != null) errors += "\r\n";
                        errors += "Fehler bei der Abfrage von '" +
                           serverIp + ": " + ex.Message;
                    }
                    finally
                    {
                        try
                        {
                                // TcpClient schließen
                                tcpClient.Close();
                        }
                        catch { }
                    }

                        // Wenn die Methode hier ankommt, sind bei allen Abfragen
                        // Fehler aufgetreten, also eine Ausnahme werfen
                        throw new Exception(errors);
                });
            }

        }

        public static void Main()
        {
            AtomzeitAsync.Atomzeit? az = AtomzeitAsync.GetAtomzeit();
            if (az == null)
            {
                Console.WriteLine("Atomzeit konnte nicht ermittelt werden");
            }
            else
            {
                Console.WriteLine("Atomzeit: {0} gemeldet durch {1}", ((AtomzeitAsync.Atomzeit)az).zeit, ((AtomzeitAsync.Atomzeit)az).server);
            }

            Console.ReadLine();
        }

    }
}
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:



VNag (ViaThinkSoft Nagios) ist ein Framework für PHP, das es erlaubt, Plugins für Nagios-kompatible Systeme (z.B. auch Icinga2) gemäß den Richtlinien zu erstellen.

Das Download-Paket enthält Dokumentation und Beispiele und eine Vielzahl an neuen Plugins, z.B. um eine WordPress-Installation auf Updates zu überprüfen.

VNag ermöglicht es nicht nur, normale Nagios/Icinga-Plugins zu entwickeln (PHP wird über CLI aufgerufen), sondern erlaubt auch, ein Plugin über das Web zur Verfügung zu stellen:

  • Das ist PHP geschriebene Plugin kann über einen HTTP-Daemon (z.B. Apache) im Browser angezeigt werden. Neben der Anzeige der Nagios-Ausgabe (Summary, Verbose information, Performance data) können beliebige HTML-Ausgaben hinzugefügt werden, um z.B. noch Diagramme zu präsentieren. Es ist nur eine Codebasis erforderlich!

  • Die Web-Ausgabe enthält einen maschinenlesbaren (unsichtbaren) Teil, der mit Hilfe des "web reader"-Plugins von VNag ausgelesen und in das Standardformat für die Überwachung mit einer lokalen Nagios Instanz umgewandelt werden kann. Somit ist es z.B. möglich, mittels Nagios bestimmte Dinge (z.B. eine WordPress-Version) auf einem entfernten System, bei dem kein Shell-Zugriff möglich oder kein Nagios installiert ist, zu überwachen.

  • Es ist auch möglich, Webseiten zu erzeugen, die nur einen unsichtbaren maschinenlesbaren Teil besitzen (bzw. Sie können eine VNag Ausgabe in Ihre bestehende Webseite einbinden), jedoch ohne visuellen Teil. Dieser maschinenlesbare Teil kann optional signiert und/oder verschlüsselt werden.

Im Download-Paket von VNag sind folgende Plugins enthalten:

  • 4images_version: Prüft 4images Installationen auf verfügbare Updates.
  • disk_running: Prüft, ob Festplatten, die über keine SMART-Funktionalität verfügen, online sind
  • file_timestamp: Warnt, wenn Dateien in einem bestimmten Interval nicht aktualisiert wurden, bzw. wenn sie ein gewisses Alter erreicht haben.
  • ipfm: Prüft die Log-Dateien des Tools "ipfm" und warnt, wenn der gemessene Traffic das Monatslimit erreicht.
  • joomla_version: Prüft Joomla Installationen auf verfügbare Updates.
  • last: Prüft die Ausgabe des Tools "last" und warnt, wenn Logins aus verdächtigen IP-Adressen festgestellt wurden.
  • mdstat: Wertet die Datei "/proc/mdstat" aus und warnt, wenn Festplatten in einem RAID-Array ausfallen.
  • mediawiki_version: Prüft MediaWiki Installationen auf verfügbare Updates.
  • pmwiki_version: Prüft PmWiki Installationen auf verfügbare Updates.
  • net2ftp_version: Prüft net2ftp Installationen auf verfügbare Updates.
  • nocc_version: Prüft NOCC webmail Installationen auf verfügbare Updates.
  • openbugbounty: Warnt, wenn Ihre Domains bei OpenBugBounty.org auftauchen.
  • phpbb_version: Prüft phpBB Installationen auf verfügbare Updates.
  • phpmyadmin_version: Prüft phpMyAdmin Installationen auf verfügbare Updates.
  • roundcube_version: Prüft RoundCube Installationen auf verfügbare Updates.
  • smart: Prüft SMART Attribute der Festplatten und warnt wenn kritische Werte entdeckt werden.
  • virtual_mem: Prüft die Größe des virtuellen Speichers (Physikalischer Speicher und Swap).
  • webreader: Lies die Ausgabe eines VNag plugins auf einem entfernten System, übertragen per HTTP.
  • wordpress_version: Prüft WordPress Installationen auf verfügbare Updates.
  • x509_expire: Prüft X.509 (PEM) Dateien und warnt, wenn diese ein gewisses Alter erreichen.
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:

This small class in PHP has following functionalities:

- Get MIME Type from a filename (useful if your system does not support mime_content_type)
- Get a name/description of a given file or filename

The project contains a small lookup-table for file type names in English.
Daniel Marschall
ViaThinkSoft Mitbegründer
Projektbeschreibung:

This small class in PHP has following functionalities:

- Get MIME Type from a filename (useful if your system does not support mime_content_type)
- Get a name/description of a given file or filename

The project contains a small lookup-table for file type names in English.
Daniel Marschall
ViaThinkSoft Mitbegründer