Manuell zu drahtlosen Netzwerk verbinden

Ich nutze momentan mein altes Netbook zum experimentieren als Server und habe deswegen ein minimales Debian installiert. Um es nicht schon im Leerlauf zu überlasten habe ich keinen X-Server oder etwas ähnliches installiert, welches mir einen Networkmanager bescheren könnte und war daher gezwungen die Verbindung zu meinem lokalen WLAN manuell aufzubauen.

Da die Verbindung automatisch bei jedem Systemstart aufgebaut werden soll, habe ich mir zwei Skripte wlan-start.py und wlan-stop.py geschrieben welche ich in einer /etc/init.d/wlan aufrufe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash
#/etc/init.d/wlan

case "$1" in
    start)
        /root/scripts/wlan-start.py
        ;;
    stop)
        /root/scripts/wlan-stop.py
        ;;
    *)
        echo "Usage: /etc/init.d/wlan {start|stop}"
        exit 1
        ;;
esac

exit 0

Ein anschließendendes:

# update-rc.d wlan defaults

sorgt für das Aufrufen beim Systemstart.

Die Zugangsdaten der wpa2 Netze speichere ich unter /etc/wlan/SSID.conf wobei SSID gegen die entsprechende WLAN-SSID zu ersetzen ist:

1
2
3
4
5
6
7
8
9
#!/usr/bin/python3

import os

ssid = input("SSID: ")
password = input("Password: ")

os.system("wpa_passphrase %s %s > /etc/wlan/%s.conf" %(ssid, password, ssid))
print("Config file was written to: /etc/wlan/%s.conf" %ssid)

(wpa_passphrase aus Paket: wpasupplicant)
Das wlan-start.py-Skript muss nun nur noch die gefundenen mit den bekannten SSIDs aus dem /etc/wlan-Verzeichnis abgleichen und ggf. die entsprechende .conf-Datei laden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/python3

import os
import subprocess
import sys

FNULL = open(os.devnull, 'w')

print("Searching for known wireless networks...")
conffile = ""
try:
    subprocess.check_call(["ifconfig", "wlan0", "up"], stdout=FNULL, stderr=subprocess.STDOUT)
    output = subprocess.check_output(["iwlist", "wlan0", "scan"], universal_newlines=True)
    ssids = [line.strip()[7:-1] for line in output.split('\n') if 'ESSID:' in line]
    for ssid in ssids:
        f = "/etc/wlan/" + ssid + ".conf";
        if os.path.isfile(f):
            conffile = f
            break
    if conffile == "":
        print("No known wireless networks found")
        sys.exit(0)
    print("Found network: %s" %ssid)
except:
    print("An error occured while searching for wireless networks.")
    sys.exit(1)

print("Connecting...")
try:
    subprocess.check_call(["wpa_supplicant", "-B", "-iwlan0", "-c" + conffile, "-Dwext"], stdout=FNULL, stderr=subprocess.STDOUT)
    subprocess.check_call(["dhclient", "wlan0"], stdout=FNULL, stderr=subprocess.STDOUT)
except:
    print("An error occured. Cannot connect to wireless network.")
else:
    print("Successfully connected to %s" %ssid)

(Für den Scann-Vorgang mit iwlist wird das Paket wireless-tools benötigt.)

Der vollständigkeitshalber hier auch noch das wlan-stop.py-Skript:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/usr/bin/python3

import subprocess

try:
    subprocess.check_call(["dhclient", "-r", "wlan0"])
    subprocess.check_call(["ifconfig", "wlan0", "down"])
except:
    print("An error occured while shutting down wlan0")
else:
    print("Shutting down wlan0 was successful")

IPv6 Privacy Extension und NetworkManager

Um die IPv6 Privacy Extension und NetworkManager gleichzeitig zu verwenden, müssen in /etc/sysctl.conf die Zeilen

1
2
3
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
net.ipv6.conf.nic0.use_tempaddr = 2

hinzugefügt werden, wobei nic0 mit dem Namen des Netzwerkinterfaces ersetzt werden muss.

NetworkManager liest /etc/sysctl.conf (nicht aber /etc/sysctl.d/*.conf) ein.

Um die Extension für eine bestimmte Verbindung zu aktivieren, muss die Zeile

IPV6_PRIVACY=rfc3041

in /etc/sysconfig/network-scripts/ifcfg-nic0 hinzugefügt werden (nic0 wieder mit der Verbindung ersetzen).

Bei mir entstand die Verwunderung, wieso es keine ifcfg-wlp3s0 Konfigurationsdatei gibt (wlp3s0 = Name meines WLAN-Interfaces). Das kommt daher, dass wlp3s0 keine Verbindung (sondern ein Interface) ist.

Deswegen gibt es auch für jede WLAN-Verbindung (jedes Netwerk) eine Konfiguration - auch für die Ethernet-Verbindung.

Siehe auch:

Scala 2.10.3 + Maven: pom.xml

Anbei zum Kopieren die minimale pom.xml (+JUnit) mit der man sofort loslegen kann.

Die Scala-Sourcen werden dabei aus “src/main/scala”, die Scala-Testsourcen in “src/test/scala” geladen. Parallel können ganz normal in “src/main/java” / “src/test/java” die entsprechende Java-Sourcen abgelegt werden.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelversion>4.0.0</modelversion>
    <groupid>de.metacoder</groupid>
    <artifactid>scalamaven</artifactid>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupid>org.scala-lang</groupid>
            <artifactid>scala-library</artifactid>
            <version>2.10.3</version>
        </dependency>
        <dependency>
            <groupid>junit</groupid>
            <artifactid>junit</artifactid>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupid>org.scala-tools</groupid>
                <artifactid>maven-scala-plugin</artifactid>
                <version>2.15.2</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <jvmargs>
                        <jvmarg>-Xms64m</jvmarg>
                        <jvmarg>-Xmx1024m</jvmarg>
                    </jvmargs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Der “configuration”-Part, der die JVM-Args steuert und den Heapspace setzt, ist optional. Bei kleineren Projekten reichen die default settings, man kann den Part also weglassen. Bei größeren Scala-Projekten benötigt man die Heapspace-Settings für den Compiler aber wieder, da die Defaults zu knapp werden.

Steam / X-Plane auf Linux: Pavucontrol erlaubt Umschalten des Output devices nicht

Sowohl unter Fedora als auch unter Gentoo (Stable) hatte ich das Problem, dass ich mit Pavucontrol für das laufende Spiel das Ausgabegerät nicht umschalten konnte. In Pavucontrol konnte ich zwar den entsprechenden Button drücken und mein Wunschausgabegerät wählen, allerdings hat dies keine Auswirkung gehabt und das Ausgabegerät wurde nicht umgestellt.

Der nächste Versuch das Ganze über die command line zu lösen hat mehr Licht ins Dunkle gebracht:

# IDs der Ausgabegeräte rausfinden
pactl list sinks

# Applikationen die über PulseAudio Sound ausgeben auflisten:
pactl list sink-inputs

# Ausgabe von X-Plane (Sink-Input 118) auf Sink 1 (neues Ausgabegerät) umleiten:
pactl move-sink-input 118 1

Der “pactl move-sink-input 118 1"-Befehl terminierte bei mir mit “Failure: Invalid argument”. Beim “pactl list sink-inputs” ist mir beim X-Plane folgende Zeile aufgefallen:

flags: DONT_MOVE START_CORKED FIX_RATE

Das Flag DONT_MOVE hat verhindert, dass man das Ausgabegerät umschalten kann. X-Plane und Steam verwenden OpenAL für die Soundausgabe. Im Steamforum habe ich die Lösung für dieses Problem gefunden. Man muss einfach die Datei .alsoftrc in seinem Home-Verzeichnis mit folgendem Inhalt anlegen:

# ~/.alsoftrc
[pulse]
allow-moves=yes

Ob das irgendwo anders zu Problemen führt / warum OpenAL by default keine Moves erlaubt kann ich aber noch nicht mit Sicherheit sagen. X-Plane funktioniert auf jeden Fall tadellos mit den neuen Settings.