yavdr-ansible/Manual.html

2351 lines
136 KiB
HTML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<!-- 2017-03-26 So 13:57 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title></title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Alexander Grothe" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/readtheorg.css"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script>
<script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2013 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
</head>
<body>
<div id="content">
<div id="table-of-contents">
<h2>Inhaltsverzeichnis</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#orgef3742c">1. Installing and configuring yaVDR with Ansible</a>
<ul>
<li><a href="#org504ffcf">1.1. Install script for local usage</a></li>
</ul>
</li>
<li><a href="#org99d5945">2. Playbooks</a>
<ul>
<li><a href="#org2c616f8">2.1. yavdr07.yml</a></li>
<li><a href="#org16aa0fa">2.2. yavdr07-headless.yml</a></li>
</ul>
</li>
<li><a href="#org871d180">3. Hosts</a></li>
<li><a href="#org7ed0399">4. Group Variables</a>
<ul>
<li><a href="#org10efc86">4.1. default text for templates</a></li>
<li><a href="#orgb07f915">4.2. PPAs</a></li>
<li><a href="#org935ef40">4.3. VDR user, directories, special configuration and plugins</a></li>
<li><a href="#org5e03fd9">4.4. Media directories</a></li>
<li><a href="#orgcb38958">4.5. NFS</a></li>
<li><a href="#orgcb21af0">4.6. Samba</a></li>
<li><a href="#org029790a">4.7. Additional packages</a></li>
<li><a href="#org4b13441">4.8. System pre-configuration</a></li>
</ul>
</li>
<li><a href="#org2da2234">5. Roles</a>
<ul>
<li><a href="#orgc8e1547">5.1. yavdr-common</a>
<ul>
<li><a href="#orgff24c64">5.1.1. default variables</a></li>
<li><a href="#org52abf93">5.1.2. tasks</a></li>
<li><a href="#orga9f36c2">5.1.3. templates</a></li>
</ul>
</li>
<li><a href="#org17ed954">5.2. vdr</a>
<ul>
<li><a href="#org20c2aae">5.2.1. tasks</a></li>
</ul>
</li>
<li><a href="#org5822543">5.3. <span class="todo STARTED">STARTED</span> yavdr-network</a>
<ul>
<li><a href="#orgc10f966">5.3.1. default variables</a></li>
<li><a href="#org6e3c8e3">5.3.2. tasks</a></li>
</ul>
</li>
<li><a href="#org7c8a404">5.4. <span class="todo STARTED">STARTED</span> nfs-server</a>
<ul>
<li><a href="#orgeaa2325">5.4.1. tasks</a></li>
</ul>
</li>
<li><a href="#org6991e57">5.5. <span class="todo TODO">TODO</span> yavdr-remote</a>
<ul>
<li><a href="#org27d14bf">5.5.1. default variables</a></li>
<li><a href="#org6cb9ea2">5.5.2. tasks</a></li>
<li><a href="#org2afee90">5.5.3. templates</a></li>
<li><a href="#org10fa18c">5.5.4. files</a></li>
</ul>
</li>
<li><a href="#org3fff7f1">5.6. <span class="todo TODO">TODO</span> automatic X-server configuration</a>
<ul>
<li><a href="#org81b903c">5.6.1. templates</a></li>
<li><a href="#orgfeaa752">5.6.2. files</a></li>
</ul>
</li>
<li><a href="#org8ab7fa7">5.7. yavdr-xorg</a>
<ul>
<li><a href="#orgea9a5a9">5.7.1. default variables</a></li>
<li><a href="#org7234b90">5.7.2. tasks</a></li>
<li><a href="#orga43e203">5.7.3. templates</a></li>
</ul>
</li>
<li><a href="#orgb20f3b3">5.8. display-data</a>
<ul>
<li><a href="#orgeef219e">5.8.1. tasks</a></li>
</ul>
</li>
<li><a href="#orgc9f7a91">5.9. nfs-server</a>
<ul>
<li><a href="#orgf3d226c">5.9.1. tasks</a></li>
<li><a href="#org3521ae3">5.9.2. templates</a></li>
</ul>
</li>
<li><a href="#org962b651">5.10. nfs-config</a></li>
<li><a href="#org7cefc91">5.11. samba-install</a>
<ul>
<li><a href="#orgf1458e9">5.11.1. tasks</a></li>
</ul>
</li>
<li><a href="#org42be2ab">5.12. samba-config</a>
<ul>
<li><a href="#org3ccb11e">5.12.1. tasks</a></li>
<li><a href="#orgbc0186c">5.12.2. templates</a></li>
</ul>
</li>
<li><a href="#org4e24ff7">5.13. <span class="todo TODO">TODO</span> autoinstall-drivers</a>
<ul>
<li><a href="#orgf2d796c">5.13.1. sundtek for Sundtek devices (local or network connection)</a></li>
<li><a href="#org414bd6a">5.13.2. dddvb-dkms if only newer DD cards are detected</a></li>
<li><a href="#org5f58e3c">5.13.3. media-build-experimental (up to kernel 4.8) for &bdquo;old&ldquo; cards like TT S2-6400 FF</a></li>
<li><a href="#orgf3c120d">5.13.4. newly merged DD drivers</a></li>
</ul>
</li>
<li><a href="#org448e5ca">5.14. autoinstall-satip</a>
<ul>
<li><a href="#org1684582">5.14.1. tasks</a></li>
</ul>
</li>
<li><a href="#org9d8b400">5.15. autoinstall-targavfd</a>
<ul>
<li><a href="#org512bee9">5.15.1. tasks</a></li>
</ul>
</li>
<li><a href="#orgd509224">5.16. autoinstall-imonlcd</a>
<ul>
<li><a href="#orge331b9b">5.16.1. tasks</a></li>
</ul>
</li>
<li><a href="#org6eb82a4">5.17. autoinstall-libcecdaemon</a>
<ul>
<li><a href="#org032fe88">5.17.1. tasks</a></li>
</ul>
</li>
<li><a href="#org0b99b8d">5.18. autoinstall-pvr350</a>
<ul>
<li><a href="#org72111b0">5.18.1. tasks</a></li>
</ul>
</li>
<li><a href="#org49e76bb">5.19. <span class="todo TODO">TODO</span> autoinstall-dvbhddevice</a>
<ul>
<li><a href="#org9c3c18c">5.19.1. tasks</a></li>
</ul>
</li>
<li><a href="#org91c5ed4">5.20. autoinstall-dvbsddevice</a>
<ul>
<li><a href="#orgda1b34d">5.20.1. tasks</a></li>
</ul>
</li>
<li><a href="#orgc2bac50">5.21. template-test</a></li>
<li><a href="#orgb878e3f">5.22. grub-config</a>
<ul>
<li><a href="#org2f0fb6a">5.22.1. default variables</a></li>
<li><a href="#orgd217a89">5.22.2. tasks</a></li>
<li><a href="#orge4c1eeb">5.22.3. templates</a></li>
<li><a href="#orgc458ac7">5.22.4. handlers</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org26f1d87">6. Modules</a>
<ul>
<li><a href="#org3587f1d">6.1. hardware_facts.py</a></li>
<li><a href="#org7dfc340">6.2. satip_facts.py</a></li>
<li><a href="#org97a4be6">6.3. xorg_facts.py</a></li>
</ul>
</li>
<li><a href="#orgf65c01e">7. Handlers</a></li>
</ul>
</div>
</div>
<div id="outline-container-orgef3742c" class="outline-2">
<h2 id="orgef3742c"><span class="section-number-2">1</span> Installing and configuring yaVDR with Ansible</h2>
<div class="outline-text-2" id="text-1">
<p>
This is an experimental feature which allows to set up a yaVDR installation based on a normal Ubuntu Server 16.04.x installation using <a href="http://ansible.com">Ansible</a>.
</p>
<p>
This Manual is written in org-mode for Emacs and can rewrite the complete ansible configuration if you call <code>org-babel-tangle</code> from within emacs.
</p>
<p>
To use this playbook on a Ubuntu Server Installation you need to run the following commands:
</p>
<div class="org-src-container">
<pre class="src src-shell">sudo apt-get install git
git clone https://github.com/yavdr/yavdr-ansible.git
<span style="color: #006FE0;">cd</span> yavdr-ansible
sudo ./install-yavdr.sh
</pre>
</div>
</div>
<div id="outline-container-org504ffcf" class="outline-3">
<h3 id="org504ffcf"><span class="section-number-3">1.1</span> Install script for local usage</h3>
<div class="outline-text-3" id="text-1-1">
<div class="org-src-container">
<pre class="src src-shell"><span style="color: #0000FF;">if</span> (( $<span style="color: #BA36A5;">EUID</span> != 0 )); <span style="color: #0000FF;">then</span>
<span style="color: #006FE0;">echo</span> <span style="color: #008000;">"This script must be run using sudo or as root"</span>
<span style="color: #0000FF;">exit</span>
<span style="color: #0000FF;">fi</span>
apt-get -y install software-properties-common
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Add repository for ansible</span>
add-apt-repository -y ppa:ansible/ansible
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">update packages</span>
apt-get update
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">install required packages</span>
apt-get -y install ansible
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">TODO: run ansible on local host</span>
ansible-playbook yavdr07.yml -b -i <span style="color: #008000;">'localhost_inventory'</span> --connection=local
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org99d5945" class="outline-2">
<h2 id="org99d5945"><span class="section-number-2">2</span> Playbooks</h2>
<div class="outline-text-2" id="text-2">
</div><div id="outline-container-org2c616f8" class="outline-3">
<h3 id="org2c616f8"><span class="section-number-3">2.1</span> yavdr07.yml</h3>
<div class="outline-text-3" id="text-2-1">
<p>
The <code>yavdr07.yml</code> playbook sets up a fully-featured yaVDR installation:
</p>
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: yavdr07.yml</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">this playbook sets up a complete yaVDR 0.7 installation</span>
- <span style="color: #BA36A5;">name</span>: set up yaVDR
<span style="color: #BA36A5;">hosts</span>: all
<span style="color: #BA36A5;">become</span>: <span style="color: #D0372D;">true</span>
<span style="color: #BA36A5;">roles</span>:
- yavdr-common <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">install and configure the basic system</span>
- vdr <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">install vdr and related packages</span>
- yavdr-network <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">enable network client capabilities</span>
- samba-install <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">install samba server</span>
- samba-config <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">configure samba server</span>
- nfs-server <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">install nfs server</span>
- yavdr-xorg <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">graphical session</span>
- yavdr-remote <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">remote configuration files, services and scripts</span>
- autoinstall-satip <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">install vdr-plugin-satip if a Sat&gt;IP server has been found</span>
- autoinstall-targavfd <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">install vdr-plugin-targavfd if display is connected</span>
- autoinstall-imonlcd <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">install vdr-plugin-imonlcd if a matchind display is connected</span>
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">- autoinstall-pv350 # install vdr-plugin-pvr350 if a matching card is detected</span>
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">- autoinstall-dvbsddevice # install vdr-plugin-dvbsddevice if a matching card is detected</span>
- grub-config <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">configure grub</span>
<span style="color: #BA36A5;">handlers</span>:
- <span style="color: #BA36A5;">include</span>: handlers/main.yml
</pre>
</div>
</div>
</div>
<div id="outline-container-org16aa0fa" class="outline-3">
<h3 id="org16aa0fa"><span class="section-number-3">2.2</span> yavdr07-headless.yml</h3>
<div class="outline-text-3" id="text-2-2">
<p>
For a headless server installation <code>yavdr07-headless.yml</code> is a good choice
</p>
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: yavdr07-headless.yml</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">this playbook set up a headless yaVDR 0.7 installation</span>
- <span style="color: #BA36A5;">name</span>: set up a headless yaVDR server
<span style="color: #BA36A5;">hosts</span>: all
<span style="color: #BA36A5;">become</span>: <span style="color: #D0372D;">true</span>
<span style="color: #BA36A5;">roles</span>:
- yavdr-common
- vdr
- yavdr-network
- samba-server
- samba-config
- nfs-server
- grub-config
- autoinstall-satip
<span style="color: #BA36A5;">handlers</span>:
- <span style="color: #BA36A5;">include</span>: handlers/main.yml
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org871d180" class="outline-2">
<h2 id="org871d180"><span class="section-number-2">3</span> Hosts</h2>
<div class="outline-text-2" id="text-3">
<p>
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:
</p>
<div class="org-src-container">
<pre class="src src-conf">[<span style="color: #6434A3;">localhost</span>]
<span style="color: #BA36A5;">localhost connection</span>=local
</pre>
</div>
</div>
</div>
<div id="outline-container-org7ed0399" class="outline-2">
<h2 id="org7ed0399"><span class="section-number-2">4</span> Group Variables</h2>
<div class="outline-text-2" id="text-4">
</div><div id="outline-container-org10efc86" class="outline-3">
<h3 id="org10efc86"><span class="section-number-3">4.1</span> default text for templates</h3>
<div class="outline-text-3" id="text-4-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: group_vars/all</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">this is the standard text to put in templates</span>
<span style="color: #BA36A5;">ansible_managed_file</span>: <span style="color: #008000;">"*** YAVDR: ANSIBLE MANAGED FILE ***"</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb07f915" class="outline-3">
<h3 id="orgb07f915"><span class="section-number-3">4.2</span> PPAs</h3>
<div class="outline-text-3" id="text-4-2">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">branch</span>: unstable
<span style="color: #BA36A5;">ppa_owner</span>: <span style="color: #008000;">'ppa:yavdr'</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">a list of all package repositories to be added to the installation</span>
<span style="color: #BA36A5;">repositories</span>:
- <span style="color: #008000;">'{{ ppa_owner }}/main'</span>
- <span style="color: #008000;">'{{ ppa_owner }}/unstable-main'</span>
- <span style="color: #008000;">'{{ ppa_owner }}/{{branch}}-vdr'</span>
- <span style="color: #008000;">'{{ ppa_owner }}/{{branch}}-yavdr'</span>
- <span style="color: #008000;">'{{ ppa_owner }}/{{branch}}-kodi'</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org935ef40" class="outline-3">
<h3 id="org935ef40"><span class="section-number-3">4.3</span> VDR user, directories, special configuration and plugins</h3>
<div class="outline-text-3" id="text-4-3">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">properties of the user vdr and vdr-related options</span>
<span style="color: #BA36A5;">vdr</span>:
<span style="color: #BA36A5;">user</span>: vdr
<span style="color: #BA36A5;">group</span>: vdr
<span style="color: #BA36A5;">uid</span>: 666
<span style="color: #BA36A5;">gid</span>: 666
<span style="color: #BA36A5;">home</span>: /var/lib/vdr
<span style="color: #BA36A5;">recdir</span>: /srv/vdr/video
<span style="color: #BA36A5;">hide_first_recording_level</span>: <span style="color: #D0372D;">false</span>
<span style="color: #BA36A5;">safe_dirnames</span>: true <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">escape characters (useful for windows clients and FAT/NTFS file systems)</span>
<span style="color: #BA36A5;">override_vdr_charset</span>: <span style="color: #D0372D;">false</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">add the vdr plugins you want to install</span>
<span style="color: #BA36A5;">vdr_plugins</span>:
- vdr-plugin-devstatus
- vdr-plugin-markad
- vdr-plugin-restfulapi
- vdr-plugin-softhddevice
</pre>
</div>
</div>
</div>
<div id="outline-container-org5e03fd9" class="outline-3">
<h3 id="org5e03fd9"><span class="section-number-3">4.4</span> Media directories</h3>
<div class="outline-text-3" id="text-4-4">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">dictionary of directories for (shared) files. Automatically exported via NFS and Samba if those roles are enabled</span>
<span style="color: #BA36A5;">media_dirs</span>:
<span style="color: #BA36A5;">audio</span>: /srv/audio
<span style="color: #BA36A5;">video</span>: /srv/audio
<span style="color: #BA36A5;">pictures</span>: /srv/picture
<span style="color: #BA36A5;">files</span>: /srv/files
<span style="color: #BA36A5;">backups</span>: /srv/backups
<span style="color: #BA36A5;">recordings</span>: <span style="color: #008000;">'{{ vdr.recdir }}'</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgcb38958" class="outline-3">
<h3 id="orgcb38958"><span class="section-number-3">4.5</span> NFS</h3>
<div class="outline-text-3" id="text-4-5">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">nfs</span>:
<span style="color: #BA36A5;">insecure</span>: false <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">set to true for OS X clients or if you plan to use libnfs as unprivileged user (e.g. KODI)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgcb21af0" class="outline-3">
<h3 id="orgcb21af0"><span class="section-number-3">4.6</span> Samba</h3>
<div class="outline-text-3" id="text-4-6">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">samba</span>:
<span style="color: #BA36A5;">workgroup</span>: YAVDR
<span style="color: #BA36A5;">windows_compatible</span>: <span style="color: #008000;">'{{ vdr.safe_dirnames }}'</span> <span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">set to true to disable unix extensions, enable follow symlinks and wide links</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org029790a" class="outline-3">
<h3 id="org029790a"><span class="section-number-3">4.7</span> Additional packages</h3>
<div class="outline-text-3" id="text-4-7">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">additional packages you want to install</span>
<span style="color: #BA36A5;">extra_packages</span>:
- vim
- tree
- w-scan
- bpython3
</pre>
</div>
</div>
</div>
<div id="outline-container-org4b13441" class="outline-3">
<h3 id="org4b13441"><span class="section-number-3">4.8</span> System pre-configuration</h3>
<div class="outline-text-3" id="text-4-8">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">system:</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">shutdown: poweroff</span>
<span style="color: #BA36A5;">grub</span>:
<span style="color: #BA36A5;">timeout</span>: 0
<span style="color: #BA36A5;">boot_options</span>: quiet nosplash
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org2da2234" class="outline-2">
<h2 id="org2da2234"><span class="section-number-2">5</span> Roles</h2>
<div class="outline-text-2" id="text-5">
</div><div id="outline-container-orgc8e1547" class="outline-3">
<h3 id="orgc8e1547"><span class="section-number-3">5.1</span> yavdr-common</h3>
<div class="outline-text-3" id="text-5-1">
<p>
This role is used to set up a basic yaVDR installation. It creates the directories, installs the vdr and other useful packages.
</p>
</div>
<div id="outline-container-orgff24c64" class="outline-4">
<h4 id="orgff24c64"><span class="section-number-4">5.1.1</span> default variables</h4>
<div class="outline-text-4" id="text-5-1-1">
<p>
This section is for reference only, please use the files in <code>global_vars</code> for customizations.
</p>
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: roles/yavdr-common/defaults/main.yml</span>
</pre>
</div>
</div>
<ol class="org-ol"><li><a id="orgb2702a0"></a>Repositories<br /><div class="outline-text-5" id="text-5-1-1-1">
<p>
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&rsquo;s plugins.
</p>
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">branch</span>: unstable
<span style="color: #BA36A5;">repositories</span>:
- <span style="color: #008000;">'ppa:yavdr/main'</span>
- <span style="color: #008000;">'ppa:yavdr/unstable-main'</span>
- <span style="color: #008000;">'ppa:yavdr/{{branch}}-vdr'</span>
- <span style="color: #008000;">'ppa:yavdr/{{branch}}-kodi'</span>
- <span style="color: #008000;">'ppa:yavdr/{{branch}}-yavdr'</span>
</pre>
</div>
</div></li>
<li><a id="orgd32f2e5"></a>Drivers<br /><div class="outline-text-5" id="text-5-1-1-2">
<p>
Automatically installed drivers can be very useful, but if you know you need a certain driver, you can simply set it&rsquo;s value to <b>true</b>. If you don&rsquo;t want a driver to be installed, set it&rsquo;s value to <b>false</b>.
</p>
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">drivers</span>:
<span style="color: #BA36A5;">sundtek</span>: auto
<span style="color: #BA36A5;">ddvb-dkms</span>: auto
</pre>
</div>
</div></li>
<li><a id="orga0da8d3"></a>Additional Packages<br /><div class="outline-text-5" id="text-5-1-1-3">
<p>
Add additional packages you would like to have on your installation to this list
</p>
<div class="org-src-container">
<pre class="src src-yaml"> <span style="color: #BA36A5;">extra_packages</span>:
- vim
- tree
- w-scan
</pre>
</div>
</div></li>
<li><a id="org140f458"></a>VDR<br /><div class="outline-text-5" id="text-5-1-1-4">
<p>
This section allows you to set the recording directory, the user and group that runs the vdr and it&rsquo;s home directory.
</p>
<dl class="org-dl">
<dt>user</dt><dd>the vdr user name</dd>
<dt>group</dt><dd>the main group for the user vdr</dd>
<dt>uid</dt><dd>the user id for the user vdr</dd>
<dt>gid</dt><dd>the group id for the group vdr</dd>
<dt>home</dt><dd>the home directory for the user vdr</dd>
<dt>recdir</dt><dd>the recording directory used by VDR</dd>
<dt>hide_first_recording_level</dt><dd>let vdr hide the first directory level of it&rsquo;s recording directory so the content of multiple directories is shown merged together</dd>
<dt>safe_dirnames</dt><dd>replace special characters which are not compatible with Windows file systems and Samba shares</dd>
<dt>override_vdr_charset</dt><dd>workaround for channels with weird EPG encodings, e.g. Sky</dd>
</dl>
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">vdr</span>:
<span style="color: #BA36A5;">user</span>: vdr
<span style="color: #BA36A5;">group</span>: vdr
<span style="color: #BA36A5;">uid</span>: 666
<span style="color: #BA36A5;">gid</span>: 666
<span style="color: #BA36A5;">home</span>: /var/lib/vdr
<span style="color: #BA36A5;">recdir</span>: /srv/vdr/video
<span style="color: #BA36A5;">hide_first_recording_level</span>: <span style="color: #D0372D;">false</span>
<span style="color: #BA36A5;">safe_dirnames</span>: <span style="color: #D0372D;">true</span>
<span style="color: #BA36A5;">override_vdr_charset</span>: <span style="color: #D0372D;">false</span>
</pre>
</div>
</div></li></ol>
</div>
<div id="outline-container-org52abf93" class="outline-4">
<h4 id="org52abf93"><span class="section-number-4">5.1.2</span> tasks</h4>
<div class="outline-text-4" id="text-5-1-2">
<p>
yavdr-common executes the following tasks:
</p>
</div>
<ol class="org-ol"><li><a id="org119e42e"></a>main.yml<br /><ol class="org-ol"><li><a id="org505538b"></a>Disable default installation of recommended packages<br /><div class="outline-text-6" id="text-5-1-2-1-1">
<p>
This task prevents apt to automatically install all recommended dependencies for packages:
</p>
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: apt | prevent automatic installation of recommended packages
<span style="color: #BA36A5;">template</span>:
<span style="color: #BA36A5;">src</span>: templates/90-norecommends.j2
<span style="color: #BA36A5;">dest</span>: /etc/apt/apt.conf.d/90norecommends
</pre>
</div>
</div></li>
<li><a id="orgba07fa2"></a>Use bash instead of dash<br /><div class="outline-text-6" id="text-5-1-2-1-2">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: use bash instead of dash
<span style="color: #BA36A5;">shell</span>: |
echo <span style="color: #008000;">"set dash/sh false"</span> | debconf-communicate
<span style="color: #008000;"> dpkg-reconfigure -f noninteractive dash</span>
</pre>
</div>
</div></li>
<li><a id="orgd80765d"></a>create user vdr<br /></li>
<li><a id="org56b8cb6"></a>Disable release-upgrade notifications<br /><div class="outline-text-6" id="text-5-1-2-1-4">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: disable release-upgrade notifications
<span style="color: #BA36A5;">lineinfile</span>:
<span style="color: #BA36A5;">dest</span>: /etc/update-manager/release-upgrades
<span style="color: #BA36A5;">backrefs</span>: <span style="color: #D0372D;">yes</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">regexp</span>: <span style="color: #008000;">'^(Prompt=).*$'</span>
<span style="color: #BA36A5;">line</span>: <span style="color: #008000;">'\1never'</span>
</pre>
</div>
</div></li>
<li><a id="org9a207ef"></a>Set up package repositories<br /><div class="outline-text-6" id="text-5-1-2-1-5">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: add yaVDR PPAs
<span style="color: #BA36A5;">apt_repository</span>:
<span style="color: #BA36A5;">repo</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">update_cache</span>: <span style="color: #D0372D;">yes</span>
<span style="color: #BA36A5;">with_items</span>: <span style="color: #008000;">'{{ repositories }}'</span>
- <span style="color: #BA36A5;">name</span>: upgrade existing packages
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">upgrade</span>: dist
<span style="color: #BA36A5;">update_cache</span>: <span style="color: #D0372D;">yes</span>
</pre>
</div>
</div></li>
<li><a id="orgfa47b28"></a>Install essential packages<br /><div class="outline-text-6" id="text-5-1-2-1-6">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: apt | install basic packages
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">install_recommends</span>: <span style="color: #D0372D;">no</span>
<span style="color: #BA36A5;">with_items</span>:
- anacron
- at
- bash-completion
- biosdevname
- linux-firmware
- psmisc
- python-kmodpy
- python-usb
- python3-usb
- software-properties-common
- ssh
- ubuntu-drivers-common
- wget
- wpasupplicant
- usbutils
- xfsprogs
</pre>
</div>
</div></li>
<li><a id="orge6022f6"></a>Install additional packages (user defined)<br /><div class="outline-text-6" id="text-5-1-2-1-7">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: apt | install extra packages
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">install_recommends</span>: <span style="color: #D0372D;">no</span>
<span style="color: #BA36A5;">with_items</span>:
<span style="color: #008000;">'{{ extra_packages }}'</span>
</pre>
</div>
</div></li>
<li><a id="org4c40ddf"></a>Gather facts with custom modules<br /><div class="outline-text-6" id="text-5-1-2-1-8">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: get information about usb and pci hardware and loaded kernel modules
<span style="color: #BA36A5;">hardware_facts</span>:
<span style="color: #BA36A5;">usb</span>: <span style="color: #D0372D;">True</span>
<span style="color: #BA36A5;">pci</span>: <span style="color: #D0372D;">True</span>
<span style="color: #BA36A5;">modules</span>: <span style="color: #D0372D;">True</span>
<span style="color: #BA36A5;">gpus</span>: <span style="color: #D0372D;">True</span>
- <span style="color: #BA36A5;">debug</span>:
<span style="color: #BA36A5;">var</span>: usb
<span style="color: #BA36A5;">verbosity</span>: 1
- <span style="color: #BA36A5;">debug</span>:
<span style="color: #BA36A5;">var</span>: pci
<span style="color: #BA36A5;">verbosity</span>: 1
- <span style="color: #BA36A5;">debug</span>:
<span style="color: #BA36A5;">var</span>: modules
<span style="color: #BA36A5;">verbosity</span>: 1
- <span style="color: #BA36A5;">debug</span>:
<span style="color: #BA36A5;">var</span>: gpus
<span style="color: #BA36A5;">verbosity</span>: 1
</pre>
</div>
</div></li>
<li><a id="orgfc1df69"></a>create media directories<br /></li></ol></li></ol>
</div>
<div id="outline-container-orga9f36c2" class="outline-4">
<h4 id="orga9f36c2"><span class="section-number-4">5.1.3</span> templates</h4>
<div class="outline-text-4" id="text-5-1-3">
<div class="org-src-container">
<pre class="src src-c">{{ ansible_managed_file | comment(<span style="color: #008000;">'c'</span>) }}
<span style="color: #8D8D84;">// </span><span style="color: #8D8D84; font-style: italic;">Recommends are as of now still abused in many packages</span>
APT::Install-Recommends <span style="color: #008000;">"0"</span>;
APT::Install-Suggests <span style="color: #008000;">"0"</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org17ed954" class="outline-3">
<h3 id="org17ed954"><span class="section-number-3">5.2</span> vdr</h3>
<div class="outline-text-3" id="text-5-2">
</div><div id="outline-container-org20c2aae" class="outline-4">
<h4 id="org20c2aae"><span class="section-number-4">5.2.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-2-1">
</div><ol class="org-ol"><li><a id="orga10c235"></a>install the basic vdr packages<br /><div class="outline-text-5" id="text-5-2-1-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: roles/vdr/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: apt | install basic vdr packages
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">install_recommends</span>: <span style="color: #D0372D;">no</span>
<span style="color: #BA36A5;">with_items</span>:
- vdr
- vdrctl
- vdr-plugin-dbus2vdr
</pre>
</div>
</div></li>
<li><a id="org52c813e"></a>Add svdrp/svdrp-disc to /etc/services<br /><div class="outline-text-5" id="text-5-2-1-2">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: add svdrp to /etc/services
<span style="color: #BA36A5;">lineinfile</span>:
<span style="color: #BA36A5;">dest</span>: /etc/services
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">line</span>: <span style="color: #008000;">"svdrp 6419/tcp"</span>
- <span style="color: #BA36A5;">name</span>: add svdrp-disc to /etc/services
<span style="color: #BA36A5;">lineinfile</span>:
<span style="color: #BA36A5;">dest</span>: /etc/services
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">line</span>: <span style="color: #008000;">"svdrp-disc 6419/udp"</span>
</pre>
</div>
</div></li>
<li><a id="orgab3e31b"></a>Set up the recording directory for the vdr user<br /><div class="outline-text-5" id="text-5-2-1-3">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: create vdr recdir
<span style="color: #BA36A5;">file</span>:
<span style="color: #BA36A5;">state</span>: directory
<span style="color: #BA36A5;">owner</span>: <span style="color: #008000;">'{{ vdr.user }}'</span>
<span style="color: #BA36A5;">group</span>: <span style="color: #008000;">'{{ vdr.group }}'</span>
<span style="color: #BA36A5;">mode</span>: 0775
<span style="color: #BA36A5;">dest</span>: <span style="color: #008000;">'{{ vdr.recdir }}'</span>
- <span style="color: #BA36A5;">name</span>: set option to use hide-first-recording-level patch
<span style="color: #BA36A5;">blockinfile</span>:
<span style="color: #BA36A5;">dest</span>: /etc/vdr/conf.d/04-vdr-hide-first-recordinglevel.conf
<span style="color: #BA36A5;">create</span>: <span style="color: #D0372D;">true</span>
<span style="color: #BA36A5;">block</span>: |
<span style="color: #008000;">[vdr]</span>
<span style="color: #008000;"> --hide-first-recording-level</span>
<span style="color: #BA36A5;">when</span>:
vdr.hide_first_recording_level
- <span style="color: #BA36A5;">name</span>: create local dir in recdir
<span style="color: #BA36A5;">file</span>:
<span style="color: #BA36A5;">state</span>: directory
<span style="color: #BA36A5;">owner</span>: <span style="color: #008000;">'{{ vdr.user }}'</span>
<span style="color: #BA36A5;">group</span>: <span style="color: #008000;">'{{ vdr.group }}'</span>
<span style="color: #BA36A5;">mode</span>: <span style="color: #008000;">'0775'</span>
<span style="color: #BA36A5;">dest</span>: <span style="color: #008000;">'{{ vdr.recdir }}/local'</span>
<span style="color: #BA36A5;">when</span>:
vdr.hide_first_recording_level
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">TODO: set recdir, user etc. in /etc/vdr/conf.d/</span>
</pre>
</div>
</div></li>
<li><a id="org8e3f657"></a>Install additional vdr plugins<br /><div class="outline-text-5" id="text-5-2-1-4">
<p>
The additional plugins to install can be set in the variable <code>{{vdr_plugins}}</code> in the group variables
</p>
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: apt | install additional vdr plugins
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">install_recommends</span>: <span style="color: #D0372D;">no</span>
<span style="color: #BA36A5;">with_items</span>:
<span style="color: #008000;">'{{ vdr_plugins | default({}) }}'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart VDR'</span> ]
</pre>
</div>
</div></li></ol>
</div>
</div>
<div id="outline-container-org5822543" class="outline-3">
<h3 id="org5822543"><span class="section-number-3">5.3</span> <span class="todo STARTED">STARTED</span> yavdr-network</h3>
<div class="outline-text-3" id="text-5-3">
</div><div id="outline-container-orgc10f966" class="outline-4">
<h4 id="orgc10f966"><span class="section-number-4">5.3.1</span> default variables</h4>
<div class="outline-text-4" id="text-5-3-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">install_avahi</span>: <span style="color: #D0372D;">true</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org6e3c8e3" class="outline-4">
<h4 id="org6e3c8e3"><span class="section-number-4">5.3.2</span> tasks</h4>
<div class="outline-text-4" id="text-5-3-2">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">this playbook sets up network services for a yaVDR installation</span>
<span style="color: #8D8D84;">#</span>
- <span style="color: #BA36A5;">name</span>: install network packages
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">install_recommends</span>: <span style="color: #D0372D;">no</span>
<span style="color: #BA36A5;">with_items</span>:
- avahi-daemon
- avahi-utils
- biosdevname
- ethtool
- nfs-common
- vdr-addon-avahi-linker
- wakeonlan
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Does this really work? We need a way to check if an interface supports WOL - Python Skript?</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">- name: check WOL capabilities of network interfaces</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">shell: 'ethtool {{ item }} | grep -Po "(?&lt;=Supports\sWake-on:\s).*$"'</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">register: wol</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">with_items: '{% for interface in ansible_interfaces if interface != 'lo' and interface != 'bond0' %}'</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org7c8a404" class="outline-3">
<h3 id="org7c8a404"><span class="section-number-3">5.4</span> <span class="todo STARTED">STARTED</span> nfs-server</h3>
<div class="outline-text-3" id="text-5-4">
</div><div id="outline-container-orgeaa2325" class="outline-4">
<h4 id="orgeaa2325"><span class="section-number-4">5.4.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-4-1">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: install and configure nfs-kernel-server
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">"{{ item }}"</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">install_recommends</span>: <span style="color: #D0372D;">no</span>
<span style="color: #BA36A5;">with_items</span>:
- nfs-kernel-server
<span style="color: #BA36A5;">when</span>:
- <span style="color: #008000;">'{{ install_nfs_server }}'</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org6991e57" class="outline-3">
<h3 id="org6991e57"><span class="section-number-3">5.5</span> <span class="todo TODO">TODO</span> yavdr-remote</h3>
<div class="outline-text-3" id="text-5-5">
</div><div id="outline-container-org27d14bf" class="outline-4">
<h4 id="org27d14bf"><span class="section-number-4">5.5.1</span> default variables</h4>
</div>
<div id="outline-container-org6cb9ea2" class="outline-4">
<h4 id="org6cb9ea2"><span class="section-number-4">5.5.2</span> tasks</h4>
</div>
<div id="outline-container-org2afee90" class="outline-4">
<h4 id="org2afee90"><span class="section-number-4">5.5.3</span> templates</h4>
</div>
<div id="outline-container-org10fa18c" class="outline-4">
<h4 id="org10fa18c"><span class="section-number-4">5.5.4</span> files</h4>
</div>
</div>
<div id="outline-container-org3fff7f1" class="outline-3">
<h3 id="org3fff7f1"><span class="section-number-3">5.6</span> <span class="todo TODO">TODO</span> automatic X-server configuration</h3>
<div class="outline-text-3" id="text-5-6">
<ul class="org-ul">
<li class="off"><code>[&#xa0;]</code> detect connected display</li>
<li class="off"><code>[&#xa0;]</code> read EDID from displays</li>
<li class="off"><code>[&#xa0;]</code> create a xorg.conf for nvidia/intel/amd gpus</li>
</ul>
</div>
<div id="outline-container-org81b903c" class="outline-4">
<h4 id="org81b903c"><span class="section-number-4">5.6.1</span> templates</h4>
<div class="outline-text-4" id="text-5-6-1">
<div class="org-src-container">
<pre class="src src-conf"><span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: roles/yavdr-xorg/templates/vdr-xorg.conf</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">{{ ansible_managed_file }}</span>
[<span style="color: #6434A3;">Unit</span>]
<span style="color: #BA36A5;">After</span>=x@vt7.service
<span style="color: #BA36A5;">Wants</span>=x@vt7.service
<span style="color: #BA36A5;">BindsTo</span>=x@vt7.service
</pre>
</div>
<div class="org-src-container">
<pre class="src src-shell"><span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">!/bin/</span><span style="color: #0000FF;">bash</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">{{ ansible_managed_file }}</span>
<span style="color: #0000FF;">exec</span> openbox-session
</pre>
</div>
<div class="org-src-container">
<pre class="src src-shell">env | grep <span style="color: #008000;">"DISPLAY\|DBUS_SESSION_BUS_ADDRESS\|XDG_RUNTIME_DIR"</span> &gt; ~/.session-env
systemctl --user import-environment
</pre>
</div>
</div>
</div>
<div id="outline-container-orgfeaa752" class="outline-4">
<h4 id="orgfeaa752"><span class="section-number-4">5.6.2</span> files</h4>
</div>
</div>
<div id="outline-container-org8ab7fa7" class="outline-3">
<h3 id="org8ab7fa7"><span class="section-number-3">5.7</span> yavdr-xorg</h3>
<div class="outline-text-3" id="text-5-7">
</div><div id="outline-container-orgea9a5a9" class="outline-4">
<h4 id="orgea9a5a9"><span class="section-number-4">5.7.1</span> default variables</h4>
</div>
<div id="outline-container-org7234b90" class="outline-4">
<h4 id="org7234b90"><span class="section-number-4">5.7.2</span> tasks</h4>
<div class="outline-text-4" id="text-5-7-2">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: roles/yavdr-xorg/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: install packages for xorg
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">with_items</span>:
- xorg
- xserver-xorg-video-all
- xserver-xorg-input-all
- xlogin
- xterm
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">- yavdr-xorg</span>
- openbox
- <span style="color: #BA36A5;">name</span>: create folders for user session
<span style="color: #BA36A5;">file</span>:
<span style="color: #BA36A5;">state</span>: directory
<span style="color: #BA36A5;">dest</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">mode</span>: <span style="color: #008000;">'0775'</span>
<span style="color: #BA36A5;">owner</span>: <span style="color: #008000;">'{{ vdr.user }}'</span>
<span style="color: #BA36A5;">group</span>: <span style="color: #008000;">'{{ vdr.group }}'</span>
<span style="color: #BA36A5;">with_items</span>:
- <span style="color: #008000;">'{{ vdr.home }}/.config/systemd/user'</span>
- <span style="color: #008000;">'{{ vdr.home }}/.config/openbox/autostart'</span>
<span style="color: #8D8D84;">### </span><span style="color: #8D8D84; font-style: italic;">TODO: move to yavdr-xorg package? ###</span>
- <span style="color: #BA36A5;">name</span>: create folder for customizations of vdr.service
<span style="color: #BA36A5;">file</span>:
<span style="color: #BA36A5;">state</span>: directory
<span style="color: #BA36A5;">dest</span>: /etc/systemd/system/vdr.service.d
<span style="color: #BA36A5;">mode</span>: <span style="color: #008000;">'0775'</span>
- <span style="color: #BA36A5;">name</span>: add dependency to X-server for vdr.service using a drop-in
<span style="color: #BA36A5;">template</span>:
<span style="color: #BA36A5;">src</span>: templates/vdr-xorg.conf
<span style="color: #BA36A5;">dest</span>: /etc/systemd/system/vdr.service.d/
<span style="color: #8D8D84;">### </span><span style="color: #8D8D84; font-style: italic;">END TODO ###</span>
- <span style="color: #BA36A5;">name</span>: create .xinitrc for vdr user
<span style="color: #BA36A5;">template</span>:
<span style="color: #BA36A5;">src</span>: <span style="color: #008000;">'templates/.xinitrc.j2'</span>
<span style="color: #BA36A5;">dest</span>: <span style="color: #008000;">'/var/lib/vdr/.xinitrc'</span>
<span style="color: #BA36A5;">mode</span>: 0755
<span style="color: #BA36A5;">owner</span>: <span style="color: #008000;">'{{ vdr.user }}'</span>
<span style="color: #BA36A5;">group</span>: <span style="color: #008000;">'{{ vdr.group }}'</span>
- <span style="color: #BA36A5;">name</span>: populate autostart for openbox
<span style="color: #BA36A5;">template</span>:
<span style="color: #BA36A5;">src</span>: <span style="color: #008000;">'templates/autostart.j2'</span>
<span style="color: #BA36A5;">dest</span>: <span style="color: #008000;">'/var/lib/vdr/.config/openbox/autostart'</span>
<span style="color: #BA36A5;">mode</span>: 0755
<span style="color: #BA36A5;">owner</span>: <span style="color: #008000;">'{{ vdr.user }}'</span>
<span style="color: #BA36A5;">group</span>: <span style="color: #008000;">'{{ vdr.group }}'</span>
- <span style="color: #BA36A5;">name</span>: set a login shell for the user vdr
<span style="color: #BA36A5;">user</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ vdr.user }}'</span>
<span style="color: #BA36A5;">shell</span>: <span style="color: #008000;">'/bin/bash'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">uid</span>: <span style="color: #008000;">'{{ vdr.uid }}'</span>
<span style="color: #BA36A5;">groups</span>: <span style="color: #008000;">'{{ vdr.group }}'</span>
<span style="color: #BA36A5;">append</span>: <span style="color: #D0372D;">yes</span>
- <span style="color: #BA36A5;">name</span>: enable and start xlogin for the user vdr
<span style="color: #BA36A5;">systemd</span>:
<span style="color: #BA36A5;">daemon_reload</span>: <span style="color: #D0372D;">yes</span>
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'xlogin@{{ vdr.user }}'</span>
<span style="color: #BA36A5;">enabled</span>: <span style="color: #D0372D;">yes</span>
<span style="color: #BA36A5;">state</span>: started
</pre>
</div>
</div>
</div>
<div id="outline-container-orga43e203" class="outline-4">
<h4 id="orga43e203"><span class="section-number-4">5.7.3</span> templates</h4>
<div class="outline-text-4" id="text-5-7-3">
<div class="org-src-container">
<pre class="src src-conf">[<span style="color: #6434A3;">Unit</span>]
<span style="color: #BA36A5;">Description</span>=X with verbose logging on %I
<span style="color: #BA36A5;">Wants</span>=graphical.target
<span style="color: #BA36A5;">Before</span>=graphical.target
[<span style="color: #6434A3;">Service</span>]
<span style="color: #BA36A5;">Type</span>=forking
<span style="color: #BA36A5;">ExecStart</span>=/usr/bin/x-daemon -logverbose 6 -noreset %I
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgb20f3b3" class="outline-3">
<h3 id="orgb20f3b3"><span class="section-number-3">5.8</span> display-data</h3>
<div class="outline-text-3" id="text-5-8">
</div><div id="outline-container-orgeef219e" class="outline-4">
<h4 id="orgeef219e"><span class="section-number-4">5.8.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-8-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: roles/display-data/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: <span style="color: #008000;">"detect xorg configuration"</span>
<span style="color: #BA36A5;">action</span>: xorg_facts
- <span style="color: #BA36A5;">debug</span>:
<span style="color: #BA36A5;">var</span>: xorg
<span style="color: #BA36A5;">verbosity</span>: 1
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgc9f7a91" class="outline-3">
<h3 id="orgc9f7a91"><span class="section-number-3">5.9</span> nfs-server</h3>
<div class="outline-text-3" id="text-5-9">
</div><div id="outline-container-orgf3d226c" class="outline-4">
<h4 id="orgf3d226c"><span class="section-number-4">5.9.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-9-1">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: install nfs server packages
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">install_recommends</span>: <span style="color: #D0372D;">no</span>
<span style="color: #BA36A5;">with_items</span>:
- nfs-kernel-server
- nfs-common
- <span style="color: #BA36A5;">name</span>: create /etc/exports
<span style="color: #BA36A5;">template</span>:
<span style="color: #BA36A5;">src</span>: templates/nfs-exports.j2
<span style="color: #BA36A5;">dest</span>: /etc/exports
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart NFS Kernel Server'</span> ]
</pre>
</div>
</div>
</div>
<div id="outline-container-org3521ae3" class="outline-4">
<h4 id="org3521ae3"><span class="section-number-4">5.9.2</span> templates</h4>
<div class="outline-text-4" id="text-5-9-2">
<div class="org-src-container">
<pre class="src src-conf"><span style="color: #BA36A5;">/srv *(rw,fsid</span>=0,sync,no_subtree_check,all_squash,anongid={{ vdr.gid }},anonuid={{ vdr.uid }})
{% for name, path in media_dirs.iteritems() %}
<span style="color: #BA36A5;">{{ path }} *(rw,fsid</span>={{ loop.index }},sync,no_subtree_check,all_squash,anongid={{ vdr.gid }},anonuid={{ vdr.uid }}{{ <span style="color: #008000;">',insecure'</span> if nfs.insecure else <span style="color: #008000;">''</span> }})
{% endfor %}
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org962b651" class="outline-3">
<h3 id="org962b651"><span class="section-number-3">5.10</span> nfs-config</h3>
</div>
<div id="outline-container-org7cefc91" class="outline-3">
<h3 id="org7cefc91"><span class="section-number-3">5.11</span> samba-install</h3>
<div class="outline-text-3" id="text-5-11">
</div><div id="outline-container-orgf1458e9" class="outline-4">
<h4 id="orgf1458e9"><span class="section-number-4">5.11.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-11-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: roles/samba-install/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: install samba server
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: <span style="color: #008000;">'{{ item }}'</span>
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">install_recommends</span>: <span style="color: #D0372D;">no</span>
<span style="color: #BA36A5;">with_items</span>:
- samba
- samba-common
- samba-common-bin
- tdb-tools
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org42be2ab" class="outline-3">
<h3 id="org42be2ab"><span class="section-number-3">5.12</span> samba-config</h3>
<div class="outline-text-3" id="text-5-12">
</div><div id="outline-container-org3ccb11e" class="outline-4">
<h4 id="org3ccb11e"><span class="section-number-4">5.12.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-12-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file: roles/samba-config/tasks/main.yml</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">TODO:</span>
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">- name: divert original smbd.conf</span>
- <span style="color: #BA36A5;">name</span>: touch smb.conf.custom
<span style="color: #BA36A5;">file</span>:
<span style="color: #BA36A5;">state</span>: touch
<span style="color: #BA36A5;">dest</span>: <span style="color: #008000;">'/etc/samba/smb.conf.custom'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart Samba'</span> ]
- <span style="color: #BA36A5;">name</span>: expand template for smb.conf
<span style="color: #BA36A5;">template</span>:
<span style="color: #BA36A5;">src</span>: <span style="color: #008000;">'templates/smb.conf.j2'</span>
<span style="color: #BA36A5;">dest</span>: <span style="color: #008000;">'/etc/samba/smb.conf'</span>
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">validate: 'testparm -s %s'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart Samba'</span> ]
</pre>
</div>
</div>
</div>
<div id="outline-container-orgbc0186c" class="outline-4">
<h4 id="orgbc0186c"><span class="section-number-4">5.12.2</span> templates</h4>
<div class="outline-text-4" id="text-5-12-2">
</div><ol class="org-ol"><li><a id="orgb044383"></a>smb.conf<br /><ol class="org-ol"><li><a id="orgcd9d41c"></a>global settings<br /><div class="outline-text-6" id="text-5-12-2-1-1">
<div class="org-src-container">
<pre class="src src-yaml">{{ ansible_managed_file | comment }}
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">======================= Global Settings =======================</span>
[global]
<span style="color: #8D8D84;">## </span><span style="color: #8D8D84; font-style: italic;">Browsing/Identification ###</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Change this to the workgroup/NT-domain name your Samba server will part of</span>
workgroup = {{ samba.workgroup }}
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">server string is the equivalent of the NT Description field</span>
server string = %h server (Samba, Ubuntu)
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">This will prevent nmbd to search for NetBIOS names through DNS.</span>
dns proxy = no
<span style="color: #8D8D84;">#### </span><span style="color: #8D8D84; font-style: italic;">Debugging/Accounting ####</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">This tells Samba to use a separate log file for each machine</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">that connects</span>
log file = /var/log/samba/log.%m
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Cap the size of the individual log files (in KiB).</span>
max log size = 1000
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">We want Samba to log a minimum amount of information to syslog. Everything</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">should go to /var/log/samba/log.{smbd,nmbd} instead. If you want to log</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">through syslog you should set the following parameter to something higher.</span>
syslog = 0
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Do something sensible when Samba crashes: mail the admin a backtrace</span>
panic action = /usr/share/samba/panic-action %d
<span style="color: #8D8D84;">####### </span><span style="color: #8D8D84; font-style: italic;">Authentication #######</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">"security = user" is always a good idea. This will require a Unix account</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">in this server for every user accessing the server. See</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">/usr/share/doc/samba-doc/htmldocs/Samba3-HOWTO/ServerType.html</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">in the samba-doc package for details.</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">security = user</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">You may wish to use password encryption. See the section on</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">'encrypt passwords' in the smb.conf(5) manpage before enabling.</span>
encrypt passwords = true
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">If you are using encrypted passwords, Samba will need to know what</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">password database type you are using. </span>
passdb backend = tdbsam
obey pam restrictions = yes
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">This boolean parameter controls whether Samba attempts to sync the Unix</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">password with the SMB password when the encrypted SMB password in the</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">passdb is changed.</span>
unix password sync = yes
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">For Unix password sync to work on a Debian GNU/Linux system, the following</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">parameters must be set (thanks to Ian Kahan &lt;<a href="mailto:kahan%40informatik.tu-muenchen.de">&lt;kahan@informatik.tu-muenchen.de&gt;</a> for</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">sending the correct chat script for the passwd program in Debian Sarge).</span>
passwd program = /usr/bin/passwd %u
passwd chat = <span style="color: #006699;">*Enter</span>\snew\s*\spassword:* %n\n <span style="color: #006699;">*Retype</span>\snew\s*\spassword:* %n\n <span style="color: #006699;">*password</span>\supdated\ssuccessfully* .
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">This boolean controls whether PAM will be used for password changes</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">when requested by an SMB client instead of the program listed in</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">'passwd program'. The default is 'no'.</span>
pam password change = yes
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">This option controls how unsuccessful authentication attempts are mapped </span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">to anonymous connections</span>
map to guest = bad user
{% if samba.windows_compatible %}
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">disable unix extensions and enable following symlinks</span>
unix extensions = no
follow symlinks= yes
wide links= yes
{% endif %}
</pre>
</div>
</div></li>
<li><a id="orgce2f842"></a>media directories<br /><div class="outline-text-6" id="text-5-12-2-1-2">
<div class="org-src-container">
<pre class="src src-yaml">{% for name, path in media_dirs.iteritems() %}
[{{ name }}]
path = {{ path }}
comment = {{ name }} on %h
guest ok = yes
writeable = yes
browseable = yes
create mode = 0664
directory mode = 0775
force user = {{ vdr.user }}
force group = {{ vdr.group }}
follow symlinks = yes
wide links = yes
{% endfor %}
</pre>
</div>
</div></li>
<li><a id="orgea9bca2"></a>include custom samba exports<br /><div class="outline-text-6" id="text-5-12-2-1-3">
<div class="org-src-container">
<pre class="src src-yaml">include = /etc/samba/smb.conf.custom
</pre>
</div>
</div></li></ol></li></ol>
</div>
</div>
<div id="outline-container-org4e24ff7" class="outline-3">
<h3 id="org4e24ff7"><span class="section-number-3">5.13</span> <span class="todo TODO">TODO</span> autoinstall-drivers</h3>
<div class="outline-text-3" id="text-5-13">
<p>
It would be nice to be able to detect if it is suitable to install those drivers:
</p>
</div>
<div id="outline-container-orgf2d796c" class="outline-4">
<h4 id="orgf2d796c"><span class="section-number-4">5.13.1</span> sundtek for Sundtek devices (local or network connection)</h4>
<div class="outline-text-4" id="text-5-13-1">
<p>
Vendor-IDs:
</p>
<ul class="org-ul">
<li>eb1a:5[1b2] (alte Generation)</li>
<li>2659:* (neuere Sticks)</li>
</ul>
</div>
</div>
<div id="outline-container-org414bd6a" class="outline-4">
<h4 id="org414bd6a"><span class="section-number-4">5.13.2</span> dddvb-dkms if only newer DD cards are detected</h4>
</div>
<div id="outline-container-org5f58e3c" class="outline-4">
<h4 id="org5f58e3c"><span class="section-number-4">5.13.3</span> media-build-experimental (up to kernel 4.8) for &bdquo;old&ldquo; cards like TT S2-6400 FF</h4>
</div>
<div id="outline-container-orgf3c120d" class="outline-4">
<h4 id="orgf3c120d"><span class="section-number-4">5.13.4</span> newly merged DD drivers</h4>
<div class="outline-text-4" id="text-5-13-4">
<p>
from <a href="http://www.vdr-portal.de/board18-vdr-hardware/board102-dvb-karten/120817-treiber-der-cine-ctv6-ddbridge-ci-in-den-kernel-integrieren/">http://www.vdr-portal.de/board18-vdr-hardware/board102-dvb-karten/120817-treiber-der-cine-ctv6-ddbridge-ci-in-den-kernel-integrieren/</a>
</p>
</div>
</div>
</div>
<div id="outline-container-org448e5ca" class="outline-3">
<h3 id="org448e5ca"><span class="section-number-3">5.14</span> autoinstall-satip</h3>
<div class="outline-text-3" id="text-5-14">
</div><div id="outline-container-org1684582" class="outline-4">
<h4 id="org1684582"><span class="section-number-4">5.14.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-14-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file roles/autoinstall-satip/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: <span style="color: #008000;">"detect SAT&gt;IP Server(s) on the network"</span>
<span style="color: #BA36A5;">action</span>: satip_facts
- <span style="color: #BA36A5;">debug</span>:
<span style="color: #BA36A5;">var</span>: satip_detected
<span style="color: #BA36A5;">verbosity</span>: 1
- <span style="color: #BA36A5;">name</span>: apt | install vdr-plugin-satip if a Sat&gt;IP server has been detected
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: vdr-plugin-satip
<span style="color: #BA36A5;">when</span>: satip_detected
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart VDR'</span> ]
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org9d8b400" class="outline-3">
<h3 id="org9d8b400"><span class="section-number-3">5.15</span> autoinstall-targavfd</h3>
<div class="outline-text-3" id="text-5-15">
</div><div id="outline-container-org512bee9" class="outline-4">
<h4 id="org512bee9"><span class="section-number-4">5.15.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-15-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file roles/autoinstall-targavfd/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: apt | install vdr-plugin-targavfd if connected
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: vdr-plugin-targavfd
<span style="color: #BA36A5;">when</span>:
- <span style="color: #008000;">'"19c2:6a11" in usb'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart VDR'</span> ]
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd509224" class="outline-3">
<h3 id="orgd509224"><span class="section-number-3">5.16</span> autoinstall-imonlcd</h3>
<div class="outline-text-3" id="text-5-16">
</div><div id="outline-container-orge331b9b" class="outline-4">
<h4 id="orge331b9b"><span class="section-number-4">5.16.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-16-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file roles/autoinstall-imonlcd/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: apt | install vdr-plugin-imonlcd if connected
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: vdr-plugin-imonlcd
<span style="color: #BA36A5;">when</span>:
- <span style="color: #008000;">'"15c2:0038" in usb'</span>
- <span style="color: #008000;">'"15c2:ffdc" in usb'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart VDR'</span> ]
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org6eb82a4" class="outline-3">
<h3 id="org6eb82a4"><span class="section-number-3">5.17</span> autoinstall-libcecdaemon</h3>
<div class="outline-text-3" id="text-5-17">
</div><div id="outline-container-org032fe88" class="outline-4">
<h4 id="org032fe88"><span class="section-number-4">5.17.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-17-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file roles/autoinstall-libcec-daemon/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: apt | install libcec-daemon if connected
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: libcec-daemon
<span style="color: #BA36A5;">when</span>:
- <span style="color: #008000;">'"2548:1002" in usb'</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org0b99b8d" class="outline-3">
<h3 id="org0b99b8d"><span class="section-number-3">5.18</span> autoinstall-pvr350</h3>
<div class="outline-text-3" id="text-5-18">
</div><div id="outline-container-org72111b0" class="outline-4">
<h4 id="org72111b0"><span class="section-number-4">5.18.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-18-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file roles/autoinstall-pvr350/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: apt | install vdr-plugin-pvr350 if connected
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: vdr-plugin-pvr350
<span style="color: #BA36A5;">when</span>:
- <span style="color: #008000;">'"0070:4000" in pci'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart VDR'</span> ]
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org49e76bb" class="outline-3">
<h3 id="org49e76bb"><span class="section-number-3">5.19</span> <span class="todo TODO">TODO</span> autoinstall-dvbhddevice</h3>
<div class="outline-text-3" id="text-5-19">
<p>
Problem: woher kommt der Treiber (AFAIK noch nicht im Kernel)? Die Firmware sollte in yavdr-firmware stecken
</p>
</div>
<div id="outline-container-org9c3c18c" class="outline-4">
<h4 id="org9c3c18c"><span class="section-number-4">5.19.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-19-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file roles/autoinstall-dvbhddevice/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: apt | install vdr-plugin-dvbhddevice if connected
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: vdr-plugin-dvbhddevice
<span style="color: #BA36A5;">when</span>:
- <span style="color: #008000;">'"13c2:300a" in pci'</span>
- <span style="color: #008000;">'"13c2:300b" in pci'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart VDR'</span> ]
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org91c5ed4" class="outline-3">
<h3 id="org91c5ed4"><span class="section-number-3">5.20</span> autoinstall-dvbsddevice</h3>
<div class="outline-text-3" id="text-5-20">
</div><div id="outline-container-orgda1b34d" class="outline-4">
<h4 id="orgda1b34d"><span class="section-number-4">5.20.1</span> tasks</h4>
<div class="outline-text-4" id="text-5-20-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">file roles/autoinstall-dvbsddevice/tasks/main.yml</span>
- <span style="color: #BA36A5;">name</span>: apt | install vdr-plugin-dvbsddevice if module is loaded
<span style="color: #BA36A5;">apt</span>:
<span style="color: #BA36A5;">name</span>: vdr-plugin-dvbsddevice
<span style="color: #BA36A5;">when</span>:
- <span style="color: #008000;">'"dvb_ttpci" in modules'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Restart VDR'</span> ]
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgc2bac50" class="outline-3">
<h3 id="orgc2bac50"><span class="section-number-3">5.21</span> template-test</h3>
<div class="outline-text-3" id="text-5-21">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #8D8D84; font-style: italic;">---</span>
- <span style="color: #BA36A5;">name</span>: show vars
<span style="color: #BA36A5;">debug</span>:
<span style="color: #BA36A5;">var</span>: <span style="color: #008000;">'{{ system }}'</span>
- <span style="color: #BA36A5;">name</span>: test templates
<span style="color: #BA36A5;">template</span>:
<span style="color: #BA36A5;">src</span>: templates/test.j2
<span style="color: #BA36A5;">dest</span>: /tmp/test.txt
</pre>
</div>
<div class="org-src-container">
<pre class="src src-shell">{{ ansible_managed_file | comment }}
Section <span style="color: #008000;">"ServerLayout"</span>
Identifier <span style="color: #008000;">"Layout0"</span>
Screen 0 <span style="color: #008000;">"Screen0"</span>
{% if system.x11.dualhead.enabled %}
Screen 1 <span style="color: #008000;">"Screen1"</span> RightOf <span style="color: #008000;">"Screen0"</span>
{% endif %}
InputDevice <span style="color: #008000;">"Keyboard0"</span> <span style="color: #008000;">"CoreKeyboard"</span>
InputDevice <span style="color: #008000;">"Mouse0"</span> <span style="color: #008000;">"CorePointer"</span>
EndSection
Section <span style="color: #008000;">"InputDevice"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">generated from default</span>
Identifier <span style="color: #008000;">"Mouse0"</span>
Driver <span style="color: #008000;">"mouse"</span>
Option <span style="color: #008000;">"Protocol"</span> <span style="color: #008000;">"auto"</span>
Option <span style="color: #008000;">"Device"</span> <span style="color: #008000;">"/dev/psaux"</span>
Option <span style="color: #008000;">"Emulate3Buttons"</span> <span style="color: #008000;">"no"</span>
Option <span style="color: #008000;">"ZAxisMapping"</span> <span style="color: #008000;">"4 5"</span>
EndSection
Section <span style="color: #008000;">"InputDevice"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">generated from default</span>
Identifier <span style="color: #008000;">"Keyboard0"</span>
Driver <span style="color: #008000;">"kbd"</span>
EndSection
Section <span style="color: #008000;">"Monitor"</span>
Identifier <span style="color: #008000;">"Monitor0"</span>
VendorName <span style="color: #008000;">"Unknown"</span>
ModelName <span style="color: #008000;">"Unknown"</span>
{% if system.x11.display.0.default == <span style="color: #008000;">"VGA2Scart_4_3"</span> or system.x11.display.0.default == <span style="color: #008000;">"VGA2Scart_16_9"</span> %}
HorizSync 14-17
VertRefresh 49-61
{% if system.x11.display.0.default == <span style="color: #008000;">"VGA2Scart_4_3"</span> %}
Modeline <span style="color: #008000;">"VGA2Scart_4_3"</span> 13.875 720 744 808 888 576 580 585 625 -HSync -Vsync interlace
{% elif system.x11.display.0.default == <span style="color: #008000;">"VGA2Scart_16_9"</span> %}
Modeline <span style="color: #008000;">"VGA2Scart_16_9"</span> 19 1024 1032 1120 1216 576 581 586 625 -Hsync -Vsync interlace
{% endif %}
{% endif %}
Option <span style="color: #008000;">"DPMS"</span>
Option <span style="color: #008000;">"ExactModeTimingsDVI"</span> <span style="color: #008000;">"True"</span>
EndSection
{% if system.x11.dualhead.enabled == <span style="color: #008000;">"1"</span> %}
Section <span style="color: #008000;">"Monitor"</span>
Identifier <span style="color: #008000;">"Monitor1"</span>
VendorName <span style="color: #008000;">"Unknown"</span>
ModelName <span style="color: #008000;">"Unknown"</span>
{% if system.x11.display.1.default<span style="color: #0000FF;"> in</span> (<span style="color: #008000;">"VGA2Scart_4_3"</span>, <span style="color: #008000;">"VGA2Scart_16_9"</span>) %}
HorizSync 14-17
VertRefresh 49-61
{% if system.x11.display.1.default == <span style="color: #008000;">"VGA2Scart_4_3"</span> %}
Modeline <span style="color: #008000;">"VGA2Scart_4_3"</span> 13.875 720 744 808 888 576 580 585 625 -HSync -Vsync interlace
{% elif system.x11.display.1.default == <span style="color: #008000;">"VGA2Scart_16_9"</span> %}
Modeline <span style="color: #008000;">"VGA2Scart_16_9"</span> 19 1024 1032 1120 1216 576 581 586 625 -Hsync -Vsync interlace
{% endif %}
Option <span style="color: #008000;">"DPMS"</span>
Option <span style="color: #008000;">"ExactModeTimingsDVI"</span> <span style="color: #008000;">"True"</span>
{% endif %}
EndSection
{% endif %}
Section <span style="color: #008000;">"Device"</span>
Identifier <span style="color: #008000;">"Device0"</span>
{% if system.hardware.nvidia.detected %}
Driver <span style="color: #008000;">"nvidia"</span>
VendorName <span style="color: #008000;">"NVIDIA Corporation"</span>
{% endif %}
Screen 0
Option <span style="color: #008000;">"DPI"</span> <span style="color: #008000;">"100x100"</span>
{% if system.hardware.nvidia.busid %}
BusID <span style="color: #008000;">"PCI: {{ system.hardware.nvidia.busid }}"</span>
{% endif %}
Option <span style="color: #008000;">"NoLogo"</span> <span style="color: #008000;">"True"</span>
Option <span style="color: #008000;">"UseEvents"</span> <span style="color: #008000;">"True"</span>
Option <span style="color: #008000;">"TripleBuffer"</span> <span style="color: #008000;">"False"</span>
Option <span style="color: #008000;">"AddARGBGLXVisuals"</span> <span style="color: #008000;">"True"</span>
Option <span style="color: #008000;">"TwinView"</span> <span style="color: #008000;">"0"</span>
Option <span style="color: #008000;">"DynamicTwinView"</span> <span style="color: #008000;">"0"</span>
Option <span style="color: #008000;">"OnDemandVBlankinterrupts"</span> <span style="color: #008000;">"on"</span>
Option <span style="color: #008000;">"FlatPanelProperties"</span> <span style="color: #008000;">"Scaling = Native"</span>
EndSection
{% if system.x11.dualhead.enabled == <span style="color: #008000;">"1"</span> %}
Section <span style="color: #008000;">"Device"</span>
Identifier <span style="color: #008000;">"Device1"</span>
{% if system.hardware.nvidia.detected %}
Driver <span style="color: #008000;">"nvidia"</span>
VendorName <span style="color: #008000;">"NVIDIA Corporation"</span>
{% endif %}
Screen 1
{% if system.hardware.nvidia.busid %}
BusID <span style="color: #008000;">"PCI: {{ system.hardware.nvidia.busid }}"</span>
{% endif %}
Option <span style="color: #008000;">"NoLogo"</span> <span style="color: #008000;">"True"</span>
Option <span style="color: #008000;">"UseEvents"</span> <span style="color: #008000;">"True"</span>
Option <span style="color: #008000;">"TripleBuffer"</span> <span style="color: #008000;">"False"</span>
Option <span style="color: #008000;">"AddARGBGLXVisuals"</span> <span style="color: #008000;">"True"</span>
Option <span style="color: #008000;">"TwinView"</span> <span style="color: #008000;">"0"</span>
Option <span style="color: #008000;">"DynamicTwinView"</span> <span style="color: #008000;">"0"</span>
EndSection
{% endif %}
Section <span style="color: #008000;">"Screen"</span>
Identifier <span style="color: #008000;">"Screen0"</span>
Device <span style="color: #008000;">"Device0"</span>
Monitor <span style="color: #008000;">"Monitor0"</span>
DefaultDepth 24
SubSection <span style="color: #008000;">"Display"</span>
Depth 24
{% if system.x11.display.0.default is defined and system.x11.display.0.default %}
Modes <span style="color: #008000;">"{{ system.x11.display.0.default }}"</span>{% for mode<span style="color: #0000FF;"> in</span> system.x11.display.0.mode %}{% if mode != system.x11.display.0.default %} <span style="color: #008000;">"{{ mode }}"</span>{% endif %}{% endfor %}
{% elif system.hardware.nvidia.detected == 1 %}
Modes <span style="color: #008000;">"nvidia-auto-select"</span>
{% endif %}
EndSubSection
{% if system.x11.display.0.default or system.x11.default %}
{% if system.x11.display.0.device is definded and system.x11.display.0.device %}
Option <span style="color: #008000;">"ConnectedMonitor"</span> {{ system.x11.display.0.device }}
{% else %}
Option <span style="color: #008000;">"ConnectedMonitor"</span> {{ system.x11.default }}
{% endif %}
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "ConnectedMonitor" "&lt;?cs if:(?system.x11.display.0.device) ?&gt;&lt;?cs call:fix_display_name(system.x11.display.0.device) ?&gt;&lt;?cs else ?&gt;&lt;?cs var:system.x11.default ?&gt;&lt;?cs /if ?&gt;&lt;?cs if:(?system.x11.dualhead.enabled &amp;&amp; system.x11.dualhead.enabled == 1) ?&gt;, &lt;?cs call:fix_display_name(system.x11.display.1.device) ?&gt;&lt;?cs /if ?&gt;"</span>
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">Option "ConnectedMonitor"</span>
<span style="color: #008000;">"&lt;?cs if:(?system.x11.display.0.device) ?&gt;</span>
<span style="color: #008000;"> &lt;?cs call:fix_display_name(system.x11.display.0.device) ?&gt;</span>
<span style="color: #008000;"> &lt;?cs else ?&gt;</span>
<span style="color: #008000;"> &lt;?cs var:system.x11.default ?&gt;</span>
<span style="color: #008000;"> &lt;?cs /if ?&gt;</span>
<span style="color: #008000;"> &lt;?cs if:(?system.x11.dualhead.enabled &amp;&amp; system.x11.dualhead.enabled == 1) ?&gt;, &lt;?cs call:fix_display_name(system.x11.display.1.device) ?&gt;&lt;?cs /if ?&gt;"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "UseDisplayDevice" "&lt;?cs if:(?system.x11.display.0.device) ?&gt;&lt;?cs call:fix_display_name(system.x11.display.0.device) ?&gt;&lt;?cs else ?&gt;&lt;?cs var:system.x11.default ?&gt;&lt;?cs /if ?&gt;"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs /if ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs if:(?system.hardware.nvidia.0.edid &amp;&amp; system.hardware.nvidia.0.edid == "1") ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "CustomEDID" "&lt;?cs call:fix_display_name(system.x11.display.0.device) ?&gt;:/etc/X11/edid.0.yavdr"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs /if ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs if:(system.hardware.nvidia.detected == 1 &amp;&amp; ?system.x11.display.0.device) ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "MetaModes" "&lt;?cs call:fix_display_name(system.x11.display.0.device) ?&gt;: &lt;?cs var:system.x11.display.0.default ?&gt; { ViewPortIn=&lt;?cs var:system.x11.display.0.viewport.in.x ?&gt;x&lt;?cs var:system.x11.display.0.viewport.in.y ?&gt;, ViewPortOut=&lt;?cs var:system.x11.display.0.viewport.out.x ?&gt;x&lt;?cs var:system.x11.display.0.viewport.out.y ?&gt;+&lt;?cs var:system.x11.display.0.viewport.out.plusx ?&gt;+&lt;?cs var:system.x11.display.0.viewport.out.plusy ?&gt; }"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs each:mode = system.x11.display.0.mode ?&gt;&lt;?cs if:(mode != system.x11.display.0.default) ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "MetaModes" "&lt;?cs call:fix_display_name(system.x11.display.0.device) ?&gt;: &lt;?cs var:mode ?&gt; { ViewPortIn=&lt;?cs var:system.x11.display.0.viewport.in.x ?&gt;x&lt;?cs var:system.x11.display.0.viewport.in.y ?&gt;, ViewPortOut=&lt;?cs var:system.x11.display.0.viewport.out.x ?&gt;x&lt;?cs var:system.x11.display.0.viewport.out.y ?&gt;+&lt;?cs var:system.x11.display.0.viewport.out.plusx ?&gt;+&lt;?cs var:system.x11.display.0.viewport.out.plusy ?&gt; }"&lt;?cs /if ?&gt;&lt;?cs /each ?&gt; </span>
{% endif %}
EndSection
{% if system.x11.dualhead.enabled == <span style="color: #008000;">"1"</span> %}
Section <span style="color: #008000;">"Screen"</span>
Identifier <span style="color: #008000;">"Screen1"</span>
Device <span style="color: #008000;">"Device1"</span>
Monitor <span style="color: #008000;">"Monitor1"</span>
DefaultDepth 24
SubSection <span style="color: #008000;">"Display"</span>
Depth 24
{% if system.x11.display.0.default is defined and system.x11.display.0.default %}
Modes <span style="color: #008000;">"{{ system.x11.display.1.default }}"</span>{% for mode<span style="color: #0000FF;"> in</span> system.x11.display.1.mode %}{% if mode != system.x11.display.1.default %} <span style="color: #008000;">"{{ mode }}"</span>{% endif %}{% endfor %}
{% elif system.hardware.nvidia.detected == <span style="color: #008000;">"1"</span> %}
Modes <span style="color: #008000;">"nvidia-auto-select"</span>
{% endif %}
EndSubSection
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs if:(?system.x11.display.1.default &amp;&amp; system.x11.display.1.default != "" &amp;&amp; system.x11.display.1.default != "disabled") ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "UseDisplayDevice" "&lt;?cs call:fix_display_name(system.x11.display.1.device) ?&gt;"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs /if ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs if:(?system.hardware.nvidia.1.edid &amp;&amp; system.hardware.nvidia.1.edid == "1") ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "CustomEDID" "&lt;?cs call:fix_display_name(system.x11.display.1.device) ?&gt;:/etc/X11/edid.1.yavdr"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs /if ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs if:(system.hardware.nvidia.detected == 1 &amp;&amp; ?system.x11.display.1.device) ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "MetaModes" "&lt;?cs call:fix_display_name(system.x11.display.1.device) ?&gt;: &lt;?cs var:system.x11.display.1.default ?&gt; { ViewPortIn=&lt;?cs var:system.x11.display.1.viewport.in.x ?&gt;x&lt;?cs var:system.x11.display.1.viewport.in.y ?&gt;, ViewPortOut=&lt;?cs var:system.x11.display.1.viewport.out.x ?&gt;x&lt;?cs var:system.x11.display.1.viewport.out.y ?&gt;+&lt;?cs var:system.x11.display.1.viewport.out.plusx ?&gt;+&lt;?cs var:system.x11.display.1.viewport.out.plusy ?&gt; }"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs each:mode = system.x11.display.1.mode ?&gt;&lt;?cs if:(mode != system.x11.display.1.default) ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">Option "MetaModes" "&lt;?cs call:fix_display_name(system.x11.display.1.device) ?&gt;: &lt;?cs var:mode ?&gt; { ViewPortIn=&lt;?cs var:system.x11.display.1.viewport.in.x ?&gt;x&lt;?cs var:system.x11.display.1.viewport.in.y ?&gt;, ViewPortOut=&lt;?cs var:system.x11.display.1.viewport.out.x ?&gt;x&lt;?cs var:system.x11.display.1.viewport.out.y ?&gt;+&lt;?cs var:system.x11.display.1.viewport.out.plusx ?&gt;+&lt;?cs var:system.x11.display.1.viewport.out.plusy ?&gt; }"&lt;?cs /if ?&gt;&lt;?cs /each ?&gt;</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">&lt;?cs /if ?&gt;</span>
EndSection
{% endif %}
Section <span style="color: #008000;">"Extensions"</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">if no open-gl OSD is needed (e.g. for vdr-sxfe):</span>
Option <span style="color: #008000;">"Composite"</span> <span style="color: #008000;">"Disable"</span>
EndSection
</pre>
</div>
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">foo</span>:
- bar
- baz
- spam
<span style="color: #BA36A5;">system</span>:
<span style="color: #BA36A5;">hardware</span>:
<span style="color: #BA36A5;">nvidia</span>:
<span style="color: #BA36A5;">detected</span>: <span style="color: #008000;">"1"</span>
<span style="color: #BA36A5;">busid</span>: <span style="color: #008000;">"000:2304:234"</span>
<span style="color: #BA36A5;">x11</span>:
<span style="color: #BA36A5;">dualhead</span>:
<span style="color: #BA36A5;">enabled</span>: <span style="color: #008000;">"0"</span>
<span style="color: #BA36A5;">display</span>:
<span style="color: #BA36A5;">0</span>:
<span style="color: #BA36A5;">mode</span>:
- <span style="color: #008000;">"1920x1080_50"</span>
<span style="color: #BA36A5;">default</span>: <span style="color: #008000;">"nvidia-auto"</span>
<span style="color: #BA36A5;">1</span>:
<span style="color: #BA36A5;">mode</span>:
- <span style="color: #008000;">"1280x720_60"</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgb878e3f" class="outline-3">
<h3 id="orgb878e3f"><span class="section-number-3">5.22</span> grub-config</h3>
<div class="outline-text-3" id="text-5-22">
</div><div id="outline-container-org2f0fb6a" class="outline-4">
<h4 id="org2f0fb6a"><span class="section-number-4">5.22.1</span> default variables</h4>
<div class="outline-text-4" id="text-5-22-1">
<div class="org-src-container">
<pre class="src src-yaml"><span style="color: #BA36A5;">system</span>:
<span style="color: #BA36A5;">shutdown</span>: poweroff
<span style="color: #BA36A5;">grub</span>:
<span style="color: #BA36A5;">timeout</span>: 0
<span style="color: #BA36A5;">boot_options</span>: quiet nosplash
</pre>
</div>
</div>
</div>
<div id="outline-container-orgd217a89" class="outline-4">
<h4 id="orgd217a89"><span class="section-number-4">5.22.2</span> tasks</h4>
<div class="outline-text-4" id="text-5-22-2">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: custom grub configuration for timeout and reboot halt
<span style="color: #BA36A5;">template</span>:
<span style="color: #BA36A5;">src</span>: templates/50_custom.j2
<span style="color: #BA36A5;">dest</span>: /etc/grub.d/50_custom
<span style="color: #BA36A5;">mode</span>: <span style="color: #008000;">'0775'</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Update GRUB'</span> ]
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">TODO: add special case if plymouth is used</span>
- <span style="color: #BA36A5;">name</span>: let the system boot quietly
<span style="color: #BA36A5;">lineinfile</span>:
<span style="color: #BA36A5;">dest</span>: /etc/default/grub
<span style="color: #BA36A5;">state</span>: present
<span style="color: #BA36A5;">regexp</span>: <span style="color: #008000;">'^(GRUB_CMDLINE_LINUX_DEFAULT=")'</span>
<span style="color: #BA36A5;">line</span>: <span style="color: #008000;">'\1{{ grub.boot_options}}"'</span>
<span style="color: #BA36A5;">backrefs</span>: <span style="color: #D0372D;">yes</span>
<span style="color: #BA36A5;">notify</span>: [ <span style="color: #008000;">'Update GRUB'</span> ]
</pre>
</div>
</div>
</div>
<div id="outline-container-orge4c1eeb" class="outline-4">
<h4 id="orge4c1eeb"><span class="section-number-4">5.22.3</span> templates</h4>
<div class="outline-text-4" id="text-5-22-3">
<div class="org-src-container">
<pre class="src src-shell"><span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">!/bin/</span><span style="color: #0000FF;">sh</span>
<span style="color: #0000FF;">exec</span> tail -n +3 $<span style="color: #BA36A5;">0</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">This file is configured by the ansible configuration for yaVDR</span>
{% if system.shutdown is defined and system.shutdown == <span style="color: #008000;">'reboot'</span> %}
menuentry <span style="color: #008000;">"PowerOff"</span> {
halt
}
{% endif %}
<span style="color: #0000FF;">if</span> [ <span style="color: #008000;">"${recordfail}"</span> = 1 ]; <span style="color: #0000FF;">then</span>
<span style="color: #006FE0;">set</span> <span style="color: #BA36A5;">timeout</span>={{ 3 if grub.timeout &lt; 3 else grub.timeout }}
<span style="color: #0000FF;">else</span>
<span style="color: #006FE0;">set</span> <span style="color: #BA36A5;">timeout</span>={{ grub.timeout if grub.timeout is defined else 0 }}
<span style="color: #0000FF;">fi</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc458ac7" class="outline-4">
<h4 id="orgc458ac7"><span class="section-number-4">5.22.4</span> handlers</h4>
<div class="outline-text-4" id="text-5-22-4">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: Update GRUB
<span style="color: #BA36A5;">command</span>: update-grub
<span style="color: #BA36A5;">failed_when</span>: (<span style="color: #008000;">'error'</span> in grub_register_update.stderr)
<span style="color: #BA36A5;">register</span>: grub_register_update
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">TODO: Do we need to use grub-set-default?</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">https://github.com/yavdr/yavdr-utils/blob/master/events/actions/update-grub</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div id="outline-container-org26f1d87" class="outline-2">
<h2 id="org26f1d87"><span class="section-number-2">6</span> Modules</h2>
<div class="outline-text-2" id="text-6">
<p>
This section contains custom modules for the yaVDR Playbooks. They are used to collect facts about the system and configure applications and daemons.
</p>
</div>
<div id="outline-container-org3587f1d" class="outline-3">
<h3 id="org3587f1d"><span class="section-number-3">6.1</span> hardware_facts.py</h3>
<div class="outline-text-3" id="text-6-1">
<div class="org-src-container">
<pre class="src src-python"><span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">!/usr/bin/env python</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">This Module collects the vendor- and device ids for USB- and PCI(e)-devices and currently loaded kernel modules.</span>
<span style="color: #BA36A5;">DOCUMENTATION</span> = <span style="color: #008000;">'''</span>
<span style="color: #008000;">---</span>
<span style="color: #008000;">module: hardware_facts</span>
<span style="color: #008000;">short_description: collects facts for kernel modules, usb and pci devices</span>
<span style="color: #008000;">description:</span>
<span style="color: #008000;"> - This Module collects the vendor- and device ids for USB- and PCI(e)-devices and</span>
<span style="color: #008000;"> currently loaded kernel modules.</span>
<span style="color: #008000;">options:</span>
<span style="color: #008000;"> usb:</span>
<span style="color: #008000;"> required: False</span>
<span style="color: #008000;"> default: True</span>
<span style="color: #008000;"> description:</span>
<span style="color: #008000;"> - return a list of vendor- and device ids for usb devices in '04x:04x' notation</span>
<span style="color: #008000;"> pci:</span>
<span style="color: #008000;"> required: False</span>
<span style="color: #008000;"> default: True</span>
<span style="color: #008000;"> description:</span>
<span style="color: #008000;"> - return a list of vendor- and device ids for pci devices in '04x:04x' notation</span>
<span style="color: #008000;"> modules:</span>
<span style="color: #008000;"> required: False</span>
<span style="color: #008000;"> default: True</span>
<span style="color: #008000;"> description:</span>
<span style="color: #008000;"> - return a list of currently loaded kernel modules</span>
<span style="color: #008000;"> gpus:</span>
<span style="color: #008000;"> required: False</span>
<span style="color: #008000;"> default: True</span>
<span style="color: #008000;"> description:</span>
<span style="color: #008000;"> - return a list of devices of the pci gpu class (0x030000)</span>
<span style="color: #008000;">notes:</span>
<span style="color: #008000;"> - requres python-pyusb and python-kmodpy</span>
<span style="color: #008000;">requirements: [ ]</span>
<span style="color: #008000;">author: "Alexander Grothe <a href="mailto:seahawk1986%40gmx.de">&lt;seahawk1986@gmx.de&gt;</a>"</span>
<span style="color: #008000;">'''</span>
<span style="color: #BA36A5;">EXAMPLES</span> = <span style="color: #008000;">'''</span>
<span style="color: #008000;">- name: get information about usb and pci hardware and loaded kernel modules</span>
<span style="color: #008000;"> hardware_facts:</span>
<span style="color: #008000;"> usb: True</span>
<span style="color: #008000;"> pci: True</span>
<span style="color: #008000;"> modules: True</span>
<span style="color: #008000;">- debug:</span>
<span style="color: #008000;"> var: usb</span>
<span style="color: #008000;">- debug</span>
<span style="color: #008000;"> var: pci</span>
<span style="color: #008000;">- debug</span>
<span style="color: #008000;"> var: modules</span>
<span style="color: #008000;">- debug</span>
<span style="color: #008000;"> var: gpus</span>
<span style="color: #008000;">'''</span>
<span style="color: #0000FF;">import</span> glob
<span style="color: #0000FF;">import</span> json
<span style="color: #0000FF;">import</span> os
<span style="color: #0000FF;">import</span> sys
<span style="color: #0000FF;">import</span> usb.core
<span style="color: #0000FF;">from</span> collections <span style="color: #0000FF;">import</span> namedtuple
<span style="color: #0000FF;">import</span> kmodpy
<span style="color: #0000FF;">from</span> ansible.module_utils.basic <span style="color: #0000FF;">import</span> *
<span style="color: #BA36A5;">PCIDevice</span> = namedtuple(<span style="color: #008000;">"PCIDevice"</span>, [<span style="color: #008000;">'idVendor'</span>, <span style="color: #008000;">'idProduct'</span>, <span style="color: #008000;">'idClass'</span>])
<span style="color: #0000FF;">def</span> <span style="color: #006699;">get_pci_devices</span>():
<span style="color: #0000FF;">for</span> device <span style="color: #0000FF;">in</span> glob.glob(<span style="color: #008000;">'/sys/devices/pci*/*:*:*/'</span>):
<span style="color: #0000FF;">with</span> <span style="color: #006FE0;">open</span>(os.path.join(device, <span style="color: #008000;">'device'</span>)) <span style="color: #0000FF;">as</span> d:
<span style="color: #BA36A5;">product_id</span> = <span style="color: #006FE0;">int</span>(d.read().strip(), 16)
<span style="color: #0000FF;">with</span> <span style="color: #006FE0;">open</span>(os.path.join(device, <span style="color: #008000;">'vendor'</span>)) <span style="color: #0000FF;">as</span> d:
<span style="color: #BA36A5;">vendor_id</span> = <span style="color: #006FE0;">int</span>(d.read().strip(), 16)
<span style="color: #0000FF;">with</span> <span style="color: #006FE0;">open</span>(os.path.join(device, <span style="color: #008000;">'class'</span>)) <span style="color: #0000FF;">as</span> d:
<span style="color: #BA36A5;">class_id</span> = <span style="color: #006FE0;">int</span>(d.read().strip(), 16)
<span style="color: #0000FF;">yield</span> PCIDevice(idVendor=vendor_id, idProduct=product_id, idClass=class_id)
<span style="color: #0000FF;">def</span> <span style="color: #006699;">format_device_list</span>(iterator):
<span style="color: #0000FF;">return</span> [<span style="color: #008000;">"{:04x}:{:04x}"</span>.<span style="color: #006FE0;">format</span>(d.idVendor, d.idProduct) <span style="color: #0000FF;">for</span> d <span style="color: #0000FF;">in</span> iterator]
<span style="color: #0000FF;">def</span> <span style="color: #006699;">format_gpu_device_list</span>(iterator):
<span style="color: #0000FF;">def</span> <span style="color: #006699;">get_entries</span>(iterator):
<span style="color: #0000FF;">for</span> d <span style="color: #0000FF;">in</span> iterator:
<span style="color: #0000FF;">if</span> d.idClass == 0x030000:
<span style="color: #0000FF;">yield</span> (<span style="color: #008000;">"{:04x}:{:04x}"</span>.<span style="color: #006FE0;">format</span>(d.idVendor, d.idProduct))
<span style="color: #0000FF;">return</span> [entry <span style="color: #0000FF;">for</span> entry <span style="color: #0000FF;">in</span> get_entries(iterator)]
<span style="color: #BA36A5;">arg_specs</span> = {
<span style="color: #008000;">'usb'</span>: <span style="color: #006FE0;">dict</span>(default=<span style="color: #D0372D;">True</span>, <span style="color: #006FE0;">type</span>=<span style="color: #008000;">'bool'</span>, required=<span style="color: #D0372D;">False</span>),
<span style="color: #008000;">'pci'</span>: <span style="color: #006FE0;">dict</span>(default=<span style="color: #D0372D;">True</span>, <span style="color: #006FE0;">type</span>=<span style="color: #008000;">'bool'</span>, required=<span style="color: #D0372D;">False</span>),
<span style="color: #008000;">'modules'</span>: <span style="color: #006FE0;">dict</span>(default=<span style="color: #D0372D;">True</span>, <span style="color: #006FE0;">type</span>=<span style="color: #008000;">'bool'</span>, required=<span style="color: #D0372D;">False</span>),
<span style="color: #008000;">'gpus'</span>: <span style="color: #006FE0;">dict</span>(default=<span style="color: #D0372D;">True</span>, <span style="color: #006FE0;">type</span>=<span style="color: #008000;">'bool'</span>, required=<span style="color: #D0372D;">False</span>),
}
<span style="color: #0000FF;">def</span> <span style="color: #006699;">main</span>():
<span style="color: #BA36A5;">module</span> = AnsibleModule(argument_spec=arg_specs, supports_check_mode=<span style="color: #D0372D;">True</span>,)
<span style="color: #BA36A5;">collect_usb</span> = module.params[<span style="color: #008000;">'usb'</span>]
<span style="color: #BA36A5;">collect_pci</span> = module.params[<span style="color: #008000;">'pci'</span>]
<span style="color: #BA36A5;">collect_modules</span> = module.params[<span style="color: #008000;">'modules'</span>]
<span style="color: #BA36A5;">collect_gpus</span> = module.params[<span style="color: #008000;">'gpus'</span>]
<span style="color: #0000FF;">if</span> collect_usb:
<span style="color: #BA36A5;">usb_devices</span> = format_device_list(usb.core.find(find_all=<span style="color: #D0372D;">True</span>))
<span style="color: #0000FF;">else</span>:
<span style="color: #BA36A5;">usb_device</span> = []
<span style="color: #0000FF;">if</span> collect_pci:
<span style="color: #BA36A5;">pci_devices</span> = format_device_list(get_pci_devices())
<span style="color: #0000FF;">else</span>:
<span style="color: #BA36A5;">pci_devices</span> = []
<span style="color: #0000FF;">if</span> collect_modules:
<span style="color: #BA36A5;">k</span> = kmodpy.Kmod()
<span style="color: #BA36A5;">modules</span> = [m[0] <span style="color: #0000FF;">for</span> m <span style="color: #0000FF;">in</span> k.loaded()]
<span style="color: #0000FF;">else</span>:
<span style="color: #BA36A5;">modules</span> = []
<span style="color: #0000FF;">if</span> collect_gpus:
<span style="color: #BA36A5;">gpus</span> = format_gpu_device_list(get_pci_devices())
<span style="color: #0000FF;">else</span>:
<span style="color: #BA36A5;">gpus</span> = []
<span style="color: #BA36A5;">data</span> = {<span style="color: #008000;">'usb'</span>: usb_devices, <span style="color: #008000;">'pci'</span>: pci_devices, <span style="color: #008000;">'modules'</span>: modules, <span style="color: #008000;">'gpus'</span>: gpus}
module.exit_json(changed=<span style="color: #D0372D;">False</span>, ansible_facts=data, msg=data)
<span style="color: #0000FF;">if</span> <span style="color: #006FE0;">__name__</span> == <span style="color: #008000;">'__main__'</span>:
main()
</pre>
</div>
</div>
</div>
<div id="outline-container-org7dfc340" class="outline-3">
<h3 id="org7dfc340"><span class="section-number-3">6.2</span> satip_facts.py</h3>
<div class="outline-text-3" id="text-6-2">
<div class="org-src-container">
<pre class="src src-python"><span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">!/usr/bin/env python2</span>
<span style="color: #BA36A5;">DOCUMENTATION</span> = <span style="color: #008000;">'''</span>
<span style="color: #008000;">---</span>
<span style="color: #008000;">module: hardware_facts</span>
<span style="color: #008000;">short_description: "check if at least one SAT&gt;IP server responds on the network"</span>
<span style="color: #008000;">description:</span>
<span style="color: #008000;"> - This script sends a multicast message and awaits responses by Sat&gt;IP servers.</span>
<span style="color: #008000;"> Returns the boolean variable 'satip_detected'</span>
<span style="color: #008000;">'''</span>
<span style="color: #BA36A5;">EXAMPLES</span> = <span style="color: #008000;">'''</span>
<span style="color: #008000;">- name: "detect SAT&gt;IP Server on the network"</span>
<span style="color: #008000;"> action: satip_facts</span>
<span style="color: #008000;">- debug:</span>
<span style="color: #008000;"> var: satip_detected</span>
<span style="color: #008000;">'''</span>
<span style="color: #0000FF;">import</span> json
<span style="color: #0000FF;">import</span> socket
<span style="color: #0000FF;">import</span> sys
<span style="color: #0000FF;">import</span> time
<span style="color: #0000FF;">from</span> ansible.module_utils.basic <span style="color: #0000FF;">import</span> *
<span style="color: #BA36A5;">SSDP_ADDR</span> = <span style="color: #008000;">"239.255.255.250"</span>
<span style="color: #BA36A5;">SSDP_PORT</span> = 1900
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">SSDP_MX = max delay for server response</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">a value of 2s is recommended by the SAT&gt;IP specification 1.2.2</span>
<span style="color: #BA36A5;">SSDP_MX</span> = 2
<span style="color: #BA36A5;">SSDP_ST</span> = <span style="color: #008000;">"urn:ses-com:device:SatIPServer:1"</span>
<span style="color: #BA36A5;">ssdpRequest</span> = <span style="color: #008000;">"\r\n"</span>.join((
<span style="color: #008000;">"M-SEARCH * HTTP/1.1"</span>,
<span style="color: #008000;">"HOST: %s:%d"</span> % (SSDP_ADDR, SSDP_PORT),
<span style="color: #008000;">"MAN: \"ssdp:discover\""</span>,
<span style="color: #008000;">"MX: %d"</span> % (SSDP_MX),
<span style="color: #008000;">"ST: %s"</span> % (SSDP_ST),
<span style="color: #008000;">"\r\n"</span>))
<span style="color: #0000FF;">def</span> <span style="color: #006699;">main</span>():
<span style="color: #BA36A5;">module</span> = AnsibleModule(argument_spec={}, supports_check_mode=<span style="color: #D0372D;">True</span>,)
<span style="color: #BA36A5;">sock</span> = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">according to Sat&gt;IP Specification 1.2.2, p. 20</span>
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">a client should send three requests within 100 ms with a ttl of 2</span>
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.settimeout(SSDP_MX + 0.5)
<span style="color: #0000FF;">for</span> _ <span style="color: #0000FF;">in</span> <span style="color: #006FE0;">range</span>(3):
sock.sendto(ssdpRequest, (SSDP_ADDR, SSDP_PORT))
time.sleep(0.03)
<span style="color: #0000FF;">try</span>:
<span style="color: #BA36A5;">response</span> = sock.recv(1000)
<span style="color: #0000FF;">if</span> response <span style="color: #0000FF;">and</span> <span style="color: #008000;">"SERVER:"</span> <span style="color: #0000FF;">in</span> response:
<span style="color: #BA36A5;">got_response</span> = <span style="color: #D0372D;">True</span>
<span style="color: #0000FF;">else</span>:
<span style="color: #0000FF;">raise</span> <span style="color: #6434A3;">ValueError</span>(<span style="color: #008000;">'No satip server detected'</span>)
<span style="color: #0000FF;">except</span> (socket.timeout, <span style="color: #6434A3;">ValueError</span>):
<span style="color: #BA36A5;">got_response</span> = <span style="color: #D0372D;">False</span>
module.exit_json(changed=<span style="color: #D0372D;">False</span>, ansible_facts={<span style="color: #008000;">'satip_detected'</span>: got_response})
<span style="color: #0000FF;">if</span> <span style="color: #006FE0;">__name__</span> == <span style="color: #008000;">'__main__'</span>:
main()
</pre>
</div>
</div>
</div>
<div id="outline-container-org97a4be6" class="outline-3">
<h3 id="org97a4be6"><span class="section-number-3">6.3</span> xorg_facts.py</h3>
<div class="outline-text-3" id="text-6-3">
<div class="org-src-container">
<pre class="src src-python"><span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">!/usr/bin/env python2</span>
<span style="color: #BA36A5;">DOCUMENTATION</span> = <span style="color: #008000;">'''</span>
<span style="color: #008000;">---</span>
<span style="color: #008000;">module: xorg_facts</span>
<span style="color: #008000;">short_description: "gather facts about connected monitors and available modelines"</span>
<span style="color: #008000;">description:</span>
<span style="color: #008000;"> - This script needs a running x-server on a given display in order to successfully call xrandr.</span>
<span style="color: #008000;"> The ranking uses the following factors:</span>
<span style="color: #008000;"> 1. preferred_refreshrate</span>
<span style="color: #008000;"> 2. preferred_resolution</span>
<span style="color: #008000;"> 3. preferred_output</span>
<span style="color: #008000;"> For each element a dictionary of values (up to 4 bit [0 .. 256]) may be passed to the module.</span>
<span style="color: #008000;"> The rank is represented by this order of 4-Bit values:</span>
<span style="color: #008000;"> | rrate | resolution | output | internal score</span>
<span style="color: #008000;"> | 50 | 1920x1080 | HDMI | 0b_0100_0100_0100 = 1092</span>
<span style="color: #008000;"> | 60 | 1280x720 | DP | 0b_0011_0011_0011 = 819</span>
<span style="color: #008000;"> Returns the connected output, monitors and modelines and a suggestion for the most fitting mode in a dictionary 'xorg'</span>
<span style="color: #008000;">options:</span>
<span style="color: #008000;"> display:</span>
<span style="color: #008000;"> required: False</span>
<span style="color: #008000;"> default: ":0"</span>
<span style="color: #008000;"> description:</span>
<span style="color: #008000;"> - the DISPLAY variable to use when calling xrandr</span>
<span style="color: #008000;"> preferred_outpus:</span>
<span style="color: #008000;"> required: False</span>
<span style="color: #008000;"> default: {"HDMI": 4, "DP": 3, "DVI": 2, "VGA": 1, "TV": 0}</span>
<span style="color: #008000;"> description:</span>
<span style="color: #008000;"> - ranking of the preferred display connectors</span>
<span style="color: #008000;"> preferred_refreshrates:</span>
<span style="color: #008000;"> required: False</span>
<span style="color: #008000;"> default: {"50": 4, "60": 3, "75": 2, "30": 1, "25": 0}</span>
<span style="color: #008000;"> description:</span>
<span style="color: #008000;"> - ranking of the preferred display refreshrate</span>
<span style="color: #008000;"> preferred_resolutions:</span>
<span style="color: #008000;"> required: False</span>
<span style="color: #008000;"> default: {"7680x4320": 8, "3840x2160": 4, "1920x1080": 2, "1280x720": 1, "720x576": 0}</span>
<span style="color: #008000;"> description:</span>
<span style="color: #008000;"> - ranking of the preferred display resolutions</span>
<span style="color: #008000;">'''</span>
<span style="color: #BA36A5;">EXAMPLES</span> = <span style="color: #008000;">'''</span>
<span style="color: #008000;">- name: "collect facts for connected displays"</span>
<span style="color: #008000;"> action: xserver_facts</span>
<span style="color: #008000;"> display: ":0"</span>
<span style="color: #008000;">- debug:</span>
<span style="color: #008000;"> var: xorg</span>
<span style="color: #008000;">'''</span>
<span style="color: #0000FF;">import</span> ast
<span style="color: #0000FF;">import</span> json
<span style="color: #0000FF;">import</span> re
<span style="color: #0000FF;">import</span> subprocess
<span style="color: #0000FF;">import</span> sys
<span style="color: #0000FF;">import</span> time
<span style="color: #0000FF;">from</span> collections <span style="color: #0000FF;">import</span> OrderedDict, namedtuple
<span style="color: #0000FF;">from</span> ansible.module_utils.basic <span style="color: #0000FF;">import</span> *
<span style="color: #BA36A5;">arg_specs</span> = {
<span style="color: #008000;">'display'</span>: <span style="color: #006FE0;">dict</span>(default=[<span style="color: #008000;">":0"</span>, <span style="color: #008000;">":0.1"</span>], <span style="color: #006FE0;">type</span>=<span style="color: #008000;">'list'</span>, required=<span style="color: #D0372D;">False</span>),
<span style="color: #008000;">'multi_display'</span>: <span style="color: #006FE0;">dict</span>(default=<span style="color: #D0372D;">True</span>, <span style="color: #006FE0;">type</span>=<span style="color: #008000;">'bool'</span>, required=<span style="color: #D0372D;">False</span>),
<span style="color: #008000;">'preferred_outputs'</span>: <span style="color: #006FE0;">dict</span>(default={<span style="color: #008000;">"HDMI"</span>: 8, <span style="color: #008000;">"DP"</span>: 4, <span style="color: #008000;">"DVI"</span>: 2, <span style="color: #008000;">"VGA"</span>: 1, <span style="color: #008000;">"TV"</span>: 0}, <span style="color: #006FE0;">type</span>=<span style="color: #008000;">'dict'</span>, required=<span style="color: #D0372D;">False</span>),
<span style="color: #008000;">'preferred_refreshrates'</span>: <span style="color: #006FE0;">dict</span>(default={50: 8, 60: 4, 75: 3, 30: 2, 25: 1}, <span style="color: #006FE0;">type</span>=<span style="color: #008000;">'dict'</span>, required=<span style="color: #D0372D;">False</span>),
<span style="color: #008000;">'preferred_resolutions'</span>: <span style="color: #006FE0;">dict</span>(default={<span style="color: #008000;">"7680x4320"</span>: 8, <span style="color: #008000;">"3840x2160"</span>: 4, <span style="color: #008000;">"1920x1080"</span>: 2, <span style="color: #008000;">"1280x720"</span>: 1, <span style="color: #008000;">"720x576"</span>: 0},
<span style="color: #006FE0;">type</span>=<span style="color: #008000;">'dict'</span>, required=<span style="color: #D0372D;">False</span>),
}
<span style="color: #BA36A5;">Mode</span> = namedtuple(<span style="color: #008000;">'Mode'</span>, [<span style="color: #008000;">'score'</span>, <span style="color: #008000;">'connection'</span>, <span style="color: #008000;">'resolution'</span>, <span style="color: #008000;">'refreshrate'</span>])
<span style="color: #0000FF;">class</span> <span style="color: #6434A3;">ModelineTools</span>(<span style="color: #006FE0;">object</span>):
<span style="color: #0000FF;">def</span> <span style="color: #006699;">__init__</span>(<span style="color: #0000FF;">self</span>, preferred_outputs, preferred_resolutions, preferred_refreshrates):
<span style="color: #0000FF;">self</span>.preferred_outputs = preferred_outputs
<span style="color: #0000FF;">self</span>.preferred_resolutions = preferred_resolutions
<span style="color: #0000FF;">self</span>.preferred_refreshrates = preferred_refreshrates
<span style="color: #0000FF;">def</span> <span style="color: #006699;">get_score</span>(<span style="color: #0000FF;">self</span>, connection, resolution, refreshrate):
<span style="color: #BA36A5;">connection</span> = connection.split(<span style="color: #008000;">'-'</span>)[0]
<span style="color: #BA36A5;">score</span> = <span style="color: #0000FF;">self</span>.preferred_refreshrates.get(<span style="color: #006FE0;">int</span>(refreshrate), 0)
<span style="color: #BA36A5;">score</span> = score &lt;&lt; 4
<span style="color: #BA36A5;">score</span> += <span style="color: #0000FF;">self</span>.preferred_resolutions.get(resolution, 0)
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">score = score &lt;&lt; 4</span>
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">score += self.preferred_outputs.get(connection, 0)</span>
<span style="color: #0000FF;">return</span> score
<span style="color: #6434A3;">@staticmethod</span>
<span style="color: #0000FF;">def</span> <span style="color: #006699;">cleanup_refreshrate</span>(refreshrate):
<span style="color: #BA36A5;">rrate</span> = refreshrate.replace(<span style="color: #008000;">'+'</span>, <span style="color: #008000;">''</span>).replace(<span style="color: #008000;">'*'</span>, <span style="color: #008000;">''</span>).replace(<span style="color: #008000;">' '</span>, <span style="color: #008000;">''</span>).strip()
<span style="color: #0000FF;">return</span> <span style="color: #006FE0;">int</span>(<span style="color: #006FE0;">round</span>(ast.literal_eval(rrate)))
<span style="color: #0000FF;">def</span> <span style="color: #006699;">sort_mode</span>(<span style="color: #0000FF;">self</span>, mode):
<span style="color: #BA36A5;">x</span>, <span style="color: #BA36A5;">y</span> = mode.resolution.split(<span style="color: #008000;">'x'</span>)
<span style="color: #BA36A5;">connection</span> = mode.connection.split(<span style="color: #008000;">'-'</span>)[0]
<span style="color: #0000FF;">return</span> (mode.score, <span style="color: #006FE0;">int</span>(x), <span style="color: #006FE0;">int</span>(y), <span style="color: #0000FF;">self</span>.preferred_outputs.get(connection, 0))
<span style="color: #0000FF;">def</span> <span style="color: #006699;">main</span>():
<span style="color: #BA36A5;">module</span> = AnsibleModule(argument_spec=arg_specs, supports_check_mode=<span style="color: #D0372D;">False</span>,)
<span style="color: #BA36A5;">display_list</span> = module.params[<span style="color: #008000;">'display'</span>]
<span style="color: #BA36A5;">preferred_outputs</span> = module.params[<span style="color: #008000;">'preferred_outputs'</span>]
<span style="color: #BA36A5;">preferred_resolutions</span> = module.params[<span style="color: #008000;">'preferred_resolutions'</span>]
<span style="color: #BA36A5;">preferred_refreshrates</span> = module.params[<span style="color: #008000;">'preferred_refreshrates'</span>]
<span style="color: #BA36A5;">mtools</span> = ModelineTools(preferred_outputs, preferred_resolutions, preferred_refreshrates)
<span style="color: #BA36A5;">modes</span> = []
<span style="color: #BA36A5;">displays</span> = {}
<span style="color: #BA36A5;">data</span> = {}
<span style="color: #0000FF;">for</span> display <span style="color: #0000FF;">in</span> display_list:
<span style="color: #8D8D84;"># </span><span style="color: #8D8D84; font-style: italic;">call xrandr</span>
<span style="color: #0000FF;">try</span>:
<span style="color: #BA36A5;">xrandr_data</span> = subprocess.check_output([<span style="color: #008000;">'xrandr'</span>, <span style="color: #008000;">'-q'</span>,<span style="color: #008000;">'-d'</span>, display],
universal_newlines=<span style="color: #D0372D;">True</span>)
<span style="color: #0000FF;">except</span>: <span style="color: #0000FF;">continue</span>
<span style="color: #0000FF;">for</span> line <span style="color: #0000FF;">in</span> xrandr_data.splitlines():
<span style="color: #0000FF;">if</span> line.startswith(<span style="color: #008000;">'Screen'</span>):
<span style="color: #BA36A5;">screen</span> = line.split(<span style="color: #008000;">':'</span>)[0].split()[-1]
<span style="color: #BA36A5;">screen</span> = <span style="color: #008000;">"Screen{}"</span>.<span style="color: #006FE0;">format</span>(screen)
<span style="color: #BA36A5;">displays</span>[screen] = {}
<span style="color: #0000FF;">elif</span> <span style="color: #008000;">'connected'</span> <span style="color: #0000FF;">in</span> line:
<span style="color: #BA36A5;">connection</span> = line.split()[0]
displays[screen][connection] = {}
<span style="color: #0000FF;">if</span> <span style="color: #008000;">'disconnected'</span> <span style="color: #0000FF;">in</span> line:
displays[screen][connection][<span style="color: #008000;">'connected'</span>] = <span style="color: #D0372D;">False</span>
<span style="color: #0000FF;">else</span>:
displays[screen][connection][<span style="color: #008000;">'connected'</span>] = <span style="color: #D0372D;">True</span>
displays[screen][connection][<span style="color: #008000;">'modes'</span>] = OrderedDict(
<span style="color: #006FE0;">sorted</span>({}.items(), key=<span style="color: #0000FF;">lambda</span> t: t.split(<span style="color: #008000;">'_'</span>)[0]))
<span style="color: #0000FF;">elif</span> line.startswith(<span style="color: #008000;">' '</span>):
<span style="color: #BA36A5;">fields</span> = <span style="color: #006FE0;">filter</span>(<span style="color: #D0372D;">None</span>, re.split(r<span style="color: #008000;">'\s{2,}'</span>, line))
<span style="color: #BA36A5;">resolution</span> = fields[0]
<span style="color: #BA36A5;">refreshrates</span> = fields[1:]
<span style="color: #BA36A5;">r</span> = <span style="color: #006FE0;">set</span>()
<span style="color: #0000FF;">for</span> refreshrate <span style="color: #0000FF;">in</span> refreshrates:
<span style="color: #BA36A5;">refreshrate</span> = refreshrate.strip()
<span style="color: #BA36A5;">rrate</span> = mtools.cleanup_refreshrate(refreshrate)
<span style="color: #0000FF;">if</span> <span style="color: #006FE0;">len</span>(refreshrate) &lt; 2:
<span style="color: #0000FF;">continue</span>
<span style="color: #0000FF;">if</span> <span style="color: #008000;">'*'</span> <span style="color: #0000FF;">in</span> refreshrate:
<span style="color: #BA36A5;">current_mode</span> = (resolution, rrate)
displays[screen][connection][<span style="color: #008000;">'current_mode'</span>] = current_mode
<span style="color: #0000FF;">if</span> <span style="color: #008000;">'+'</span> <span style="color: #0000FF;">in</span> refreshrate:
<span style="color: #BA36A5;">preferred_mode</span> = (resolution, rrate)
displays[screen][connection][<span style="color: #008000;">'preferred_mode'</span>] = preferred_mode
r.add(mtools.cleanup_refreshrate(refreshrate))
modes.append(Mode(score=mtools.get_score(connection, resolution, rrate), connection=connection,
resolution=resolution, refreshrate=rrate))
displays[screen][connection][<span style="color: #008000;">'modes'</span>][resolution] = <span style="color: #006FE0;">sorted</span>(r)
<span style="color: #BA36A5;">data</span>[<span style="color: #008000;">'displays'</span>] = displays
<span style="color: #BA36A5;">data</span>[<span style="color: #008000;">'modes'</span>] = modes
<span style="color: #BA36A5;">best_mode</span> = <span style="color: #006FE0;">max</span>(modes, key=mtools.sort_mode)
<span style="color: #BA36A5;">data</span>[<span style="color: #008000;">"best_mode"</span>] = {
<span style="color: #008000;">'connection'</span>: best_mode.connection,
<span style="color: #008000;">'resolution'</span>: best_mode.resolution,
<span style="color: #008000;">'refreshrate'</span>: best_mode.refreshrate,
}
module.exit_json(changed=<span style="color: #D0372D;">False</span>, ansible_facts={<span style="color: #008000;">'xorg'</span>: data})
<span style="color: #0000FF;">if</span> <span style="color: #006FE0;">__name__</span> == <span style="color: #008000;">'__main__'</span>:
main()
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf65c01e" class="outline-2">
<h2 id="orgf65c01e"><span class="section-number-2">7</span> Handlers</h2>
<div class="outline-text-2" id="text-7">
<div class="org-src-container">
<pre class="src src-yaml">- <span style="color: #BA36A5;">name</span>: Restart Samba
<span style="color: #BA36A5;">systemd</span>:
<span style="color: #BA36A5;">name</span>: smbd.service
<span style="color: #BA36A5;">state</span>: restarted
<span style="color: #BA36A5;">enabled</span>: <span style="color: #D0372D;">yes</span>
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">masked: no</span>
<span style="color: #BA36A5;">register</span>: samba_reload
- <span style="color: #BA36A5;">name</span>: Restart NFS Kernel Server
<span style="color: #BA36A5;">systemd</span>:
<span style="color: #BA36A5;">name</span>: nfs-server.service
<span style="color: #BA36A5;">state</span>: restarted
<span style="color: #BA36A5;">enabled</span>: <span style="color: #D0372D;">yes</span>
<span style="color: #8D8D84;">#</span><span style="color: #8D8D84; font-style: italic;">masked: no</span>
<span style="color: #BA36A5;">register</span>: nfs_reload
- <span style="color: #BA36A5;">name</span>: Restart VDR
<span style="color: #BA36A5;">systemd</span>:
<span style="color: #BA36A5;">name</span>: vdr.service
<span style="color: #BA36A5;">state</span>: restarted
<span style="color: #BA36A5;">enabled</span>: <span style="color: #D0372D;">yes</span>
<span style="color: #BA36A5;">register</span>: vdr_restart
</pre>
</div>
</div>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Autor: Alexander Grothe</p>
<p class="date">Created: 2017-03-26 So 13:57</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>