A.L.F.R.E.D. - Almighty Lightweight Fact Remote Exchange Daemon

Installation

wget http://ftp.us.debian.org/debian/pool/main/a/alfred/alfred_2018.2-1_amd64.deb
dpkg -i alfred_2018.2-1_amd64.deb
wget http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred-json/alfred-json_0.3.1-0ffmwu1~trusty_amd64.deb
dpkg -i alfred-json_0.3.1-0ffmwu1~trusty_amd64.deb

TODO: batadv-vis.service / alfred.service TODO: default alfred

A.L.F.R.E.D. Announce

Folgende Pakete werden für die Installation benötigt.

apt install python3 python3-dev python-virtualenv

Script aus dem Repository laden.

mkdir -p /root/scripts/announce
cd /root/scripts/announce
git clone https://github.com/freifunk-herford/ffnord-alfred-announce.git

Die Datei /root/scripts/announce/requirement.txt mit folgendem Inhalt anlegen.

netifaces
py-cpuinfo

Einrichten der virtuellen Umgebung für das Script.

cd /root/scripts/announce
virtualenv venv -p python3
source venv/bin/activate
pip install --upgrade pip -r requirements.txt

Nun erstellen wir in /root/scripts ein Script mit dem Namen alfred-announce.sh mit dem folgenden Inhalt.

#!/usr/bin/env bash
# Copyright 2016 - 2016 Tobias Benzin tbenzin@digital-nerv.net
#                       Rally Vincent rvincent@digital-nerv.net

# This file is managed by Salt, do not edit.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash

base="/root/scripts/announce"

${base}/venv3/bin/python ${base}/ffnord-alfred-announce/announce.py \
-d /root/scripts/announce/ffnord-alfred-announce/nodeinfo.d/ \
-i {{ bridge }} -b {{ batman }} -f {{ mesh }} -s {{ sitecode }} | gzip | \
alfred -u {{ socket }} -i {{ bridge }} -b {{ batman }} -s 158

${base}/venv3/bin/python ${base}/ffnord-alfred-announce/announce.py \
-d /root/scripts/announce/ffnord-alfred-announce/statistics.d/ \
-i {{ bridge }} -b {{ batman }} -f {{ mesh }} -s {{ sitecode }} | gzip | \
alfred -u {{ socket }} -i {{ bridge }} -b {{ batman }} -s 159

Vorsicht

Nicht vergessen das Script mit chmod +x alfred-announce.sh ausführbar zu machen!

Jetzt legen wir einen Cronjob an der das Script jede Minute startet.

crontab -e

Folgendes fügen wir in den nun ein.

*/1 * * * * /root/scripts/alfred-announce.sh

Konfiguation

# This file is managed by Salt, do not edit.

#
# /etc/default/alfred
#

# Additional command line options
DAEMON_ARGS="{{ args }}"

# Interface for A.L.F.R.E.D. to listen on. Has to be specified.
INTERFACE="{{ interface }}"

# Specify the batman-adv interface configured on the system (default: bat0).
# Use 'none' to disable the batman-adv based best server selection.
BATMANIF="{{ batmanif }}"

# Specify the unix socket to use. It is possible to run multiple alfred daemons.
# For this to work the unix socket has to be distinct, also.
UNIX_SOCKET="{{ socket }}"

Salt State File

alfred.sls

# A.L.F.R.E.D. - Almighty Lightweight Fact Remote Exchange Daemon

#  'Debian': {'pkgs': ['alfred', 'alfred-json', 'batadv-vis']}

{% set alfred = salt['grains.filter_by']({
  'Debian': {'pkgs': ['alfred', 'alfred-json', 'libgps23']}
}, default='Debian') %}

{% if pillar['network']['mesh']['hwaddress'] is defined %}

{% if grains['os'] == 'Ubuntu' and grains['osrelease'] == '14.04' %}
alfred:
  pkg.installed:
    - pkgs:
        {% for pkg in alfred.pkgs %}
        - {{ pkg }}
        {% endfor %}
    - refresh: True
    - install_recommends: False
    # - require:
    #   - sls: gateway.batman
    #   - sls: gateway.fastd
{% elif grains['os'] == 'Ubuntu' and grains['osrelease'] == '16.04' %}
alfred:
  pkg.installed:
    - sources:
      - alfred: http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred/alfred_2017.1-0ffmwu0~trusty_amd64.deb
      #- alfred: http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred/alfred_2017.0-0ffmwu2~trusty_amd64.deb
      #- batadv-vis: http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred/batadv-vis_2017.0-0ffmwu2~trusty_amd64.deb

batadv-vis:
  pkg.installed:
    - sources:
      - batadv-vis: http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred/batadv-vis_2017.1-0ffmwu0~trusty_amd64.deb

alfred-json:
  pkg.installed:
    - sources:
      - alfred-json: http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred-json/alfred-json_0.3.1-0ffmwu1~trusty_amd64.deb
{% elif grains['os'] == 'Ubuntu' and grains['osrelease'] == '18.04' %}
alfred:
  pkg.installed:
    - sources:
      - alfred: http://ftp.us.debian.org/debian/pool/main/a/alfred/alfred_2018.2-1_amd64.deb
      #- alfred: http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred/alfred_2017.1-0ffmwu0~trusty_amd64.deb
      #- batadv-vis: http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred/batadv-vis_2017.1-0ffmwu0~trusty_amd64.deb

alfred-json:
  pkg.installed:
    - sources:
      - alfred-json: http://ppa.launchpad.net/freifunk-mwu/freifunk-ppa/ubuntu/pool/main/a/alfred-json/alfred-json_0.3.1-0ffmwu1~trusty_amd64.deb
{% endif %}

alfred-group:
  group.present:
    - name: alfred

{% if grains['os_family'] == 'Debian' and grains['init'] == 'systemd' %}
/etc/systemd/system/batadv-vis.service:
  file.managed:
    - name: /etc/systemd/system/batadv-vis.service
    - source: salt://gateway/etc/systemd/system/batadv-vis.service
    - unless: test -f /lib/systemd/system/batadv-vis.service
    - user: root
    - group: root
    - mode: 644
  cmd.run:
    - name: systemctl daemon-reload
    - onchanges:
      - file: /etc/systemd/system/batadv-vis.service
{% endif %}

{% if grains['os_family'] == 'Debian' and grains['init'] == 'systemd' %}
/etc/systemd/system/alfred.service:
  file.managed:
    - name: /etc/systemd/system/alfred.service
    - source: salt://gateway/etc/systemd/system/alfred.service
    - unless: test -f /lib/systemd/system/alfred.service
    - user: root
    - group: root
    - mode: 644
  cmd.run:
    - name: systemctl daemon-reload
    - onchanges:
      - file: /etc/systemd/system/alfred.service
{% endif %}

/etc/default/alfred:
  file.managed:
    - name: /etc/default/alfred
    - source: salt://gateway/etc/default/alfred
    - user: root
    - group: root
    - mode: 644
    - template: jinja
    - defaults:
        interface: {{ pillar['network']['bridge']['interface'] }}
        batmanif: {{ pillar['network']['batman']['interface'] }}
        socket: {{ pillar['alfred']['socket'] }}
        args: ''
    {% if pillar['alfred'].get('master') %}
    - context:
        args: '-m'
    {% endif %}

batadv-vis.service:
  service.running:
    - name: batadv-vis
    - enable: True
    - init_delay: 30
    # - watch:
    #   {% if grains['os_family'] == 'Debian' and grains['init'] == 'systemd' %}
    #   - file: /etc/systemd/system/batadv-vis.service
    #   {% endif %}
    #   - file: /etc/default/alfred
    - require:
      {% if grains['os_family'] == 'Debian' and grains['init'] == 'systemd' %}
      - file: /etc/systemd/system/batadv-vis.service
      {% endif %}
      - file: /etc/default/alfred
      - pkg: alfred

alfred.service:
  service.running:
    - name: alfred
    - enable: True
    - init_delay: 10
    # - watch:
    #   {% if grains['os_family'] == 'Debian' and grains['init'] == 'systemd' %}
    #   - file: /etc/systemd/system/alfred.service
    #   {% endif %}
    #   - file: /etc/default/alfred
    #   # - sls: gateway.fastd
    - require:
      {% if grains['os_family'] == 'Debian' and grains['init'] == 'systemd' %}
      - file: /etc/systemd/system/alfred.service
      {% endif %}
      - file: /etc/default/alfred
      - pkg: alfred
      # - sls: gateway.fastd

/root/scripts/check-alfred.sh:
  file.managed:
    - name: /root/scripts/check-alfred.sh
    - source: salt://gateway/root/scripts/check-alfred.sh
    - makedirs: True
    - user: root
    - group: root
    - mode: 755

check-alfred-cron:
  cron.present:
    - name: /root/scripts/check-alfred.sh
    - identifier: check-alfred
    - user: root
    - minute: '*/5'
    - comment: 'Check if A.L.F.R.E.D. is running every 5 Minutes'
    - require:
      - file: /root/scripts/check-alfred.sh

{% if pillar['alfred']['announce'] %}
alfred-announce-prepare:
  pkg.installed:
    - pkgs:
        {% if grains['os_family'] == 'Debian' %}
        - ethtool
        {% if grains['os'] == 'Ubuntu' and grains['osrelease'] == '16.04' %}
        - virtualenv
        {% endif %}
        {% if grains['os'] == 'Ubuntu' and grains['osrelease'] == '18.04' %}
        - virtualenv
        {% endif %}
        - python3
        - python3-dev
        - python-virtualenv
        {% endif %}
  file.managed:
    - name: /root/scripts/announce/requirements.txt
    - source: salt://gateway/root/scripts/announce/requirements.txt
    - makedirs: True

alfred-announce-venv:
  virtualenv.managed:
    - python: python3
    - cwd: /root/scripts/announce
    - name: /root/scripts/announce/venv3
    - requirements: /root/scripts/announce/requirements.txt
    - pip_upgrade: True
    - require:
      - pkg: alfred-announce-prepare
      - file: alfred-announce-prepare

ffnord-alfred-announce:
  git.latest:
    - name: https://github.com/freifunk-herford/ffnord-alfred-announce.git
#   - name: https://github.com/freifunk-mwu/ffnord-alfred-announce.git
    - target: /root/scripts/announce/ffnord-alfred-announce
    - unless: test -d /root/scripts/announce/ffnord-alfred-announce
    - require:
      - file: alfred-announce-prepare

alfred-announce-cron:
  cron.present:
    - name: /root/scripts/alfred-announce.sh
    - identifier: alfred-announce
    - user: root
    - minute: '*/1'
    - comment: 'A.L.F.R.E.D. Announce every Minute'
    - require:
      - file: /root/scripts/alfred-announce.sh

/root/scripts/announce/alfred-announce.sh:
  file.managed:
    - name: /root/scripts/alfred-announce.sh
    - source: salt://gateway/root/scripts/alfred-announce.sh
    - makedirs: True
    - user: root
    - group: root
    - mode: 755
    - template: jinja
    - defaults:
        bridge: {{ pillar['network']['bridge']['interface'] }}
        batman: {{ pillar['network']['batman']['interface'] }}
        mesh: {{ pillar['network']['mesh']['interface'] }}
        socket: {{ pillar['alfred']['socket'] }}
        sitecode: {{ pillar['alfred']['sitecode'] }}
{% endif %}

{% else %}

/root/scripts/alfred-collect,py:
  file.managed:
    - name: /root/scripts/alfred-collect.py
    - source: salt://gateway/root/scripts/alfred-collect.py
    - makedirs: True
    - user: root
    - group: root

alfred-collect-cron:
  cron.present:
    - name: /usr/bin/python /root/scripts/alfred-collect.py -l /var/lib/dhcp/dhcpd.leases -o /var/www/vnstat/node.json
    - identifier: alfred-collect
    - user: root
    - minute: '*/1'
    - comment: 'A.L.F.R.E.D. Emulator provides hardware info and dhcp clients as nodes'
    - require:
      - file: /root/scripts/alfred-collect.py

{% endif %}