aws.rb 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. # frozen_string_literal: true
  2. require 'accounts'
  3. require 'regions'
  4. require 'mime-types'
  5. require 'fog-aws'
  6. require 's3'
  7. require 'neo4j'
  8. require 'rds'
  9. require 'neoinfra/config'
  10. require 'neoinfra/cloudwatch'
  11. # NeoInfra Account information
  12. module NeoInfra
  13. # Provide informations about the accounts available
  14. class Aws
  15. def initialize
  16. @cfg = NeoInfra::Config.new
  17. neo4j_url = "http://#{@cfg.neo4j[:host]}:#{@cfg.neo4j[:port]}"
  18. Neo4j::Session.open(:server_db, neo4j_url)
  19. end
  20. def regions
  21. account = @cfg.accounts.first
  22. base_conf = {
  23. provider: 'AWS',
  24. aws_access_key_id: account[:key],
  25. aws_secret_access_key: account[:secret]
  26. }
  27. conn = Fog::Compute.new(base_conf)
  28. conn.describe_regions.data[:body]['regionInfo'].collect { |x| x['regionName'] }
  29. end
  30. def region_count
  31. Region.all.length
  32. end
  33. def az_count
  34. Az.all.length
  35. end
  36. def azs(region)
  37. account = @cfg.accounts.first
  38. base_conf = {
  39. provider: 'AWS',
  40. aws_access_key_id: account[:key],
  41. aws_secret_access_key: account[:secret],
  42. region: region
  43. }
  44. conn = Fog::Compute.new(base_conf)
  45. conn.describe_availability_zones.data[:body]['availabilityZoneInfo'].collect { |x| x['zoneName'] }
  46. end
  47. def load_regions
  48. regions.each do |region|
  49. next unless Region.where(region: region).empty?
  50. r = Region.new(
  51. region: region
  52. )
  53. r.save
  54. azs(region).each do |az|
  55. next unless Az.where(az: az).empty?
  56. a = Az.new(az: az)
  57. a.save
  58. AzRegion.create(from_node: a, to_node: Region.where(region: region).first)
  59. end
  60. end
  61. end
  62. def list_buckets
  63. buckets = []
  64. Bucket.all.order('n.size DESC').each do |b|
  65. buckets << {
  66. 'name' => b.name,
  67. 'size' => b.size,
  68. 'versioning' => b.versioning,
  69. 'creation' => b.creation,
  70. 'region' => b.region.region,
  71. 'owner' => b.owner.name
  72. }
  73. end
  74. return buckets
  75. end
  76. def load_buckets
  77. cw = NeoInfra::Cloudwatch.new
  78. @cfg.accounts.each do |account|
  79. base_conf = {
  80. provider: 'AWS',
  81. aws_access_key_id: account[:key],
  82. aws_secret_access_key: account[:secret]
  83. }
  84. s = Fog::Storage.new(base_conf)
  85. s.directories.each do |bucket|
  86. next unless Bucket.where(name: bucket.key).empty?
  87. begin
  88. vers = bucket.versioning?.to_s
  89. crea = bucket.creation_date.to_s
  90. rescue
  91. vers = "unknown"
  92. crea = "unknown"
  93. end
  94. b = Bucket.new(
  95. name: bucket.key,
  96. versioning: vers,
  97. creation: crea,
  98. size: cw.get_bucket_size(account[:key], account[:secret], bucket.location, bucket.key)
  99. )
  100. b.save
  101. BucketRegion.create(from_node: b, to_node: Region.where(region: bucket.location).first)
  102. BucketAccount.create(from_node: b, to_node: AwsAccount.where(name: account[:name]).first)
  103. end
  104. end
  105. end
  106. def load_security_groups
  107. @cfg.accounts.each do |account|
  108. base_conf = {
  109. provider: 'AWS',
  110. aws_access_key_id: account[:key],
  111. aws_secret_access_key: account[:secret]
  112. }
  113. self.regions.each do |region|
  114. region_conf = { region: region }
  115. conn = Fog::Compute.new(region_conf.merge(base_conf))
  116. conn.security_groups.all.each do |grp|
  117. next unless SecurityGroup.where(sg_id: grp.group_id).empty?
  118. g = SecurityGroup.new(
  119. sg_id: grp.group_id,
  120. name: grp.name,
  121. description: grp.description,
  122. )
  123. g.save
  124. SecurityGroupOwner.create(from_node: g, to_node: AwsAccount.where(account_id: grp.owner_id).first)
  125. SecurityGroupVpc.create(from_node: g, to_node: Vpc.where(vpc_id: grp.vpc_id).first)
  126. end
  127. end
  128. end
  129. end
  130. def load_rds
  131. @cfg.accounts.each do |account|
  132. base_conf = {
  133. aws_access_key_id: account[:key],
  134. aws_secret_access_key: account[:secret]
  135. }
  136. s = Fog::AWS::RDS.new(base_conf)
  137. s.servers.each do |rds|
  138. next unless Rds.where(name: rds.id).empty?
  139. r = Rds.new(
  140. name: rds.id,
  141. size: rds.flavor_id,
  142. engine: rds.engine,
  143. engine_version: rds.engine_version,
  144. multi_az: rds.multi_az.to_s,
  145. endpoint: rds.endpoint['Address'],
  146. port: rds.endpoint['Port'],
  147. allocated_storage: rds.allocated_storage,
  148. )
  149. r.save
  150. RdsAz.create(from_node: r, to_node: Az.where(az: rds.availability_zone).first)
  151. RdsAccount.create(from_node: r, to_node: AwsAccount.where(name: account[:name]).first)
  152. end
  153. end
  154. end
  155. end
  156. end