Systemd – Start- und Stopskript Teamspeak

Das nachfolgende Skript wird unter „/etc/systemd/system“ abgelegt, wie auch andere benutzerdefinierte Skripte. Die systemweiten Skripte liegen unterdessen unter „/lib/systemd/system“. Am besten mit dem Namen „tss3.service“.

1
touch /etc/systemd/system/tss3.service

Und hier der Inhalt des Skriptes:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[Unit]
Description=The Team Speak Server
After=network.target
Documentation=https://blog.marcodn.de/
 
[Service]
WorkingDirectory=/srv/tss3
Type=simple
# Wenn man keinen speziellen Benutzer möchte, einfach die 2 Zeilen entfernen
User=ts3
Group=ts3
Environment="LD_LIBRARY_PATH=/srv/tss3"
ExecStart=/srv/tss3/ts3server_linux_amd64
ExecStop=/bin/kill -s INT $MAINPID
PIDFile=/srv/tss3/ts3server.pid
RestartSec=15
Restart=always
StandardOutput=syslog
StandardError=syslog
SysLogIdentifier=tss3
 
[Install]
WantedBy=multi-user.target

Zum aktivieren des Skriptes müssen folgende Befehle ausgeführt werden:

  1. systemctl daemon-reload
  2. systemctl enable tss3
  3. systemctl start tss3
  4. systemctl status tss3

Bei Änderungen an der Skriptdatei muss Punkt 1 wiederholt werden.

Linux System mit Arch Linux

Installation

Hier soll eine Sammlung von Programmen entstehen, die ich aktuell nicht mehr auf meinen Rechner missen möchte und eine bestimmte Grundausstattung besitzen. Dieser Artikel wird immer wieder aktualisiert, wenn neue wichtige Programme hinzukommen.

Grundinstallation

Als Linux-System wird hier Manjaro verwendet, was auf dem Arch-Linux aufbaut. Vorteil von Manjaro ist der graphische Installer gegenüber dem reinen Arch-Linux.

Und wieso wurde es ein Arch-Linux?

Zum einen sind die meisten vorhanden Packete schon aktueller als in den anderen Distributionen und zusätzlich gibt es noch yaourt, mit dem die aktuellsten Sourcen der meisten Packete direkt übersetzen lassen und die Packete im Anschluss installieren.

Grapische Oberfläche

SDDM – Login-Manager – https://wiki.archlinux.org/index.php/SDDM

PacketnameTypBezugsquelle
SDDMLogin-Managerhttps://wiki.archlinux.org/index.php/SDDM
OpenboxWindows Manager
SynapseProgrammstarter
RemminaRDP (mstsc)http://www.remmina.org/wp/
KRDCRDP (mstsc) KDEhttps://www.kde.org/applications/internet/krdc/

Audioausgabe (mit AirPlay)

Damit die Ausgabe des Linux-System über AirPlay-fähige Geräte gestreamt werden kann, hab ich folgende 2 Pakete benötigt:

  • pulseaudio-raop2: Streamen der Ausgabe an AirPlay Geräte.
  • pavucontrol: damit wird die Ausgabe des Audiostreams eingestellt (Umschalter für z.B. MPlayer auf AirPlay-Gerät)

Nach dem Installieren müssen folgende Befehle ausgeführt werden:

sudo systemctl start avahi-daemon #startet den Dienst
avahi-browse -t --all #Zeigt alle AirPlay Geräte im Netz an
sudo systemctl enable avahi-daemon #aktiviert den Dienst für Autostart

Weitere Informationen findet man auch hier: AirTunes.

 

Weitere Programme:

PacketnameTypBezugsquelle
Visual Studio CodeEditorMicrosoft
AtomEditoryaourt

Logitech K350 MediaKeys mit AIMP und MPC-HC

Nach dem ich mir nun die K350 von Logitech zugelegt habe, hatte ich zuerst schon bedenken, dass ich wieder vom AIMP-MediaPlayer zu Winamp oder gar Windows Media Player wechseln muss, da im AIMP die MediaKeys von der Tastatur nicht funktionierten.

Glücklicherweise fand ich aber im Internet die Lösung, und zwar muss in der Player-Ini des SetPoint-Programmes AIMP nur nachgetragen werden. Wichtig dabei ist darauf zu achten, welche Version von AIMP installiert ist. Hatte hier ein paar Probleme da ich mit einer falsche Version gearbeitet hatte.

Die Ini findet man nach der Standard-Installation unter folgenden Pfad:

%ProgramFiles%\Logitech\SetPointP\players.ini

Die INI muss um die Zeilen 2-4 erweitert werden, die der Sektion „Players“ hinzugefügt werden müssen:

[Players]
AIMP2=cmd,AIMP2.exe,Winamp v1.x,xxx,xxx,40045,40046,40047,40044,40048,0,1,WinAmp 5
AIMP3=cmd,AIMP3.exe,Winamp v1.x,xxx,xxx,40045,40046,40047,40044,40048,0,1,WinAmp 5
AIMP4=cmd,AIMP.exe,Winamp v1.x,xxx,xxx,40045,40046,40047,40044,40048,0,1,WinAmp 5
mplayerc=wac,mpc-hc64.exe,MediaPlayerClassicW,Windows Media Player,xxx,xxx,xxx,xxx,xxx,xxx,0,1,Media Player Classic
...

Alle anderen Einträge müssen nicht angepasst werden. Die markierte Zeile 5 zeigt, wie der Eintrag definiert ist, damit der Media Player Classic (MPC-HC) von der SetPoint-Software zu erkennen wird.

VMware Player 6 unter Windows 10

Nach dem erfolgreichen Update von Windows 8.1 auf Windows 10 hat leider der VMware Player nicht richtig funktioniert.

Zuerst konnte die VM’s zwar gestartet werden, aber keine der gestarteten VM’s ist mehr ins Netzwerk gekommen. Bei „Configure Adapaters“ bei der Bridge-Einstellung, war auch keine der Netzwerkkarten mehr anzuwählen. Nach etwas Recherche bin ich darauf gestoßen, dass der Bridge-Dienst nicht mehr auf der Netzwerkkarte installiert ist.

Um dies zu beheben, muss man zu den Netzwerkeinstellungen. Öffnet dort das Eigenschaftsfenster der physikalischen Netzwerkkarte und dort kann man über die Schaltfläche „Installatieren…“ neue Komponenten einrichten. Nach dem Klick auf die Schalftfläche „Dienst“ auswählen und mit „Hinzufügen…“ bestätigen. Dann unter dem Hersteller VMware den „VMware Bridge Protocol“ Eintrag auswählen und mit „OK“ bestätigen. Nach dem installieren, können dann die Netzwerkkarten bei Bridge wieder konfiguriert werden und eine Verbindung ins Netzwerk ist wieder möglich.

Nach einen Neustart des Host ist dann ein andere Fehler aufgetaucht, und zwar wurde beim versuch eine VM zu starten die Fehlermeldung „error while powering on: internal error“ angezeigt.

Um diese Problem zu lösen, muss der Dienst „VMware Authorization Service“ manuell nach gestartet werden. Er steht zwar auf Automatisch, ist beim hochfahren aber nicht gestartet worden oder wieder abgestürzt. Nach dem Start des Dienstes funktioniert jede VM wieder

Arch Linux Single User Mode

Um bei Arch Linux in den Single User Mode zu kommen ist fogendes notwendig:

  1. Im Grub den Eintrag des zu startenden Linux auswählen und die Taste [E] drücken
  2. Im angzeigten Skript die nachfolgende Stelle suchen:
    ... rw  quiet splash
  3. „quiet splash“ entfernen und „single“ einsetzen
  4. Nun mit [Strg]+[X] das starten des Linux initieren
  5. nach kurzer Wartezeit, wird das root-Passwort verlangt, dies bitte eingeben
  6. nun kann man die notwendigen Änderungen durchführen damit das System wieder richtig startet, z.B. einen lightdm deaktivieren und lxdm wieder aktivieren:
    systemctl disable lightdm
    systemctl enable lxdm
  7. Wenn alles fertig ist, kann durch „exit“ der Single User Mode verlassen werden, und der Startvorgang läuft weiter.

Git GUI unter Linux an GitLab Server mit PuTTY-Key

Nach der Umstellung auf LInux System, benötigte ich meinen vorhanden PuTTY-Schlüssel als OpenSSH Schlüssel im Linux System. Für die Wandlung gibt es unter linux puttygen, was entweder einzeln oder im Packet putty-tools installiert wird. Zum Wandeln wird folgender Befehl benutzt:

puttygen <keyfile> -O  private-openssh -o <output>

In <keyfile-PuTTY> wird der Putty-Schlüssel angegeben und bei <output> wird die Ausgabedatei angegeben, welche auch direkt die Datei „~/.ssh/id_rsa“ sein kann.

Um den Public-Key zu ermitteln, wird folgender Befehl benutzt:

ssh-keygen -f <source-private-key> -y > <output>

Hier wird bei <source-private-key> der OpenSSH-Private-Key benötigt, und bei Output der Ziel des Public-Keys definiert, z.B: „~/.ssh/id_rsa.pub“.

Damit dann meine gewählte Git-GUI, hab mich für GitEye entschieden, auch noch richtig funktionierte musste unter „Window -> Prfeferences -> General -> Nework Connections -> SSH2 -> Private keys: der id_rsa an den Anfang geschoben werden.

Linux Desktop Screenshots und Video-Aufzeichnung

Um unter Linux einen Screenshot vom Desktop oder nur eines Ausschnitts zu erzeugen, gibt es die Software Shutter. Nach dem Start dieser Software, kann damit genauso gearbeitet werden wie mit dem Snipping-Tool von Windows 8.

Zu Aufzeichnung eines Desktop-Videos, kann unter Gnome zum einem die Tastenkombination „Strg + Alt + Umschalt + R“ benutzt werden. Nach dem Starten erscheint oben rechts ein roter Punkt, der darstellen soll, dass die Aufnahme läuft. Das Video wird in den Benutzerverzeichnis im Ordner Videos abgelegt.

Des weiteren gibt es die Software SimpleScreenRecorder, welche eine Hülle an möglichen Einstellungen besitzt (die nicht angepasst werden müssen, aber können). Mit dieser können auch nur feste Ausschnitte bzw. der Maus folgende Ausschnitte aufzeichnet werden und nicht immer der ganze Desktop.

Windows 8 Energiesparmodus

Da ich immer wieder Probleme mit automatischen Aufwachen aus dem Energiesparmodus in Windows 8 hatte, hab ich mich im Internet etwas umgeschaut und bin auf folgenden Befehl gestoßen:

powercfg -devicequery wake_armed

Mit diesen, werden alle Geräte aufgelistet, die den Rechner aus den Energiesparmodus aufwecken dürfen. Und mit nachfolgenden Befehl, können einzelne Geräte entfernt werden:

powercfg -devicedisablewake [device_name]

(device_name, durch den Namen des zu entfernenden Gerät ersetzen. Vorsicht, wenn der Gerätename Leerzeichen beinhaltet, muss der Namen mit „“ umschlossen werden)

C# Dienst mit eigener Installationsroutine (per /i)

Nach langer suche und vielen Zusammenstückeln, habe ich nun endlich ein komplettes Paket um einen Dienst die Möglichkeit zu implementieren sich selbst per Kommandozeilenparameter zu installieren.

Ebenso wird zeitgleich eine Konsolenausgabe mit implementiert. Das einzige Problem hier ist, solange der Projekt-Typ nach Standard auf „Windows Anwendung“ steht, funktionieren das Attachen nicht ganz komplikationslos, da die Anwendung in der Konsole direkt zurückkehrt ohne aufs Ende des Prozesses zu warten. Um diese Problem wegzubekommen, muss der Projekt-Typ auf „Konsolen Anwendung“ umgestellt werden.

Dieser Quellcode hat einen großen Vorteil gegenüber anderen die noch vorhanden sind, da hier beim installieren und deinstallieren das gleiche durchgeführt wird, was auch das InstallUtil Programm durchführt. Daher kann das Array welches bei Install und Deinstall übergeben wird, entsprechend der Parameter die am InstallUtil vorhanden sind erweitert werden.

(Vorne weg noch ein kleiner Tip, sollte die using-Direktive zu einer Klasse fehlen und die Klasse wurde richtig geschrieben, dann kann per [Strg]+[.] die Direktive automatisch ermittelt und hinzugefügt werden. Für den Fall das ich welche vergessen habe.)

Zuerst einmal die Konstanten und die Imports, welche innerhalb der „static class Program“ eingefügt werden müssen:

const uint ATTACH_PARENT_PROCESS = 0x0ffffffff;
const int ERROR_ACCESS_DENIED = 5; // Process ist schon attached von einer anderen Konsole
[DllImport("kernel32", SetLastError = true)]
static extern bool AllocConsole();
[DllImport("kernel32", SetLastError = true)]
static extern bool FreeConsole();
[DllImport("kernel32", SetLastError = true)]
static extern bool AttachConsole(uint dwProcessID);

Die Main-Prozedur (der noch der Paramter „string[] args“ hinzugefügt werden muss, wenn nicht vorhanden) muss nun folgender weise erweitert werden:

ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new MyNewService() };
if (System.Environment.UserInteractive)
{
  if(!AttachConsole(ATTACH_PARENT_PROCESS) || Marshal.GetLastWin32Error() == ERROR_ACCESS_DENIED)
    AllocConsole();
  // Uebergabe Parameter
  bool install = false;
  bool uninstall = false;
  bool debug = false;
  string value = "";
  int pos = -1;
  for (int i = 0; i < args.Length; i++)
  {
    var arg = args[i];
    value = "";
    pos = arg.IndexOf('=');
    if (pos > 0)
    {
      value = arg.Substring(pos + 1);
      arg = arg.Substring(0, pos);
    }
    switch(arg.ToLower())
    {
      case "/i": install = true; break;
      case "/u": uninstall = true; break;
      case "/c": debug = true; break;
      case "/account": /*Account-Typ aus der Variable value speichern*/ break;
      case "/user": /*Benutzer aus der Variable value speichern*/ break;
      case "/passwd": /*Passwort aus der Variable value speichern*/ break;
      default:
        Console.WriteLine("Argument nicht verstanden: {0}", arg);
        break;
    }
  }
  try
  {
    if (install)
    {
      var combArgs = new string[] { Assembly.GetExecutingAssembly().Location };
      System.Configuration.Install
        .ManagedInstallerClass.InstallHelper(combArgs);
    }
    else if (uninstall)
    {
      var combArgs = new string[] { "/u", Assembly.GetExecutingAssembly().Location };
      System.Configuration.Install
        .ManagedInstallerClass.InstallHelper(combArgs);
    }
    else if (debug)
    {
      var svc = ServicesToRun[0] as MyNewService;
      svc.OnStartDebug(args);
      Console.WriteLine("[Return] fürs beenden drücken...");
      Console.ReadLine();
      svc.OnStopDebug();
    }
  }
  catch (Exception exc)
  {
    Console.WriteLine(exc.Message);
  }
  // Konsole wieder freigeben
  FreeConsole();
}
else
{
  // Wenn das Programm nicht ueber die Konsole gestartet wurde dann als Dienst starten lassen
  ServiceBase.Run(ServicesToRun);
}

Zusätzlich müssen die 2 Funktionen (OnStartDebug/OnStopDebug) angelegt werden, die einzig die gleichnamigen (ohne Debug am Ende) protected Methoden aufrufen, wenn der Debug-Modus gewünscht ist. Wenn nicht, dann einfach diesen Teil aus den obigen Quellcode entfernen.