add parameters for answerback-email
-e,--email email_addr: add email address
-s,--ssh-pubkey pub_key: add ssh pub_key
-f,--raw-email mail_file: add email_adress[,pub_key] via email file
why:
easier for administrator to manully assign jumper account for user with:
- user's email
- user's email with pub_key
- user's email_file
Signed-off-by: Luan Shengde <luanshengde2(a)huawei.com>
---
container/assign-account/answerback-email.rb | 165 ++++++++-----------
1 file changed, 70 insertions(+), 95 deletions(-)
diff --git a/container/assign-account/answerback-email.rb b/container/assign-account/answerback-email.rb
index b5283ba..0789c38 100755
--- a/container/assign-account/answerback-email.rb
+++ b/container/assign-account/answerback-email.rb
@@ -3,46 +3,18 @@
# Copyright (c) 2020 Huawei Technologies Co., Ltd. All rights reserved.
# frozen_string_literal: true
-=begin
-
-repo_list:
- all repos url list from upstream-repos.git
-
-API:
-call graph:
-read_mail_content
-send_account_request
- email_addr
- get email address
- email_message_id
- get email message_id
- check_email_available
- check email available
- pub_key_value
- get pub key
- account
- send apply account request and return account info
- build_message
- build email message
- send_mail
- call send_mail to send mail whit build message
-
-the returned data for account_info like:
-{
- "account" => "guest",
- "passwd" => "Use pub_key to login",
- "jumper_ip" => "10.10.10.10",
- "jumper_port" => "10000"
-}
-=end
+# xx --email xxx --login --ssh-pubkey xxx --raw-email email-file
+# samba mount
+# ssh logshn (huawei, ) (install pubkey / send password)
require 'json'
require 'mail'
require 'set'
-require_relative '../defconfig.rb'
+require 'optparse'
+require_relative '../defconfig'
names = Set.new %w[
- JUMPER_IP
+ JUMPER_HOST
JUMPER_PORT
CRYSTAL_INTRANET
SEND_MAIL_PORT
@@ -50,27 +22,71 @@ names = Set.new %w[
defaults = relevant_defaults(names)
-JUMPER_IP = defaults['JUMPER_IP']
+JUMPER_HOST = defaults['JUMPER_HOST']
JUMPER_PORT = defaults['JUMPER_PORT']
CRYSTAL_INTRANET = defaults['CRYSTAL_INTRANET']
SEND_MAIL_PORT = defaults['SEND_MAIL_PORT']
-def build_message(email, message_id, infos)
+apply_info = {
+ 'email_addr' => nil,
+ 'pub_key' => nil
+}
+
+def format_info(email_file, apply_info)
+ mail_content = Mail.read(email_file)
+
+ email_addr = mail_content.from[0]
+ pub_key = mail_content.part[1].body.decoded.split(/\r|\n/).join if mail_content.part[1].filename == 'id_rsa.pub'
+
+ apply_info['email_addr'] = email_addr
+ apply_info['pub_key'] = pub_key
+
+ apply_info
+end
+
+options = OptionParser.new do |opts|
+ opts.banner = "Usage: answerback-mail.rb [--email email] [--ssh-pubkey pub_key] [--raw-email email_file]\n"
+ opts.banner += " -e or -f is required\n"
+ opts.banner += ' -s is optional when use -e'
+
+ opts.separator ''
+ opts.separator 'options:'
+
+ opts.on('-e email_addr', '--email email_addr', 'appoint email address') do |email_addr|
+ apply_info['email_addr'] = email_addr
+ end
+
+ opts.on('-s pub_key', '--ssh-pubkey pub_key', 'ssh pub_key to enable keyless login') do |pub_key|
+ apply_info['pub_key'] = pub_key
+ end
+
+ opts.on('-f email_file', '--raw-email email_file', 'email file') do |email_file|
+ format_info(email_file, apply_info)
+ end
+
+ opts.on_tail('-h', '--help', 'show this message') do
+ puts opts
+ exit
+ end
+end
+
+options.parse!(ARGV)
+
+def build_message(email, acct_infos)
message = <<~EMAIL_MESSAGE
To: #{email}
- Message-ID: #{message_id}
Subject: jumper account is ready
- Dear #{email}
+ Dear user:
Thank you for joining us.
You can use the following command to login the jumper server:
login command:
- ssh -p #{infos['jumper_port']} #{infos['account']}@#{infos['jumper_ip']}
+ ssh -p #{acct_infos['jumper_port']} #{acct_infos['account']}@#{acct_infos['jumper_ip']}
account passwd:
- account_password: #{infos['passwd']}
+ account_password: #{acct_infos['passwd']}
regards
compass-ci
@@ -79,67 +95,26 @@ def build_message(email, message_id, infos)
return message
end
-def email_addr(mail_content)
- msg = 'not an applying account email'
-
- raise msg unless mail_content.subject =~ /apply ssh account/i
-
- email = mail_content.from.join(',')
-
- return email
-end
-
-# def check_email_available(mail_content, email)
-# oos_list = File.read('/c/upstream-repos/repo_list').split(/\n/)
-# url = mail_content.body.decoded.split(/\n/).find { |line| line =~ /https?:\/\// }
-# base_url = url.split('/')[0,5].join('/')
-# message = 'The url is not in upstream repo_list'
-#
-# raise message unless oos_list.include? base_url
-#
-# url_fdback = %x(curl #{url})
-# email_index = url_fdback.index email
-#
-# message = 'No commit info found from the url for the email'
-# raise message unless email_index
-# end
-
-def email_message_id(mail_content)
- message_id = mail_content.message_id
- return message_id
-end
-
-def pub_key_value(mail_content)
- pub_key = mail_content.body.decoded.split(/\n/).find { |line| line =~ /ssh-rsa/ }
- return pub_key
-end
-
def account_info(pub_key)
- account_info_str = %x(curl -XGET '#{JUMPER_IP}:#{JUMPER_PORT}/assign_account' -d "pub_key: #{pub_key}")
- account_info = JSON.parse account_info_str
-
- return account_info
+ account_info_str = if pub_key.nil?
+ %x(curl -XGET '#{JUMPER_HOST}:#{JUMPER_PORT}/assign_account')
+ else
+ %x(curl -XGET '#{JUMPER_HOST}:#{JUMPER_PORT}/assign_account' -d "pub_key: #{pub_key}")
+ end
+ JSON.parse account_info_str
end
-def send_account(mail_content)
- email = email_addr(mail_content)
- message_id = email_message_id(mail_content)
- # check_email_available(mail_content, email)
+def send_account(apply_info)
+ message = "No email address specified\n"
+ message += "use -e email_addr add a email address\n"
+ message += 'or use -f to add a mail file'
+ raise message if apply_info['email_addr'].nil?
- pub_key = pub_key_value(mail_content)
- acct_info = account_info(pub_key)
+ acct_info = account_info(apply_info['pub_key'])
- message = build_message(email, message_id, acct_info)
+ message = build_message(apply_info['email_addr'], acct_info)
%x(curl -XPOST '#{CRYSTAL_INTRANET}:#{SEND_MAIL_PORT}/send_mail_text' -d "#{message}")
end
-def read_mail_content(mail_file)
- mail_content = Mail.read(mail_file)
-
- return mail_content
-end
-
-mail_file = ARGV[0]
-mail_content = read_mail_content(mail_file)
-send_account(mail_content)
+send_account(apply_info)
--
2.23.0