lib/miam/exporter.rb in miam-0.1.1 vs lib/miam/exporter.rb in miam-0.1.2
- old
+ new
@@ -1,67 +1,69 @@
class Miam::Exporter
- def self.export(iam, options = {}, &block)
- self.new(iam, options).export(&block)
+ def self.export(iam, options = {})
+ self.new(iam, options).export
end
def initialize(iam, options = {})
@iam = iam
@options = options
+ @mutex = Mutex.new
+ @concurrency = options[:export_concurrency] || 16
end
- def export(&block)
+ def export
users = list_users
groups = list_groups
roles = list_roles
instance_profiles = list_instance_profiles
group_users = {}
instance_profile_roles = {}
- export_options = {
- :progress_total => (users.length + groups.length + roles.length + instance_profiles.length),
- :progress => 0,
- }
+ unless @options[:no_progress]
+ progress_total = users.length + groups.length + roles.length + instance_profiles.length
+ @progressbar = ProgressBar.create(:title => "Loading", :total => progress_total, :output => $stderr)
+ end
expected = {
- :users => export_users(users, group_users, export_options, &block),
- :groups => export_groups(groups, export_options, &block),
- :roles => export_roles(roles, instance_profile_roles, export_options, &block),
- :instance_profiles => export_instance_profiles(instance_profiles, export_options, &block),
+ :users => export_users(users, group_users),
+ :groups => export_groups(groups),
+ :roles => export_roles(roles, instance_profile_roles),
+ :instance_profiles => export_instance_profiles(instance_profiles),
}
[expected, group_users, instance_profile_roles]
end
private
- def export_users(users, group_users, export_options = {})
+ def export_users(users, group_users)
result = {}
- users.each do |user|
+ Parallel.each(users, :in_threads => @concurrency) do |user|
user_name = user.user_name
-
groups = export_user_groups(user_name)
+ policies = export_user_policies(user_name)
+ login_profile = export_login_profile(user_name)
- groups.each do |group_name|
- group_users[group_name] ||= []
- group_users[group_name] << user_name
- end
+ @mutex.synchronize do
+ groups.each do |group_name|
+ group_users[group_name] ||= []
+ group_users[group_name] << user_name
+ end
- result[user_name] = {
- :path => user.path,
- :groups => groups,
- :policies => export_user_policies(user_name),
- }
+ result[user_name] = {
+ :path => user.path,
+ :groups => groups,
+ :policies => policies,
+ }
- login_profile = export_login_profile(user_name)
+ if login_profile
+ result[user_name][:login_profile] = login_profile
+ end
- if login_profile
- result[user_name][:login_profile] = login_profile
+ progress
end
-
- export_options[:progress] += 1
- yield(export_options) if block_given?
end
result
end
@@ -94,23 +96,25 @@
rescue Aws::IAM::Errors::NoSuchEntity
nil
end
end
- def export_groups(groups, export_options = {})
+ def export_groups(groups)
result = {}
- groups.each do |group|
+ Parallel.each(groups, :in_threads => @concurrency) do |group|
group_name = group.group_name
+ policies = export_group_policies(group_name)
- result[group_name] = {
- :path => group.path,
- :policies => export_group_policies(group_name),
- }
+ @mutex.synchronize do
+ result[group_name] = {
+ :path => group.path,
+ :policies => policies,
+ }
- export_options[:progress] += 1
- yield(export_options) if block_given?
+ progress
+ end
end
result
end
@@ -126,34 +130,35 @@
end
result
end
- def export_roles(roles, instance_profile_roles, export_options = {})
+ def export_roles(roles, instance_profile_roles)
result = {}
- roles.each do |role|
+ Parallel.each(roles, :in_threads => @concurrency) do |role|
role_name = role.role_name
-
instance_profiles = export_role_instance_profiles(role_name)
+ policies = export_role_policies(role_name)
- instance_profiles.each do |instance_profile_name|
- instance_profile_roles[instance_profile_name] ||= []
- instance_profile_roles[instance_profile_name] << role_name
- end
+ @mutex.synchronize do
+ instance_profiles.each do |instance_profile_name|
+ instance_profile_roles[instance_profile_name] ||= []
+ instance_profile_roles[instance_profile_name] << role_name
+ end
- document = CGI.unescape(role.assume_role_policy_document)
+ document = CGI.unescape(role.assume_role_policy_document)
- result[role_name] = {
- :path => role.path,
- :assume_role_policy_document => JSON.parse(document),
- :instance_profiles => instance_profiles,
- :policies => export_role_policies(role_name),
- }
+ result[role_name] = {
+ :path => role.path,
+ :assume_role_policy_document => JSON.parse(document),
+ :instance_profiles => instance_profiles,
+ :policies => policies,
+ }
- export_options[:progress] += 1
- yield(export_options) if block_given?
+ progress
+ end
end
result
end
@@ -177,22 +182,23 @@
end
result
end
- def export_instance_profiles(instance_profiles, export_options = {})
+ def export_instance_profiles(instance_profiles)
result = {}
- instance_profiles.each do |instance_profile|
+ Parallel.each(instance_profiles, :in_threads => @concurrency) do |instance_profile|
instance_profile_name = instance_profile.instance_profile_name
- result[instance_profile_name] = {
- :path => instance_profile.path,
- }
+ @mutex.synchronize do
+ result[instance_profile_name] = {
+ :path => instance_profile.path,
+ }
- export_options[:progress] += 1
- yield(export_options) if block_given?
+ progress
+ end
end
result
end
@@ -224,7 +230,11 @@
def list_instance_profiles
@iam.list_instance_profiles.map {|resp|
resp.instance_profiles.to_a
}.flatten
+ end
+
+ def progress
+ @progressbar.increment if @progressbar
end
end