add option for answerback-email tool
-n|--name name
specify my_name for user when assigning account
-l|--login Y|y|N|n
enable/disable user login permission
-u|--update
enable update configuration for assigned account
-u option enable update for:
my_name
my_ssh_pubkey
generate sshkey on jumper
reset user's login permission
Signed-off-by: Luan Shengde <shdluan(a)163.com>
---
container/assign-account/answerback-email.rb | 147 +++++++++++++++----
1 file changed, 120 insertions(+), 27 deletions(-)
diff --git a/container/assign-account/answerback-email.rb b/container/assign-account/answerback-email.rb
index 5ddc451..bffba17 100755
--- a/container/assign-account/answerback-email.rb
+++ b/container/assign-account/answerback-email.rb
@@ -14,6 +14,7 @@ require 'optparse'
require_relative '../defconfig'
require_relative '../../lib/es_client'
require_relative 'build-send-account-email'
+require_relative 'build-update-email'
names = Set.new %w[
JUMPER_HOST
@@ -33,25 +34,61 @@ my_info = {
'my_email' => nil,
'my_name' => nil,
'my_commit_url' => nil,
- 'my_uuid' => %x(uuidgen).chomp,
- 'my_ssh_pubkey' => [],
- 'gen_sshkey' => false
+ 'my_uuid' => nil,
+ 'my_login_name' => nil,
+ 'my_ssh_pubkey' => []
}
-def init_info(mail_content, my_info)
+# stdin_info is used to store infos added with option:
+# -e email_address
+# -n name
+# -s pubkey_file
+# email_info is used to store infos parsed from email_file with option:
+# -f email_file
+# my_info_es is used to store info read from ES when update user
+# when use --update option
+# stdin_info, email_info, my_info_es have different priority
+# stdin_info > email_info > my_info_es
+# when assigning account or update conf for account
+# if they have the same key, my_info will use the value with higher priority.
+# conf_info is used to store keys used to config the account
+stdin_info = {}
+email_info = {}
+my_info_es = {}
+conf_info = {
+ 'gen_sshkey' => false,
+ 'enable_login' => true,
+ 'is_update_account' => false
+}
+
+def init_info(mail_content, email_info, my_info)
my_info['my_email'] = mail_content.from[0]
- my_info['my_name'] = mail_content.From.unparsed_value.gsub(/ <[^<>]*>/, '')
+ email_info['my_name'] = mail_content.From.unparsed_value.gsub(/ <[^<>]*>/, '')
return if mail_content.attachments.empty?
- my_info['my_ssh_pubkey'] << mail_content.attachments[0].body.decoded
+ email_info['new_email_pubkey'] = mail_content.attachments[0].body.decoded.strip
+end
+
+def read_my_login_name(my_email, my_info_es)
+ my_account_info_str = %x(curl -XGET localhost:9200/accounts/_doc/#{my_email})
+ my_account_info = YAML.safe_load my_account_info_str
+ message = "No such email found from the ES: #{my_email}"
+ raise message unless my_account_info['found']
+
+ my_info_es.update my_account_info['_source']
end
options = OptionParser.new do |opts|
- opts.banner = 'Usage: answerback-mail.rb [-e|--email email] '
- opts.banner += "[-s|--ssh-pubkey pub_key_file] [-f|--raw-email email_file] [-g|--gen-sshkey]\n"
- opts.banner += " -e or -f is required\n"
+ opts.banner = 'Usage: answerback-mail.rb [-e|--email email] [-n|--name name] '
+ opts.banner += "[-s|--ssh-pubkey pub_key_file] [-g|--gen-sshkey] [--login y|Y|n|N] [--update]\n"
+ opts.banner += ' answerback-mail.rb [-f|--raw-email email_file] '
+ opts.banner += "[-g|--gen-sshkey] [--login y|Y|n|N] [--update]\n"
+ opts.banner += " -e|-f is required when applying account or updating account\n"
+ opts.banner += " -n is require when assigning account with -e\n"
opts.banner += " -s is optional when use -e\n"
- opts.banner += ' -g is optional, used to generate sshkey for user'
+ opts.banner += " -g is optional, used to generate sshkey for user\n"
+ opts.banner += " -u is require when updating an account\n"
+ opts.banner += ' -l is optional, used to enable/disable login permission'
opts.separator ''
opts.separator 'options:'
@@ -60,18 +97,37 @@ options = OptionParser.new do |opts|
my_info['my_email'] = email_address
end
+ opts.on('-n name', '--name name', 'appoint name') do |name|
+ stdin_info['my_name'] = name
+ end
+
opts.on('-s pub_key_file', '--ssh-pubkey pub_key_file', \
'ssh pub_key file, enable password-less login') do |pub_key_file|
- my_info['my_ssh_pubkey'] << File.read(pub_key_file).chomp
+ stdin_info['new_ssh_pubkey'] = File.read(pub_key_file).strip
end
opts.on('-f email_file', '--raw-email email_file', 'email file') do |email_file|
mail_content = Mail.read(email_file)
- init_info(mail_content, my_info)
+ init_info(mail_content, email_info, my_info)
end
opts.on('-g', '--gen-sshkey', 'generate jumper ras public/private key and return pubkey') do
- my_info['gen_sshkey'] = true
+ conf_info['gen_sshkey'] = true
+ end
+
+ opts.on('-u', '--update', 'updata user account') do
+ read_my_login_name(my_info['my_email'], my_info_es)
+ conf_info['is_update_account'] = true
+ end
+
+ opts.on('-l Y|y|N|n', '--login Y|y|N|n', 'enable/disable user login permission') do |value|
+ if %w[y Y].include? value
+ conf_info['enable_login'] = true
+ elsif %w[n N].include? value
+ conf_info['enable_login'] = false
+ else
+ raise 'invalid parameter, please use y|Y|n|N'
+ end
end
opts.on_tail('-h', '--help', 'show this message') do
@@ -82,33 +138,70 @@ end
options.parse!(ARGV)
-def apply_account(my_info)
- account_info_str = %x(curl -XGET '#{JUMPER_HOST}:#{JUMPER_PORT}/assign_account' -d '#{my_info.to_json}')
+def apply_account(my_info, conf_info)
+ apply_info = {}
+ apply_info.update my_info
+ apply_info.update conf_info
+
+ account_info_str = %x(curl -XGET '#{JUMPER_HOST}:#{JUMPER_PORT}/assign_account' -d '#{apply_info.to_json}')
JSON.parse account_info_str
end
-def send_account(my_info)
+def check_my_email(my_info)
message = "No email address specified\n"
- message += "use -e to add a email address\n"
+ message += "use -e to add a email address for applying account\n"
message += 'or use -f to add a email file'
- raise message if my_info['my_email'].nil?
- account_info = apply_account(my_info)
- my_info['my_login_name'] = account_info['my_login_name']
+ raise message if my_info['my_email'].empty?
+end
+def build_my_info_from_input(my_info, email_info, my_info_es, stdin_info)
+ new_email_pubkey = email_info.delete 'new_email_pubkey'
+ new_stdin_pubkey = stdin_info.delete 'new_ssh_pubkey'
+ new_pubkey = new_stdin_pubkey || new_email_pubkey
+
+ my_info.update my_info_es unless my_info_es.empty?
+ my_info.update email_info unless email_info.empty?
+ my_info.update stdin_info unless stdin_info.empty?
+
+ return if new_pubkey.nil?
+ return if my_info['my_ssh_pubkey'].include? new_pubkey
+
+ my_info['my_ssh_pubkey'].insert(0, new_pubkey)
+end
+
+def build_my_info_from_account_info(my_info, account_info, conf_info)
unless account_info['my_jumper_pubkey'].nil?
- my_info['my_ssh_pubkey'] << account_info['my_jumper_pubkey'].chomp
+ return if my_info['my_ssh_pubkey'][-1] == account_info['my_jumper_pubkey']
+
+ my_info['my_ssh_pubkey'] << account_info['my_jumper_pubkey']
end
- my_info.delete 'gen_sshkey'
+ my_info['my_login_name'] = account_info['my_login_name'] unless conf_info['is_update_account']
+end
+
+def send_account(my_info, conf_info, email_info, my_info_es, stdin_info)
+ check_my_email(my_info)
+ my_info['my_uuid'] = %x(uuidgen).chomp unless conf_info['is_update_account']
+ build_my_info_from_input(my_info, email_info, my_info_es, stdin_info)
+
+ message = 'No my_name found, please use -n to add one'
+ raise message if my_info['my_name'].nil?
+
+ account_info = apply_account(my_info, conf_info)
+ build_my_info_from_account_info(my_info, account_info, conf_info)
+
store_account_info(my_info)
- send_mail(my_info, account_info)
+ send_mail(my_info, account_info, conf_info)
end
-def send_mail(my_info, account_info)
- message = build_message(my_info['my_email'], account_info)
-
+def send_mail(my_info, account_info, conf_info)
+ message = if conf_info['is_update_account']
+ build_update_message(my_info['my_email'], account_info, conf_info)
+ else
+ build_message(my_info['my_email'], account_info)
+ end
%x(curl -XPOST '#{SEND_MAIL_HOST}:#{SEND_MAIL_PORT}/send_mail_text' -d "#{message}")
end
@@ -117,4 +210,4 @@ def store_account_info(my_info)
es.put_source_by_id(my_info['my_email'], my_info)
end
-send_account(my_info)
+send_account(my_info, conf_info, email_info, my_info_es, stdin_info)
--
2.23.0