vagrant-dnsdock-hostupdater 0.0.21 → 0.0.22

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,51 +0,0 @@
1
- # encoding: UTF-8
2
- =begin
3
- Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
-
5
- This file is part of Hosts.
6
-
7
- Permission to use, copy, modify, and/or distribute this software for any
8
- purpose with or without fee is hereby granted, provided that the above
9
- copyright notice and this permission notice appear in all copies.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
- FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
- PERFORMANCE OF THIS SOFTWARE.
18
- =end
19
-
20
- require 'set'
21
- require 'pathname'
22
- require_relative 'linebreak/linebreak'
23
-
24
- # Namespace for projects of Alexander E. Fischer <aef@raxys.net>.
25
- #
26
- # If you want to be able to simply type Example instead of Aef::Example to
27
- # address classes in this namespace simply write the following before using the
28
- # classes.
29
- #
30
- # @example Including the namespace
31
- # include Aef
32
- # @author Alexander E. Fischer
33
- module Aef
34
-
35
- # Namespace for the hosts library
36
- module Hosts
37
-
38
- # An exception for errors happening while parsing a hosts file
39
- class ParserError < RuntimeError; end
40
- end
41
- end
42
-
43
- require_relative 'hosts/version'
44
- require_relative 'hosts/helpers'
45
- require_relative 'hosts/file'
46
- require_relative 'hosts/element'
47
- require_relative 'hosts/section'
48
- require_relative 'hosts/entry'
49
- require_relative 'hosts/comment'
50
- require_relative 'hosts/empty_element'
51
-
@@ -1,73 +0,0 @@
1
- # encoding: UTF-8
2
- =begin
3
- Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
-
5
- This file is part of Hosts.
6
-
7
- Permission to use, copy, modify, and/or distribute this software for any
8
- purpose with or without fee is hereby granted, provided that the above
9
- copyright notice and this permission notice appear in all copies.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
- FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
- PERFORMANCE OF THIS SOFTWARE.
18
- =end
19
-
20
- require_relative '../hosts'
21
-
22
- module Aef
23
- module Hosts
24
-
25
- # Represents a comment-only line as element of a hosts file
26
- class Comment < Element
27
-
28
- # The comment
29
- #
30
- # @return [String]
31
- attr_reader :comment
32
-
33
- # Initializes a comment
34
- #
35
- # @param comment [String] the comment
36
- # @param options [Hash]
37
- # @option options [String] :cache sets a cached String representation
38
- def initialize(comment, options = {})
39
- validate_options(options, :cache)
40
-
41
- raise ArgumentError, 'Comment cannot be empty' unless comment
42
-
43
- @comment = comment.to_s
44
- @cache = options[:cache].to_s unless options[:cache].nil?
45
- end
46
-
47
- # Sets the comment
48
- def comment=(comment)
49
- set_if_changed(:comment, comment.to_s) do
50
- invalidate_cache!
51
- end
52
- end
53
-
54
- # A String representation for debugging purposes
55
- #
56
- # @return [String]
57
- def inspect
58
- generate_inspect(self, :comment, :cache)
59
- end
60
-
61
- protected
62
-
63
- # Defines the algorithm to generate a String representation from scratch.
64
- #
65
- # @return [String] a generated String representation
66
- def generate_string(options = {})
67
- "##{comment}\n"
68
- end
69
- end
70
-
71
- end
72
- end
73
-
@@ -1,108 +0,0 @@
1
- # encoding: UTF-8
2
- =begin
3
- Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
-
5
- This file is part of Hosts.
6
-
7
- Permission to use, copy, modify, and/or distribute this software for any
8
- purpose with or without fee is hereby granted, provided that the above
9
- copyright notice and this permission notice appear in all copies.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
- FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
- PERFORMANCE OF THIS SOFTWARE.
18
- =end
19
-
20
- require_relative '../hosts'
21
-
22
- module Aef
23
- module Hosts
24
-
25
- # The base class for elements which are aggregated by the Aef::Hosts::File
26
- # class.
27
- #
28
- # @abstract This class is not supposed to be instantiated.
29
- class Element
30
-
31
- include Helpers
32
-
33
- # Cached String representation
34
- #
35
- # @return [String, Hash, nil]
36
- attr_reader :cache
37
-
38
- # Deletes the cached String representation
39
- #
40
- # @return [Aef::Hosts::Element] a self reference
41
- def invalidate_cache!
42
- @cache = nil
43
-
44
- self
45
- end
46
-
47
- # Tells if a String representation is cached or not
48
- #
49
- # @return [true, false] true if cache is not empty
50
- def cache_filled?
51
- @cache ? true : false
52
- end
53
-
54
- # A String representation for debugging purposes
55
- #
56
- # @return [String]
57
- def inspect
58
- generate_inspect(self, :cache)
59
- end
60
-
61
- # Provides a String representation of the element
62
- #
63
- # @param [Hash] options
64
- # @option options [true, false] :force_generation if set to true, the
65
- # cache won't be used, even if it not empty
66
- # @option options [:unix, :windows, :mac] :linebreak_encoding the
67
- # linebreak encoding of the result. If nothing is specified the result
68
- # will be encoded as if :unix was specified.
69
- # @see Aef::Linebreak#encode
70
- def to_s(options = {})
71
- validate_options(options, :force_generation, :linebreak_encoding)
72
-
73
- string = ''
74
-
75
- if !cache_filled? || options[:force_generation]
76
- string << generate_string(options)
77
- else
78
- string << cache_string(options)
79
- end
80
-
81
- if options[:linebreak_encoding]
82
- string = Aef::Linebreak.encode(string, options[:linebreak_encoding])
83
- end
84
-
85
- string
86
- end
87
-
88
- protected
89
-
90
- # Defines the algorithm to generate a String representation from scratch.
91
- #
92
- # @abstract This method needs to be implemented in descendant classes.
93
- # @return [String] a generated String representation
94
- def generate_string(options = {})
95
- raise NotImplementedError
96
- end
97
-
98
- # Defines the algorithm to construct the String representation from cache
99
- #
100
- # @return [String] the cached String representation
101
- def cache_string(options = {})
102
- @cache.dup
103
- end
104
- end
105
-
106
- end
107
- end
108
-
@@ -1,50 +0,0 @@
1
- # encoding: UTF-8
2
- =begin
3
- Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
-
5
- This file is part of Hosts.
6
-
7
- Permission to use, copy, modify, and/or distribute this software for any
8
- purpose with or without fee is hereby granted, provided that the above
9
- copyright notice and this permission notice appear in all copies.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
- FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
- PERFORMANCE OF THIS SOFTWARE.
18
- =end
19
-
20
- require_relative '../hosts'
21
-
22
- module Aef
23
- module Hosts
24
-
25
- # Represents an empty line as element of a hosts file
26
- class EmptyElement < Element
27
-
28
- # Initializes an empty Element
29
- #
30
- # @param [Hash] options
31
- # @option options [String] :cache sets a cached String representation
32
- def initialize(options = {})
33
- validate_options(options, :cache)
34
-
35
- @cache = options[:cache].to_s unless options[:cache].nil?
36
- end
37
-
38
- protected
39
-
40
- # Defines the algorithm to generate a String representation from scratch.
41
- #
42
- # @return [String] a generated String representation
43
- def generate_string(options = {})
44
- "\n"
45
- end
46
-
47
- end
48
- end
49
- end
50
-
@@ -1,123 +0,0 @@
1
- # encoding: UTF-8
2
- =begin
3
- Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
-
5
- This file is part of Hosts.
6
-
7
- Permission to use, copy, modify, and/or distribute this software for any
8
- purpose with or without fee is hereby granted, provided that the above
9
- copyright notice and this permission notice appear in all copies.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
- FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
- PERFORMANCE OF THIS SOFTWARE.
18
- =end
19
-
20
- require_relative '../hosts'
21
-
22
- module Aef
23
- module Hosts
24
-
25
- # Represents an entry line as element of a hosts file
26
- class Entry < Element
27
-
28
- # The network address
29
- #
30
- # @return [String]
31
- attr_reader :address
32
-
33
- # The primary hostname for the address
34
- #
35
- # @return [String]
36
- attr_reader :name
37
-
38
- # Optional comment
39
- #
40
- # @return [String]
41
- attr_reader :comment
42
-
43
- # Optional alias hostnames
44
- #
45
- # @return [Array<String>]
46
- attr_reader :aliases
47
-
48
- # Initializes an entry.
49
- #
50
- # @param [String] address the network address
51
- # @param [String] name the primary hostname for the address
52
- # @param [Hash] options
53
- # @option options [Array<String>] :aliases a list of aliases for the
54
- # address
55
- # @option options [String] :comment a comment for the entry
56
- # @option options [String] :cache a cached String representation
57
- def initialize(address, name, options = {})
58
- validate_options(options, :aliases, :comment, :cache)
59
-
60
- raise ArgumentError, 'Address cannot be empty' unless address
61
- raise ArgumentError, 'Name cannot be empty' unless name
62
-
63
- @address = address.to_s
64
- @name = name.to_s
65
- @aliases = options[:aliases] || []
66
- @comment = options[:comment].to_s unless options[:comment].nil?
67
- @cache = options[:cache].to_s unless options[:cache].nil?
68
- end
69
-
70
- # Sets the network address
71
- def address=(address)
72
- set_if_changed(:address, address.to_s) do
73
- invalidate_cache!
74
- end
75
- end
76
-
77
- # Sets the primary hostname for the address
78
- def name=(name)
79
- set_if_changed(:name, name.to_s) do
80
- invalidate_cache!
81
- end
82
- end
83
-
84
- # Sets the optional comment
85
- def comment=(comment)
86
- set_if_changed(:comment, comment.to_s) do
87
- invalidate_cache!
88
- end
89
- end
90
-
91
- # Sets the optional alias hostnames
92
- def aliases=(aliases)
93
- set_if_changed(:aliases, [*aliases]) do
94
- invalidate_cache!
95
- end
96
- end
97
-
98
- # A String representation for debugging purposes
99
- #
100
- # @return [String]
101
- def inspect
102
- generate_inspect(self, :address, :name, :aliases, :comment, :cache)
103
- end
104
-
105
- protected
106
-
107
- # Defines the algorithm to generate a String representation from scratch.
108
- #
109
- # @abstract This method needs to be implemented in descendant classes.
110
- # @return [String] a generated String representation
111
- def generate_string(options = nil)
112
- if comment
113
- suffix = " ##{comment}\n"
114
- else
115
- suffix = "\n"
116
- end
117
-
118
- [address, name, *aliases].join(' ') << suffix
119
- end
120
-
121
- end
122
- end
123
- end
@@ -1,252 +0,0 @@
1
- # encoding: UTF-8
2
- =begin
3
- Copyright Alexander E. Fischer <aef@raxys.net>, 2012
4
-
5
- This file is part of Hosts.
6
-
7
- Permission to use, copy, modify, and/or distribute this software for any
8
- purpose with or without fee is hereby granted, provided that the above
9
- copyright notice and this permission notice appear in all copies.
10
-
11
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
13
- FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17
- PERFORMANCE OF THIS SOFTWARE.
18
- =end
19
-
20
- require_relative '../hosts'
21
-
22
- module Aef
23
- module Hosts
24
-
25
- # This class represents a hosts file and aggregates its elements.
26
- #
27
- # It is able to parse host files from file-system or String and can
28
- # generate a String representation of itself to String or file-system.
29
- class File
30
-
31
- include Helpers
32
-
33
- # Regular expression to extract a comment line.
34
- #
35
- # @private
36
- COMMENT_LINE_PATTERN = /^\s*#(.*)$/
37
-
38
- # Regular expression to extract section headers and footers.
39
- #
40
- # @private
41
- SECTION_MARKER_PATTERN = /^ -----(BEGIN|END) SECTION (.*)-----(?:[\r])?$/
42
-
43
- # Regular expression to extract entry lines.
44
- #
45
- # @private
46
- ENTRY_LINE_PATTERN = /^([^#]*)(?:#(.*))?$/
47
-
48
- # The hosts file's elements.
49
- #
50
- # @return [Array<Aef::Hosts::Element>]
51
- attr_accessor :elements
52
-
53
- # The filesystem path of the hosts file.
54
- #
55
- # @return [Pathname, nil]
56
- attr_reader :path
57
-
58
- class << self
59
- # Parses a hosts file given as path.
60
- #
61
- # @param [Pathname] path the hosts file path
62
- # @return [Aef::Hosts::File] a file
63
- def read(path)
64
- new(path).read
65
- end
66
-
67
- # Parses a hosts file given as String.
68
- #
69
- # @param [String] data a String representation of the hosts file
70
- # @return [Aef::Hosts::File] a file
71
- def parse(data)
72
- new.parse(data)
73
- end
74
- end
75
-
76
- # Initializes a file.
77
- #
78
- # @param [Pathname] path path to the hosts file
79
- def initialize(path = nil)
80
- reset
81
- self.path = path
82
- end
83
-
84
- # Removes all elements.
85
- #
86
- # @return [Aef::Hosts::File] a self reference
87
- def reset
88
- @elements = []
89
-
90
- self
91
- end
92
-
93
- # Deletes the cached String representations of all elements.
94
- #
95
- # @return [Aef::Hosts::File] a self reference
96
- def invalidate_cache!
97
- elements.each do |element|
98
- element.invalidate_cache!
99
- end
100
-
101
- self
102
- end
103
-
104
- # Sets the filesystem path of the hosts file.
105
- def path=(path)
106
- @path = to_pathname(path)
107
- end
108
-
109
- # Parses a hosts file given as path.
110
- #
111
- # @param [Pathname] path override the path attribute for this operation
112
- # @return [Aef::Hosts::File] a self reference
113
- def read(path = nil)
114
- path = path.nil? ? @path : to_pathname(path)
115
-
116
- raise ArgumentError, 'No path given' unless path
117
-
118
- parse(path.read)
119
-
120
- self
121
- end
122
-
123
- # Parses a hosts file given as String.
124
- #
125
- # @param [String] data a String representation of the hosts file
126
- # @return [Aef::Hosts::File] a self reference
127
- def parse(data)
128
- current_section = self
129
-
130
- data.to_s.lines.each_with_index do |line, line_number|
131
- line = Linebreak.encode(line, :unix)
132
-
133
- if COMMENT_LINE_PATTERN =~ line
134
- comment = $1
135
-
136
- if SECTION_MARKER_PATTERN =~ comment
137
- type = $1
138
- name = $2
139
-
140
- case type
141
- when 'BEGIN'
142
- unless current_section.is_a?(Section)
143
- current_section = Section.new(
144
- name,
145
- :cache => {:header => line, :footer => nil}
146
- )
147
- else
148
- raise ParserError, "Invalid cascading of sections. Cannot start new section '#{name}' without first closing section '#{current_section.name}' on line #{line_number + 1}."
149
- end
150
- when 'END'
151
- if name == current_section.name
152
- current_section.cache[:footer] = line
153
- elements << current_section
154
- current_section = self
155
- else
156
- raise ParserError, "Invalid closing of section. Found attempt to close section '#{name}' in body of section '#{current_section.name}' on line #{line_number + 1}."
157
- end
158
- end
159
- else
160
- current_section.elements << Comment.new(
161
- comment,
162
- :cache => line
163
- )
164
- end
165
- else
166
- ENTRY_LINE_PATTERN =~ line
167
-
168
- entry = $1
169
- comment = $2
170
-
171
- if entry and not entry =~ /^\s+$/
172
-
173
- split = entry.split(/\s+/)
174
- split.shift if split.first == ''
175
-
176
- address, name, *aliases = *split
177
-
178
- current_section.elements << Entry.new(
179
- address, name,
180
- :aliases => aliases,
181
- :comment => comment,
182
- :cache => line
183
- )
184
- else
185
- current_section.elements << EmptyElement.new(
186
- :cache => line
187
- )
188
- end
189
- end
190
- end
191
-
192
- self
193
- end
194
-
195
- # Generates a hosts file and writes it to a path.
196
- #
197
- # @param [Hash] options
198
- # @option options [Pathname] :path overrides the path attribute for this
199
- # operation
200
- # @option options [true, false] :force_generation if set to true, the
201
- # cache won't be used, even if it not empty
202
- # @option options [:unix, :windows, :mac] :linebreak_encoding the
203
- # linebreak encoding of the result. If nothing is specified the result
204
- # will be encoded as if :unix was specified.
205
- # @see Aef::Linebreak#encode
206
- def write(options = {})
207
- validate_options(options, :force_generation, :linebreak_encoding, :path)
208
-
209
- path = options[:path].nil? ? @path : to_pathname(options[:path])
210
-
211
- raise ArgumentError, 'No path given' unless path
212
-
213
- options.delete(:path)
214
-
215
- path.open('w') do |file|
216
- file.write(to_s(options))
217
- end
218
-
219
- true
220
- end
221
-
222
- # A String representation for debugging purposes.
223
- #
224
- # @return [String]
225
- def inspect
226
- generate_inspect(self, :path, :elements)
227
- end
228
-
229
- # A String representation of the hosts file.
230
- #
231
- # @param [Hash] options
232
- # @option options [true, false] :force_generation if set to true, the
233
- # cache won't be used, even if it not empty
234
- # @option options [:unix, :windows, :mac] :linebreak_encoding the
235
- # linebreak encoding of the result. If nothing is specified the result
236
- # will be encoded as if :unix was specified.
237
- # @see Aef::Linebreak#encode
238
- def to_s(options = {})
239
- validate_options(options, :force_generation, :linebreak_encoding)
240
-
241
- string = ''
242
-
243
- @elements.each do |element|
244
- string << element.to_s(options)
245
- end
246
-
247
- string
248
- end
249
-
250
- end
251
- end
252
- end