On Wed, Nov 25, 2020 at 05:14:44PM +0800, Luan Shengde wrote:
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@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"
Just show the y/n, you can change the letter to lowercase.
Thanks, Xueliang
- 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)
%x(curl -XPOST '#{SEND_MAIL_HOST}:#{SEND_MAIL_PORT}/send_mail_text' -d "#{message}")end
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