autosign 0.1.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -81,6 +81,42 @@ password_list:
81
81
 
82
82
  Note that this is a relatively insecure way to do certificate autosigning. Using one-time tokens via the `autosign generate` command is more secure. This functionality is provided to grandfather in existing use cases to ease the transition.
83
83
 
84
+ ## Validation order
85
+ By default the validation runs the following validators in order:
86
+
87
+ 1. jwt_token
88
+ 2. password_list
89
+ 3. multiplexer
90
+
91
+ The first validator to succeed wins and short circuits the validaiton process.
92
+
93
+ You can completely customize the list and how they are ordered via the configuration file. Or even remove some entirely.
94
+
95
+ ```
96
+ ---
97
+ general:
98
+ loglevel: debug
99
+ logfile: "/var/log/autosign.log"
100
+ validation_order:
101
+ - jwt_token
102
+ - multiplexer
103
+ - password_list
104
+ jwt_token:
105
+ secret: J7/WjmkC/CJp2K0/8+sktzSgCqQ=
106
+ validity: '7200'
107
+ journalfile: "/root/var/autosign/autosign.journal"
108
+ ```
109
+
110
+ The validation_order config is an ordered array and since the validators will only match the first validation
111
+ to succeed the validation script should occur as fast as you want.
112
+
113
+ Additionally, if you omit any validator that validator will not be used during the validation process. This might
114
+ be important if you wanted to only use special validators or remove unwanted validator execution.
115
+
116
+ Please note, the name of the validator which is speficed by the `NAME` constant in the validator code must match
117
+ the list you specify otherwise it will not be part of the validation process.
118
+
119
+ **NOTE** To use this feature you must have deep_merge 1.2.1+ installed which is now a requirement of this gem.
84
120
 
85
121
  ### Troubleshooting
86
122
  If you're having problems, try the following:
@@ -90,6 +126,7 @@ If you're having problems, try the following:
90
126
  - you can manually trigger the autosigning script with something like `cat the_csr.csr | autosign-validator certname.example.com`
91
127
  - If you run the puppet master foregrounded, you'll see quite a bit of autosign script output if autosign loglevel is set to debug.
92
128
 
129
+ Starting with the 1.0.0 release the autosign gem requires ruby 2.4. If you can't upgrade just yet you can continue to use the older 0.1.4 release.
93
130
 
94
131
  ### Further Reading
95
132
 
data/Rakefile CHANGED
@@ -1,32 +1,32 @@
1
+ # encoding: utf-8
2
+ # frozen_string_literal: true
3
+
1
4
  require 'rubygems'
2
- begin
3
- require 'rspec/core/rake_task'
4
- require 'cucumber'
5
- require 'cucumber/rake/task'
6
- require 'rdoc/task'
7
- RSpec::Core::RakeTask.new(:spec) do |t|
8
- t.rspec_opts = '--format documentation'
9
- end
10
- rescue LoadError
11
- end
5
+ require 'bundler'
6
+ require 'bundler/gem_tasks'
7
+ require 'rake/testtask'
8
+ require 'rspec/core/rake_task'
9
+ require 'cucumber'
10
+ require 'cucumber/rake/task'
11
+ require 'rdoc/task'
12
12
  require 'rake/clean'
13
- require 'rubygems/package_task'
14
- Rake::RDocTask.new do |rd|
15
- rd.main = "README.rdoc"
16
- rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
17
- rd.title = 'Your application title'
18
- end
19
13
 
20
- spec = eval(File.read('autosign.gemspec'))
14
+ RSpec::Core::RakeTask.new(:spec) do |t|
15
+ t.rspec_opts = '--format documentation'
16
+ end
21
17
 
22
- Gem::PackageTask.new(spec) do |pkg|
18
+ Rake::RDocTask.new do |rd|
19
+ rd.main = 'README.rdoc'
20
+ rd.rdoc_files.include('README.rdoc', 'lib/**/*.rb', 'bin/**/*')
21
+ rd.title = 'Autosign'
23
22
  end
24
- CUKE_RESULTS = 'results.html'
23
+
24
+ CUKE_RESULTS = 'results.html'.freeze
25
25
  CLEAN << CUKE_RESULTS
26
26
  desc 'Run features'
27
27
 
28
28
  Cucumber::Rake::Task.new(:features) do |t|
29
- t.cucumber_opts = "features --format pretty"
29
+ t.cucumber_opts = 'features --format pretty'
30
30
  end
31
31
 
32
32
  desc 'Run features tagged as work-in-progress (@wip)'
@@ -41,10 +41,10 @@ task 'cucumber:wip' => 'features:wip'
41
41
  task :wip => 'features:wip'
42
42
  require 'rake/testtask'
43
43
  Rake::TestTask.new do |t|
44
- t.libs << "test"
44
+ t.libs << 'test'
45
45
  t.test_files = FileList['test/*_test.rb']
46
46
  end
47
47
 
48
48
  task :ci => [:spec, :features]
49
49
 
50
- task :default => [:test,:features]
50
+ task :default => [:test, :features]
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Ensure we require the local version and not one we might have installed already
2
- require File.join([File.dirname(__FILE__),'lib','autosign','version.rb'])
3
- spec = Gem::Specification.new do |s|
4
+ require File.join([__dir__, 'lib', 'autosign', 'version.rb'])
5
+ spec = Gem::Specification.new do |s|
4
6
  s.name = 'autosign'
5
7
  s.version = Autosign::VERSION
6
8
  s.author = 'Daniel Dreier'
@@ -8,28 +10,30 @@ spec = Gem::Specification.new do |s|
8
10
  s.homepage = 'https://github.com/danieldreier/autosign'
9
11
  s.platform = Gem::Platform::RUBY
10
12
  s.summary = 'Tooling to make puppet autosigning easy, secure, and extensible'
11
- s.files = `git ls-files`.split("
12
- ")
13
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|features|fixtures)/}) }
13
14
  s.require_paths << 'lib'
14
- s.has_rdoc = false
15
- s.rdoc_options << '--title' << 'autosign' << '--main' << 'README.rdoc' << '-ri'
15
+ s.extra_rdoc_files = [
16
+ 'CHANGELOG.md',
17
+ 'LICENSE',
18
+ 'README.md'
19
+ ]
16
20
  s.bindir = 'bin'
17
- s.executables << 'autosign'
18
- s.executables << 'autosign-validator'
19
- s.add_development_dependency('rake', '~> 10')
20
- s.add_development_dependency('rdoc', '~> 4')
21
+ s.executables = ['autosign', 'autosign-validator']
21
22
  s.add_development_dependency('aruba', '~> 0.6')
22
- s.add_development_dependency('cucumber', '~> 2')
23
- s.add_development_dependency('puppet', '~> 3')
24
- s.add_development_dependency('rspec', '~> 3')
25
23
  s.add_development_dependency('coveralls')
24
+ s.add_development_dependency('cucumber', '~> 2')
26
25
  s.add_development_dependency('pry', '~> 0.10')
27
- s.add_runtime_dependency('gli','~> 2')
28
- s.add_runtime_dependency('jwt','~> 1')
29
- s.add_runtime_dependency('iniparse','~> 1')
26
+ s.add_development_dependency('puppet', '~> 6')
27
+ s.add_development_dependency('rake', '~> 13')
28
+ s.add_development_dependency('rdoc', '~> 4')
29
+ s.add_development_dependency('rspec', '~> 3')
30
+ s.add_development_dependency('rubocop', '~> 0.83.0')
31
+ s.add_development_dependency('yard', '~> 0.9.11')
32
+ s.add_development_dependency('bundler', '~> 2.0')
33
+ s.add_runtime_dependency('deep_merge', '~> 1.2')
34
+ s.add_runtime_dependency('gli', '~> 2')
35
+ s.add_runtime_dependency('iniparse', '~> 1')
36
+ s.add_runtime_dependency('jwt', '~> 1')
30
37
  s.add_runtime_dependency('logging', '~> 2')
31
- s.add_runtime_dependency('json', '~> 1')
32
- s.add_runtime_dependency('deep_merge', '~> 1')
33
- s.add_runtime_dependency('require_all', '~> 1')
34
- s.add_runtime_dependency('yard', '~> 0.8')
38
+ s.add_runtime_dependency('multi_json', '>=1')
35
39
  end
@@ -52,8 +52,9 @@ command :generate do |c|
52
52
 
53
53
  c.action do |global_options,options,args|
54
54
  config = Autosign::Config.new({'config_file' => global_options['config']})
55
- global_options['secret'] = config.settings['jwt_token']['secret'] if global_options['secret'].nil?
56
- options['validfor'] = config.settings.to_hash['jwt_token']['validity'].to_s if options['validfor'] == '7200'
55
+ config_settings = config.settings
56
+ global_options['secret'] = config_settings['jwt_token']['secret'] if global_options['secret'].nil?
57
+ options['validfor'] = config_settings.to_hash['jwt_token']['validity'].to_s if options['validfor'] == '7200'
57
58
  @logger.debug "validfor: " + options['validfor']
58
59
  help_now!('no secret was defined via --secret or a config file') if global_options['secret'].nil?
59
60
  help_now!('certname is required as argument') if args[0].nil?
@@ -66,9 +67,11 @@ command :generate do |c|
66
67
  puts token.sign.to_s
67
68
  else
68
69
  @logger.info "generated token for: " + certname
69
- puts "Autosign token for: " + token.certname + ", valid until: " + Time.at(token.validto).to_s
70
- puts "To use the token, put the following in ${puppet_confdir}/csr_attributes.yaml prior to running puppet agent for the first time:"
71
- puts ""
70
+ unless global_options[:quiet]
71
+ puts "Autosign token for: " + token.certname + ", valid until: " + Time.at(token.validto).to_s
72
+ puts "To use the token, put the following in ${puppet_confdir}/csr_attributes.yaml prior to running puppet agent for the first time:"
73
+ puts ""
74
+ end
72
75
  puts "custom_attributes:"
73
76
  puts " challengePassword: \"#{token.sign.to_s}\""
74
77
  end
@@ -85,8 +88,9 @@ command :validate do |c|
85
88
 
86
89
  c.action do |global_options,options,args|
87
90
  config = Autosign::Config.new({'config_file' => global_options['config']})
88
- puts config.settings.to_hash['jwt_token']
89
- global_options['secret'] = config.settings['jwt_token']['secret'] if global_options['secret'].nil?
91
+ config_settings = config.settings
92
+ puts config_settings.to_hash['jwt_token']
93
+ global_options['secret'] = config_settings['jwt_token']['secret'] if global_options['secret'].nil?
90
94
 
91
95
  help_now!('no secret was defined via --secret or a config file') if global_options['secret'].nil?
92
96
  help_now!('certname is required') if options['certname'].nil?
@@ -110,7 +114,7 @@ command :config do |c|
110
114
  c.command :setup do |setup|
111
115
  setup.action do |global_options,options,args|
112
116
  @logger.info "setup command ran with #{global_options} #{options} #{args}"
113
- result = Autosign::Config.generate_default
117
+ result = Autosign::Config.generate_default({'config_file' => global_options['config']})
114
118
  STDOUT.puts "generated default config file at #{result}" if result
115
119
  end
116
120
  end
@@ -120,7 +124,8 @@ command :config do |c|
120
124
  print.action do |global_options,options,args|
121
125
  @logger.debug "print command ran with #{global_options} #{options} #{args}"
122
126
  config = Autosign::Config.new({'config_file' => global_options['config']})
123
- puts config.settings.to_s
127
+ require 'yaml'
128
+ puts config.settings.to_yaml
124
129
  end
125
130
  end
126
131
 
@@ -132,17 +137,20 @@ pre do |global,command,options,args|
132
137
  # chosen command
133
138
  # Use skips_pre before a command to skip this block
134
139
  # on that command only
135
- # config = Autosign::Config.new
136
- # @logger.level = config.settings.to_hash['general']['loglevel'].to_sym unless config.settings.to_hash['general']['loglevel'].nil?
140
+ config = Autosign::Config.new
141
+ config_settings = config.settings
142
+ @logger.level = config_settings.to_hash['general']['loglevel'].to_sym unless config_settings.to_hash['general']['loglevel'].nil?
137
143
 
138
144
  @logger.level = :error if global['quiet']
139
145
  @logger.level = :info if global['verbose']
140
146
  @logger.level = :debug if global['debug']
141
147
 
142
- if global['logfile'].nil?
143
- @logger.add_appenders Logging.appenders.stdout
144
- else
145
- @logger.add_appenders Logging.appenders.stdout, Logging.appenders.file(global['logfile'])
148
+ stdout_layout = Logging.layouts.pattern(:pattern => "%-5l -- %c : %m\n")
149
+ @logger.add_appenders Logging.appenders.stdout(:layout => stdout_layout)
150
+
151
+ unless global['logfile'].nil?
152
+ file_layout = Logging.layouts.pattern(:pattern => "%d %-5l -- %c : %m\n", :date_pattern => "%Y-%m-%dT%H:%M:%S.%s")
153
+ @logger.add_appenders Logging.appenders.file(global['logfile'], :layout => file_layout)
146
154
  end
147
155
 
148
156
  true
@@ -2,17 +2,26 @@
2
2
  require 'autosign'
3
3
  require 'logging'
4
4
 
5
+ ### Ensure stdin is read https://tickets.puppetlabs.com/browse/SERVER-1116
6
+ raw_csr = $stdin.read
5
7
 
6
8
  ### Start logging
7
9
  @logger = Logging.logger['Autosign']
8
- @logger.level = :debug
10
+ @logger.level = :warn
9
11
 
10
12
  # Start logging to stdout first so we get errors while loading the config file
11
13
  @logger.add_appenders Logging.appenders.stdout
12
14
 
13
15
  # Load config and then add logfile as a log appender
14
- config = Autosign::Config.new
15
- @logger.add_appenders Logging.appenders.file(config.settings['general']['logfile']) unless config.settings['general']['logfile'].nil?
16
+ config_settings = Autosign::Config.new.settings
17
+
18
+ unless config_settings['general']['logfile'].nil?
19
+ file_layout = Logging.layouts.pattern(:pattern => "%d %-5l -- %c : %m\n", :date_pattern => "%Y-%m-%dT%H:%M:%S.%s")
20
+ @logger.add_appenders Logging.appenders.file(config_settings['general']['logfile'], :layout => file_layout)
21
+ end
22
+
23
+ @logger.level = config_settings['general']['loglevel'].to_sym unless config_settings['general']['loglevel'].nil?
24
+
16
25
  ### End logging initialization
17
26
 
18
27
  ### Get Inputs
@@ -21,11 +30,10 @@ unless ARGV.count == 1
21
30
  exit 1
22
31
  end
23
32
 
24
- certname = ARGV[0]
33
+ certname = ARGV.shift
25
34
  @logger.debug "certname is " + certname
26
35
 
27
36
  @logger.debug "reading CSR from stdin"
28
- raw_csr = $stdin.read
29
37
  csr = Autosign::Decoder.decode_csr(raw_csr)
30
38
  exit 1 unless csr.is_a?(Hash)
31
39
 
@@ -33,7 +41,7 @@ exit 1 unless csr.is_a?(Hash)
33
41
  ### End Inputs
34
42
 
35
43
  ### validate token
36
- token_validation = Autosign::Validator.any_validator(csr[:challenge_password].to_s, certname.to_s, raw_csr)
44
+ token_validation = Autosign::Validator.any_validator(csr[:challenge_password].to_s, certname.to_s, raw_csr, config_settings)
37
45
  ### end validation
38
46
 
39
47
  ### Exit with correct exit status
@@ -1,5 +1,5 @@
1
1
  require 'rubygems'
2
- require 'json'
2
+ require 'multi_json'
3
3
  require 'autosign/version.rb'
4
4
  require 'autosign/token.rb'
5
5
  require 'autosign/config.rb'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rbconfig'
2
4
  require 'securerandom'
3
5
  require 'deep_merge'
@@ -7,16 +9,16 @@ module Autosign
7
9
  # Exceptions namespace for Autosign class
8
10
  module Exceptions
9
11
  # Exception representing a general failure during validation
10
- class Validation < Exception
12
+ class Validation < RuntimeError
11
13
  end
12
14
  # Exception representing a missing file during config validation
13
- class NotFound < Exception
15
+ class NotFound < RuntimeError
14
16
  end
15
17
  # Exception representing a permissions error during config validation
16
- class Permissions < Exception
18
+ class Permissions < RuntimeError
17
19
  end
18
20
  # Exception representing errors that Autosign does not know how to handle
19
- class Error < Exception
21
+ class Error < RuntimeError
20
22
  end
21
23
  end
22
24
 
@@ -36,20 +38,25 @@ module Autosign
36
38
  # @return [Autosign::Config] instance of the Autosign::Config class
37
39
  def initialize(settings_param = {})
38
40
  # set up logging
39
- @log = Logging.logger['Autosign::Config']
40
- @log.debug "initializing Autosign::Config"
41
+ @log = Logging.logger[self.class]
42
+ @log.debug "initializing #{self.class.name}"
41
43
  # validate parameter
42
44
  raise 'settings is not a hash' unless settings_param.is_a?(Hash)
43
45
 
44
46
  # look in the following places for a config file
45
- @config_file_paths = ['/etc/autosign.conf', '/usr/local/etc/autosign.conf']
47
+ @config_file_paths = ['/etc/puppetlabs/puppetserver/autosign.conf', '/etc/autosign.conf', '/usr/local/etc/autosign.conf']
46
48
 
47
49
  # HOME is unset when puppet runs, so we need to only use it if it's set
48
- @config_file_paths << File.join(Dir.home, '.autosign.conf') unless ENV['HOME'].nil?
49
- @config_file_paths = [ settings_param['config_file'] ] unless settings_param['config_file'].nil?
50
+ unless ENV['HOME'].nil?
51
+ @config_file_paths << File.join(Dir.home, '.autosign.conf')
52
+ end
53
+
54
+ unless settings_param['config_file'].nil?
55
+ @config_file_paths = [settings_param['config_file']]
56
+ end
50
57
 
51
58
  @settings = settings_param
52
- @log.debug "Using merged settings hash: " + @settings.to_s
59
+ @log.debug 'Using merged settings hash: ' + @settings.to_s
53
60
  end
54
61
 
55
62
  # Return a merged settings hash of defaults, config file settings
@@ -57,11 +64,11 @@ module Autosign
57
64
  #
58
65
  # @return [Hash] deep merged settings hash
59
66
  def settings
60
- @log.debug "merging settings"
67
+ @log.debug 'merging settings'
61
68
  setting_sources = [default_settings, configfile, @settings]
62
- merged_settings = setting_sources.inject({}) { |merged, hash| merged.deep_merge(hash) }
63
- @log.debug "using merged settings: " + merged_settings.to_s
64
- return merged_settings
69
+ merged_settings = setting_sources.inject({}) { |merged, hash| merged.deep_merge!(hash, {:overwrite_arrays => true}) }
70
+ @log.debug 'using merged settings: ' + merged_settings.to_s
71
+ merged_settings
65
72
  end
66
73
 
67
74
  private
@@ -78,12 +85,14 @@ module Autosign
78
85
  def default_settings
79
86
  { 'general' =>
80
87
  {
81
- 'loglevel' => 'INFO',
88
+ 'loglevel' => 'INFO',
89
+ 'validation_order' => %w[
90
+ jwt_token password_list multiplexer
91
+ ]
82
92
  },
83
93
  'jwt_token' => {
84
94
  'validity' => 7200
85
- }
86
- }
95
+ } }
87
96
  end
88
97
 
89
98
  # Locate the configuration file, parse it from INI-format, and return
@@ -91,21 +100,21 @@ module Autosign
91
100
  #
92
101
  # @return [Hash] configuration settings loaded from INI file
93
102
  def configfile
94
- @log.debug "Finding config file"
95
- @config_file_paths.each { |file|
103
+ @log.debug 'Finding config file'
104
+ @config_file_paths.each do |file|
96
105
  @log.debug "Checking if file '#{file}' exists"
97
106
  if File.file?(file)
98
- @log.debug "Reading config file from: " + file
107
+ @log.debug 'Reading config file from: ' + file
99
108
  config_file = File.read(file)
100
109
  parsed_config_file = YAML.load(config_file)
101
- #parsed_config_file = IniParse.parse(config_file).to_hash
102
- @log.debug "configuration read from config file: " + parsed_config_file.to_s
110
+ # parsed_config_file = IniParse.parse(config_file).to_hash
111
+ @log.debug 'configuration read from config file: ' + parsed_config_file.to_s
103
112
  return parsed_config_file if parsed_config_file.is_a?(Hash)
104
113
  else
105
114
  @log.debug "Configuration file '#{file}' not found"
106
115
  end
107
- }
108
- return {}
116
+ end
117
+ {}
109
118
  end
110
119
 
111
120
  # Validate configuration file
@@ -114,14 +123,14 @@ module Autosign
114
123
  # @param configfile [String] the absolute path of the config file to validate
115
124
  # @return [String] the absolute path of the config file
116
125
  def validate_config_file(configfile = location)
117
- @log.debug "validating config file"
126
+ @log.debug 'validating config file'
118
127
  unless File.file?(configfile)
119
128
  @log.error "configuration file not found at: #{configfile}"
120
129
  raise Autosign::Exceptions::NotFound
121
130
  end
122
131
 
123
132
  # check if file is world-readable
124
- if File.world_readable?(configfile) or File.world_writable?(configfile)
133
+ if File.world_readable?(configfile) || File.world_writable?(configfile)
125
134
  @log.error "configuration file #{configfile} is world-readable or world-writable, which is a security risk"
126
135
  raise Autosign::Exceptions::Permissions
127
136
  end
@@ -132,25 +141,25 @@ module Autosign
132
141
  # Generate a default configuration file
133
142
  # As a convenience for the user, we can generate a default config file
134
143
  # This class is currently too tightly coupled with the JWT token validator
135
- def self.generate_default()
144
+ def self.generate_default(settings_param = {})
136
145
  os_defaults = (
137
146
  case RbConfig::CONFIG['host_os']
138
147
  when /darwin|mac os/
139
148
  {
140
- 'logpath' => File.join(Dir.home, 'autosign.log'),
141
- 'confpath' => File.join(Dir.home, '.autosign.conf'),
149
+ 'logpath' => File.join(Dir.home, 'autosign.log'),
150
+ 'confpath' => File.join(Dir.home, '.autosign.conf'),
142
151
  'journalfile' => File.join(Dir.home, '.autosign.journal')
143
152
  }
144
153
  when /linux/
145
154
  {
146
- 'logpath' => '/var/log/autosign.log',
147
- 'confpath' => '/etc/autosign.conf',
155
+ 'logpath' => '/var/log/autosign.log',
156
+ 'confpath' => '/etc/autosign.conf',
148
157
  'journalfile' => File.join(Dir.home, '/var/autosign/autosign.journal')
149
158
  }
150
159
  when /bsd/
151
160
  {
152
- 'logpath' => '/var/log/autosign.log',
153
- 'confpath' => '/usr/local/etc/autosign.conf',
161
+ 'logpath' => '/var/log/autosign.log',
162
+ 'confpath' => '/usr/local/etc/autosign.conf',
154
163
  'journalfile' => File.join(Dir.home, '/var/autosign/autosign.journal')
155
164
  }
156
165
  else
@@ -161,36 +170,42 @@ module Autosign
161
170
  config = {
162
171
  'general' => {
163
172
  'loglevel' => 'warn',
164
- 'logfile' => os_defaults['logpath']
173
+ 'logfile' => os_defaults['logpath'],
174
+ 'validation_order' => %w[
175
+ jwt_token password_list multiplexer
176
+ ]
165
177
  },
166
178
  'jwt_token' => {
167
- 'secret' => SecureRandom.base64(20),
179
+ 'secret' => SecureRandom.base64(20),
168
180
  'validity' => '7200',
169
181
  'journalfile' => os_defaults['journalfile']
170
182
  }
171
183
  }
172
184
 
173
- # config = IniParse.gen do |doc|
174
- # doc.section("general") do |general|
175
- # general.option("loglevel", "warn")
176
- # general.option("logfile", os_defaults['logpath'])
177
- # end
178
- # doc.section("jwt_token") do |jwt_token|
179
- # jwt_token.option("secret", SecureRandom.base64(15))
180
- # jwt_token.option("validity", 7200)
181
- # jwt_token.option("journalfile", os_defaults['journalfile'])
182
- # end
183
- # doc.section("multiplexer") do |jwt_token|
184
- # jwt_token.option(";external_policy_executable", '/usr/local/bin/some_autosign_executable')
185
- # jwt_token.option(";external_policy_executable", '/usr/local/bin/another_autosign_executable')
186
- # end
187
- # doc.section("password_list") do |jwt_token|
188
- # jwt_token.option(";password", 'static_autosign_password_here')
189
- # jwt_token.option(";password", 'another_static_autosign_password')
190
- # end
191
- # end.to_ini
192
- raise Autosign::Exceptions::Error, "file #{os_defaults['confpath']} already exists, aborting" if File.file?(os_defaults['confpath'])
193
- return os_defaults['confpath'] if File.write(os_defaults['confpath'], config.to_yaml)
185
+ # config = IniParse.gen do |doc|
186
+ # doc.section("general") do |general|
187
+ # general.option("loglevel", "warn")
188
+ # general.option("logfile", os_defaults['logpath'])
189
+ # end
190
+ # doc.section("jwt_token") do |jwt_token|
191
+ # jwt_token.option("secret", SecureRandom.base64(15))
192
+ # jwt_token.option("validity", 7200)
193
+ # jwt_token.option("journalfile", os_defaults['journalfile'])
194
+ # end
195
+ # doc.section("multiplexer") do |jwt_token|
196
+ # jwt_token.option(";external_policy_executable", '/usr/local/bin/some_autosign_executable')
197
+ # jwt_token.option(";external_policy_executable", '/usr/local/bin/another_autosign_executable')
198
+ # end
199
+ # doc.section("password_list") do |jwt_token|
200
+ # jwt_token.option(";password", 'static_autosign_password_here')
201
+ # jwt_token.option(";password", 'another_static_autosign_password')
202
+ # end
203
+ # end.to_ini
204
+ config_file = settings_param['config_file'] || os_defaults['confpath']
205
+ if File.file?(config_file)
206
+ raise Autosign::Exceptions::Error, "file #{config_file} already exists, aborting"
207
+ end
208
+ return config_file if File.write(config_file, config.to_yaml)
194
209
  end
195
210
  end
196
211
  end