grafana 1.0.0 → 1.1.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
  SHA256:
3
- metadata.gz: 8e73fd657e1a344d3cb67b5bf01cd33f8e227447e92e6e93b575a51a0091a253
4
- data.tar.gz: c9f41ad884326c341d9c25746bfb80967206c5d0f94ef2bf94a4de6dd7e74435
3
+ metadata.gz: ee4ecb6c21184aee321f81b9d5a5681524da6cac47b736756e8b3b1a4c091eed
4
+ data.tar.gz: 267e82424dad92727eace6b546f2fd436235e51af5b471c806833e4eb3186efe
5
5
  SHA512:
6
- metadata.gz: 4aa2e43dbde3b105b5f85c74ac84a4269cd67d2de6b327cc597854ef1e6e4d66ce52628e9564785a0f1729527e90514e2577c83a651d8fe6c82c765c73a8ecbc
7
- data.tar.gz: 50df29f0e9ad79c5dd7586dd1190585badb8ae3e09b82847433721cded33a6aa562ccba34be65c12356ca00cde64a45a18bf9dde1592af614a52263d71bca2f4
6
+ metadata.gz: 97d4a3aa5740c1992cf706fec3deae4690db5c68f05eb334b828dea74d6173fde86fbb3a53c2afe562d5a299e13a2c5450d4e27bcdf7dae96a146a8b3f2cb770
7
+ data.tar.gz: 5c231dad3f4552d8176b8b0a5653284b3792ec1058c958674a625e99b790d9e51f93eb240ca5f500c94e2cbff23159b2933fac13723cdaa0518b8f808f31176a
data/README.md CHANGED
@@ -33,9 +33,9 @@ You can also run `bin/console` for an interactive prompt that will allow you to
33
33
  To install this gem onto your local machine, run `bundle exec rake install`.
34
34
  To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`,
35
35
  which will create a git tag for the version,
36
- push git commits and tags and push the `.gem` file to [rubygems.org](https://rubygems.org).
36
+ push git commits and tags and push the `.gem` file to [rubygems.org](https://rubygems.org/gems/grafana).
37
37
 
38
38
  ## Contributing
39
39
 
40
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/grafana.
40
+ Bug reports and pull requests are welcome on GitHub at https://github.com/bodsch/grafana.
41
41
 
data/lib/_logging.rb_ ADDED
@@ -0,0 +1,55 @@
1
+
2
+ require 'logger'
3
+
4
+ # -------------------------------------------------------------------------------------------------
5
+
6
+ module Logging
7
+
8
+ def logger
9
+ @logger ||= Logging.logger_for( self.class.name )
10
+ end
11
+
12
+ # Use a hash class-ivar to cache a unique Logger per class:
13
+ @loggers = {}
14
+
15
+ class << self
16
+
17
+ def logger_for( classname )
18
+ @loggers[classname] ||= configure_logger_for( classname )
19
+ end
20
+
21
+ def configure_logger_for( classname )
22
+
23
+ log_level = ENV.fetch('LOG_LEVEL', 'INFO' )
24
+ level = log_level.dup
25
+
26
+ # DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN
27
+ log_level = case level.upcase
28
+ when 'DEBUG'
29
+ Logger::DEBUG # Low-level information for developers.
30
+ when 'INFO'
31
+ Logger::INFO # Generic (useful) information about system operation.
32
+ when 'WARN'
33
+ Logger::WARN # A warning.
34
+ when 'ERROR'
35
+ Logger::ERROR # A handleable error condition.
36
+ when 'FATAL'
37
+ Logger::FATAL # An unhandleable error that results in a program crash.
38
+ else
39
+ Logger::UNKNOWN # An unknown message that should always be logged.
40
+ end
41
+
42
+ $stdout.sync = true
43
+ logger = Logger.new($stdout)
44
+ logger.level = log_level
45
+ logger.datetime_format = "%Y-%m-%d %H:%M:%S %z"
46
+ logger.formatter = proc do |severity, datetime, progname, msg|
47
+ "[#{datetime.strftime( logger.datetime_format )}] #{severity.ljust(5)} #{msg}\n"
48
+ end
49
+
50
+ logger
51
+ end
52
+ end
53
+ end
54
+
55
+ # -------------------------------------------------------------------------------------------------
data/lib/grafana.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- require_relative 'logging'
2
+ # require_relative 'logging'
3
3
  require_relative 'monkey_patches.rb'
4
4
  require_relative 'grafana/client.rb'
5
5
 
@@ -102,7 +102,6 @@ module Grafana
102
102
  # puts alert_id
103
103
  # GET /api/alerts/:id
104
104
 
105
-
106
105
  endpoint = format( '/api/alerts/%d' , alert_id )
107
106
 
108
107
  # puts endpoint
@@ -130,13 +129,18 @@ module Grafana
130
129
  end
131
130
  raise ArgumentError.new('missing \'alert_id\'') if( alert_id.size.zero? )
132
131
 
133
- if(alert_id.is_a?(String))
132
+ if( alert_id.is_a?(String) )
134
133
  data = alerts( alerts: 'all' ).select { |_k,v| v['name'] == alert_id }
135
134
  alert_id = data.keys.first if( data )
136
135
  end
137
136
 
137
+ endpoint = format( '/api/alerts/%d/pause', alert_id )
138
+
139
+ @logger.debug("Attempting pause alert id #{alert_id} (POST #{endpoint})") if @debug
140
+
138
141
  # POST /api/alerts/:id/pause
139
142
  # puts alert_id
143
+ post( endpoint )
140
144
  end
141
145
 
142
146
  # Get alert notifications
@@ -124,8 +124,8 @@ module Grafana
124
124
  time = validate( params, required: false, var: 'time', type: Integer ) || Time.now.to_i
125
125
  time_end = validate( params, required: false, var: 'time_end', type: Integer )
126
126
  region = validate( params, required: false, var: 'region', type: Boolean )
127
- tags = validate( params, required: true, var: 'tags', type: Array )
128
- text = validate( params, required: true, var: 'text', type: String )
127
+ tags = validate( params, required: true , var: 'tags', type: Array )
128
+ text = validate( params, required: true , var: 'text', type: String )
129
129
 
130
130
  if( dashboard.is_a?(String) )
131
131
 
@@ -0,0 +1,150 @@
1
+
2
+ module Grafana
3
+
4
+ # abstract base class for authentication API
5
+ #
6
+ # https://grafana.com/docs/grafana/latest/http_api/auth/
7
+ #
8
+ # Token
9
+ # - Currently you can authenticate via an API Token or via a Session cookie (acquired using regular login or oauth).
10
+ #
11
+ # Basic Auth
12
+ # - If basic auth is enabled (it is enabled by default) you can authenticate your HTTP request via standard
13
+ # basic auth. Basic auth will also authenticate LDAP users.
14
+ #
15
+ module Auth
16
+
17
+ # Auth HTTP resources / actions
18
+ # Api Keys
19
+ #
20
+ # GET /api/auth/keys
21
+ def api_keys
22
+
23
+ endpoint = '/api/auth/keys'
24
+
25
+ @logger.debug("Attempting to get all existing api keys (GET #{endpoint})") if @debug
26
+
27
+ get( endpoint )
28
+ end
29
+
30
+
31
+ def api_key( api_id )
32
+
33
+ if( api_id.is_a?(String) && api_id.is_a?(Integer) )
34
+ raise ArgumentError.new(format('wrong type. API token \'api_id\' must be an String (for an API name) or an Integer (for an API Id), given \'%s\'', api_id.class.to_s))
35
+ end
36
+ raise ArgumentError.new('missing \'api_id\'') if( api_id.size.zero? )
37
+
38
+ if(api_id.is_a?(String))
39
+ keys = api_keys
40
+ keys = JSON.parse(keys) if(keys.is_a?(String))
41
+
42
+ # logger.debug(keys)
43
+
44
+ status = keys.dig('status')
45
+ return keys if( status != 200 )
46
+
47
+ u = keys.dig('message').detect { |v| v['id'] == api_id || v['name'] == api_id }
48
+
49
+ # logger.debug(u)
50
+
51
+ return { 'status' => 404, 'message' => format( 'No API token \'%s\' found', api_id ) } if( u.nil? )
52
+
53
+ # api_id = u.dig('id') unless(u.nil?)
54
+ end
55
+
56
+ { 'status' => 200, 'message' => u }
57
+
58
+ end
59
+
60
+
61
+ # Create API Key
62
+ #
63
+ # POST /api/auth/keys
64
+ # https://grafana.com/docs/grafana/latest/http_api/auth/#create-api-key
65
+ #
66
+ # @param [Hash] params
67
+ # @option params [String] name The key name - (required)
68
+ # @option params [String] role Sets the access level/Grafana Role for the key. Can be one of the following values: Viewer, Editor or Admin. - (required)
69
+ # @option params [Integer] seconds_to_live Sets the key expiration in seconds.
70
+ # It is optional. If it is a positive number an expiration date for the key is set.
71
+ # If it is null, zero or is omitted completely (unless api_key_max_seconds_to_live configuration option is set) the key will never expire.
72
+ #
73
+ #
74
+ # @return [Hash]
75
+ #
76
+ # @example:
77
+ #
78
+ def create_api_key( params )
79
+
80
+ raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
81
+ raise ArgumentError.new('missing \'params\'') if( params.size.zero? )
82
+
83
+ name = validate( params, required: true, var: 'name' )
84
+ role = validate( params, required: true, var: 'role' )
85
+ seconds_to_live = validate( params, required: false, var: 'seconds_to_live', type: Integer )
86
+
87
+ valid_roles = %w[Viewer Editor Admin]
88
+
89
+ # https://stackoverflow.com/questions/9333952/case-insensitive-arrayinclude?answertab=votes#tab-top
90
+ # Do this once, or each time the array changes
91
+ downcased = Set.new valid_roles.map(&:downcase)
92
+ unless( downcased.include?( role.downcase ) )
93
+ return {
94
+ 'status' => 404,
95
+ 'login_or_email' => login_or_email,
96
+ 'role' => role,
97
+ 'message' => format( 'wrong role. Role must be one of %s, given \'%s\'', valid_roles.join(', '), role )
98
+ }
99
+ end
100
+
101
+ seconds_to_live = 86_400 if seconds_to_live.nil?
102
+
103
+ endpoint = '/api/auth/keys'
104
+
105
+ data = {
106
+ name: name,
107
+ role: role,
108
+ secondsToLive: seconds_to_live
109
+ }
110
+
111
+ data.reject!{ |_k, v| v.nil? }
112
+
113
+ payload = data.deep_string_keys
114
+ # payload = existing_ds.merge(payload).deep_symbolize_keys
115
+
116
+ @logger.debug("create API token (POST #{endpoint})") if @debug
117
+
118
+ post(endpoint, payload.to_json)
119
+
120
+ end
121
+
122
+ # Delete API Key
123
+ #
124
+ # DELETE /api/auth/keys/:id
125
+ def delete_api_key( key_id )
126
+
127
+ if( key_id.is_a?(String) && key_id.is_a?(Integer) )
128
+ raise ArgumentError.new(format('wrong type. \'key_id\' must be an String (for an API Key name) or an Integer (for an API Key Id), given \'%s\'', key_id.class.to_s))
129
+ end
130
+ raise ArgumentError.new('missing \'key_id\'') if( key_id.size.zero? )
131
+
132
+ if(key_id.is_a?(String))
133
+ data = api_keys.select { |_k,v| v['name'] == key_id }
134
+ key_id = data.keys.first if( data )
135
+ end
136
+
137
+ return { 'status' => 404, 'message' => format( 'No API key \'%s\' found', key_id) } if( key_id.nil? )
138
+
139
+ raise format('API Key can not be 0') if( key_id.zero? )
140
+
141
+ endpoint = format('/api/auth/keys/%d', key_id)
142
+ logger.debug("Deleting API key #{key_id} (DELETE #{endpoint})") if @debug
143
+
144
+ delete(endpoint)
145
+
146
+ end
147
+
148
+ end
149
+
150
+ end
@@ -5,7 +5,9 @@ require 'rest-client'
5
5
  require 'json'
6
6
  require 'timeout'
7
7
 
8
+ require_relative 'logging'
8
9
  require_relative 'version'
10
+ require_relative 'auth'
9
11
  require_relative 'validator'
10
12
  require_relative 'login'
11
13
  require_relative 'network'
@@ -48,6 +50,7 @@ module Grafana
48
50
  include Logging
49
51
 
50
52
  include Grafana::Version
53
+ include Grafana::Auth
51
54
  include Grafana::Validator
52
55
  include Grafana::Login
53
56
  include Grafana::Network
@@ -111,11 +114,18 @@ module Grafana
111
114
  ssl = settings.dig(:grafana, :ssl) || false
112
115
  @timeout = settings.dig(:grafana, :timeout) || 5
113
116
  @open_timeout = settings.dig(:grafana, :open_timeout) || 5
114
- @http_headers = settings.dig(:grafana, :http_headers) || {}
117
+ @api_user = settings.dig(:grafana, :api, :user) || 'admin'
118
+ @api_password = settings.dig(:grafana, :api, :password)
119
+ @http_headers = settings.dig(:grafana, :http_headers) || { 'Content-Type' => 'application/json', 'Accept' => 'application/json' }
115
120
  @debug = settings.dig(:debug) || false
116
-
121
+ @debug = false
117
122
  @headers = {}
118
123
 
124
+ # Token Support for Grafana 6
125
+ @api_key = nil
126
+ @api_token_name = settings.dig(:grafana, :api, :token, :name ) || (0..10).to_a.map{|_a| rand(16).to_s(16)}.join
127
+ @api_token_lifetime = settings.dig(:grafana, :api, :token, :lifetime ) || 0
128
+
119
129
  raise ArgumentError.new('missing \'host\'') if( host.nil? )
120
130
 
121
131
  raise ArgumentError.new(format('wrong type. \'port\' must be an Integer, given \'%s\'', port.class.to_s)) unless( port.is_a?(Integer) )
@@ -129,6 +139,28 @@ module Grafana
129
139
  @url = format( '%s://%s:%d%s', protocoll, host, port, url_path )
130
140
  end
131
141
 
142
+
143
+ def create_instance
144
+
145
+ logger.debug( "create_instance" )
146
+ logger.debug( "@api_key: #{@api_key} #{@api_key.class}" )
147
+
148
+ params = { timeout: @timeout.to_i, open_timeout: @open_timeout.to_i, headers: @http_headers, verify_ssl: false }
149
+ params = { timeout: @timeout.to_i, open_timeout: @open_timeout.to_i, headers: @http_headers, verify_ssl: false, user: @api_user, password: @api_password } if( @api_key.nil? )
150
+
151
+ logger.debug( "url : #{@url}" )
152
+ logger.debug( "params: #{params}" )
153
+
154
+ begin
155
+ RestClient::Resource.new( @url, params )
156
+ rescue => error
157
+ logger.error( error ) # if @debug
158
+ logger.debug( e.backtrace.join("\n") ) #if @debug
159
+ false
160
+ end
161
+ end
162
+
163
+
132
164
  # Get Settings
133
165
  #
134
166
  # http://docs.grafana.org/http_api/other/#get-settings
@@ -142,20 +174,26 @@ module Grafana
142
174
 
143
175
  def version
144
176
  s = settings
145
- @version = s.dig('buildInfo','version')
146
- @major_version = @version.split('.').first.to_i
147
-
148
- {version: @version, major_version: @major_version}
149
- end
150
177
 
178
+ status = s.dig('status')
179
+ if( status.to_i == 200 )
180
+ @version = s.dig('buildInfo','version')
181
+ @major_version = @version.split('.').first.to_i
151
182
 
152
- def self.logger
153
- @@logger ||= defined?(Logging) ? Logging.logger : Logger.new(STDOUT)
183
+ { version: @version, major_version: @major_version }
184
+ else
185
+ s
186
+ end
154
187
  end
155
188
 
156
- def self.logger=(logger)
157
- @@logger = logger
158
- end
189
+
190
+ # def self.logger
191
+ # @@logger ||= defined?(Logging) ? Logging.logger : Logger.new(STDOUT)
192
+ # end
193
+ #
194
+ # def self.logger=(logger)
195
+ # @@logger = logger
196
+ # end
159
197
 
160
198
  end
161
199
 
@@ -99,7 +99,7 @@ module Grafana
99
99
 
100
100
  endpoint = '/api/folders'
101
101
 
102
- @logger.debug("create folder#{title} (GET #{endpoint})") if @debug
102
+ @logger.debug("create folder #{title} (GET #{endpoint})") if @debug
103
103
  logger.debug(payload.to_json) if(@debug)
104
104
 
105
105
  post( endpoint, payload.to_json )
@@ -0,0 +1,55 @@
1
+
2
+ require 'logger'
3
+
4
+ # -------------------------------------------------------------------------------------------------
5
+
6
+ module Logging
7
+
8
+ def logger
9
+ @logger ||= Logging.logger_for( self.class.name )
10
+ end
11
+
12
+ # Use a hash class-ivar to cache a unique Logger per class:
13
+ @loggers = {}
14
+
15
+ class << self
16
+
17
+ def logger_for( classname )
18
+ @loggers[classname] ||= configure_logger_for( classname )
19
+ end
20
+
21
+ def configure_logger_for( classname )
22
+
23
+ log_level = ENV.fetch('LOG_LEVEL', 'INFO' )
24
+ level = log_level.dup
25
+
26
+ # DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN
27
+ log_level = case level.upcase
28
+ when 'DEBUG'
29
+ Logger::DEBUG # Low-level information for developers.
30
+ when 'INFO'
31
+ Logger::INFO # Generic (useful) information about system operation.
32
+ when 'WARN'
33
+ Logger::WARN # A warning.
34
+ when 'ERROR'
35
+ Logger::ERROR # A handleable error condition.
36
+ when 'FATAL'
37
+ Logger::FATAL # An unhandleable error that results in a program crash.
38
+ else
39
+ Logger::UNKNOWN # An unknown message that should always be logged.
40
+ end
41
+
42
+ $stdout.sync = true
43
+ logger = Logger.new($stdout)
44
+ logger.level = log_level
45
+ logger.datetime_format = "%Y-%m-%d %H:%M:%S %z"
46
+ logger.formatter = proc do |severity, datetime, progname, msg|
47
+ "[#{datetime.strftime( logger.datetime_format )}] #{severity.ljust(5)} #{msg}\n"
48
+ end
49
+
50
+ logger
51
+ end
52
+ end
53
+ end
54
+
55
+ # -------------------------------------------------------------------------------------------------
data/lib/grafana/login.rb CHANGED
@@ -29,20 +29,27 @@ module Grafana
29
29
  max_retries = validate( params, required: false, var: 'max_retries', type: Integer ) || 2
30
30
  sleep_between_retries = validate( params, required: false, var: 'sleep_between_retries', type: Integer ) || 5
31
31
 
32
- begin
33
- @api_instance = RestClient::Resource.new(
34
- @url,
35
- timeout: @timeout.to_i,
36
- open_timeout: @open_timeout.to_i,
37
- headers: @http_headers,
38
- verify_ssl: false
39
- )
40
- rescue => e
41
- logger.error( e ) if @debug
42
- logger.debug( e.backtrace.join("\n") ) if @debug
43
- false
32
+ # raise 'no valid rest instance found' if( @api_instance.nil? )
33
+
34
+ # only useful for Grafana version < 6
35
+ #
36
+ if( @api_instance.nil? )
37
+
38
+ @api_user = username
39
+ @api_password = password
40
+
41
+ @api_instance = create_instance
42
+
43
+ return true if(@api_instance)
44
+ else
45
+ logger.debug('User session already initiated') if @debug
46
+ return true
44
47
  end
45
48
 
49
+ logger.debug( "resource: #{@api_instance.inspect}")
50
+
51
+ false
52
+
46
53
  request_data = { 'User' => username, 'Password' => password }
47
54
 
48
55
  if( @api_instance )
@@ -51,13 +58,15 @@ module Grafana
51
58
  @headers = {}
52
59
 
53
60
  begin
54
- logger.debug('Attempting to establish user session') if @debug
61
+ logger.debug('Attempting to establish user session') # if @debug
55
62
 
56
- response = @api_instance['/login'].post(
63
+ response = @api_instance['/api/login'].post(
57
64
  request_data.to_json,
58
65
  content_type: 'application/json; charset=UTF-8'
59
66
  )
60
67
 
68
+ logger.debug( "response #{response}")
69
+
61
70
  response_cookies = response.cookies
62
71
  response_code = response.code.to_i
63
72
 
@@ -131,11 +140,40 @@ module Grafana
131
140
  # @return [Hash]
132
141
  #
133
142
  def ping_session
134
- logger.debug( "Pinging current session (GET #{endpoint})" ) if @debug
135
143
  endpoint = '/api/login/ping'
136
- get( endpoint )
144
+ logger.debug( "Pinging current session (GET #{endpoint})" ) if @debug
145
+
146
+ begin
147
+ get( endpoint )
148
+ rescue => error
149
+ logger.error(e)
150
+ end
137
151
  end
138
152
 
153
+ # Returns health information about Grafana
154
+ #
155
+ # @example
156
+ # health
157
+ #
158
+ # @return [Hash]
159
+ #
160
+ def health
161
+ endpoint = '/api/health'
162
+ logger.debug( "get health information (GET #{endpoint})" ) if @debug
163
+
164
+ result = get( endpoint )
165
+
166
+ if( result.is_a?(Hash) )
167
+ status = result.dig('status')
168
+ if( status.to_i == 200 )
169
+ message = result.dig('message')
170
+ r = message.gsub('=>', ':').gsub(':nil,', ':null,')
171
+ return { 'status' => status, 'message' => JSON.parse( r ) }
172
+ end
173
+ end
174
+
175
+ result
176
+ end
139
177
 
140
178
  def headers
141
179
  @headers
@@ -61,9 +61,11 @@ module Grafana
61
61
  #
62
62
  def request( method_type = 'GET', endpoint = '/', data = {} )
63
63
 
64
+ logger.debug( "request( method_type: #{method_type}, endpoint: #{endpoint}, data )" )
65
+
64
66
  raise 'try first login()' if @api_instance.nil?
65
67
 
66
- login( username: @username, password: @password )
68
+ # login( username: @username, password: @password )
67
69
 
68
70
  response = nil
69
71
  response_code = 404
@@ -103,7 +105,7 @@ module Grafana
103
105
  logger.error('422')
104
106
 
105
107
  response_body = response_body.first if(response_body.is_a?(Array))
106
- message_field_name = response_body.dig('fieldNames')
108
+ # message_field_name = response_body.dig('fieldNames')
107
109
 
108
110
  #status = response_code # response_body.dig('status')
109
111
  message = response_body # .dig('message')
@@ -151,6 +153,8 @@ module Grafana
151
153
  return false
152
154
  end
153
155
 
156
+ # logger.debug( "response: #{response} (#{response.class})" )
157
+
154
158
  response_code = response.code.to_i
155
159
  response_body = response.body
156
160
  response_headers = response.headers
@@ -317,7 +317,7 @@ module Grafana
317
317
  organization = validate( params, required: true, var: 'organization', type: String )
318
318
  login_or_email = validate( params, required: true, var: 'login_or_email', type: String )
319
319
  role = validate( params, required: true, var: 'role', type: String )
320
- valid_roles = ['Viewer', 'Editor', 'Read Only Editor', 'Admin']
320
+ valid_roles = %w[Viewer Editor "Read Only Editor" Admin]
321
321
 
322
322
  # https://stackoverflow.com/questions/9333952/case-insensitive-arrayinclude?answertab=votes#tab-top
323
323
  # Do this once, or each time the array changes
@@ -122,17 +122,16 @@ module Grafana
122
122
  d = data.dig('message')
123
123
  data = d.select { |k| k['name'] == playlist_id }
124
124
 
125
- return { 'status' => 404, 'message' => format( 'No Playlist \'%s\' found', playlist_id) } if( data.size == 0 )
125
+ return { 'status' => 404, 'message' => format( 'No Playlist \'%s\' found', playlist_id) } if( data.size.zero? )
126
126
 
127
- if( data.size != 0 )
128
-
129
- _d = []
130
- data.each do |k,v|
131
- _d << playlist( k['id'] )
127
+ unless( data.empty? )
128
+ playlist_data = []
129
+ data.each_entry do |k|
130
+ playlist_data << playlist( k['id'] )
132
131
  end
133
- return { 'status' => status, 'playlists' => _d }
132
+
133
+ return { 'status' => status, 'playlists' => playlist_data }
134
134
  end
135
- # return { 'status' => 200, 'message' => data } if( data.size != 0 )
136
135
  end
137
136
 
138
137
  raise format('playlist id can not be 0') if( playlist_id.zero? )
@@ -145,7 +144,7 @@ module Grafana
145
144
 
146
145
  return { 'status' => 404, 'message' => 'playlist is empty', 'items' => [] } if( result.dig('status') == 404 )
147
146
 
148
- return result
147
+ result
149
148
  end
150
149
 
151
150
  ### Get Playlist items
@@ -192,24 +191,22 @@ module Grafana
192
191
  end
193
192
  raise ArgumentError.new('missing \'playlist_id\'') if( playlist_id.size.zero? )
194
193
 
195
- _playlists = playlists
194
+ tmp_playlists = playlists
196
195
 
197
196
  begin
198
- status = _playlists.dig('status')
199
- message = _playlists.dig('message')
197
+ status = tmp_playlists.dig('status').to_i
198
+ message = tmp_playlists.dig('message')
200
199
 
201
- if( status == 200 )
200
+ return tmp_playlists if( status != 200 )
202
201
 
203
- data = message.select { |k| k['id'] == playlist_id } if( playlist_id.is_a?(Integer) )
204
- data = message.select { |k| k['name'] == playlist_id } if( playlist_id.is_a?(String) )
202
+ data = message.select { |k| k['id'] == playlist_id } if( playlist_id.is_a?(Integer) )
203
+ data = message.select { |k| k['name'] == playlist_id } if( playlist_id.is_a?(String) )
205
204
 
206
- return { 'status' => 404, 'message' => 'No Playlist found' } if( !data.is_a?(Array) || data.count == 0 || status.to_i != 200 )
207
- return { 'status' => 404, 'message' => format('found %d playlists with name %s', data.count, playlist_id ) } if( data.count > 1 && multi_result == false )
205
+ return { 'status' => 404, 'message' => 'No Playlist found' } if( !data.is_a?(Array) || data.count.zero? || status.to_i != 200 )
206
+ return { 'status' => 404, 'message' => format('found %d playlists with name %s', data.count, playlist_id ) } if( data.count > 1 && multi_result == false )
207
+
208
+ id = data.first.dig('id')
208
209
 
209
- id = data.first.dig('id')
210
- else
211
- return _playlists
212
- end
213
210
  rescue
214
211
  return { 'status' => 404, 'message' => 'No Playlists found' } if( playlists.nil? || playlists == false || playlists.dig('status').to_i != 200 )
215
212
  end
@@ -220,7 +217,7 @@ module Grafana
220
217
 
221
218
  return { 'status' => 404, 'message' => 'playlist is empty' } if( result.dig('status') == 404 )
222
219
 
223
- return result
220
+ result
224
221
  end
225
222
 
226
223
  ### Get Playlist dashboards
@@ -321,7 +318,7 @@ module Grafana
321
318
  interval = validate( params, required: true , var: 'interval' , type: String )
322
319
  items = validate( params, required: true , var: 'items' , type: Array )
323
320
 
324
- return { 'status' => 404, 'message' => 'There are no elements for a playlist' } if(items.count == 0)
321
+ return { 'status' => 404, 'message' => 'There are no elements for a playlist' } if(items.count.zero?)
325
322
 
326
323
  payload_items = create_playlist_items(items)
327
324
 
@@ -412,29 +409,28 @@ module Grafana
412
409
  # organisation = validate( params, required: false, var: 'organisation' )
413
410
  items = validate( params, required: false, var: 'items', type: Array )
414
411
 
415
- _playlists = playlists
412
+ tmp_playlists = playlists
416
413
 
417
414
  data = []
418
415
 
419
416
  begin
420
- status = _playlists.dig('status')
421
- message = _playlists.dig('message')
417
+ status = tmp_playlists.dig('status').to_i
418
+ message = tmp_playlists.dig('message')
422
419
 
423
- if( status == 200 )
424
- data = message.select { |k| k['id'] == playlist_id } if( playlist_id.is_a?(Integer) )
425
- data = message.select { |k| k['name'] == playlist_id } if( playlist_id.is_a?(String) )
420
+ return tmp_playlists if( status != 200 )
421
+
422
+ data = message.select { |k| k['id'] == playlist_id } if( playlist_id.is_a?(Integer) )
423
+ data = message.select { |k| k['name'] == playlist_id } if( playlist_id.is_a?(String) )
424
+
425
+ return { 'status' => 404, 'message' => 'no playlist found' } if( !data.is_a?(Array) || data.count.zero? || status.to_i != 200 )
426
+ return { 'status' => 404, 'message' => format('found %d playlists with name %s', data.count, playlist_id ) } if( data.count > 1 && multi_result == false )
426
427
 
427
- return { 'status' => 404, 'message' => 'no playlist found' } if( !data.is_a?(Array) || data.count == 0 || status.to_i != 200 )
428
- return { 'status' => 404, 'message' => format('found %d playlists with name %s', data.count, playlist_id ) } if( data.count > 1 && multi_result == false )
429
- else
430
- return _playlists
431
- end
432
428
  rescue
433
429
  return { 'status' => 404, 'message' => 'no playlists found' } if( playlists.nil? || playlists == false || playlists.dig('status').to_i != 200 )
434
430
  end
435
431
 
436
432
  playlist_id = data.first.dig('id')
437
- playlist_name = data.first.dig('name')
433
+ # playlist_name = data.first.dig('name')
438
434
  payload_items = create_playlist_items(items, playlist_id)
439
435
 
440
436
  payload = {
@@ -479,24 +475,22 @@ module Grafana
479
475
  end
480
476
  raise ArgumentError.new('missing \'playlist_id\'') if( playlist_id.size.zero? )
481
477
 
482
- _playlists = playlists
478
+ tmp_playlists = playlists
483
479
 
484
480
  data = []
485
481
 
486
482
  begin
487
- status = _playlists.dig('status')
488
- message = _playlists.dig('message')
483
+ status = tmp_playlists.dig('status').to_i
484
+ message = tmp_playlists.dig('message')
489
485
 
490
- if( status == 200 )
486
+ return tmp_playlists if( status != 200 )
491
487
 
492
- data = message.select { |k| k['id'] == playlist_id } if( playlist_id.is_a?(Integer) )
493
- data = message.select { |k| k['name'] == playlist_id } if( playlist_id.is_a?(String) )
488
+ data = message.select { |k| k['id'] == playlist_id } if( playlist_id.is_a?(Integer) )
489
+ data = message.select { |k| k['name'] == playlist_id } if( playlist_id.is_a?(String) )
490
+
491
+ return { 'status' => 404, 'message' => 'no playlist found' } if( !data.is_a?(Array) || data.count.zero? || status.to_i != 200 )
492
+ return { 'status' => 404, 'message' => format('found %d playlists with name %s', data.count, playlist_id ) } if( data.count > 1 && multi_result == false )
494
493
 
495
- return { 'status' => 404, 'message' => 'no playlist found' } if( !data.is_a?(Array) || data.count == 0 || status.to_i != 200 )
496
- return { 'status' => 404, 'message' => format('found %d playlists with name %s', data.count, playlist_id ) } if( data.count > 1 && multi_result == false )
497
- else
498
- return _playlists
499
- end
500
494
  rescue
501
495
  return { 'status' => 404, 'message' => 'no playlists found' } if( playlists.nil? || playlists == false || playlists.dig('status').to_i != 200 )
502
496
  end
@@ -515,7 +509,7 @@ module Grafana
515
509
  end
516
510
  end
517
511
 
518
- return result
512
+ # return result
519
513
  else
520
514
 
521
515
  playlist_id = data.first.dig('id')
@@ -530,69 +524,70 @@ module Grafana
530
524
  return { 'status' => 200, 'message' => 'playlist deleted' } if(r.dig('status').to_i == 404)
531
525
  end
532
526
 
533
- return result
527
+ # return result
534
528
  end
535
529
 
530
+ result
536
531
  end
537
532
 
538
533
 
539
534
  private
540
- def create_playlist_items( items, playlistId = nil)
535
+ def create_playlist_items( items, playlist_id = nil)
541
536
 
542
- _items = []
537
+ playlist_items = []
543
538
 
544
539
  items.each do |r|
545
- _element = {}
540
+ playlist_element = {}
546
541
 
547
542
  if( r['name'] )
548
543
 
549
- _name = search_dashboards( query: r['name'] )
550
- _name_status = _name.dig('status')
544
+ playlist_name = search_dashboards( query: r['name'] )
545
+ playlist_name_status = playlist_name.dig('status')
551
546
 
552
- next unless( _name_status == 200 )
547
+ next unless( playlist_name_status == 200 )
553
548
 
554
- _name = _name.dig('message')
555
- _name_id = _name.first.dig('id')
556
- _name_title = _name.first.dig('title')
549
+ playlist_name = playlist_name.dig('message')
550
+ playlist_name_id = playlist_name.first.dig('id')
551
+ playlist_name_title = playlist_name.first.dig('title')
557
552
 
558
- _element[:type] = 'dashboard_by_id'
559
- _element[:value] = _name_id.to_s
560
- _element[:title] = _name_title
561
- _element[:playlistId] = playlistId unless(playlistId.nil?)
553
+ playlist_element[:type] = 'dashboard_by_id'
554
+ playlist_element[:value] = playlist_name_id.to_s
555
+ playlist_element[:title] = playlist_name_title
556
+ playlist_element[:playlistId] = playlist_id unless(playlist_id.nil?)
562
557
 
563
558
  elsif( r['id'] )
564
559
 
565
- _uid = dashboard_by_uid(r['id'])
566
- _uid_status = _uid.dig('status')
560
+ uid = dashboard_by_uid(r['id'])
561
+ uid_status = uid.dig('status')
567
562
 
568
- next unless( _uid_status == 200 )
563
+ next unless( uid_status == 200 )
569
564
 
570
- _element[:type] = 'dashboard_by_id'
571
- _element[:value] = r['id']
572
- _element[:playlistId] = playlistId unless(playlistId.nil?)
565
+ playlist_element[:type] = 'dashboard_by_id'
566
+ playlist_element[:value] = r['id']
567
+ playlist_element[:playlistId] = playlist_id unless(playlist_id.nil?)
573
568
 
574
569
  elsif( r['tag'] )
575
570
 
576
- _tags = search_dashboards( tags: r['tag'] )
577
- _tags_status = _tags.dig('status')
571
+ tags = search_dashboards( tags: r['tag'] )
572
+ tags_status = tags.dig('status')
578
573
 
579
- next unless( _tags_status == 200 )
574
+ next unless( tags_status == 200 )
580
575
 
581
- _element[:type] = 'dashboard_by_tag'
582
- _element[:value] = r['tag']
583
- _element[:title] = r['tag']
584
- _element[:playlistId] = playlistId unless(playlistId.nil?)
576
+ playlist_element[:type] = 'dashboard_by_tag'
577
+ playlist_element[:value] = r['tag']
578
+ playlist_element[:title] = r['tag']
579
+ playlist_element[:playlistId] = playlist_id unless(playlist_id.nil?)
585
580
 
586
581
  else
587
582
  next
588
583
  end
589
584
 
590
- _element[:order] = r['order'] if(r['order'])
585
+ playlist_element[:order] = r['order'] if(r['order'])
591
586
 
592
- _items << _element if(_element.count >= 4)
587
+ playlist_items << playlist_element if(playlist_element.count >= 4)
593
588
  end
594
589
 
595
- _items
590
+ playlist_items
596
591
  end
597
592
 
598
593
  end
@@ -11,7 +11,7 @@ module Grafana
11
11
 
12
12
  # Get Current User Prefs
13
13
  # GET /api/user/preferences
14
- def user_preferences()
14
+ def user_preferences
15
15
 
16
16
  v, mv = version.values
17
17
  return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
@@ -43,7 +43,7 @@ module Grafana
43
43
 
44
44
  # Get Current Org Prefs
45
45
  # GET /api/org/preferences
46
- def org_preferences()
46
+ def org_preferences
47
47
 
48
48
  v, mv = version.values
49
49
  return { 'status' => 404, 'message' => format( 'folder has been supported in Grafana since version 5. you use version %s', v) } if(mv < 5)
@@ -8,7 +8,7 @@ module Grafana
8
8
  #
9
9
  # @param params [Hash]
10
10
  # @param options [Hash]
11
- # @option options [Boolean] requiered
11
+ # @option options [Boolean] required
12
12
  # @option options [String] var
13
13
  # @option options [Class] type
14
14
  #
@@ -26,7 +26,7 @@ module Grafana
26
26
  params = params.deep_symbolize_keys
27
27
  variable = params.dig(var.to_sym)
28
28
 
29
- raise ArgumentError.new(format('\'%s\' is requiered and missing!', var)) if(variable.nil? && required == true )
29
+ raise ArgumentError.new(format('\'%s\' is required and missing!', var)) if(variable.nil? && required == true )
30
30
 
31
31
  unless( type.nil? )
32
32
  clazz = Object.const_get(type.to_s)
@@ -6,7 +6,7 @@ module Grafana
6
6
  # major part of version
7
7
  MAJOR = 1
8
8
  # minor part of version
9
- MINOR = 0
9
+ MINOR = 1
10
10
  # tiny part of version
11
11
  TINY = 0
12
12
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grafana
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bodo Schulz
@@ -215,10 +215,12 @@ extra_rdoc_files: []
215
215
  files:
216
216
  - LICENSE
217
217
  - README.md
218
+ - lib/_logging.rb_
218
219
  - lib/grafana.rb
219
220
  - lib/grafana/admin.rb
220
221
  - lib/grafana/alerts.rb
221
222
  - lib/grafana/annotations.rb
223
+ - lib/grafana/auth.rb
222
224
  - lib/grafana/client.rb
223
225
  - lib/grafana/dashboard.rb
224
226
  - lib/grafana/dashboard_permissions.rb
@@ -227,6 +229,7 @@ files:
227
229
  - lib/grafana/folder.rb
228
230
  - lib/grafana/folder_and_dashboard_search.rb
229
231
  - lib/grafana/folder_permissions.rb
232
+ - lib/grafana/logging.rb
230
233
  - lib/grafana/login.rb
231
234
  - lib/grafana/network.rb
232
235
  - lib/grafana/organization.rb
@@ -241,7 +244,6 @@ files:
241
244
  - lib/grafana/users.rb
242
245
  - lib/grafana/validator.rb
243
246
  - lib/grafana/version.rb
244
- - lib/logging.rb
245
247
  - lib/monkey_patches.rb
246
248
  homepage: http://github.com/bodsch/ruby-grafana
247
249
  licenses:
data/lib/logging.rb DELETED
@@ -1,35 +0,0 @@
1
-
2
- require 'logger'
3
-
4
- # -------------------------------------------------------------------------------------------------
5
-
6
- module Logging
7
-
8
- def logger
9
- @logger ||= Logging.logger_for( self.class.name )
10
- end
11
-
12
- # Use a hash class-ivar to cache a unique Logger per class:
13
- @loggers = {}
14
-
15
- class << self
16
- def logger_for( classname )
17
- @loggers[classname] ||= configure_logger_for( classname )
18
- end
19
-
20
- def configure_logger_for( classname )
21
-
22
- logger = Logger.new(STDOUT)
23
- logger.progname = classname
24
- logger.level = Logger::DEBUG
25
- logger.datetime_format = '%Y-%m-%d %H:%M:%S::%3N'
26
- logger.formatter = proc do |severity, datetime, progname, msg|
27
- "[#{datetime.strftime( logger.datetime_format )}] #{severity.ljust(5)} : #{progname} - #{msg}\n"
28
- end
29
-
30
- logger
31
- end
32
- end
33
- end
34
-
35
- # -------------------------------------------------------------------------------------------------