On Mon, Oct 12, 2020 at 02:43:40PM +0800, Luan Shengde wrote:
read email content check email available check if base url in upstream-repos return if base url not in upstream-repos check if commit url valid return if no match commit info check pub_key return if no pub_key assign account generate uuid write account/uuid to es send uuid to user
Signed-off-by: Luan Shengde luanshengde2@huawei.com
container/mail-robot/answerback-email.rb | 207 +++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100755 container/mail-robot/answerback-email.rb
Use a class to implement the logic will more clear.
diff --git a/container/mail-robot/answerback-email.rb b/container/mail-robot/answerback-email.rb new file mode 100755 index 0000000..7664f37 --- /dev/null +++ b/container/mail-robot/answerback-email.rb @@ -0,0 +1,207 @@ +#!/usr/bin/env ruby +# SPDX-License-Identifier: MulanPSL-2.0+ +# Copyright (c) 2020 Huawei Technologies Co., Ltd. All rights reserved. +# frozen_string_literal: true
+require 'json' +require 'mail' +require_relative '/compass-ci/lib/es_client.rb'
+def build_message(sum_infos)
- # To: #{sum_infos['email']}
- message = <<~EMAIL_MESSAGE
- To: shdluan@163.com
- Message-ID: #{sum_infos['message_id']}
- Subject: Account Ready
- Dear #{sum_infos['email'].split('@')[0]}
Thank you for joining us.
You can use the following info to submit jobs:
First add the info to: ~/.config/compass-ci/defaults/{USER}.yaml
Add ": " or delete the other step ": ".
uuid: #{sum_infos['account_uuid']}
lab: z9
Second: download lkp-tests and dependencies
git clone https://gitee.com_/wu_fengguang/lkp-tests.git
cd lkp-tests
make install
source {HOME}/.bashrc && source {HOME}/.bash_profile
Third: submit job
reference: https://gitee.com/wu_fengguang/compass-ci/blob/master/doc/tutorial.md
how to write job yaml
submit jobs/netperf.yaml
Repalce the fields {...} with your local environment variable.
- regards
- compass-ci
- EMAIL_MESSAGE
- return message
+end
+def email_addr(mail_content)
- email = mail_content.from[0]
- return email
+end
+def url_addr(mail_content)
- url_line = mail_content.part[0].body.decoded.split(/\n/).find { |line| line =~ %r{https?://} }
- message = 'No commit url found'
- raise message unless url_line
- url = url_line.split[-1]
- return url
+end
+def base_url_addr(url)
- url_a = url.split('/')
- url_a.pop 2
- base_url = url_a.join('/')
- return base_url
+end
+def check_email_available(mail_content, email)
Need some comments to explain why the email is available.
- url = url_addr(mail_content)
- base_url = base_url_addr(url)
- upstream_dir = '/upstream-repos'
- check_url_in_upstream_repos(upstream_dir, base_url)
- check_url_commit(url, base_url, email)
- return url
+end
+def check_url_in_upstream_repos(upstream_dir, base_url)
- Dir.chdir(upstream_dir)
No need chdir, use shell command.
- match_out = %x(grep -rn #{base_url})
- message = 'The url is not in upstream-repo list'
- raise StandardError, message, base_url if match_out.empty?
+end
+def check_url_commit(url, base_url, email)
- hub_name = url.split('/')[2]
- check_gitee_commit(url, base_url, email) if hub_name.eql? 'gitee.com'
- check_non_gitee_commit(url, email) unless hub_name.eql? 'gitee.com'
+end
+def check_non_gitee_commit(url, email)
- url_fdback = %x(curl #{url})
- email_index = url_fdback.index email
- message = 'No email matched from the commit_id feedback.'
- raise StandardError, message, url if email_index.nil?
+end
+def check_gitee_commit(url, base_url, email)
- repo_info = {
- 'repos_dir' => '/repos_dir',
- 'repo_dir' => url.split('/')[-3],
- 'repo_url' => [base_url, 'git'].join('.'),
- 'repo_path' => File.join('/repos_dir', url.split('/')[-3]),
- 'commit_id' => url.split('/')[-1]
- }
- check_gitee_repo_commit(url, email, repo_info)
+end
+def check_gitee_repo_commit(url, email, repo_info)
- Dir.chdir repo_info['repos_dir']
- %x(/usr/bin/git clone #{repo_info['repo_url']})
- Dir.chdir repo_info['repo_path']
No need chdir, use git -C can handle this.
- email_index = %x(/usr/bin/git show #{repo_info['commit_id']}).index email
- Dir.chdir repo_info['repos_dir']
- FileUtils.rm_rf repo_info['repo_dir']
- message = 'No email matched from commit_id feedback.' if email_index.nil?
- raise StandardError, message, url if email_index.nil?
+end
+def email_message_id(mail_content)
- message_id = mail_content.message_id
- return message_id
+end
+def pub_key_value(mail_content)
No need add _value in the function name.
- pub_key = mail_content.part[1].body.decoded.split(/\r|\n/).join if mail_content.part[1].filename == 'id_rsa.pub'
- message = 'No pub_key found'
- raise message unless pub_key
- return pub_key
+end
+def account_info(pub_key)
- account_info_str = %x(curl -XGET "#{ENV['JUMPER_IP']}:#{ENV['JUMPER_PORT']}/assign_account" -d "pub_key: #{pub_key}")
- account_info = JSON.parse account_info_str
- message = 'No available jumper account returned.'
- raise StandardError, message, account_info if account_info['account'].empty?
- return account_info
+end
+def setup_account_uuid
No need add setup_ in the function name. Thanks, Xueliang
- account_uuid = %x(uuidgen).chomp
- return account_uuid
+end
+def sum_infos(mail_content)
- email = email_addr(mail_content)
- pub_key = pub_key_value(mail_content)
- sum_infos = {
- 'email' => email,
- 'message_id' => email_message_id(mail_content),
- 'url' => check_email_available(mail_content, email),
- 'acct_infos' => account_info(pub_key),
- 'account_uuid' => setup_account_uuid,
- 'pub_key' => pub_key
- }
- store_account_info(sum_infos)
- sum_infos
+end
+def send_uuid(sum_infos)
- message = build_message(sum_infos)
- send_mail_server = `/sbin/ip route |awk '/default/ {print $3}'`.chomp
- %x(curl -XPOST "#{send_mail_server}:#{ENV['SEND_MAIL_PORT']}/send_mail_text" -d "#{message}")
+end
+def send_account(mail_content)
- sum_infos = sum_infos(mail_content)
- send_uuid(sum_infos)
+end
+def store_account_info(sum_infos)
- account_uuid_info = {
- 'email' => sum_infos['email'],
- 'name' => sum_infos['email'].split('@')[0],
- 'uuid' => sum_infos['account_uuid'],
- 'user' => sum_infos['acct_infos']['account'],
- 'my_commit_url' => sum_infos['url']
- }
- es = ESClient.new(index: 'accounts')
- es.put_source_by_id(sum_infos['email'], account_uuid_info)
+end
+def read_mail_content(mail_file)
- mail_content = Mail.read(mail_file)
- return mail_content
+end
2.23.0