summaryrefslogtreecommitdiff
path: root/roles
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2020-12-28 21:29:49 +0100
committerChristian Pointner <equinox@spreadspace.org>2020-12-28 21:29:49 +0100
commit681f88d28fb3f1230f18bbdac23f75a9e62bd1b7 (patch)
tree0bb67d7144ca8785e0f06c30e7b1a6edf27e3907 /roles
parentadd host ch-equinox-t450s (diff)
ws/minet: initial version
Diffstat (limited to 'roles')
-rw-r--r--roles/ws/minet/defaults/main.yml6
-rw-r--r--roles/ws/minet/files/_minet40
-rwxr-xr-xroles/ws/minet/files/minet111
-rw-r--r--roles/ws/minet/files/minet_helpers.sh53
-rw-r--r--roles/ws/minet/tasks/main.yml31
-rwxr-xr-xroles/ws/minet/templates/connections/dhcpWire.j228
-rwxr-xr-xroles/ws/minet/templates/connections/genericWPAWireless.j230
-rwxr-xr-xroles/ws/minet/templates/connections/manualWire.j225
-rwxr-xr-xroles/ws/minet/templates/connections/manualWireless.j225
-rwxr-xr-xroles/ws/minet/templates/connections/wifiScan.j225
10 files changed, 374 insertions, 0 deletions
diff --git a/roles/ws/minet/defaults/main.yml b/roles/ws/minet/defaults/main.yml
new file mode 100644
index 00000000..f2a25f02
--- /dev/null
+++ b/roles/ws/minet/defaults/main.yml
@@ -0,0 +1,6 @@
+---
+ws_minet_wired_interface_name: eth0
+ws_minet_wired_interface_module: e1000e
+
+ws_minet_wireless_interface_name: wlan0
+ws_minet_wireless_interface_module: iwlwifi
diff --git a/roles/ws/minet/files/_minet b/roles/ws/minet/files/_minet
new file mode 100644
index 00000000..8f3e02ca
--- /dev/null
+++ b/roles/ws/minet/files/_minet
@@ -0,0 +1,40 @@
+#compdef _minet minet
+#autoload
+
+
+_minet () {
+ local cmd
+ if (( CURRENT > 2)); then
+ cmd=${words[2]}
+ # Set the context for the subcommand.
+ curcontext="${curcontext%:*:*}:pass-$cmd"
+ # Narrow the range of words we are looking at to exclude `pass'
+ (( CURRENT-- ))
+ shift words
+ # Run the completion for the subcommand
+ case "${cmd}" in
+ start)
+ if (( CURRENT == 2 )); then
+ _minet_complete_entries
+ fi
+ ;;
+ esac
+ else
+ local -a subcommands
+ subcommands=(
+ "start:Connect to network"
+ "stop:Disconnect from network"
+ "restart:Reconnect to network"
+ "suspend:Suspend current connection"
+ "resume:Resume suspended connection"
+ "status:Print connection status"
+ )
+ _describe -t commands 'minet' subcommands
+ fi
+}
+
+_minet_complete_entries () {
+ local IFS=$'\n'
+ local prefix="/usr/local/lib/minet"
+ _values -C 'connections' ${$(find -L "$prefix" \( -name minet_helpers.sh -o -name template \) -prune -o -type f -executable -print 2>/dev/null | sed -e "s#${prefix}/\{0,1\}##" | sort):-""}
+}
diff --git a/roles/ws/minet/files/minet b/roles/ws/minet/files/minet
new file mode 100755
index 00000000..6d6181e4
--- /dev/null
+++ b/roles/ws/minet/files/minet
@@ -0,0 +1,111 @@
+#!/bin/sh
+#
+# This is the main script of the Minimalistic Network Manager
+# Author: Christian Pointner <equinox@chaos-at-home.org>
+#
+
+NAME="Minimalistic Network Manager"
+CURRENT_FILE="/var/run/minet.current"
+SUSPENDED_FILE="$CURRENT_FILE.suspended"
+SCRIPT_ROOT="/usr/local/lib/minet"
+
+if [ -n "$1" ] && [ "$1" != "status" ] && [ "$USER" != "root" ]; then
+ echo "$NAME: only root can do that!"
+ exit 1
+fi
+
+. $SCRIPT_ROOT/minet_helpers.sh
+
+case "$1" in
+ start)
+ if [ -z "$2" ]; then
+ echo "$NAME: initializing..."
+ if [ -f $CURRENT_FILE ]; then
+ rm $CURRENT_FILE
+ fi
+ if [ -f $SUSPENDED_FILE ]; then
+ rm $SUSPENDED_FILE
+ fi
+ else
+ if [ -f $SUSPENDED_FILE ]; then
+ echo -n "$NAME: "
+ echo -n `cat $SUSPENDED_FILE`
+ echo " is suspended"
+ exit 0
+ fi
+ if [ -x $SCRIPT_ROOT/$2 ]; then
+ if [ -f $CURRENT_FILE ]; then
+ $SCRIPT_ROOT/`cat $CURRENT_FILE` stop
+ fi
+ $SCRIPT_ROOT/$2 start
+ echo $2 > $CURRENT_FILE
+ else
+ echo "Unknown Connection"
+ exit 2
+ fi
+ exit 0
+ fi
+ ;;
+ stop)
+ echo "$NAME: stopping..."
+ if [ -f $CURRENT_FILE ]; then
+ $SCRIPT_ROOT/`cat $CURRENT_FILE` stop
+ rm $CURRENT_FILE
+ fi
+ ;;
+ restart)
+ echo "$NAME: restarting..."
+ if [ -f $CURRENT_FILE ]; then
+ $SCRIPT_ROOT/`cat $CURRENT_FILE` stop
+ sleep 1
+ $SCRIPT_ROOT/`cat $CURRENT_FILE` start
+ fi
+ ;;
+ suspend)
+ echo -n "$NAME: "
+ if [ ! -f $CURRENT_FILE ]; then
+ echo "no active connection to suspend"
+ exit 0
+ else
+ echo -n "suspending connection: "
+ echo `cat $CURRENT_FILE`
+ ln $CURRENT_FILE $SUSPENDED_FILE
+ $SCRIPT_ROOT/`cat $CURRENT_FILE` stop
+ rm $CURRENT_FILE
+ fi
+ ;;
+ resume)
+ echo -n "$NAME: "
+ if [ ! -f $SUSPENDED_FILE ]; then
+ echo "no suspended connection to resume"
+ exit 0
+ else
+ echo -n "resuming connection: "
+ echo `cat $SUSPENDED_FILE`
+ ln $SUSPENDED_FILE $CURRENT_FILE
+ $SCRIPT_ROOT/`cat $CURRENT_FILE` start
+ rm $SUSPENDED_FILE
+ fi
+ ;;
+ status)
+ echo -n "$NAME status: "
+ if [ ! -f $CURRENT_FILE ]; then
+ if [ -f $SUSPENDED_FILE ]; then
+ echo -n `cat $SUSPENDED_FILE`
+ echo " is suspended"
+ exit 0
+ else
+ echo "not connected"
+ exit 0
+ fi
+ else
+ echo -n "connected with "
+ echo `cat $CURRENT_FILE`
+ fi
+ ;;
+ *)
+ echo "Usage: $0 (start [connection name]|stop|suspend|resume|status)"
+ ;;
+esac
+
+exit 0
diff --git a/roles/ws/minet/files/minet_helpers.sh b/roles/ws/minet/files/minet_helpers.sh
new file mode 100644
index 00000000..1b82e4a5
--- /dev/null
+++ b/roles/ws/minet/files/minet_helpers.sh
@@ -0,0 +1,53 @@
+# These are helper functions for the Minimalistic Network Manager
+# Author: Christian Pointner <equinox@chaos-at-home.org>
+
+activate_interface()
+{
+ echo 2 > /proc/sys/net/ipv6/conf/default/use_tempaddr
+ modprobe $2
+ while true; do
+ ip link set up dev $1 >/dev/null 2>&1
+ if [ $? -eq 0 ]; then
+ break
+ fi
+ echo -n "."
+ sleep 1
+ echo 2 > /proc/sys/net/ipv6/conf/$1/use_tempaddr
+ done
+ if [ $2 = "eth0" ]; then
+ sleep 2
+ ethtool -s $2 advertise 0x008
+ fi
+ echo ""
+}
+
+deactivate_interface()
+{
+ ip link set down dev $1 >/dev/null 2>&1
+ modprobe -r $2
+}
+
+wpa_select_ssid()
+{
+ NET=$(wpa_cli -i$1 list_networks | awk "BEGIN { FS = \"\\t\" } ; \$2 == \"$2\" { print(\$1) }")
+ if [ -n "$NET" ]; then
+ wpa_cli -i$1 select_network $NET
+ else
+ echo "SSID '$2' is not in wpa_supplicant.conf - ignoring it..."
+ fi
+}
+
+create_6to4()
+{
+ IPV6_ADDR=`printf "2002:%02x%02x:%02x%02x::1" \`echo "$2" | tr "." " "\``
+
+ ip tunnel add mode sit remote 192.88.99.1 name $1
+ ip link set dev $1 up
+ ip addr add dev $1 $IPV6_ADDR/48
+ ip -6 route add default dev $1
+}
+
+destroy_6to4()
+{
+ ip tunnel del name $1
+}
diff --git a/roles/ws/minet/tasks/main.yml b/roles/ws/minet/tasks/main.yml
new file mode 100644
index 00000000..b1c68d7f
--- /dev/null
+++ b/roles/ws/minet/tasks/main.yml
@@ -0,0 +1,31 @@
+---
+- name: install minet management script
+ copy:
+ src: minet
+ dest: /usr/local/sbin/
+ mode: 0755
+
+- name: install minet management script zsh completion
+ copy:
+ src: _minet
+ dest: /usr/local/share/zsh/site-functions
+ mode: 0644
+
+- name: install minet lib dir
+ file:
+ path: /usr/local/lib/minet
+ state: directory
+
+- name: install minet helpers
+ copy:
+ src: minet_helpers.sh
+ dest: /usr/local/lib/minet
+
+- name: install minet connection scripts
+ loop: "{{ lookup('fileglob', 'templates/connections/*.j2', wantlist=True) }}"
+ loop_control:
+ label: "{{ item | basename | splitext | first }}"
+ template:
+ src: "{{ item }}"
+ dest: "/usr/local/lib/minet/{{ item | basename | splitext | first }}"
+ mode: 0755
diff --git a/roles/ws/minet/templates/connections/dhcpWire.j2 b/roles/ws/minet/templates/connections/dhcpWire.j2
new file mode 100755
index 00000000..3acee9a7
--- /dev/null
+++ b/roles/ws/minet/templates/connections/dhcpWire.j2
@@ -0,0 +1,28 @@
+#!/bin/sh
+#
+# Author: Christian Pointner <equinox@chaos-at-home.org>
+#
+
+SHORT_NAME="dhcpwire"
+DESC_NAME="anywhere(dhcp) WIRE"
+INTERFACE="{{ ws_minet_wired_interface_name }}"
+MODULE_NAME="{{ ws_minet_wired_interface_module }}"
+
+. /usr/local/lib/minet/minet_helpers.sh
+
+case "$1" in
+ start|"")
+ echo "Connecting with $DESC_NAME"
+ activate_interface $INTERFACE $MODULE_NAME
+ dhclient $INTERFACE -v -pf /var/run/dhclient.$SHORT_NAME.pid
+ ;;
+ stop)
+ echo "Disconnecting from $DESC_NAME"
+ kill `cat /var/run/dhclient.$SHORT_NAME.pid`
+ rm /var/run/dhclient.$SHORT_NAME.pid
+ deactivate_interface $INTERFACE $MODULE_NAME
+ ;;
+ *)
+ exit 1
+ ;;
+esac
diff --git a/roles/ws/minet/templates/connections/genericWPAWireless.j2 b/roles/ws/minet/templates/connections/genericWPAWireless.j2
new file mode 100755
index 00000000..ecc4b2bb
--- /dev/null
+++ b/roles/ws/minet/templates/connections/genericWPAWireless.j2
@@ -0,0 +1,30 @@
+#!/bin/sh
+#
+# Author: Christian Pointner <equinox@chaos-at-home.org>
+#
+
+SHORT_NAME="genericwpawireless"
+DESC_NAME="Generic WPA WIRELESS"
+INTERFACE="{{ ws_minet_wireless_interface_name }}"
+MODULE_NAME="{{ ws_minet_wireless_interface_module }}"
+
+. /usr/local/lib/minet/minet_helpers.sh
+
+case "$1" in
+ start|"")
+ echo "Connecting with $DESC_NAME"
+ activate_interface $INTERFACE $MODULE_NAME
+ wpa_supplicant -c/etc/wpa_supplicant.conf -i$INTERFACE -Dnl80211 -B
+ dhclient $INTERFACE -v -pf /var/run/dhclient.$SHORT_NAME.pid
+ ;;
+ stop)
+ echo "Disconnecting from $DESC_NAME"
+ kill `cat /var/run/dhclient.$SHORT_NAME.pid`
+ rm /var/run/dhclient.$SHORT_NAME.pid
+ killall wpa_supplicant
+ deactivate_interface $INTERFACE $MODULE_NAME
+ ;;
+ *)
+ exit 1
+ ;;
+esac
diff --git a/roles/ws/minet/templates/connections/manualWire.j2 b/roles/ws/minet/templates/connections/manualWire.j2
new file mode 100755
index 00000000..837b4f15
--- /dev/null
+++ b/roles/ws/minet/templates/connections/manualWire.j2
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Author: Christian Pointner <equinox@chaos-at-home.org>
+#
+
+SHORT_NAME="manualwire"
+DESC_NAME="manual WIRE"
+INTERFACE="{{ ws_minet_wired_interface_name }}"
+MODULE_NAME="{{ ws_minet_wired_interface_module }}"
+
+. /usr/local/lib/minet/minet_helpers.sh
+
+case "$1" in
+ start|"")
+ echo "Connecting with $DESC_NAME"
+ activate_interface $INTERFACE $MODULE_NAME
+ ;;
+ stop)
+ echo "Disconnecting from $DESC_NAME"
+ deactivate_interface $INTERFACE $MODULE_NAME
+ ;;
+ *)
+ exit 1
+ ;;
+esac
diff --git a/roles/ws/minet/templates/connections/manualWireless.j2 b/roles/ws/minet/templates/connections/manualWireless.j2
new file mode 100755
index 00000000..2f0b6dba
--- /dev/null
+++ b/roles/ws/minet/templates/connections/manualWireless.j2
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Author: Christian Pointner <equinox@chaos-at-home.org>
+#
+
+SHORT_NAME="manualwireless"
+DESC_NAME="manual WIRELESS"
+INTERFACE="{{ ws_minet_wireless_interface_name }}"
+MODULE_NAME="{{ ws_minet_wireless_interface_module }}"
+
+. /usr/local/lib/minet/minet_helpers.sh
+
+case "$1" in
+ start|"")
+ echo "Connecting with $DESC_NAME"
+ activate_interface $INTERFACE $MODULE_NAME
+ ;;
+ stop)
+ echo "Disconnecting from $DESC_NAME"
+ deactivate_interface $INTERFACE $MODULE_NAME
+ ;;
+ *)
+ exit 1
+ ;;
+esac
diff --git a/roles/ws/minet/templates/connections/wifiScan.j2 b/roles/ws/minet/templates/connections/wifiScan.j2
new file mode 100755
index 00000000..81580b63
--- /dev/null
+++ b/roles/ws/minet/templates/connections/wifiScan.j2
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Author: Christian Pointner <equinox@chaos-at-home.org>
+#
+
+SHORT_NAME="wifiScan"
+DESC_NAME="do a Wifi Scan"
+INTERFACE="{{ ws_minet_wireless_interface_name }}"
+MODULE_NAME="{{ ws_minet_wireless_interface_module }}"
+
+. /usr/local/lib/minet/minet_helpers.sh
+
+case "$1" in
+ start|"")
+ echo "$DESC_NAME"
+ activate_interface $INTERFACE $MODULE_NAME
+ iwlist $INTERFACE scanning | grep -B 5 ESSID
+ deactivate_interface $INTERFACE $MODULE_NAME
+ ;;
+ stop)
+ ;;
+ *)
+ exit 1
+ ;;
+esac