83fbd820c90979839aca4eea89783bfc196ed7c0
[mirror/dsa-puppet.git] / modules / stunnel4 / manifests / init.pp
1 class stunnel4 {
2     define stunnel_generic($client, $verify, $cafile, $crlfile=false, $accept, $connect, $local=false) {
3         file {
4             "/etc/stunnel":
5                 ensure  => directory,
6                 owner   => root,
7                 group   => root,
8                 mode    => 755,
9                 ;
10             "/etc/stunnel/puppet-${name}.conf":
11                 content => template("stunnel4/stunnel.conf.erb"),
12                 notify  => Exec['restart_stunnel'],
13                 ;
14         }
15     }
16
17     # define an stunnel listener, listening for SSL connections on $accept,
18     # connecting to plaintext service $connect using local source address $local
19     #
20     # unfortunately stunnel is really bad about verifying its peer,
21     # all we can be certain of is that they are signed by our CA,
22     # not who they are.  So do not use in places where the identity of
23     # the caller is important.  Use dsa-portforwarder for that.
24     define stunnel_server($accept, $connect, $local = "127.0.0.1") {
25         stunnel_generic {
26             "${name}":
27                 client => false,
28                 verify => 2,
29                 cafile => "/etc/exim4/ssl/ca.crt",
30                 crlfile => "/etc/exim4/ssl/crl.crt",
31                 accept => "${accept}",
32                 connect => "${connect}",
33                 ;
34         }
35         @ferm::rule {
36             "stunnel-${name}":
37                 description => "stunnel ${name}",
38                 rule => "&SERVICE_RANGE(tcp, ${accept}, \$HOST_DEBIAN_V4)",
39                 ;
40             "stunnel-${name}-v6":
41                 domain          => 'ip6',
42                 description => "stunnel ${name}",
43                 rule => "&SERVICE_RANGE(tcp, ${accept}, \$HOST_DEBIAN_V6)",
44                 ;
45         }
46     }
47     define stunnel_client($accept, $connecthost, $connectport) {
48         file {
49             "/etc/stunnel/puppet-${name}-peer.pem":
50                 # source  => "puppet:///modules/exim/certs/${connecthost}.crt",
51                 content => generate("/bin/cat", "/etc/puppet/modules/exim/files/certs/${connecthost}.crt",
52                                                 "/etc/puppet/modules/exim/files/certs/ca.crt"),
53                 notify  => Exec['restart_stunnel'],
54                 ;
55         }
56         stunnel_generic {
57             "${name}":
58                 client => true,
59                 verify => 3,
60                 cafile => "/etc/stunnel/puppet-${name}-peer.pem",
61                 accept => "${accept}",
62                 connect => "${connecthost}:${connectport}",
63                 require => [ File["/etc/stunnel/puppet-${name}-peer.pem"] ],
64                 ;
65         }
66     }
67
68
69     package {
70         "stunnel4": ensure => installed;
71     }
72
73     file {
74         "/etc/stunnel/stunnel.conf":
75             ensure => absent,
76             require => [ Package['stunnel4'] ],
77             ;
78     }
79
80     exec {
81         "enable_stunnel4":
82                 command => "sed -i -e 's/^ENABLED=/#&/; \$a ENABLED=1 # added by puppet' /etc/default/stunnel4",
83                 unless => "grep -q '^ENABLED=1' /etc/default/stunnel4",
84                 require => [ Package['stunnel4'] ],
85                 ;
86         "restart_stunnel":
87                 command => "true && cd / && env -i /etc/init.d/stunnel4 restart",
88                 require => [ File['/etc/stunnel/stunnel.conf'], Exec['enable_stunnel4'], Package['stunnel4'] ],
89                 refreshonly => true,
90                 ;
91     }
92 }
93
94 # vim:set et:
95 # vim:set sts=4 ts=4:
96 # vim:set shiftwidth=4: