Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'aws-sdk'
- # ENV NEED:
- # # ENV['AWS_REGION']
- # # ENV['BDASH_OPT_DB_HOST']
- # # ENV['BDASH_OPT_DB_USERNAME']
- # # ENV['BDASH_OPT_DB_PASSWORD']
- # # ENV['BDASH_OPT_DB_NAME']
- def get_aws_account_id
- begin
- iam = Aws::IAM::Client.new.get_user
- r = iam[:user][:arn].match('^arn:aws:iam::([0-9]{12}):.*$')[1]
- rescue Aws::IAM::Errors::AccessDenied
- result = $!
- r = result.to_s.match('^User: arn:aws:iam::([0-9]{12}):.*$')[1]
- end
- r
- end
- ret = "jdbc:mysql://#{ENV['BDASH_OPT_DB_HOST']}:3306/#{ENV['BDASH_OPT_DB_NAME']}?autoReconnect=true"
- min_value = 100000
- respect_tag_value="batch"
- respect_tag_value=ENV["USAGE_TAG_VALUE"] unless ENV["USAGE_TAG_VALUE"] == nil
- myzone_list = []
- other_list = []
- rds = Aws::RDS::Client.new(region: ENV['AWS_REGION'])
- resp = rds.describe_db_instances
- resp.db_instances.each do |r|
- if r.endpoint != nil and r.endpoint.address == ENV['BDASH_OPT_DB_HOST'] then
- replicas = []
- if r.engine == "aurora" then
- db_cluster_identifier = r.db_cluster_identifier
- recs = rds.describe_db_instances
- recs.db_instances.each do |rec|
- if rec.db_cluster_identifier == db_cluster_identifier then
- addr = rec.endpoint.address
- port = rec.endpoint.port
- cmd = "/usr/bin/mysql -u #{ENV['BDASH_OPT_DB_USERNAME']} -p#{ENV['BDASH_OPT_DB_PASSWORD']} -h #{addr} -P #{port} -e \"SHOW GLOBAL VARIABLES LIKE 'innodb_read_only';\" | grep 'innodb_read_only' | awk '{print $2}'"
- result = `#{cmd}`
- result.strip!
- if result == "ON" then
- replicas << rec.db_instance_identifier
- end
- end
- end
- else
- replicas = r.read_replica_db_instance_identifiers
- end
- p replicas
- unless replicas.empty?
- replicas.each do |x|
- res1 = rds.describe_db_instances({db_instance_identifier: x})
- if res1.db_instances.size >= 1 and res1.db_instances[0].endpoint != nil then
- account_id=get_aws_account_id
- rds_arn = sprintf("arn:aws:rds:%s:%d:db:%s", ENV['AWS_REGION'], account_id, x)
- response = rds.list_tags_for_resource(:resource_name => rds_arn)
- usage_tag = response[:tag_list].find { |tag| tag[:key] == 'usage' }
- if usage_tag != nil && usage_tag[:value] != respect_tag_value
- next
- else
- preferred_maintenance_window = res1.db_instances[0].preferred_maintenance_window
- wday = {"mon"=>1,"tue"=>2,"wed"=>3,"thu"=>4,"fri"=>5,"sat"=>6,"sun"=>0}
- weekday = wday[preferred_maintenance_window.split("-")[0].split(":")[0]]
- from_tm = preferred_maintenance_window.split("-")[0].split(":")[1].to_i - 1
- to_tm = preferred_maintenance_window.split("-")[1].split(":")[1].to_i
- current_wday = Time.now.wday
- current_tm = Time.now.hour
- if current_wday == weekday && from_tm <= current_tm && to_tm >= current_tm
- next
- end
- addr = res1.db_instances[0].endpoint.address
- port = res1.db_instances[0].endpoint.port
- if ENV["MY_ZONE"] == res1.db_instances[0].availability_zone
- myzone_list << {"addr"=>addr, "port"=>port}
- else
- other_list << {"addr"=>addr, "port"=>port}
- end
- end
- end
- end
- end
- end
- end
- check_list = []
- if !myzone_list.empty?
- check_list = myzone_list
- else
- if !other_list.empty?
- check_list = other_list
- end
- end
- check_list.each do |r|
- addr = r["addr"]
- port = r["port"]
- cmd = "/usr/bin/mysql -u #{ENV['BDASH_OPT_DB_USERNAME']} -p#{ENV['BDASH_OPT_DB_PASSWORD']} -h #{addr} -P #{port} -e \"show status like 'Threads_connected'\" | grep Threads_connected | awk '{print $2}'"
- res = `#{cmd}`
- res.strip!
- p cmd
- p res
- if min_value > res.to_i and res.to_i != 0
- min_value = res.to_i
- ret = "jdbc:mysql://#{addr}:#{port}/#{ENV['BDASH_OPT_DB_NAME']}?autoReconnect=true"
- end
- end
- puts ret
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement