anikkar-klarlack 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Max Schöfmann
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,43 @@
1
+ = klarlack
2
+
3
+ Klarlack is a ruby client library for the varnish administration interface.
4
+
5
+ See also: http://www.varnish-cache.org
6
+
7
+ Please note: You need at least version 2.0.3 of varnish for purging to work.
8
+
9
+ === Installation (from gemcutter.org)
10
+
11
+ sudo gem install klarlack
12
+
13
+ === Example
14
+
15
+ Lets purge all blog posts from the cache...
16
+
17
+ require 'rubygems'
18
+ require 'klarlack'
19
+
20
+ varnish = Varnish::Client.new '127.0.0.1:6082'
21
+ # the regexp is not a ruby regexp, just a plain string varnishd understands
22
+ varnish.purge :url, "^/posts/.*"
23
+
24
+ In a Rails app, you might want to use use this in a cache sweeper.
25
+
26
+ === Specs
27
+
28
+ Start up a local varnishd with <tt>-T 127.0.0.1:6082</tt>. Then run
29
+
30
+ spec spec
31
+
32
+ === TODO
33
+
34
+ * Support authentication when varnishd is started with <tt>-S</tt>
35
+ * Make parameter manipulation/display more friendly
36
+
37
+ === WTF?
38
+
39
+ http://dict.leo.org/?search=klarlack
40
+
41
+ === Copyright
42
+
43
+ Copyright (c) 2009-2010 Max Schöfmann. Distributed under the MIT-License
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "klarlack"
8
+ gem.summary = %Q{ruby client for varnishd's admin interface}
9
+ gem.email = "max@pragmatic-it.de"
10
+ gem.homepage = "http://github.com/schoefmax/klarlack"
11
+ gem.authors = ["Max Schöfmann"]
12
+
13
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
14
+ end
15
+ rescue LoadError
16
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
17
+ end
18
+
19
+ require 'spec/rake/spectask'
20
+ Spec::Rake::SpecTask.new(:spec) do |spec|
21
+ spec.libs << 'lib' << 'spec'
22
+ spec.spec_files = FileList['spec/**/*_spec.rb']
23
+ end
24
+
25
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
26
+ spec.libs << 'lib' << 'spec'
27
+ spec.pattern = 'spec/**/*_spec.rb'
28
+ spec.rcov = true
29
+ end
30
+
31
+
32
+ task :default => :spec
33
+
34
+ require 'rake/rdoctask'
35
+ Rake::RDocTask.new do |rdoc|
36
+ if File.exist?('VERSION.yml')
37
+ config = YAML.load(File.read('VERSION.yml'))
38
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
39
+ else
40
+ version = ""
41
+ end
42
+
43
+ rdoc.rdoc_dir = 'rdoc'
44
+ rdoc.title = "klarlack #{version}"
45
+ rdoc.rdoc_files.include('README*')
46
+ rdoc.rdoc_files.include('lib/**/*.rb')
47
+ end
48
+
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 0
3
+ :patch: 7
4
+ :major: 0
@@ -0,0 +1,7 @@
1
+ require 'socket'
2
+ require 'varnish/socket_factory'
3
+ require 'varnish/client'
4
+
5
+ module Varnish
6
+ VERSION = '0.0.7'
7
+ end
@@ -0,0 +1,316 @@
1
+ module Varnish
2
+ class Error < StandardError; end
3
+ class BrokenConnection < Error; end
4
+ class CommandFailed < Error; end
5
+ class Client
6
+ # Default management port of varnishd
7
+ DEFAULT_PORT = 6082
8
+
9
+ # We assume varnishd on localhost
10
+ DEFAULT_HOST = 'localhost'
11
+
12
+ DEFAULT_OPTS = {
13
+ :keep_alive => false,
14
+ :timeout => 1
15
+ }
16
+
17
+ # timeout in seconds when connecting to varnishd. Default is 1
18
+ attr_accessor :timeout
19
+
20
+ # set to true, to keep the connection alive. Default is false
21
+ attr_accessor :keep_alive
22
+
23
+ # hostname or IP-address of varnishd. Default is "localhost"
24
+ attr_accessor :host
25
+
26
+ # port number of varnishd. Default is 6082
27
+ attr_accessor :port
28
+
29
+ # Examples:
30
+ #
31
+ # Varnish::Client.new "127.0.0.1"
32
+ # Varnish::Client.new "mydomain.com:6082"
33
+ # Varnish::Client.new :timeout => 5
34
+ # Varnish::Client.new "10.0.0.3:6060", :timeout => nil, :keep_alive => true
35
+ #
36
+ # === Configuration options
37
+ #
38
+ # +timeout+:: if specified (seconds), calls to varnish
39
+ # will be wrapped in a timeout, default is 1 second.
40
+ # Disable with <tt>:timeout => nil</tt>
41
+ # +keep_alive+:: if true, the connection is kept alive by sending
42
+ # ping commands to varnishd every few seconds
43
+ def initialize(*args)
44
+ opts = {}
45
+
46
+ case args.length
47
+ when 0
48
+ self.server = DEFAULT_HOST
49
+ when 1
50
+ arg = args[0]
51
+ case arg
52
+ when String
53
+ self.server = arg
54
+ when Hash
55
+ self.server = DEFAULT_HOST
56
+ opts = arg
57
+ end
58
+ when 2
59
+ self.server = args[0]
60
+ opts = args[1]
61
+ else
62
+ raise ArgumentError, "wrong number of arguments (#{args.length} for 2)"
63
+ end
64
+
65
+ opts = DEFAULT_OPTS.merge(opts)
66
+ @timeout = opts[:timeout]
67
+ @keep_alive = opts[:keep_alive]
68
+
69
+ @mutex = Mutex.new
70
+ end
71
+
72
+ # Set the varnishd management host and port.
73
+ # Expects a string as "hostname" or "hostname:port"
74
+ def server=(server)
75
+ @host, @port = server.split(':')
76
+ @port = (@port || DEFAULT_PORT).to_i
77
+ server
78
+ end
79
+
80
+ # Returns the varnishd management host and port as "hostname:port"
81
+ def server
82
+ "#{@host}:#{@port}"
83
+ end
84
+
85
+ # Manipulate the VCL configuration
86
+ #
87
+ # .vcl :load, <configname>, <filename>
88
+ # .vcl :inline, <configname>, <quoted_VCLstring>
89
+ # .vcl :use, <configname>
90
+ # .vcl :discard, <configname>
91
+ # .vcl :list
92
+ # .vcl :show, <configname>
93
+ #
94
+ # Returns an array of VCL configurations for :list, and the servers
95
+ # response as string otherwise
96
+ #
97
+ # Ex.:
98
+ # v = Varnish::Client.new
99
+ # v.vcl :list
100
+ # #=> [["active", 0, "boot"]]
101
+ #
102
+ # v.vcl :load, "newconf", "/etc/varnish/myconf.vcl"
103
+ #
104
+ #
105
+ def vcl(op, *params)
106
+ response = cmd("vcl.#{op}", *params)
107
+ case op
108
+ when :list
109
+ response.split("\n").map do |line|
110
+ a = line.split(/\s+/, 3)
111
+ [a[0], a[1].to_i, a[2]]
112
+ end
113
+ else
114
+ response
115
+ end
116
+ end
117
+
118
+ # Purge objects from the cache or show the purge queue.
119
+ #
120
+ # Takes one or two arguments:
121
+ #
122
+ # 1.
123
+ # .purge :url, <regexp>
124
+ # .purge :hash, <regexp>
125
+ #
126
+ # <regexp> is a string containing a varnish compatible regexp
127
+ #
128
+ # 2.
129
+ # .purge <costum-purge-conditions>
130
+ # .purge :list
131
+ #
132
+ # Returns true for purging, returns an array containing the purge queue
133
+ # for :list
134
+ #
135
+ # Ex.:
136
+ # v = Varnish::Client.new
137
+ # v.purge :url, '.*'
138
+ #
139
+ # v.purge "req.http.host ~ www.foo.com && req.http.url ~ images"
140
+ #
141
+ # v.purge :list
142
+ # #=> [[1, "req.url ~ .*"]]
143
+ #
144
+ def purge(*args)
145
+ c = 'purge'
146
+ c << ".#{args.shift}" if [:url, :hash, :list].include?(args.first)
147
+ response = cmd(c, *args)
148
+ case c
149
+ when 'purge.list'
150
+ response.split("\n").map do |line|
151
+ a = line.split("\t")
152
+ [a[0].to_i, a[1]]
153
+ end
154
+ else
155
+ bool response
156
+ end
157
+ end
158
+
159
+ # Ban objects from the cache or show the ban queue.
160
+ #
161
+ # Takes one or two arguments:
162
+ #
163
+ # 1.
164
+ # .ban :url, <regexp>
165
+ #
166
+ # <regexp> is a string containing a varnish compatible regexp
167
+ #
168
+ # 2.
169
+ # .ban <costum-purge-conditions>
170
+ # .ban :list
171
+ #
172
+ # Returns true for banning, returns an array containing the ban queue
173
+ # for :list
174
+ #
175
+ # Ex.:
176
+ # v = Varnish::Client.new
177
+ # v.ban :url, '.*'
178
+ #
179
+ # v.ban "req.http.host ~ www.foo.com && req.http.url ~ images"
180
+ #
181
+ # v.ban :list
182
+ # #=> [[1, "req.url ~ .*"]]
183
+ #
184
+ def ban(*args)
185
+ c = 'ban'
186
+ c << ".#{args.shift}" if [:url, :list].include?(args.first)
187
+ response = cmd(c, *args)
188
+ case c
189
+ when 'ban.list'
190
+ response.split("\n").map do |line|
191
+ a = line.split("\t")
192
+ [a[0].to_i, a[1]]
193
+ end
194
+ else
195
+ bool response
196
+ end
197
+ end
198
+
199
+ # Ping the server to keep the connection alive
200
+ def ping(timestamp = nil)
201
+ cmd("ping", timestamp)
202
+ end
203
+
204
+ # Returns a hash of status information
205
+ #
206
+ # Ex.:
207
+ # v = Varnish::Client.new
208
+ # v.stats
209
+ # => {"Total header bytes"=>0, "Cache misses"=>0 ...}
210
+ def stats
211
+ result = cmd("stats")
212
+ Hash[*result.split("\n").map { |line|
213
+ stat = line.strip!.split(/\s+/, 2)
214
+ [stat[1], stat[0].to_i]
215
+ }.flatten
216
+ ]
217
+ end
218
+
219
+ # Set and show parameters
220
+ #
221
+ # .param :show, [-l], [<param>]
222
+ # .param :set, <param>, <value>
223
+ def param(op, *args)
224
+ cmd("param.#{op}", *args)
225
+ end
226
+
227
+ # Returns the status string from varnish.
228
+ # See also #running? and #stopped?
229
+ def status
230
+ cmd("status")
231
+ end
232
+
233
+ def start
234
+ bool cmd("start")
235
+ end
236
+
237
+ def stop
238
+ bool cmd("stop")
239
+ end
240
+
241
+ def running?
242
+ bool status =~ /running/
243
+ end
244
+
245
+ def stopped?
246
+ bool status =~ /stopped/
247
+ end
248
+
249
+ # close the connection to varnishd.
250
+ # Note that the connection will automatically be re-established
251
+ # when another command is issued.
252
+ def disconnect
253
+ if connected?
254
+ @conn.write "quit\n"
255
+ @conn.gets
256
+ @conn.close unless @conn.closed?
257
+ end
258
+ end
259
+
260
+ def connected?
261
+ bool @conn && !@conn.closed?
262
+ end
263
+
264
+ private
265
+
266
+ # Sends a command to varnishd.
267
+ # Raises a Varnish::CommandFailed error when a non-200 status is returned
268
+ # Returns the response text
269
+ def cmd(name, *params)
270
+ @mutex.synchronize do
271
+ connect unless connected?
272
+ @conn.write "#{name} #{params.join(' ').gsub('\\', '\\\\\\')}\n"
273
+ status, length = conn_gets.split # <status> <content_length>\n
274
+ content = conn_read(length.to_i + 1) # +1 = \n
275
+ content.chomp!
276
+ raise CommandFailed, "Command #{name} returned with status #{status}: #{content}" if status.to_i != 200
277
+ content
278
+ end
279
+ end
280
+
281
+ def connect
282
+ @conn = SocketFactory.tcp_socket(@host, @port, @timeout)
283
+
284
+ # If keep alive, we ping the server every few seconds.
285
+ if @keep_alive
286
+ varnish = self
287
+ Thread.new do
288
+ while(true) do
289
+ if varnish.connected?
290
+ varnish.ping
291
+ sleep 5
292
+ else
293
+ break
294
+ end
295
+ end
296
+ end
297
+ end
298
+
299
+ @conn
300
+ end
301
+
302
+ def conn_gets
303
+ @conn.gets || raise(BrokenConnection, "Expected to read one line from Varnish, got nil")
304
+ end
305
+
306
+ def conn_read(bytes)
307
+ @conn.read(bytes) || raise(BrokenConnection, "Expected to read #{bytes} bytes from Varnish, got nil")
308
+ end
309
+
310
+ # converts +value+ into a boolean
311
+ def bool(value)
312
+ !!value
313
+ end
314
+
315
+ end
316
+ end
@@ -0,0 +1,57 @@
1
+ module Varnish
2
+ # Wrapper around Ruby's Socket.
3
+ #
4
+ # Uses Mike Perhams superior (in both reliability and
5
+ # performance) connection technique with proper timeouts:
6
+ # See: http://github.com/mperham/memcache-client
7
+ class SocketFactory
8
+
9
+ begin
10
+ # Try to use the SystemTimer gem instead of Ruby's timeout library
11
+ # when running on something that looks like Ruby 1.8.x. See:
12
+ # http://ph7spot.com/articles/system_timer
13
+ # We don't want to bother trying to load SystemTimer on jruby and
14
+ # ruby 1.9+.
15
+ if RUBY_VERSION =~ /^1\.8\./ and RUBY_PLATFORM !~ /java/
16
+ require 'system_timer'
17
+ Timer = SystemTimer
18
+ else
19
+ require 'timeout'
20
+ Timer = Timeout
21
+ end
22
+ rescue LoadError => e
23
+ #$stderr.puts "[klarlack] Could not load SystemTimer gem, falling back to Ruby's slower/unsafe timeout library: #{e.message}"
24
+ require 'timeout'
25
+ Timer = Timeout
26
+ end
27
+
28
+ def self.tcp_socket(host, port, timeout = nil)
29
+ addr = Socket.getaddrinfo(host, nil)
30
+ sock = Socket.new(Socket.const_get(addr[0][0]), Socket::SOCK_STREAM, 0)
31
+
32
+ if timeout
33
+ secs = Integer(timeout)
34
+ usecs = Integer((timeout - secs) * 1_000_000)
35
+ optval = [secs, usecs].pack("l_2")
36
+ sock.setsockopt Socket::SOL_SOCKET, Socket::SO_RCVTIMEO, optval
37
+ sock.setsockopt Socket::SOL_SOCKET, Socket::SO_SNDTIMEO, optval
38
+
39
+ # Socket timeouts don't work for more complex IO operations
40
+ # like gets which lay on top of read. We need to fall back to
41
+ # the standard Timeout mechanism.
42
+ sock.instance_eval <<-EOR
43
+ alias :blocking_gets :gets
44
+ def gets
45
+ Timer.timeout(#{timeout}) do
46
+ self.blocking_gets
47
+ end
48
+ end
49
+ EOR
50
+ end
51
+ sock.connect(Socket.pack_sockaddr_in(port, addr[0][3]))
52
+ sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
53
+ sock
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,214 @@
1
+ require 'spec/spec_helper'
2
+
3
+ describe Varnish::Client do
4
+
5
+ before(:each) do
6
+ @varnish = Varnish::Client.new "127.0.0.1:6082"
7
+ end
8
+
9
+ describe '(connection handling)' do
10
+
11
+ it 'should not be connected on object instantiation' do
12
+ @varnish.connected?.should be_false
13
+ end
14
+
15
+ it 'should not raise an error when trying to disconnect a non-connected client' do
16
+ lambda { @varnish.disconnect }.should_not raise_error
17
+ end
18
+
19
+ it 'should automatically connect when a command is issued' do
20
+ @varnish.ping
21
+ @varnish.connected?.should be_true
22
+ end
23
+
24
+ it 'should use timeouts when sending commands' do
25
+ Varnish::SocketFactory::Timer.should_receive(:timeout).and_return("200 0")
26
+ @varnish.timeout = 10
27
+ @varnish.ping
28
+ end
29
+
30
+ it 'should be possible to disable timeouts' do
31
+ Varnish::SocketFactory::Timer.should_not_receive(:timeout)
32
+ @varnish.timeout = nil
33
+ @varnish.ping
34
+ end
35
+
36
+ it '#disconnect should close the connection' do
37
+ @varnish.ping
38
+ @varnish.connected?.should be_true
39
+ @varnish.disconnect
40
+ @varnish.connected?.should be_false
41
+ end
42
+
43
+ it 'given keep_alive is set, the connection should be kept alive with pings' do
44
+ @varnish.keep_alive = true
45
+ @varnish.should_receive :ping
46
+ @varnish.send :connect
47
+ end
48
+
49
+ it 'given keep_alive is not set, no pings should be sent to varnishd' do
50
+ @varnish.keep_alive = false
51
+ @varnish.should_not_receive :ping
52
+ @varnish.send :connect
53
+ end
54
+
55
+ it '#server should return the host and port for the connection' do
56
+ @varnish.host = "foohost"
57
+ @varnish.port = 1234
58
+ @varnish.server.should == "foohost:1234"
59
+ end
60
+
61
+ it '#server= should set the host and port for the connection' do
62
+ @varnish.server = "blahost:9876"
63
+ @varnish.host.should == "blahost"
64
+ @varnish.port.should == 9876
65
+ end
66
+
67
+ end
68
+
69
+ describe '(commands)' do
70
+
71
+ before(:each) do
72
+ ensure_started
73
+ end
74
+
75
+ # ... the specs for #param, #purge, #ban and #vcl could be better ...
76
+
77
+ it '#param should send the param command to varnishd' do
78
+ @varnish.param(:show).should_not be_empty
79
+ end
80
+
81
+ if ENV['VARNISH_3']
82
+ it '#ban should allow purging by url and custom fields' do
83
+ @varnish.ban(:url, '^/articles/.*').should be_true
84
+ @varnish.ban("req.http.host", "~", "www.example.com").should be_true
85
+ @varnish.ban("req.http.host ~ www.example.com").should be_true
86
+ end
87
+
88
+ it '#ban with :list should return an array with queued purges' do
89
+ @varnish.ban(:url, '^/posts/.*')
90
+ list = @varnish.ban(:list)
91
+ list.last[0].should be_kind_of(Integer)
92
+ list.last[1].should == "req.url ~ ^/posts/.*"
93
+ end
94
+ else
95
+ it '#purge should allow purging by url, hash and custom fields' do
96
+ @varnish.purge(:url, '^/articles/.*').should be_true
97
+ @varnish.purge(:hash, 12345).should be_true
98
+ @varnish.purge("req.http.host", "~", "www.example.com").should be_true
99
+ @varnish.purge("req.http.host ~ www.example.com").should be_true
100
+ end
101
+
102
+ it '#purge with :list should return an array with queued purges' do
103
+ @varnish.purge(:url, '^/posts/.*')
104
+ list = @varnish.purge(:list)
105
+ list.last[0].should be_kind_of(Integer)
106
+ list.last[1].should == "req.url ~ ^/posts/.*"
107
+ end
108
+ end
109
+
110
+ it '#vcl with :list should return an array of VCL configurations' do
111
+ list = @varnish.vcl(:list)
112
+ list.should_not be_empty
113
+ list.should be_kind_of(Array)
114
+ list.first[0].should be_kind_of(String)
115
+ list.first[1].should be_kind_of(Integer)
116
+ list.first[2].should be_kind_of(String)
117
+ end
118
+
119
+ it '#ping should send a ping to the server and return a string containing the response' do
120
+ @varnish.ping.should =~ /^PONG \d+/
121
+ end
122
+
123
+
124
+ it '#status should return a string explaining the daemons status' do
125
+ @varnish.status.should =~ /running|stopped|stopping|starting/
126
+ end
127
+
128
+ it "#stats should return a hash containing status information" do
129
+ stats = @varnish.stats
130
+ stats.should_not be_empty
131
+ stats.values.each {|v| v.should be_kind_of(Integer) }
132
+ stats.keys.each {|k| k.should_not be_empty }
133
+ end
134
+
135
+ end
136
+
137
+ describe '(regression)' do
138
+
139
+ unless ENV['VARNISH_3'] #doesn't look like ban takes a hash
140
+ it '#purge.hash with regex containing backslashes should be escaped properly' do
141
+ test_regex = '/home\?x=1'
142
+ @varnish.purge :hash, test_regex
143
+ list = @varnish.purge :list
144
+ list.flatten.join.should include(test_regex)
145
+ end
146
+ end
147
+ end
148
+
149
+ describe '(broken connection)' do
150
+
151
+ before(:each) do
152
+ fake_connection!(:connected => true, :return => "200 1\n")
153
+ end
154
+
155
+ it 'should fail with a Varnish::Error when the connection does return nil for gets' do
156
+ @conn.stub!(:gets).and_return(nil)
157
+ lambda { @varnish.ping }.should raise_error(Varnish::BrokenConnection)
158
+ end
159
+
160
+ it 'should fail with a Varnish::Error when the connection does return nil for read' do
161
+ @conn.stub!(:read).and_return(nil)
162
+ lambda { @varnish.ping }.should raise_error(Varnish::BrokenConnection)
163
+ end
164
+
165
+ end
166
+
167
+ describe '(daemon lifecycle)' do
168
+
169
+ it '#start, #stop, #running?, #stopped? should bahave as advertised' do
170
+ ensure_stopped # issues #stop
171
+ @varnish.stopped?.should be_true
172
+ @varnish.running?.should be_false
173
+ ensure_started # issues #start
174
+ @varnish.stopped?.should be_false
175
+ @varnish.running?.should be_true
176
+ end
177
+
178
+ it 'starting an already started daemon should raise an error' do
179
+ ensure_started
180
+ lambda { @varnish.start }.should raise_error(Varnish::CommandFailed)
181
+ end
182
+
183
+ it 'stopping an already stopped daemon should raise an error' do
184
+ ensure_stopped
185
+ lambda { @varnish.stop }.should raise_error(Varnish::CommandFailed)
186
+ end
187
+
188
+ end
189
+
190
+ def ensure_started
191
+ @varnish.start if @varnish.stopped?
192
+ while(!@varnish.running?) do sleep 0.1 end
193
+ end
194
+
195
+ def ensure_stopped
196
+ @varnish.stop if @varnish.running?
197
+ while(!@varnish.stopped?) do sleep 0.1 end
198
+ end
199
+
200
+ class FakeConn
201
+ attr_accessor :retval
202
+ def read(*args) @retval end
203
+ def gets(*args) @retval end
204
+ def write(str) str.to_s.size end
205
+ end
206
+
207
+ def fake_connection!(opts = {})
208
+ @conn = FakeConn.new
209
+ @conn.retval = opts[:return] || ''
210
+ @varnish.stub!(:connected?).and_return(opts[:connected] || false)
211
+ @varnish.instance_variable_set('@conn', @conn)
212
+ end
213
+
214
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec'
2
+
3
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ require 'klarlack'
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: anikkar-klarlack
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 7
9
+ version: 0.0.7
10
+ platform: ruby
11
+ authors:
12
+ - "Max Sch\xC3\xB6fmann"
13
+ - Arash Nikkar
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-07-26 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description:
23
+ email: max@pragmatic-it.de anikkar@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - LICENSE
30
+ - README.rdoc
31
+ files:
32
+ - LICENSE
33
+ - README.rdoc
34
+ - Rakefile
35
+ - VERSION.yml
36
+ - lib/klarlack.rb
37
+ - lib/varnish/client.rb
38
+ - lib/varnish/socket_factory.rb
39
+ - spec/klarlack_spec.rb
40
+ - spec/spec_helper.rb
41
+ has_rdoc: true
42
+ homepage: https://github.com/anikkar/klarlack
43
+ licenses: []
44
+
45
+ post_install_message:
46
+ rdoc_options:
47
+ - --charset=UTF-8
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ requirements: []
65
+
66
+ rubyforge_project:
67
+ rubygems_version: 1.3.6
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: ruby client for varnishd's admin interface
71
+ test_files:
72
+ - spec/klarlack_spec.rb
73
+ - spec/spec_helper.rb