Module: Grafana::Login

Included in:
Client
Defined in:
lib/grafana/login.rb

Overview

Abstract base class for Login.

Instance Method Summary collapse

Instance Method Details

#headersObject



178
179
180
# File 'lib/grafana/login.rb', line 178

def headers
  @headers
end

#healthHash

Returns health information about Grafana

Examples:

health

Returns:



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/grafana/login.rb', line 160

def health
  endpoint = '/api/health'
  logger.debug( "get health information (GET #{endpoint})" ) if @debug

  result = get( endpoint )

  if( result.is_a?(Hash) )
    status = result.dig('status')
    if( status.to_i == 200 )
      message = result.dig('message')
      r = message.gsub('=>', ':').gsub(':nil,', ':null,')
      return { 'status' => status, 'message' => JSON.parse( r ) }
    end
  end

  result
end

#login(params) ⇒ Hash

Login into Grafana

Examples:

( username: 'admin', password: 'admin' )
( username: 'admin', password: 'admin', max_retries: 10, sleep_between_retries: 8 )

Parameters:

Options Hash (params):

  • username (String)

    username for the login

  • password (String)

    password for the login

  • max_retries (Integer) — default: 2

    maximum retries

  • sleep_between_retries (Integer) — default: 5

    sleep seconds between retries

Returns:

Raises:

  • (ArgumentError)


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/grafana/login.rb', line 22

def ( params )

  raise ArgumentError.new(format('wrong type. \'params\' must be an Hash, given \'%s\'', params.class.to_s)) unless( params.is_a?(Hash) )
  raise ArgumentError.new('missing params') if( params.size.zero? )

  username = validate( params, required: true, var: 'username', type: String )
  password = validate( params, required: true, var: 'password', type: String )
  max_retries = validate( params, required: false, var: 'max_retries', type: Integer ) || 2
  sleep_between_retries = validate( params, required: false, var: 'sleep_between_retries', type: Integer ) || 5

  # raise 'no valid rest instance found' if( @api_instance.nil? )

  # only useful for Grafana version < 6
  #
  if( @api_instance.nil? )

    @api_user = username
    @api_password = password

    @api_instance = create_instance

    return true if(@api_instance)
  else
    logger.debug('User session already initiated') if @debug
    return true
  end

  logger.debug( "resource: #{@api_instance.inspect}")

  false

  request_data = { 'User' => username, 'Password' => password }

  if( @api_instance )
    retried ||= 0
    response_cookies  = ''
    @headers          = {}

    begin
      logger.debug('Attempting to establish user session') # if @debug

      response = @api_instance['/api/login'].post(
        request_data.to_json,
        content_type: 'application/json; charset=UTF-8'
      )

      logger.debug( "response #{response}")

      response_cookies  = response.cookies
      response_code     = response.code.to_i

      if( response_code == 200 )
        @headers = {
          content_type: 'application/json',
          accept: 'application/json',
          cookies: response_cookies
        }
        @username = username
        @password = password
      end

    rescue SocketError
      raise format( 'Maximum retries (%d) against \'%s/login\' reached. Giving up ...', max_retries, @url ) unless( retried < max_retries )

      retried += 1
      logger.debug( format( 'cannot login, socket error (retry %d / %d)', retried, max_retries ) ) if @debug
      sleep( sleep_between_retries )
      retry

    rescue RestClient::Unauthorized
      logger.debug( request_data.to_json ) if @debug
      raise format( 'Not authorized to connect \'%s\' - wrong username or password?', @url )

    rescue RestClient::BadGateway
      raise format( 'Maximum retries (%d) against \'%s/login\' reached. Giving up ...', max_retries, @url ) unless( retried < max_retries )

      retried += 1
      logger.debug( format( 'cannot login, connection refused (retry %d / %d)', retried, max_retries ) ) if @debug
      sleep( sleep_between_retries )
      retry

    rescue Errno::ECONNREFUSED
      raise format( 'Maximum retries (%d) against \'%s/login\' reached. Giving up ...', max_retries, @url ) unless( retried < max_retries )

      retried += 1
      logger.debug( format( 'cannot login, connection refused (retry %d / %d)', retried, max_retries ) ) if @debug
      sleep( sleep_between_retries )
      retry

    rescue Errno::EHOSTUNREACH
      raise format( 'Maximum retries (%d) against \'%s/login\' reached. Giving up ...', max_retries, @url ) unless( retried < max_retries )

      retried += 1
      logger.debug( format( 'cannot login, host unreachable (retry %d / %d)', retried, max_retries ) ) if @debug
      sleep( sleep_between_retries )
      retry

    rescue => error
      raise format( 'Maximum retries (%d) against \'%s/login\' reached. Giving up ...', max_retries, @url ) unless( retried < max_retries )

      retried += 1
      logger.error( error )
      logger.debug( format( 'cannot login (retry %d / %d)', retried, max_retries ) ) if @debug
      sleep( sleep_between_retries )
      retry
    end

    logger.debug('User session initiated') if @debug
    return true
  end
  false
end

#ping_sessionHash

Renew session based on remember cookie

Examples:

ping_session

Returns:



142
143
144
145
146
147
148
149
150
151
# File 'lib/grafana/login.rb', line 142

def ping_session
  endpoint = '/api/login/ping'
  logger.debug( "Pinging current session (GET #{endpoint})" ) if @debug

  begin
    get( endpoint )
  rescue => error
    logger.error(e)
  end
end