summaryrefslogtreecommitdiffstats
path: root/lib/puppet/provider/host/parsed.rb
blob: c606562a2f71f9e4320c44e5e2f12c302f1d20aa (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
require 'puppet/provider/parsedfile'

Puppet::Type.type(:host).provide :parsed, :parent => Puppet::Provider::ParsedFile do
    @path = "/etc/hosts"
    @filetype = Puppet::FileType.filetype(:flat)

    confine :exists => @path

    # Parse a host file
    #
    # This method also stores existing comments, and it stores all host
    # jobs in order, mostly so that comments are retained in the order
    # they were written and in proximity to the same jobs.
    def self.parse(text)
        count = 0
        instances = []
        text.chomp.split("\n").each { |line|
            hash = {}
            case line
            when /^#/, /^\s*$/:
                # add comments and blank lines to the list as they are
                instances << line 
            else
                if line.sub!(/^(\S+)\s+(\S+)\s*/, '')
                    hash[:ip] = $1
                    hash[:name] = $2

                    unless line == ""
                        line.sub!(/\s*/, '')
                        line.sub!(/^([^#]+)\s*/) do |value|
                            aliases = $1
                            unless aliases =~ /^\s*$/
                                hash[:alias] = aliases.split(/\s+/)
                            end

                            ""
                        end
                    end
                else
                    raise Puppet::Error, "Could not match '%s'" % line
                end

                if hash[:alias] == ""
                    hash.delete(:alias)
                end

                instances << hash

                count += 1
            end
        }

        return instances
    end

    # Convert the current object into a host-style string.
    def self.to_record(hash)
        [:ip, :name].each do |n|
            unless hash.has_key? n
                raise ArgumentError, "%s is a required attribute for hosts" % n
            end
        end

        str = "%s\t%s" % [hash[:ip], hash[:name]]

        if hash.include? :alias
            if hash[:alias].is_a? Array
                str += "\t%s" % hash[:alias].join("\t")
            else
                raise ArgumentError, "Aliases must be specified as an array"
            end
        end

        str
    end
end

# $Id$