diff --git a/lib/common b/lib/common index 868a5f6..31d348e 100644 --- a/lib/common +++ b/lib/common @@ -95,6 +95,17 @@ lowercase () { tr "[:upper:]" "[:lower:]" } +# Convierte llaves públicas en MAC +public_key_to_mac () { + grep -E "^[A-Za-z0-9/+=]+$" \ + | base64 -d \ + | sha256sum \ + | cut -d " " -f 1 \ + | cut -b 1-12 \ + | sed -re "s/../&:/g" \ + | cut -d : -f 1-6 +} + # Limpia el hostname # @see tincd.conf(5) get_node_name() { diff --git a/lib/exec/install b/lib/exec/install index 1719ae7..e56fcdc 100755 --- a/lib/exec/install +++ b/lib/exec/install @@ -44,6 +44,12 @@ nodedir="$(get_node_dir "${1}")" # Crear el directorio de scripts mkdir -p "${nodedir}/scripts" +# Setear la MAC si no existía ya +if ! test -f "${nodedir}/mac"; then + msg "Estableciendo MAC" + get_node_file "${1}" | xargs cat | public_key_to_mac > "${nodedir}/mac" +fi + msg "Instalando en el sistema..." ${sudo} mkdir -p "${TINC}" ${sudo} rsync -a --no-owner \ diff --git a/skel/scripts/ula-hosts b/skel/scripts/ula-hosts index 52b49f7..6edb779 100755 --- a/skel/scripts/ula-hosts +++ b/skel/scripts/ula-hosts @@ -1,8 +1,9 @@ -#!/bin/bash +#!/bin/sh set -euo pipefail IFS=$'\n\t' -ULA_PREFIX="fd00:1312:acab::" +ULA_PREFIX="fd00:acab" +ULA_SUBNET="/32" ETCHOSTS="/etc/hosts" # Added at the end of each line in the hosts file. COMMENT="# Managed by tinc ${NETNAME}" @@ -16,20 +17,22 @@ function mac_to_address () { case $2 in subnet) - IP="${ULA_PREFIX}$(mac_to_address "${SUBNET}")" + _mac="$(mac_to_address "${SUBNET}")" + IP="${ULA_PREFIX}::${_mac}" + if test "${ULA_SUBNET}" = "/32"; then + case $1 in + up) ip -6 route add "${ULA_PREFIX}:${_mac}::/80" via "${IP}" dev "${INTERFACE}" ;; + down) ip -6 route del "${ULA_PREFIX}:${_mac}::/80" via "${IP}" dev "${INTERFACE}" ;; + esac + fi ;; tinc) MAC="$(cat "/sys/class/net/${INTERFACE}/address")" - IP="${ULA_PREFIX}$(mac_to_address "${MAC}")" + IP="${ULA_PREFIX}::$(mac_to_address "${MAC}")" case $1 in - up) - ip address add "${IP}/64" dev "${INTERFACE}" - ;; - down) - sed -re "/${COMMENT}$/d" -i "${ETCHOSTS}" - ;; - esac - ;; + up) ip address add "${IP}${ULA_SUBNET}" dev "${INTERFACE}" ;; + down) sed -re "/${COMMENT}$/d" -i "${ETCHOSTS}" ;; + esac ;; esac test -z "${NODE}" && exit diff --git a/skel/tinc-up b/skel/tinc-up index 5ab7c98..ec2f676 100755 --- a/skel/tinc-up +++ b/skel/tinc-up @@ -1,6 +1,8 @@ #!/bin/sh +cd `dirname "$0"` + +ip link set dev ${INTERFACE} address `cat mac` ip link set ${INTERFACE} up -cd `dirname "$0"` . ./run-script