summaryrefslogtreecommitdiff
path: root/manifests/manage.pp
blob: e0f2d013b925bd52266cedb2a73caddfecbcd525 (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#
# User module based on git://git.puppet.immerda.ch/module-user.git
#
# Password hash can be generated with mkpasswd provided by whois
# debian package: mkpasswd -m sha-256, see crypt(3) for details
# on supported hashes.
#
define user::manage(
  $password,
  $ensure          = present,
  $uid             = false,
  $gid             = 'uid',
  $groups          = [],
  $managehome      = true,
  $homedir_mode    = '0750',
  $comment         = 'absent',
  $homedir         = 'absent',
  $shell           = 'absent',
  $sshkey          = 'absent',
  $sshkey_options  = [],
  $sshkey_type     = 'absent',
  $membership      = 'minimum',
  $ticket          = false) {

  $real_groups = $groups ? {
    '' => [ "$title", ],
    default => $groups,
  }

  $real_homedir = $homedir ? {
    'absent' => "/home/$name",
    default  => $homedir,
  }

  $real_name_comment = $comment ? {
    'absent' => $name,
    default  => $comment,
  }

  $real_sshkey_type = $sshkey_type ? {
    'absent' => "ssh-rsa",
    default  => $sshkey_type,
  }

  $real_shell = $shell ? {
    'absent' => $operatingsystem ? {
      openbsd => "/usr/local/bin/bash",
      default => "/bin/bash",
    },
    default => $shell,
  }

  if $managehome == true {
    if $ensure == 'absent' {
      file{ "$real_homedir":
        ensure  => absent,
        purge   => true,
        force   => true,
        recurse => true,
      }
    } else {
      file{ "$real_homedir":
        ensure  => directory,
        require => User[$name],
        owner   => $name,
        mode    => $homedir_mode;
      }
      case $gid {
        'absent','uid': {
          File[$real_homedir]{
            group => $name,
          }
        }
        default: {
          File[$real_homedir]{
            group => $gid,
          }
        }
      }
    }
  } else {
    if $managehome != false {
      if !defined(File[$managehome]) {
        file { $managehome:
          ensure  => present,
          owner   => $name,
          mode    => $homedir_mode,
          require => User[$name],
        }
      }

      case $gid {
        'absent','uid': {
          File[$managehome] {
            group => $name,
          }
        }
        default: {
          File[$managehome] {
            group => $gid,
          }
        }
      }

      file{ "$real_homedir":
          ensure  => $managehome,
          require => File[$managehome],
      }
    }
  }

  if $gid != 'absent' {
    if $gid == 'uid' {
      if $uid != 'absent' {
        $real_gid = $uid
      } else {
        $real_gid = false
      }
    } else {
      $real_gid = $gid
    }
  } else {
    $real_gid = false
  }

  user { "$title":
    ensure     => $ensure,
    allowdupe  => false,
    comment    => "$real_name_comment",
    home       => $real_homedir,
    managehome => $managehome,
    shell      => $real_shell,
    groups     => $real_groups,
    membership => $membership,
    password   => $password,
    uid        => $uid      ? { false => undef, default => $uid },
    gid        => $real_gid ? { false => undef, default => $real_gid },
  }

  if $sshkey != 'absent' {
    ssh_authorized_key { "$title":
      ensure  => $ensure,
      key     => $sshkey,
      user    => $title,
      options => $sshkey_options,
      type    => $real_sshkey_type,
      target  => "$real_homedir/.ssh/authorized_keys",
      require => User["$title"],
    }
  }
}