Add facts script for Sat>IP
This commit is contained in:
parent
6094471c3d
commit
d3e40de05d
102
Manual.org
102
Manual.org
@ -16,7 +16,7 @@ This Manual is written in org-mode for Emacs and can rewrite the complete ansibl
|
|||||||
|
|
||||||
* Playbooks
|
* Playbooks
|
||||||
** yavdr07.yml
|
** yavdr07.yml
|
||||||
To set up a fully-featured yaVDR installation you can use the ~yavdr07.yml~ Playbook:
|
The ~yavdr07.yml~ playbook sets up a fully-featured yaVDR installation:
|
||||||
#+BEGIN_SRC yaml :tangle yavdr07.yml :mkdirp yes
|
#+BEGIN_SRC yaml :tangle yavdr07.yml :mkdirp yes
|
||||||
---
|
---
|
||||||
# file: yavdr07.yml
|
# file: yavdr07.yml
|
||||||
@ -66,10 +66,10 @@ For a headless server installation ~yavdr07-headless.yml~ is a good choice
|
|||||||
* Hosts
|
* Hosts
|
||||||
This playbook can either be used to run the installation on the localhost or any other PC in the network that can be accessed via ssh. Simply add the host names or IP addresses to the hosts file in the respective section:
|
This playbook can either be used to run the installation on the localhost or any other PC in the network that can be accessed via ssh. Simply add the host names or IP addresses to the hosts file in the respective section:
|
||||||
|
|
||||||
#+BEGIN_SRC conf :tangle hosts :mkdirp yes
|
#+BEGIN_SRC conf :tangle localhost_inventory :mkdirp yes
|
||||||
[yavdr-full]
|
[yavdr-full]
|
||||||
#localhost connection=local
|
localhost connection=local
|
||||||
192.168.1.116
|
#192.168.1.116
|
||||||
|
|
||||||
[yavdr-headless]
|
[yavdr-headless]
|
||||||
|
|
||||||
@ -142,14 +142,15 @@ system:
|
|||||||
** yavdr-common
|
** yavdr-common
|
||||||
This role is used to set up a basic yaVDR installation. It creates the directories, installs the vdr and other useful packages.
|
This role is used to set up a basic yaVDR installation. It creates the directories, installs the vdr and other useful packages.
|
||||||
*** default variables
|
*** default variables
|
||||||
Several variables can be set to customize the configuration.
|
This section is for reference only, please use the files in ~global_vars~ for customizations.
|
||||||
|
#+BEGIN_SRC yaml :tangle roles/yavdr-common/defaults/main.yml :mkdirp yes
|
||||||
|
---
|
||||||
|
# file: roles/yavdr-common/defaults/main.yml
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
**** Repositories
|
**** Repositories
|
||||||
You can set a list of package repositories which provide the necessary packages. Feel free to use own PPAs if you need special customization to the VDR and it's plugins.
|
You can set a list of package repositories which provide the necessary packages. Feel free to use own PPAs if you need special customization to the VDR and it's plugins.
|
||||||
#+BEGIN_SRC yaml :tangle roles/yavdr-common/defaults/main.yml :mkdirp yes
|
#+BEGIN_SRC yaml :tangle roles/yavdr-common/defaults/main.yml :mkdirp yes
|
||||||
---
|
|
||||||
# file: roles/yavdr-common/defaults/main.yml
|
|
||||||
|
|
||||||
branch: unstable
|
branch: unstable
|
||||||
repositories:
|
repositories:
|
||||||
- 'ppa:yavdr/main'
|
- 'ppa:yavdr/main'
|
||||||
@ -206,7 +207,7 @@ yavdr-common executes the following tasks:
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
***** Disable default installation of recommended packages
|
***** Disable default installation of recommended packages
|
||||||
|
|
||||||
This configuration file prevents apt to automatically install all recommended dependencies when installing packages:
|
This task prevents apt to automatically install all recommended dependencies for packages:
|
||||||
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes
|
#+BEGIN_SRC yaml :tangle roles/yavdr-common/tasks/main.yml :mkdirp yes
|
||||||
- name: apt | prevent automatic installation of recommended packages
|
- name: apt | prevent automatic installation of recommended packages
|
||||||
template:
|
template:
|
||||||
@ -272,9 +273,92 @@ yavdr-common executes the following tasks:
|
|||||||
dest: /etc/ansible/facts.d/hardware.facts
|
dest: /etc/ansible/facts.d/hardware.facts
|
||||||
mode: '0775'
|
mode: '0775'
|
||||||
|
|
||||||
|
- name: copy facts script for Sat>IP server detection
|
||||||
|
copy:
|
||||||
|
src: files/satip.facts.py
|
||||||
|
dest: /etc/ansible/facts.d/satip.facts
|
||||||
|
mode: '0775'
|
||||||
|
|
||||||
- name: reload ansible local facts
|
- name: reload ansible local facts
|
||||||
setup: filter=ansible_local
|
setup: filter=ansible_local
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
*** files:
|
||||||
|
#+BEGIN_SRC python :tangle roles/yavdr-common/files/hardware.facts.py :mkdirp yes
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# This script returns a list of Vendor- and Product-IDs for all connected usb
|
||||||
|
# and pci(e) devices in json format
|
||||||
|
import glob
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import usb.core
|
||||||
|
from collections import namedtuple
|
||||||
|
|
||||||
|
|
||||||
|
Device = namedtuple("Device", ['idVendor', 'idProduct'])
|
||||||
|
|
||||||
|
def get_pci_devices():
|
||||||
|
for device in glob.glob('/sys/devices/pci*/*:*:*/'):
|
||||||
|
with open(os.path.join(device, 'device')) as d:
|
||||||
|
product_id = int(d.read().strip(), 16)
|
||||||
|
with open(os.path.join(device, 'vendor')) as d:
|
||||||
|
vendor_id = int(d.read().strip(), 16)
|
||||||
|
yield Device(idVendor=vendor_id, idProduct=product_id)
|
||||||
|
|
||||||
|
def format_device_list(iterator):
|
||||||
|
return ["{:04x}:{:04x}".format(d.idVendor, d.idProduct) for d in iterator]
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
usb_devices = format_device_list(usb.core.find(find_all=True))
|
||||||
|
pci_devices = format_device_list(get_pci_devices())
|
||||||
|
print(json.dumps({'usb': usb_devices, 'pci': pci_devices}))
|
||||||
|
#+END_SRC
|
||||||
|
#+BEGIN_SRC python :tangle roles/yavdr-common/files/satip.facts.py :mkdirp yes
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# This script sends a multicast message and awaits responses by Sat>IP servers.
|
||||||
|
# returns the boolean variable 'satip_detected' as json
|
||||||
|
import json
|
||||||
|
import socket
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
|
SSDP_ADDR = "239.255.255.250"
|
||||||
|
SSDP_PORT = 1900
|
||||||
|
# SSDP_MX = max delay for server response
|
||||||
|
# a value of 2s is recommended by the SAT>IP specification 1.2.2
|
||||||
|
SSDP_MX = 2
|
||||||
|
SSDP_ST = "urn:ses-com:device:SatIPServer:1"
|
||||||
|
|
||||||
|
ssdpRequest = "\r\n".join((
|
||||||
|
"M-SEARCH * HTTP/1.1",
|
||||||
|
"HOST: %s:%d" % (SSDP_ADDR, SSDP_PORT),
|
||||||
|
"MAN: \"ssdp:discover\"",
|
||||||
|
"MX: %d" % (SSDP_MX),
|
||||||
|
"ST: %s" % (SSDP_ST),
|
||||||
|
"\r\n"))
|
||||||
|
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
# according to Sat>IP Specification 1.2.2, p. 20
|
||||||
|
# a client should send three requests within 100 ms with a ttl of 2
|
||||||
|
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
|
||||||
|
sock.settimeout(SSDP_MX + 0.5)
|
||||||
|
for _ in range(3):
|
||||||
|
sock.sendto(ssdpRequest.encode('ascii'), (SSDP_ADDR, SSDP_PORT))
|
||||||
|
time.sleep(0.03)
|
||||||
|
try:
|
||||||
|
response = sock.recv(1000).decode()
|
||||||
|
if response and "SERVER:" in response:
|
||||||
|
got_response = True
|
||||||
|
else:
|
||||||
|
raise ValueError('No satip server detected')
|
||||||
|
except (socket.timeout, ValueError):
|
||||||
|
got_response = False
|
||||||
|
finally:
|
||||||
|
print(json.dumps(
|
||||||
|
{'satip_detected': got_response}
|
||||||
|
))
|
||||||
|
#+END_SRC
|
||||||
*** templates
|
*** templates
|
||||||
#+BEGIN_SRC shell :tangle roles/yavdr-common/templates/90-norecommends.j2 :mkdirp yes
|
#+BEGIN_SRC shell :tangle roles/yavdr-common/templates/90-norecommends.j2 :mkdirp yes
|
||||||
// {{ ansible_managed_file }}
|
// {{ ansible_managed_file }}
|
||||||
|
0
roles/yavdr-common/files/hardware.facts.py
Executable file → Normal file
0
roles/yavdr-common/files/hardware.facts.py
Executable file → Normal file
@ -57,5 +57,11 @@
|
|||||||
dest: /etc/ansible/facts.d/hardware.facts
|
dest: /etc/ansible/facts.d/hardware.facts
|
||||||
mode: '0775'
|
mode: '0775'
|
||||||
|
|
||||||
|
- name: copy facts script for Sat>IP server detection
|
||||||
|
copy:
|
||||||
|
src: files/satip.facts.py
|
||||||
|
dest: /etc/ansible/facts.d/satip.facts
|
||||||
|
mode: '0775'
|
||||||
|
|
||||||
- name: reload ansible local facts
|
- name: reload ansible local facts
|
||||||
setup: filter=ansible_local
|
setup: filter=ansible_local
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#- yavdr-xorg
|
#- yavdr-xorg
|
||||||
- openbox
|
- openbox
|
||||||
|
|
||||||
# TODO: move to yavdr-xorg package?
|
|
||||||
- name: create folders for user session
|
- name: create folders for user session
|
||||||
file:
|
file:
|
||||||
state: directory
|
state: directory
|
||||||
@ -39,7 +38,7 @@
|
|||||||
dest: /etc/systemd/system/vdr.service.d/
|
dest: /etc/systemd/system/vdr.service.d/
|
||||||
### END TODO ###
|
### END TODO ###
|
||||||
|
|
||||||
- name: set up .xinitrc for vdr user
|
- name: create .xinitrc for vdr user
|
||||||
template:
|
template:
|
||||||
src: 'templates/.xinitrc.j2'
|
src: 'templates/.xinitrc.j2'
|
||||||
dest: '/var/lib/vdr/.xinitrc'
|
dest: '/var/lib/vdr/.xinitrc'
|
||||||
@ -47,7 +46,7 @@
|
|||||||
owner: '{{ vdr.user }}'
|
owner: '{{ vdr.user }}'
|
||||||
group: '{{ vdr.group }}'
|
group: '{{ vdr.group }}'
|
||||||
|
|
||||||
- name: set up autostart for openbox
|
- name: populate autostart for openbox
|
||||||
template:
|
template:
|
||||||
src: 'templates/autostart.j2'
|
src: 'templates/autostart.j2'
|
||||||
dest: '/var/lib/vdr/.config/openbox/autostart'
|
dest: '/var/lib/vdr/.config/openbox/autostart'
|
||||||
@ -64,7 +63,7 @@
|
|||||||
groups: '{{ vdr.group }}'
|
groups: '{{ vdr.group }}'
|
||||||
append: yes
|
append: yes
|
||||||
|
|
||||||
- name: enable and start xlogin for vdr user
|
- name: enable and start xlogin for the vdr user
|
||||||
systemd:
|
systemd:
|
||||||
daemon_reload: yes
|
daemon_reload: yes
|
||||||
name: 'xlogin@{{ vdr.user }}'
|
name: 'xlogin@{{ vdr.user }}'
|
||||||
|
Loading…
Reference in New Issue
Block a user