themis-checker-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/themis/checker/server.rb +142 -0
  3. metadata +114 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fdf356f5322629749d3234c1743645aeac7311a2
4
+ data.tar.gz: d2fea9e5e581f1638273fb9c69b02545776973d1
5
+ SHA512:
6
+ metadata.gz: 1e447789d8308510eeb12a0c65c98fe8aacb2016ad76fe94f5fa79cd0becda1aa606fc47f5b7673a8c4704a228de095eec8c4fd66bc9ae25f23e49bd368442b5
7
+ data.tar.gz: d6ca9e3889e09a6082222ea26dbaf42b1dc850b8c8a45bc464c5c50f988cf562a6661988706156149ac5ac5ae428e3e43e4677b6b98d1cbcb1ed7ac397469da5
@@ -0,0 +1,142 @@
1
+ require 'logger'
2
+ require 'json'
3
+ require 'beaneater'
4
+ require 'themis/checker/result'
5
+
6
+
7
+ module Themis
8
+ module Checker
9
+ class Server
10
+ def initialize
11
+ @logger = self.get_logger
12
+ @beanstalk = nil
13
+ end
14
+
15
+ def run
16
+ @beanstalk = Beaneater.new ENV['BEANSTALKD_URI']
17
+ @logger.info 'Connected to beanstalk server'
18
+
19
+ @beanstalk.jobs.register ENV['TUBE_LISTEN'] do |job|
20
+ job_data = JSON.parse job.body
21
+ job_result = nil
22
+
23
+ case job_data['operation']
24
+ when 'push'
25
+ status, flag_id = self.internal_push(
26
+ job_data['endpoint'],
27
+ job_data['flag_id'],
28
+ job_data['flag']
29
+ )
30
+
31
+ job_result = {
32
+ operation: job_data['operation'],
33
+ status: status,
34
+ flag: job_data['flag'],
35
+ flag_id: flag_id,
36
+ endpoint: job_data['endpoint']
37
+ }
38
+
39
+ @logger.info "PUSH flag #{job_data['flag']} to #{job_data['endpoint']}: result #{status}, flag_id #{flag_id}"
40
+ when 'pull'
41
+ status = self.internal_pull(
42
+ job_data['endpoint'],
43
+ job_data['flag_id'],
44
+ job_data['flag']
45
+ )
46
+
47
+ job_result = {
48
+ operation: job_data['operation'],
49
+ request_id: job_data['request_id'],
50
+ status: status
51
+ }
52
+
53
+ @logger.info "PULL flag #{job_data['flag']} from #{job_data['endpoint']} with flag_id #{job_data['flag_id']}: result #{status}"
54
+ else
55
+ @logger.warn 'Unknown job!'
56
+ end
57
+
58
+ unless job_result.nil?
59
+ report_tube = @beanstalk.tubes[ENV['TUBE_REPORT']]
60
+ report_tube.put job_result.to_json
61
+ end
62
+ end
63
+
64
+ begin
65
+ @beanstalk.jobs.process!
66
+ rescue Interrupt
67
+ @logger.info 'Received shutdown signal'
68
+ end
69
+ @beanstalk.close
70
+ @logger.info 'Disconnected from beanstalk server'
71
+ end
72
+
73
+ def push(endpoint, flag_id, flag)
74
+ raise NotImplementedError, 'Push flag logic not implemented!'
75
+ end
76
+
77
+ def pull(endpoint, flag_id, flag)
78
+ raise NotImplementedError, 'Pull flag logic not implemented!'
79
+ end
80
+
81
+ protected
82
+ def get_logger
83
+ logger = ::Logger.new STDOUT
84
+
85
+ # Setup log formatter
86
+ logger.datetime_format = '%Y-%m-%d %H:%M:%S'
87
+ logger.formatter = proc do |severity, datetime, progname, msg|
88
+ "[#{datetime}] #{severity} -- #{msg}\n"
89
+ end
90
+
91
+ $stdout.sync = ENV['STDOUT_SYNC'] == 'true'
92
+
93
+ # Setup log level
94
+ case ENV['LOG_LEVEL']
95
+ when 'DEBUG'
96
+ logger.level = ::Logger::DEBUG
97
+ when 'INFO'
98
+ logger.level = ::Logger::INFO
99
+ when 'WARN'
100
+ logger.level = ::Logger::WARN
101
+ when 'ERROR'
102
+ logger.level = ::Logger::ERROR
103
+ when 'FATAL'
104
+ logger.level = ::Logger::FATAL
105
+ when 'UNKNOWN'
106
+ logger.level = ::Logger::UNKNOWN
107
+ else
108
+ logger.level = ::Logger::INFO
109
+ end
110
+ logger
111
+ end
112
+
113
+ def internal_push(endpoint, flag_id, flag)
114
+ result, new_flag_id = Themis::Checker::Result::INTERNAL_ERROR, flag_id
115
+ begin
116
+ result, new_flag_id = self.push endpoint, flag_id, flag
117
+ rescue Interrupt
118
+ raise
119
+ rescue Exception => e
120
+ @logger.error e.message
121
+ e.backtrace.each { |line| @logger.error line }
122
+ end
123
+
124
+ return result, new_flag_id
125
+ end
126
+
127
+ def internal_pull(endpoint, flag_id, flag)
128
+ result = Themis::Checker::Result::INTERNAL_ERROR
129
+ begin
130
+ result = self.pull endpoint, flag_id, flag
131
+ rescue Interrupt
132
+ raise
133
+ rescue Exception => e
134
+ @logger.error e.message
135
+ e.backtrace.each { |line| @logger.error line }
136
+ end
137
+
138
+ result
139
+ end
140
+ end
141
+ end
142
+ end
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: themis-checker-server
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Pyatkin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: beaneater
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: themis-checker-result
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Service checker base class for Themis contest checking system
84
+ email: asp@thexyz.net
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - lib/themis/checker/server.rb
90
+ homepage: http://github.com/aspyatkin/themis-checker-server
91
+ licenses:
92
+ - MIT
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '2.0'
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.4.5
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: Themis::Checker::Server
114
+ test_files: []