class Cased::CLI::Session
Attributes
Public: The CLI
session record API URL @example
session.api_record_url #=> "https://api.cased.com/cli/sessions/guard_session_1oFqm5GBQYwhH8pfIpnS0A5QgFJ/record"
@return [String, nil]
Public: The CLI
session API URL @example
session.api_url #=> "https://api.cased.com/cli/sessions/guard_session_1oFqm5GBQYwhH8pfIpnS0A5QgFJ"
@return [String, nil]
@return [Cased::CLI::Authentication]
Public: Command that invoked CLI
session. @example
session.command #=> "/usr/local/bin/rails console"
@return [String]
Public: The forwarded IP V4 or IP V6 address of the user that initiated the CLI
session.
@example
session.forwarded_ip_address #=> "1.1.1.1"
@return [String, nil]
Public: The CLI
session ID @example
session.id #=> "guard_session_1oFqm5GBQYwhH8pfIpnS0A5QgFJ"
@return [String, nil]
Public: The client's IP V4 or IP V6 address that initiated the CLI
session. @example
session.ip_address #=> "1.1.1.1"
@return [String, nil]
Public: Additional user supplied metadata about the CLI
session. @example
session.metadata #=> {"hostname" => "Mac.local"}
@return [Hash]
Public: Cased
may filter out sensitive data in the command, we shouldn't execute what is returned from the server.
@return [String, nil]
Public: The user supplied reason for the CLI
session for taking place. @example
session.reason #=> "Investigating customer support ticket."
@return [String, nil]
Public: The current state the CLI
session is in @example
session.api_url #=> "approved"
@return [String, nil]
Public: The CLI
session web URL @example
session.url #=> "https://api.cased.com/cli/programs/ruby/sessions/guard_session_1oFqm5GBQYwhH8pfIpnS0A5QgFJ"
@return [String, nil]
Public Class Methods
If we're inside of a recorded session we can lookup the session we're in.
# File lib/cased/cli/session.rb, line 24 def self.current @current ||= if ENV['GUARD_SESSION_ID'] Cased::CLI::Session.find(ENV['GUARD_SESSION_ID']) end end
# File lib/cased/cli/session.rb, line 30 def self.current? current.present? end
# File lib/cased/cli/session.rb, line 13 def self.find(guard_session_id) authentication = Cased::CLI::Authentication.new response = Cased.clients.cli.get("cli/sessions/#{guard_session_id}", user_token: authentication.token) new.tap do |session| session.session = response.body end end
# File lib/cased/cli/session.rb, line 133 def initialize(reason: nil, command: nil, metadata: {}, authentication: nil) @authentication = authentication || Cased::CLI::Authentication.new @reason = reason @original_command = command || [$PROGRAM_NAME, *ARGV].join(' ') @command = @original_command @metadata = Cased.config.cli.metadata.merge(metadata) @requester = {} @responder = {} @guard_application = {} end
Public Instance Methods
# File lib/cased/cli/session.rb, line 174 def approved? state == 'approved' end
# File lib/cased/cli/session.rb, line 268 def cancel response = Cased.clients.cli.post("#{api_url}/cancel", user_token: authentication.token) self.session = response.body canceled? end
# File lib/cased/cli/session.rb, line 182 def canceled? state == 'canceled' end
# File lib/cased/cli/session.rb, line 275 def cased_category :cli end
# File lib/cased/cli/session.rb, line 283 def cased_context(category: cased_category) { "#{category}_id".to_sym => cased_id, category.to_sym => to_s, } end
# File lib/cased/cli/session.rb, line 279 def cased_id id end
# File lib/cased/cli/session.rb, line 240 def create return false unless id.nil? response = Cased.clients.cli.post('cli/sessions', user_token: authentication.token, forwarded_ip_address: forwarded_ip_address, reason: reason, metadata: metadata, command: command) if response.success? self.session = response.body else case response.body['error'] when 'reason_required' @error = :reason_required when 'unauthorized' @error = :unauthorized when 'reauthenticate' @error = :reauthenticate else @error = true return false end end response.success? end
# File lib/cased/cli/session.rb, line 178 def denied? state == 'denied' end
# File lib/cased/cli/session.rb, line 197 def error? !error.nil? end
# File lib/cased/cli/session.rb, line 205 def reason_required? error == :reason_required || guard_application.dig('settings', 'reason_required') end
# File lib/cased/cli/session.rb, line 213 def reauthenticate? error == :reauthenticate end
# File lib/cased/cli/session.rb, line 221 def record return false unless recordable? && record_output? Cased::CLI::Log.log 'CLI session is now recording' recorder = Cased::CLI::Recorder.new(original_command.split(' '), env: { 'GUARD_SESSION_ID' => id, 'GUARD_APPLICATION_ID' => guard_application.fetch('id'), 'GUARD_USER_TOKEN' => requester.fetch('id'), }) recorder.start Cased.clients.cli.put(api_record_url, recording: recorder.writer.to_cast, user_token: authentication.token) Cased::CLI::Log.log 'CLI session recorded' end
# File lib/cased/cli/session.rb, line 217 def record_output? guard_application.dig('settings', 'record_output') || false end
# File lib/cased/cli/session.rb, line 290 def recordable? STDOUT.isatty end
# File lib/cased/cli/session.rb, line 190 def refresh return false unless api_url response = Cased.clients.cli.get(api_url, user_token: authentication.token) self.session = response.body end
# File lib/cased/cli/session.rb, line 170 def requested? state == 'requested' end
# File lib/cased/cli/session.rb, line 152 def session=(session) @error = nil @id = session.fetch('id') @api_url = session.fetch('api_url') @api_record_url = session.fetch('api_record_url') @url = session.fetch('url') @state = session.fetch('state') @command = session.fetch('command') @metadata = session.fetch('metadata') @reason = session.fetch('reason') @forwarded_ip_address = session.fetch('forwarded_ip_address') @ip_address = session.fetch('ip_address') @requester = session.fetch('requester') @responded_at = session['responded_at'] @responder = session['responder'] || {} @guard_application = session.fetch('guard_application') end
# File lib/cased/cli/session.rb, line 201 def success? id && !error? end
# File lib/cased/cli/session.rb, line 186 def timed_out? state == 'timed_out' end
# File lib/cased/cli/session.rb, line 148 def to_param id end
# File lib/cased/cli/session.rb, line 144 def to_s command end