summaryrefslogtreecommitdiffstats
path: root/lib/puppet/type/k5login.rb
blob: 850e3773358d68d4075cd1767f8c5ab41194fbe8 (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
# $Id: k5login.rb 2468 2007-08-07 23:30:20Z digant $
#
# Plug-in type for handling k5login files

Puppet::Type.newtype(:k5login) do
  @doc = "Manage the .k5login file for a user.  Specify the full path to
    the .k5login file as the name and an array of principals as the
    property principals."

  ensurable

  # Principals that should exist in the file
  newproperty(:principals, :array_matching => :all) do
    desc "The principals present in the .k5login file."
  end

  # The path/name of the k5login file
  newparam(:path) do
    isnamevar
    desc "The path to the file to manage.  Must be fully qualified."

    validate do |value|
      unless value =~ /^#{File::SEPARATOR}/
        raise Puppet::Error, "File paths must be fully qualified"
      end
    end
  end

  # To manage the mode of the file
  newproperty(:mode) do
    desc "Manage the k5login file's mode"
    defaultto { "644" }
  end

  provide(:k5login) do
    desc "The k5login provider is the only provider for the k5login
      type."

    # Does this file exist?
    def exists?
      File.exists?(@resource[:name])
    end

    # create the file
    def create
      write(@resource.should(:principals))
      should_mode = @resource.should(:mode)
      unless self.mode == should_mode
        self.mode = should_mode
      end
    end

    # remove the file
    def destroy
      File.unlink(@resource[:name])
    end

    # Return the principals
    def principals(dummy_argument=:work_arround_for_ruby_GC_bug)
      if File.exists?(@resource[:name])
        File.readlines(@resource[:name]).collect { |line| line.chomp }
      else
        :absent
      end
    end

    # Write the principals out to the k5login file
    def principals=(value)
      write(value)
    end

    # Return the mode as an octal string, not as an integer
    def mode
      "%o" % (File.stat(@resource[:name]).mode & 007777)
    end

    # Set the file mode, converting from a string to an integer.
    def mode=(value)
      File.chmod(Integer("0#{value}"), @resource[:name])
    end

    private
    def write(value)
      File.open(@resource[:name], "w") { |f| f.puts value.join("\n") }
    end
  end
end