icwot 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: de385402f1226360527fe24047fdcdfa43e07a73
4
- data.tar.gz: adc408b40362093aa3e0f84dca6cf197d220b25f
3
+ metadata.gz: 87d7b6e4a3a0b5d5f5310815f6d62dcbb8a7dc68
4
+ data.tar.gz: 5e45269940885f14aa76296bad21d25bb1834ddb
5
5
  SHA512:
6
- metadata.gz: baaa83c802c66bae4cfd6f7c8634fe33f90612fa1b2d867d29aad973f9edc17b512562450b9d61b48dbec75d748fd910ed21f5ddc763924167db6823617a37ee
7
- data.tar.gz: d464c39e9cab1905e59f923be7f5874a2960b264e014899530ffa34d67b4e22a57338cadb1ddb5a8eac8a626be3fc8441e31891d1cf675375df20f32db5a8b59
6
+ metadata.gz: 8dcc6a75b177ba34fc434cce1a795b9b323fca4131ae72d65ff2fc13138cc081ab6265d67d85e69750cc30e84b488583f6077be99fbcecf422c2ce173dd407aa
7
+ data.tar.gz: d564062c6af2afd3f34256e7320b0cdc407cb5821dc886be51c19b84cf191a0ef66c5f562111ce9e7a25334103424787ed26fb99ffe4546484b909f3ca5b48cb
data/bin/icwot CHANGED
@@ -6,123 +6,26 @@ require 'socket'
6
6
  require 'timeout'
7
7
  require 'rest-client'
8
8
  require 'json'
9
+ require 'icwot'
10
+ require 'icwot/client'
11
+ require 'icwot/console'
9
12
 
10
- # determine if a port is used or not
11
- # from http://stackoverflow.com/questions/517219/ruby-see-if-a-port-is-open
12
- def self.is_port_open?(ip, port)
13
- begin
14
- Timeout::timeout(1) do
15
- begin
16
- s = TCPSocket.new(ip, port)
17
- s.close
18
- return true
19
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
20
- return false
21
- end
22
- end
23
- rescue Timeout::Error
24
- end
25
- return false
26
- end
27
-
28
- class Client
29
- attr_accessor :uri, :content_type
30
-
31
- def initialize
32
- @content_type = 'application/json'
33
- end
34
-
35
- def to_xml
36
- "<client xmlns=\"http://jaxb.xwot.first.ch.unifr.diuf\"><uri>#{uri}</uri></client>"
37
- end
38
-
39
- def to_hash
40
- {uri: uri}
41
- end
13
+ console = Console.new
42
14
 
43
- # inspired by http://stackoverflow.com/questions/11897269/get-own-ip-address
44
- def get_ip
45
- ip=Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
46
- ip ? ip.ip_address : '127.0.0.1'
47
- end
48
-
49
- def to_s
50
- case content_type
51
- when 'application/json'
52
- to_hash.to_json
53
- when 'application/xml'
54
- to_xml
55
- end
56
- end
57
- end
58
-
59
- if ARGV.empty?
60
- puts 'you need to provide at least one argument! See icwot -h'
15
+ unless console.parse
16
+ puts console.errors
61
17
  exit 0
62
18
  end
63
- produces = 'application/json'
64
- accept = 'application/json'
65
- port = 4567
66
- host = ''
67
- protocol = 'http://'
68
- log_path = ''
69
- ARGV.each_with_index do |a, index|
70
- case a
71
- when '-h'
72
- puts 'Usage : icwot <host>
73
- -h print help
74
- -l the host is localhost
75
- -c the content-type value for the header application/json by default
76
- -a the accept value for the header text/plain by default
77
- -p the port where to run the server
78
- -t the protocol to use http:// by default
79
- -l where to save the log. By default your-home-directory/log/icwot-{port}-msg.log
80
- host is where to register for the service.
81
- '
82
- exit 0
83
- when '-l'
84
- host='localhost'
85
- when '-c'
86
- produces = ARGV.delete_at index + 1
87
- when '-a'
88
- accept = ARGV.delete_at index + 1
89
- when '-p'
90
- port = ARGV.delete_at(index + 1).to_i
91
- when '-t'
92
- unless (temp = ARGV.delete_at(index + 1)).nil?
93
- protocol = temp
94
- end
95
- when '-l'
96
- log_path = ARGV.delete_at index + 1
97
- else
98
- host += a
99
- end
100
- end
101
19
 
102
- if host == ''
103
- puts 'Host must be set !'
104
- exit 0
105
- end
106
-
107
- if port == 0
108
- puts 'The port must be bigger than 0'
109
- exit 0
110
- end
111
-
112
- if is_port_open?('localhost', port)
20
+ if Icwot.is_port_open?('localhost', console.port)
113
21
  puts 'Port already in use ! Try another one.'
114
22
  exit 0
115
23
  end
116
24
 
117
- client = Client.new
118
- client.uri = "http://#{client.get_ip}:#{port}/"
119
- client.content_type = produces
25
+ client = Client.new(port: console.port, content_type: console.produces)
120
26
 
121
- response = RestClient.post protocol+host, client.to_s, accept: accept, content_type: produces
27
+ RestClient.post console.url, client.to_s, console.header
122
28
 
123
- unless response.code == 200
124
- puts 'Error. Connection not establish with the server.'
125
- exit 0
126
- end
29
+ #TODO handle exception from RestClient
127
30
 
128
- `sinatra_port=#{port} sinatra_log=#{log_path} bundle exec ruby lib/icwot.rb -e production -p #{port}`
31
+ Icwot.run(console.port, console.log_path)
data/icwot.gemspec CHANGED
@@ -5,7 +5,7 @@ require 'icwot/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "icwot"
8
- spec.version = Icwot::VERSION
8
+ spec.version = Icwot::version
9
9
  spec.authors = ["leo"]
10
10
  spec.email = ["facenord.sud@gmail.com"]
11
11
  spec.description = %q{icwot : RESTfull sinatra server providing inversion of control for logging messages from another web-server}
@@ -0,0 +1,38 @@
1
+ class Client
2
+ attr_accessor :uri, :content_type, :port
3
+
4
+ def initialize(options = {})
5
+ @content_type = options[:content_type] || 'application/json'
6
+ @uri = options[:uri]
7
+ @port = options[:port]
8
+ end
9
+
10
+ def uri
11
+ @uri.nil? ? "http://#{get_ip}:#{port}" : @uri
12
+ end
13
+
14
+ def to_s
15
+ case content_type
16
+ when 'application/json'
17
+ to_hash.to_json
18
+ when 'application/xml'
19
+ to_xml
20
+ end
21
+ end
22
+
23
+ protected
24
+
25
+ def to_xml
26
+ "<client xmlns=\"http://jaxb.xwot.first.ch.unifr.diuf\"><uri>#{uri}</uri></client>"
27
+ end
28
+
29
+ def to_hash
30
+ {uri: uri}
31
+ end
32
+
33
+ # inspired by http://stackoverflow.com/questions/11897269/get-own-ip-address
34
+ def get_ip
35
+ ip=Socket.ip_address_list.detect{|intf| intf.ipv4_private?}
36
+ ip ? ip.ip_address : '127.0.0.1'
37
+ end
38
+ end
@@ -0,0 +1,77 @@
1
+ class Console
2
+
3
+ attr_reader :produces, :accept, :port, :host, :protocol, :log_path, :errors
4
+
5
+ def initialize
6
+ @produces = 'application/json'
7
+ @accept = 'application/json'
8
+ @port = 4567
9
+ @host = ''
10
+ @protocol = 'http://'
11
+ @log_path = ''
12
+ @errors = ''
13
+ end
14
+
15
+ def parse
16
+ if ARGV.empty?
17
+ @errors = 'you need to provide at least one argument! See icwot -h'
18
+ return false
19
+ end
20
+ ARGV.each_with_index do |a, index|
21
+ case a
22
+ when '-h'
23
+ puts 'Usage : icwot <host>
24
+ -h print help
25
+ -l the host is localhost
26
+ -c the content-type value for the header application/json by default
27
+ -a the accept value for the header text/plain by default
28
+ -p the port where to run the server
29
+ -t the protocol to use http:// by default
30
+ -l where to save the log. By default your-home-directory/log/icwot-{port}-msg.log
31
+ host is where to register for the service.
32
+ '
33
+ exit 0
34
+ when '-l'
35
+ @host='localhost'
36
+ when '-c'
37
+ @produces = ARGV.delete_at index + 1
38
+ when '-a'
39
+ @accept = ARGV.delete_at index + 1
40
+ when '-p'
41
+ @port = ARGV.delete_at(index + 1).to_i
42
+ when '-t'
43
+ unless (temp = ARGV.delete_at(index + 1)).nil?
44
+ @protocol = temp
45
+ end
46
+ when '-l'
47
+ @log_path = ARGV.delete_at index + 1
48
+ else
49
+ @host += a
50
+ end
51
+ end
52
+ validate
53
+ end
54
+
55
+ def url
56
+ protocol+host
57
+ end
58
+
59
+ def header
60
+ {accept: accept, content_type: produces}
61
+ end
62
+
63
+ private
64
+
65
+ def validate
66
+ if @host == ''
67
+ @errors=('Host must be set !')
68
+ return false
69
+ end
70
+
71
+ if @port == 0
72
+ @errors = 'The port must be bigger than 0'
73
+ return false
74
+ end
75
+ true
76
+ end
77
+ end
@@ -0,0 +1,56 @@
1
+ require 'sinatra/base'
2
+
3
+ class ServerClient < Sinatra::Base
4
+
5
+ # Si le fichier log/msg.log n'existe pas, on le créé, sinon on l'ouvre
6
+ def self.create_or_open_log
7
+ file_name = "icwot-#{settings.port}-msg.log"
8
+ directory_path = "#{Dir.home}/log/"
9
+ Dir.mkdir(directory_path) unless File.exists?(directory_path)
10
+ file = (settings.log_path.nil? || !File.exist?(settings.log_path) ? File.new(directory_path+file_name, 'a+') : File.new(settings.log_path))
11
+ file.sync = true
12
+ file
13
+ end
14
+
15
+ configure do
16
+ set :log_path, nil
17
+
18
+ set :environment, :production
19
+
20
+ enable :logging
21
+ # We put the log level to info
22
+ set :logger_level, :info
23
+ # The logger is at the location log/msg.log
24
+ set :logger_log_file, lambda { create_or_open_log }
25
+ end
26
+
27
+ # POST sur / avec le port par défaut 4567
28
+ post '/' do
29
+ content_type 'text/plain'
30
+ # On enregistre dans un log spécial le body de la requête
31
+ msg.info request.body.read
32
+ logger.info "message saved to #{self.class.logger_log_file.path}"
33
+ # On retourne le code http 200 avec le texte 'ok'
34
+ 'ok'
35
+ end
36
+
37
+ helpers do
38
+ # logger personalisé pour enregistrer les réponses du body
39
+ def msg
40
+ @logger ||= begin
41
+ @logger = ::Logger.new(self.class.logger_log_file)
42
+ @logger.level = ::Logger.const_get((self.class.logger_level || :warn).to_s.upcase)
43
+ @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
44
+ @logger.formatter = proc do |serverity, time, progname, msg|
45
+ # le format est de la sorte:
46
+ #
47
+ # 2013-12-12 00:00:00
48
+ # "message body"
49
+
50
+ "#{time} :\n\"#{msg}\"\n\n"
51
+ end
52
+ @logger
53
+ end
54
+ end
55
+ end
56
+ end
data/lib/icwot/version.rb CHANGED
@@ -1,3 +1,5 @@
1
1
  module Icwot
2
- VERSION = '0.1.1'
2
+ def self.version
3
+ '0.2.0'
4
+ end
3
5
  end
data/lib/icwot.rb CHANGED
@@ -1,51 +1,31 @@
1
1
  require "icwot/version"
2
- require 'sinatra'
2
+ require 'icwot/server_client'
3
3
 
4
- configure do
5
- # We put the log level to info
6
- set :logger_level, :info
7
- # The logger is at the location log/msg.log
8
- set :logger_log_file, lambda { create_or_open_log }
9
- end
10
-
11
- # POST sur / avec le port 4567
12
- post '/' do
13
- content_type 'text/plain'
14
- # On enregistre dans un log spécial le body de la requête
15
- msg.info request.body.read
16
- logger.info "message saved to #{self.class.logger_log_file.path}"
17
- # On retourne le code http 200 avec le texte 'ok'
18
- 'ok'
19
- end
20
-
21
- helpers do
22
- # logger personalisé pour enregistrer les réponses du body
23
- def msg
24
- @logger ||= begin
25
- @logger = ::Logger.new(self.class.logger_log_file)
26
- @logger.level = ::Logger.const_get((self.class.logger_level || :warn).to_s.upcase)
27
- @logger.datetime_format = "%Y-%m-%d %H:%M:%S"
28
- @logger.formatter = proc do |serverity, time, progname, msg|
29
- # le format et de la sorte:
30
- #
31
- # 2013-12-12 00:00:00
32
- # "message body"
4
+ module Icwot
5
+ def self.run(port, log_path)
6
+ app = ServerClient.new
7
+ app.settings.port = port
8
+ app.settings.log_path = log_path
9
+ app.settings.run!
10
+ end
33
11
 
34
- "#{time} :\n\"#{msg}\"\n\n"
12
+ # determine if a port is used or not
13
+ # from http://stackoverflow.com/questions/517219/ruby-see-if-a-port-is-open
14
+ def self.is_port_open?(ip, port)
15
+ begin
16
+ Timeout::timeout(1) do
17
+ begin
18
+ s = TCPSocket.new(ip, port)
19
+ s.close
20
+ return true
21
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
22
+ return false
23
+ end
35
24
  end
36
- @logger
25
+ rescue Timeout::Error
37
26
  end
27
+ return false
38
28
  end
39
29
  end
40
30
 
41
- private
42
31
 
43
- # Si le fichier log/msg.log n'existe pas, on le créé, sinon on l'ouvre
44
- def create_or_open_log
45
- file_name = "icwot-#{ENV['sinatra_port']}-msg.log"
46
- directory_path = "#{Dir.home}/log/"
47
- Dir.mkdir(directory_path) unless File.exists?(directory_path)
48
- file = ((log_path = ENV['sinatra_log']) == '' && !File.exist?(log_path) ? File.new(directory_path+file_name, 'a+') : File.new(ENV['sinatra_log']))
49
- file.sync = true
50
- file
51
- end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: icwot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - leo
@@ -107,10 +107,12 @@ files:
107
107
  - Gemfile
108
108
  - LICENSE.txt
109
109
  - README.md
110
- - Rakefile
111
110
  - bin/icwot
112
111
  - icwot.gemspec
113
112
  - lib/icwot.rb
113
+ - lib/icwot/client.rb
114
+ - lib/icwot/console.rb
115
+ - lib/icwot/server_client.rb
114
116
  - lib/icwot/version.rb
115
117
  homepage: https://github.com/facenord-sud/icwot
116
118
  licenses:
data/Rakefile DELETED
@@ -1 +0,0 @@
1
- require "bundler/gem_tasks"