summaryrefslogtreecommitdiff
path: root/manifests/syncthing.pp
blob: 0a308510992ea324a8c71f5bb05621ccf8cd54b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
class profiles::syncthing (
  $data,
  Array[String] $enable_for = [],
  Array[String] $augrules = [],
) {

  case $facts['osfamily'] {
    'Debian': {
      file { '/etc/apt/trusted.gpg.d/syncthing.gpg':
        ensure         => file,
        source         => 'https://syncthing.net/release-key.gpg',
        checksum       => 'sha256',
        checksum_value => 'a3806c3511f2cce3d2f12962f64b58b9192a15c9d862886cc46f9de8a25d7dbf',
      }

      ensure_resource(exec, { 'apt update' => { refreshonly => true }})

      file { '/etc/apt/sources.list.d/syncthing.list':
        content => "deb https://apt.syncthing.net/ syncthing stable\n",
        # TODO more general way to add apt repos
        notify  => Exec['apt update'],
        before  => Package['syncthing']
      }
    }
  }

  package { 'syncthing':
    ensure => installed
  }


  systemd::dropin_file { 'nospam.conf':
    unit    => 'syncthing@.service',
    content => @(EOF)
      [Service]
      ExecStart=
      ExecStart=/bin/bash -c 'set -o pipefail; /usr/bin/syncthing -no-browser -no-restart -logflags=0 | grep -v "INFO: "'
      | EOF
  }

  $enable_for.map |$user| {

    user { $user:
      home       => "/home/${user}",
      managehome => true,
    }

    $dir = "/home/${user}/.config/syncthing"
    file { "/home/${user}/.config":
      ensure => directory,
      owner  => $user,
      group  => $user,
    }
    exec { "/usr/bin/syncthing -generate='${dir}'":
      user    => $user,
      creates => $dir,
    }

    # service { "syncthing@${user}":
    #   enable => true,
    # }

    # augeas { 'syncthing_config':
    #   # context => "/files/home/${user}.config/syncthing/config.xml/configuration",
    #   changes => [
    #     "defvar base /home/${user}/.config/syncthing/",
    #     'set /augeas/load/Xml/incl[1] $base/*.xml',
    #     'load',
    #     'defvar $ctx $base/config.xml/configuration',
    #     'set $ctx/gui/#attribute/enabled false',
    #     'save',
    #     'rm $ctx/folder/',
    #     'set $ctx/folder[0]/#attribute/label Documentns',
    #     'set $ctx/folder[0]/#attribute/path ~/sync/doc',
    #     'set $ctx/folder[0]/#attribute/id rrrr-xxxx',
    #     'set $ctx/folder[0]/#attribute/device[0]/#attribute/id something-really-long',
    #     'save',
    #   ],
    # }

    $device_rules = flatten($data['devices'].map |$name, $d| {
      [
        "defnode node device[#attribute/name=$name] ''",
        "set \$node/#attribute/name ${name}",
        "set \$node/#attribute/id ${d['id']}",
      ]
    })

    $folder_rules = flatten($data['folders'].map |$name, $d| {
      [
        "defnode node folder[#attribute/label=$name] ''",
        "set \$node/#attribute/label ${name}",
        "set \$node/#attribute/path ${d['path']}",
        "set \$node/#attribute/id ${d['id']}",
      ] + flatten($d['devices'].map |$name| {
        alert($name)
        alert($data['devices'][$name])
        [ "set \$node/device[0]/#attribute/id ${data['devices'][$name]['id']}", ]
      })
    })

    augeas { 'syncthing-config':
      lens    => 'Xml.lns',
      incl    => "/home/${user}/.config/syncthing/config.xml",
      context => "/files/home/${user}/.config/syncthing/config.xml/configuration",
      changes => $device_rules + $folder_rules,
      # [
      #   'rm folder/',
      #   'set folder[0]/#attribute/label Documentsn',
      #   'set folder[0]/#attribute/path ~/sync/doc',
      #   # 'set folder[0]/#attribute/id rrrr-xxxx',
      #   # 'set folder[0]/#attribute/device[0]/#attribute/id something-really-long',
      # ],
    }
  }

  # TODO manage synced data


}