Class: Vagrant::Util::CheckpointClient

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/vagrant/util/checkpoint_client.rb

Constant Summary collapse

CHECKPOINT_TIMEOUT =

Maximum number of seconds to wait for check to complete

10

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeCheckpointClient



25
26
27
28
# File 'lib/vagrant/util/checkpoint_client.rb', line 25

def initialize
  @logger = Log4r::Logger.new("vagrant::checkpoint_client")
  @enabled = false
end

Instance Attribute Details

#enabledBoolean (readonly)



17
18
19
# File 'lib/vagrant/util/checkpoint_client.rb', line 17

def enabled
  @enabled
end

#envVagrant::Environment (readonly)



23
24
25
# File 'lib/vagrant/util/checkpoint_client.rb', line 23

def env
  @env
end

#filesHash (readonly)



20
21
22
# File 'lib/vagrant/util/checkpoint_client.rb', line 20

def files
  @files
end

#loggerLog4r::Logger (readonly)



14
15
16
# File 'lib/vagrant/util/checkpoint_client.rb', line 14

def logger
  @logger
end

Instance Method Details

#alerts_checkObject



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/vagrant/util/checkpoint_client.rb', line 125

def alerts_check
  if result["alerts"] && !result["alerts"].empty?
    result["alerts"].group_by{|a| a["level"]}.each_pair do |_, alerts|
      alerts.each do |alert|
        date = nil
        begin
          date = Time.at(alert["date"])
        rescue
          date = Time.now
        end
        output = I18n.t("vagrant.alert",
          message: alert["message"],
          date: date,
          url: alert["url"]
        )
        case alert["level"]
        when "info"
          alert_ui = Vagrant::UI::Prefixed.new(env.ui, "vagrant")
          alert_ui.info(output)
        when "warn"
          alert_ui = Vagrant::UI::Prefixed.new(env.ui, "vagrant-warning")
          alert_ui.warn(output)
        when "critical"
          alert_ui = Vagrant::UI::Prefixed.new(env.ui, "vagrant-alert")
          alert_ui.error(output)
        end
      end
      env.ui.info("")
    end
  else
    @logger.debug("no alert notifications to display")
  end
end

#checkself

Run check



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
# File 'lib/vagrant/util/checkpoint_client.rb', line 77

def check
  if enabled && @checkpoint_thread.nil?
    logger.debug("starting plugin check")
    @checkpoint_thread = Thread.new do
      Thread.current.abort_on_exception = false
      if Thread.current.respond_to?(:report_on_exception=)
        Thread.current.report_on_exception = false
      end
      begin
        Thread.current[:result] = Checkpoint.check(
          product: "vagrant",
          version: VERSION,
          signature_file: files[:signature],
          cache_file: files[:cache]
        )
        if !Thread.current[:result].is_a?(Hash)
          Thread.current[:result] = nil
        end
        logger.debug("plugin check complete")
      rescue => e
        logger.debug("plugin check failure - #{e}")
      end
    end
  end
  self
end

#complete?Boolean

Check has completed



56
57
58
# File 'lib/vagrant/util/checkpoint_client.rb', line 56

def complete?
  !@checkpoint_thread.nil? && !@checkpoint_thread.alive?
end

#displayboolean

Display any alerts or version update information



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/vagrant/util/checkpoint_client.rb', line 107

def display
  if !defined?(@displayed)
    if !complete?
      @logger.debug("waiting for checkpoint to complete...")
    end
    # Don't display if information is cached
    if result && !result["cached"]
      version_check
      alerts_check
    else
      @logger.debug("no information received from checkpoint")
    end
    @displayed = true
  else
    false
  end
end

#reset!Object

Reset the cached values for platform. This is not considered a public API and should only be used for testing.



175
176
177
178
179
180
# File 'lib/vagrant/util/checkpoint_client.rb', line 175

def reset!
  logger = @logger
  instance_variables.each(&method(:remove_instance_variable))
  @logger = logger
  @enabled = false
end

#resultHash?

Result of check



63
64
65
66
67
68
69
70
71
72
# File 'lib/vagrant/util/checkpoint_client.rb', line 63

def result
  if !enabled || @checkpoint_thread.nil?
    nil
  elsif !defined?(@result)
    @checkpoint_thread.join(CHECKPOINT_TIMEOUT)
    @result = @checkpoint_thread[:result]
  else
    @result
  end
end

#setup(env) ⇒ self

Setup will attempt to load the checkpoint library and define required paths



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/vagrant/util/checkpoint_client.rb', line 35

def setup(env)
  begin
    require "checkpoint"
    @enabled = true
  rescue LoadError
    @logger.warn("checkpoint library not found. disabling.")
  end
  if ENV["VAGRANT_CHECKPOINT_DISABLE"]
    @logger.debug("checkpoint disabled via explicit user request")
    @enabled = false
  end
  @files = {
    signature: env.data_dir.join("checkpoint_signature"),
    cache: env.data_dir.join("checkpoint_cache")
  }
  @checkpoint_thread = nil
  @env = env
  self
end

#version_checkObject



159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/vagrant/util/checkpoint_client.rb', line 159

def version_check
  latest_version = Gem::Version.new(result["current_version"])
  installed_version = Gem::Version.new(VERSION)
  ui = Vagrant::UI::Prefixed.new(env.ui, "vagrant")
  if latest_version > installed_version
    @logger.info("new version of Vagrant available - #{latest_version}")
    ui.info(I18n.t("vagrant.version_upgrade_available", latest_version: latest_version, installed_version: installed_version), channel: :error)
    env.ui.info("", channel: :error)
  else
    @logger.debug("vagrant is currently up to date")
  end
end