Class: Boxen::Config

Inherits:
Object
  • Object
show all
Defined in:
lib/boxen/config.rb

Overview

All configuration for Boxen, whether it’s loaded from command-line args, environment variables, config files, or the keychain.

Constant Summary collapse

KEYCHAIN_SERVICE =

The service name to use when loading/saving config in the Keychain.

"Boxen"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize {|_self| ... } ⇒ Config

Create a new instance. Yields ‘self` if `block` is given.

Yields:

  • (_self)

Yield Parameters:

  • _self (Boxen::Config)

    the object that the method was called on



81
82
83
84
85
86
# File 'lib/boxen/config.rb', line 81

def initialize(&block)
  @fde  = true
  @pull = true

  yield self if block_given?
end

Instance Attribute Details

#debug=(value) ⇒ Object (writeonly)

Sets the attribute debug

Parameters:

  • value

    the value to set the attribute debug to.



101
102
103
# File 'lib/boxen/config.rb', line 101

def debug=(value)
  @debug = value
end

#emailObject

A GitHub user’s public email.



109
110
111
# File 'lib/boxen/config.rb', line 109

def email
  @email
end

#fde=(value) ⇒ Object (writeonly)

Sets the attribute fde

Parameters:

  • value

    the value to set the attribute fde to.



124
125
126
# File 'lib/boxen/config.rb', line 124

def fde=(value)
  @fde = value
end

#homedirObject

Boxen’s home directory. Default is ‘“/opt/boxen”`. Respects the `BOXEN_HOME` environment variable.



129
130
131
# File 'lib/boxen/config.rb', line 129

def homedir
  @homedir || ENV["BOXEN_HOME"] || "/opt/boxen"
end

#logfileObject

Boxen’s log file. Default is ‘“##repodir/log/boxen.log”`. Respects the `BOXEN_LOG_FILE` environment variable. The log is overwritten on every run.



139
140
141
# File 'lib/boxen/config.rb', line 139

def logfile
  @logfile || ENV["BOXEN_LOG_FILE"] || "#{repodir}/log/boxen.log"
end

#loginObject

A GitHub user login. Default is ‘nil`.



147
148
149
# File 'lib/boxen/config.rb', line 147

def 
  @login
end

#nameObject

A GitHub user’s profile name.



162
163
164
# File 'lib/boxen/config.rb', line 162

def name
  @name
end

#passwordObject

A GitHub user password. Default is ‘nil`.



166
167
168
# File 'lib/boxen/config.rb', line 166

def password
  @password
end

#pretend=(value) ⇒ Object (writeonly)

Sets the attribute pretend

Parameters:

  • value

    the value to set the attribute pretend to.



179
180
181
# File 'lib/boxen/config.rb', line 179

def pretend=(value)
  @pretend = value
end

#profile=(value) ⇒ Object (writeonly)

Sets the attribute profile

Parameters:

  • value

    the value to set the attribute profile to.



187
188
189
# File 'lib/boxen/config.rb', line 187

def profile=(value)
  @profile = value
end

#puppetdirObject

The directory where Puppet expects configuration (which we don’t use) and runtime information (which we generally don’t care about). Default is ‘/tmp/boxen/puppet`. Respects the `BOXEN_PUPPET_DIR` environment variable.



211
212
213
# File 'lib/boxen/config.rb', line 211

def puppetdir
  @puppetdir || ENV["BOXEN_PUPPET_DIR"] || "/tmp/boxen/puppet"
end

#repodirObject

The directory of the custom Boxen repo for an org. Default is ‘Dir.pwd`. Respects the `BOXEN_REPO_DIR` environment variable.



220
221
222
# File 'lib/boxen/config.rb', line 220

def repodir
  @repodir || ENV["BOXEN_REPO_DIR"] || Dir.pwd
end

#srcdirObject

The directory where repos live. Default is ‘“/Users/##user/src”`.



229
230
231
# File 'lib/boxen/config.rb', line 229

def srcdir
  @srcdir || "/Users/#{user}/src"
end

#stealth=(value) ⇒ Object (writeonly)

Sets the attribute stealth

Parameters:

  • value

    the value to set the attribute stealth to.



242
243
244
# File 'lib/boxen/config.rb', line 242

def stealth=(value)
  @stealth = value
end

#tokenObject

A GitHub OAuth token. Default is ‘nil`.



246
247
248
# File 'lib/boxen/config.rb', line 246

def token
  @token
end

#userObject

A local user login. Default is the ‘USER` environment variable.



250
251
252
# File 'lib/boxen/config.rb', line 250

def user
  @user || ENV["USER"]
end

Class Method Details

.load(&block) ⇒ Object

Load config. Yields config if ‘block` is given.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/boxen/config.rb', line 19

def self.load(&block)
  new do |config|
    file = "#{config.homedir}/config/boxen/defaults.json"

    if File.file? file
      attrs = JSON.parse File.read file

      attrs.each do |key, value|
        if value && config.respond_to?(selector = "#{key}=")
          config.send selector, value
        end
      end
    end

    cmd = "security find-generic-password " +
      "-a #{config.user} -s '#{KEYCHAIN_SERVICE}' -w 2>/dev/null"

    password = `#{cmd}`.strip
    password = nil unless $?.success?

    config.password = password

    yield config if block_given?
  end
end

.save(config) ⇒ Object

Save ‘config`. Returns `config`. Note that this only saves data, not flags. For example, `login` will be saved, but `stealth?` won’t.



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
# File 'lib/boxen/config.rb', line 49

def self.save(config)
  attrs = {
    :email     => config.email,
    :homedir   => config.homedir,
    :login     => config.,
    :name      => config.name,
    :puppetdir => config.puppetdir,
    :repodir   => config.repodir,
    :srcdir    => config.srcdir,
    :token     => config.token,
    :user      => config.user
  }

  file = "#{config.homedir}/config/boxen/defaults.json"
  FileUtils.mkdir_p File.dirname file

  File.open file, "wb" do |f|
    f.write JSON.generate Hash[attrs.reject { |k, v| v.nil? }]
  end

  cmd = ["security", "add-generic-password",
         "-a", config.user, "-s", KEYCHAIN_SERVICE, "-U", "-w", config.password]

  unless system *cmd
    raise Boxen::Error, "Can't save config in the Keychain."
  end

  config
end

Instance Method Details

#apiObject

Create an API instance using the current user creds. A new instance is created any time ‘login` or `password` change.



91
92
93
# File 'lib/boxen/config.rb', line 91

def api
  @api ||= Octokit::Client.new :login => , :password => password
end

#debug?Boolean

Spew a bunch of debug logging? Default is ‘false`.

Returns:

  • (Boolean)


97
98
99
# File 'lib/boxen/config.rb', line 97

def debug?
  !!@debug
end

#dirty?Boolean

Returns:

  • (Boolean)


103
104
105
# File 'lib/boxen/config.rb', line 103

def dirty?
  `git status --porcelain`.strip.empty?
end

#envfileObject

The shell script that loads Boxen’s environment.



113
114
115
# File 'lib/boxen/config.rb', line 113

def envfile
  "#{homedir}/env.sh"
end

#fde?Boolean

Is full disk encryption required? Default is ‘true`. Respects the `BOXEN_NO_FDE` environment variable.

Returns:

  • (Boolean)


120
121
122
# File 'lib/boxen/config.rb', line 120

def fde?
  !ENV["BOXEN_NO_FDE"] && @fde
end

#master?Boolean

Is Boxen running on the ‘master` branch?

Returns:

  • (Boolean)


156
157
158
# File 'lib/boxen/config.rb', line 156

def master?
  `git symbolic-ref HEAD`.chomp == "refs/heads/master"
end

#pretend?Boolean

Just go through the motions? Default is ‘false`.

Returns:

  • (Boolean)


175
176
177
# File 'lib/boxen/config.rb', line 175

def pretend?
  !!@pretend
end

#profile?Boolean

Run a profiler on Puppet? Default is ‘false`.

Returns:

  • (Boolean)


183
184
185
# File 'lib/boxen/config.rb', line 183

def profile?
  !!@profile
end

#projectsObject

An Array of Boxen::Project entries, one for each project Boxen knows how to manage.

FIX: Revisit this once we restructure template projects. It’s broken for several reasons: It assumes paths that won’t be right, and it assumes projects live in the same repo as this file.



197
198
199
200
201
202
203
204
# File 'lib/boxen/config.rb', line 197

def projects
  files = Dir["#{repodir}/modules/projects/manifests/*.pp"]
  names = files.map { |m| File.basename m, ".pp" }.sort

  names.map do |name|
    Boxen::Project.new "#{srcdir}/#{name}"
  end
end

#stealth?Boolean

Don’t auto-create issues on failure? Default is ‘false`. Respects the `BOXEN_NO_ISSUE` environment variable.

Returns:

  • (Boolean)


238
239
240
# File 'lib/boxen/config.rb', line 238

def stealth?
  !!ENV["BOXEN_NO_ISSUE"] || @stealth
end