aly 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/aly/app.rb +237 -51
- data/lib/aly/cli.rb +2 -0
- data/lib/aly/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9db212d7233b62974d4d2b74909f00090561d6dbe874950e580d92d84be67b5f
         | 
| 4 | 
            +
              data.tar.gz: de5bdb35a47c607db653a5befb8f55a82f53dbaca1c28646c00b54be263dd52d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b95c2203787b28ff2abeb5cfe2b54015619c6289a21ef631b8dc8c6c6dbb599600fa9a1113afb99300d6262c8452d41b81e82d117c9a88f98b4fe80ccd67cfd1
         | 
| 7 | 
            +
              data.tar.gz: 3d2178da37d57a8c90a585640e6ed60aa9cafff01c449165c10929fc8c0c362a00b06fbb5c2708c02ef931e565a3368955fc3c3bcaa900f66bc15b21e50dbd20
         | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/lib/aly/app.rb
    CHANGED
    
    | @@ -10,7 +10,7 @@ class Array | |
| 10 10 | 
             
                Terminal::Table.new { |t|
         | 
| 11 11 | 
             
                  t << header
         | 
| 12 12 | 
             
                  t << :separator
         | 
| 13 | 
            -
                  each { |row| t << row.values }
         | 
| 13 | 
            +
                  each { |row| t << (row.nil? ? :separator : row.values) }
         | 
| 14 14 | 
             
                }
         | 
| 15 15 | 
             
              end
         | 
| 16 16 | 
             
            end
         | 
| @@ -91,6 +91,128 @@ module Aly | |
| 91 91 | 
             
                  end
         | 
| 92 92 | 
             
                end
         | 
| 93 93 |  | 
| 94 | 
            +
                def full_slb(lbs, eips, **options)
         | 
| 95 | 
            +
                  lbs.each do |lb|
         | 
| 96 | 
            +
                    puts "\nLoanBalancer Id: %s, Name: %s" % [lb['LoadBalancerId'], lb['LoadBalancerName']]
         | 
| 97 | 
            +
                    puts "==============================================================\n\n"
         | 
| 98 | 
            +
                    listeners = lb['Listeners']
         | 
| 99 | 
            +
                    background_servers = exec('slb', 'DescribeLoadBalancerAttribute', "--LoadBalancerId=#{lb['LoadBalancerId']}", **options)['BackendServers']['BackendServer'] || []
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                    puts '    LoadBalancer Basic Information:'
         | 
| 102 | 
            +
                    puts([{
         | 
| 103 | 
            +
                            Id: lb['LoadBalancerId'],
         | 
| 104 | 
            +
                            Name: lb['LoadBalancerName'],
         | 
| 105 | 
            +
                            Address: lb['Address'],
         | 
| 106 | 
            +
                            Eip: lb['Eip'],
         | 
| 107 | 
            +
                            Listeners: listeners.size
         | 
| 108 | 
            +
                          }].table.to_s.gsub(/^/, '    '))
         | 
| 109 | 
            +
                    puts
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                    if background_servers && background_servers.size > 0
         | 
| 112 | 
            +
                      puts '    Default Backend Servers:'
         | 
| 113 | 
            +
                      puts
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                      ecss = @ecs.select { |e| background_servers.map{|ee| ee['ServerId']}.include?(e['InstanceId']) }
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                      puts ecss.map { |row|
         | 
| 118 | 
            +
                        {
         | 
| 119 | 
            +
                          Id: row['InstanceId'],
         | 
| 120 | 
            +
                          Name: row['InstanceName'],
         | 
| 121 | 
            +
                          PrivateIP: row['PrivateIP'].join(','),
         | 
| 122 | 
            +
                          PublicIP: row['PublicIP'].join(','),
         | 
| 123 | 
            +
                          CPU: row['Cpu'],
         | 
| 124 | 
            +
                          RAM: "#{row['Memory'] / 1024.0} GB"
         | 
| 125 | 
            +
                        }
         | 
| 126 | 
            +
                      }.table.to_s.gsub(/^/, '    ')
         | 
| 127 | 
            +
                      puts
         | 
| 128 | 
            +
                    end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                    vserver_groups = exec('slb', 'DescribeVServerGroups', '--pager', "--LoadBalancerId=#{lb['LoadBalancerId']}", **options)["VServerGroups"]["VServerGroup"] || []
         | 
| 131 | 
            +
                    vserver_group_servers = vserver_groups.flat_map do |vg|
         | 
| 132 | 
            +
                      vg_attr = exec('slb', 'DescribeVServerGroupAttribute', "--VServerGroupId=#{vg['VServerGroupId']}", **options)["BackendServers"]["BackendServer"]
         | 
| 133 | 
            +
                      vg_attr.each_with_index.map do |attr, idx|
         | 
| 134 | 
            +
                        ecs = @ecs.find {|e| e['InstanceId'] == attr['ServerId'] }
         | 
| 135 | 
            +
                        {
         | 
| 136 | 
            +
                          VGroupId: (idx.zero? ? vg['VServerGroupId'] : ''),
         | 
| 137 | 
            +
                          VGroupName: (idx.zero? ? vg['VServerGroupName'] : ''),
         | 
| 138 | 
            +
                          Weight: attr['Weight'],
         | 
| 139 | 
            +
                          Port: attr['Port'],
         | 
| 140 | 
            +
                          Type: attr['Type'],
         | 
| 141 | 
            +
                          EcsId: attr['ServerId'],
         | 
| 142 | 
            +
                          EcsName: ecs['InstanceName'],
         | 
| 143 | 
            +
                          PrivateIP: ecs['PrivateIP'].join(','),
         | 
| 144 | 
            +
                          PublicIP: ecs['PublicIP'].join(','),
         | 
| 145 | 
            +
                          CPU: ecs['Cpu'],
         | 
| 146 | 
            +
                          RAM: "#{ecs['Memory'] / 1024.0} GB"
         | 
| 147 | 
            +
                        }
         | 
| 148 | 
            +
                      end + [nil]
         | 
| 149 | 
            +
                    end
         | 
| 150 | 
            +
                    puts '    VServer Groups:'
         | 
| 151 | 
            +
                    puts vserver_group_servers[0..-2].table.to_s.gsub(/^/, '    ')
         | 
| 152 | 
            +
                    puts
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                    listeners.each do |listener|
         | 
| 155 | 
            +
                      listener_type = ['HTTP', 'HTTPS', 'TCP', 'TCPS', 'UDP'].find { |e| !listener["#{e}ListenerConfig"].empty? }
         | 
| 156 | 
            +
                      listener['ListenerType'] = listener_type
         | 
| 157 | 
            +
                    end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                    listeners_info = listeners.map do |listener|
         | 
| 160 | 
            +
                      {
         | 
| 161 | 
            +
                        Description: listener['Description'],
         | 
| 162 | 
            +
                        Port: listener['ListenerPort'],
         | 
| 163 | 
            +
                        Protocol: listener['ListenerProtocol'],
         | 
| 164 | 
            +
                        Status: listener['Status'],
         | 
| 165 | 
            +
                        HeathCheck: (listener["#{listener['ListenerType']}ListenerConfig"] || {}).dig("HealthCheck") || 'off',
         | 
| 166 | 
            +
                        BackendServerPort: listener['BackendServerPort'],
         | 
| 167 | 
            +
                        ForwardPort: listener.dig('HTTPListenerConfig', 'ForwardPort'),
         | 
| 168 | 
            +
                        VServerGroup: listener['VServerGroupId'],
         | 
| 169 | 
            +
                        AclStatus: listener['AclStatus'] || 'off',
         | 
| 170 | 
            +
                        AclType: listener['AclType'],
         | 
| 171 | 
            +
                        AclIds: (listener['AclIds'] || []).join(','),
         | 
| 172 | 
            +
                      }
         | 
| 173 | 
            +
                    end
         | 
| 174 | 
            +
             | 
| 175 | 
            +
                    puts '    Configured Listeners:'
         | 
| 176 | 
            +
                    puts listeners_info.table.to_s.gsub(/^/, '    ')
         | 
| 177 | 
            +
                    puts
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                    listener_rules = listeners.flat_map do |listener|
         | 
| 180 | 
            +
                      listener_type = listener['ListenerType']
         | 
| 181 | 
            +
                      next [] unless listener_type
         | 
| 182 | 
            +
                      rules = exec('slb', "DescribeLoadBalancer#{listener_type}ListenerAttribute", "--LoadBalancerId=#{lb['LoadBalancerId']}", "--ListenerPort=#{listener['ListenerPort']}", **options).dig('Rules', 'Rule') || []
         | 
| 183 | 
            +
                      rules.map do |rule|
         | 
| 184 | 
            +
                        {'Listener' => listener['Description']}.merge(rule)
         | 
| 185 | 
            +
                      end
         | 
| 186 | 
            +
                    end
         | 
| 187 | 
            +
             | 
| 188 | 
            +
                    puts '    Listener Rules:'
         | 
| 189 | 
            +
                    puts listener_rules.table.to_s.gsub(/^/, '    ')
         | 
| 190 | 
            +
                    puts
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                    if options['acl']
         | 
| 193 | 
            +
                      acl_ids = listeners.flat_map { |listener| listener['AclIds'] || [] }.uniq
         | 
| 194 | 
            +
                      unless acl_ids.empty?
         | 
| 195 | 
            +
                        alc_entries = acl_ids.flat_map do |acl_id|
         | 
| 196 | 
            +
                          attr = exec('slb', 'DescribeAccessControlListAttribute', "--AclId=#{acl_id}", **options)
         | 
| 197 | 
            +
                          (attr.dig('AclEntrys', 'AclEntry') || []).each_with_index.map do |e, idx|
         | 
| 198 | 
            +
                            {
         | 
| 199 | 
            +
                              AclId: (idx.zero? ? attr['AclId'] : ''),
         | 
| 200 | 
            +
                              AclName: (idx.zero? ? attr['AclName'] : ''),
         | 
| 201 | 
            +
                              AclEntryIP: e['AclEntryIP'],
         | 
| 202 | 
            +
                              AclEntryComment: e['AclEntryComment']
         | 
| 203 | 
            +
                            }
         | 
| 204 | 
            +
                          end + [nil]
         | 
| 205 | 
            +
                        end
         | 
| 206 | 
            +
                        puts '    Access Control Lists:'
         | 
| 207 | 
            +
                        puts alc_entries[0..-2].table.to_s.gsub(/^/, '    ')
         | 
| 208 | 
            +
                        puts
         | 
| 209 | 
            +
                      end
         | 
| 210 | 
            +
             | 
| 211 | 
            +
                    end
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                  end
         | 
| 214 | 
            +
                end
         | 
| 215 | 
            +
             | 
| 94 216 | 
             
                def slb(*args, **options)
         | 
| 95 217 | 
             
                  raw_out = exec('slb', 'DescribeLoadBalancers', '--pager', **options)
         | 
| 96 218 | 
             
                  selected = raw_out['LoadBalancers']['LoadBalancer'] || []
         | 
| @@ -115,7 +237,29 @@ module Aly | |
| 115 237 | 
             
                    end
         | 
| 116 238 | 
             
                  end
         | 
| 117 239 |  | 
| 118 | 
            -
                   | 
| 240 | 
            +
                  @eip ||= exec('vpc', 'DescribeEipAddresses', '--PageSize=100', **options)['EipAddresses']['EipAddress'] || []
         | 
| 241 | 
            +
             | 
| 242 | 
            +
                  eip_map = @eip.each_with_object({}) { |eip, h| h[eip['InstanceId']] = eip['IpAddress'] }
         | 
| 243 | 
            +
                  selected.each do |slb|
         | 
| 244 | 
            +
                    slb['Eip'] = eip_map[slb['LoadBalancerId']]
         | 
| 245 | 
            +
                  end
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                  @ecs = exec('ecs', 'DescribeInstances', '--pager', **options)['Instances']['Instance'] || []
         | 
| 248 | 
            +
                  @ecs.each do |item|
         | 
| 249 | 
            +
                    item['PrivateIP'] = (item['NetworkInterfaces']['NetworkInterface'] || []).map { |ni| ni['PrimaryIpAddress'] }
         | 
| 250 | 
            +
                    item['PublicIP'] = []
         | 
| 251 | 
            +
                    if ip = item['EipAddress']['IpAddress']
         | 
| 252 | 
            +
                      item['PublicIP'] << ip
         | 
| 253 | 
            +
                    end
         | 
| 254 | 
            +
                    if ips = item['PublicIpAddress']['IpAddress']
         | 
| 255 | 
            +
                      item['PublicIP'] += ips
         | 
| 256 | 
            +
                    end
         | 
| 257 | 
            +
                    item['AllIPs'] = item['PrivateIP'] + item['PublicIP']
         | 
| 258 | 
            +
                  end
         | 
| 259 | 
            +
             | 
| 260 | 
            +
                  if options['full']
         | 
| 261 | 
            +
                    full_slb(selected, eips, **options)
         | 
| 262 | 
            +
                  elsif options['detail']
         | 
| 119 263 | 
             
                    selected.each do |row|
         | 
| 120 264 | 
             
                      described_load_balancer_attributes = exec('slb', 'DescribeLoadBalancerAttribute', "--LoadBalancerId=#{row['LoadBalancerId']}", **options)
         | 
| 121 265 | 
             
                      row['BackendServers'] = described_load_balancer_attributes['BackendServers']['BackendServer']
         | 
| @@ -165,80 +309,122 @@ module Aly | |
| 165 309 | 
             
                  @listeners ||= exec('slb', 'DescribeLoadBalancerListeners', '--pager', 'path=Listeners', **options)['Listeners'] || []
         | 
| 166 310 | 
             
                  lb = @slb.find { |e| e['Address'] == host || e['Eip'] == host }
         | 
| 167 311 | 
             
                  listeners = @listeners.select { |e| e['LoadBalancerId'] == lb['LoadBalancerId'] }
         | 
| 168 | 
            -
                  background_servers = exec('slb', 'DescribeLoadBalancerAttribute', "--LoadBalancerId=#{lb['LoadBalancerId']}", **options)['BackendServers']['BackendServer']
         | 
| 169 312 |  | 
| 170 | 
            -
                  puts  | 
| 313 | 
            +
                  puts "\nLoanBalancer Id: %s, Name: %s" % [lb['LoadBalancerId'], lb['LoadBalancerName']]
         | 
| 314 | 
            +
                  puts "==============================================================\n\n"
         | 
| 315 | 
            +
                  background_servers = exec('slb', 'DescribeLoadBalancerAttribute', "--LoadBalancerId=#{lb['LoadBalancerId']}", **options)['BackendServers']['BackendServer'] || []
         | 
| 316 | 
            +
             | 
| 317 | 
            +
                  puts '    LoadBalancer Basic Information:'
         | 
| 171 318 | 
             
                  puts([{
         | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 174 | 
            -
             | 
| 175 | 
            -
             | 
| 176 | 
            -
             | 
| 177 | 
            -
             | 
| 319 | 
            +
                          Id: lb['LoadBalancerId'],
         | 
| 320 | 
            +
                          Name: lb['LoadBalancerName'],
         | 
| 321 | 
            +
                          Address: lb['Address'],
         | 
| 322 | 
            +
                          Eip: lb['Eip'],
         | 
| 323 | 
            +
                          Listeners: listeners.size
         | 
| 324 | 
            +
                        }].table.to_s.gsub(/^/, '    '))
         | 
| 178 325 | 
             
                  puts
         | 
| 179 326 |  | 
| 180 327 | 
             
                  if background_servers && background_servers.size > 0
         | 
| 181 | 
            -
                    puts 'Default Backend Servers:'
         | 
| 182 | 
            -
                    puts background_servers.table.to_s
         | 
| 328 | 
            +
                    puts '    Default Backend Servers:'
         | 
| 183 329 | 
             
                    puts
         | 
| 330 | 
            +
             | 
| 331 | 
            +
                    ecss = @ecs.select { |e| background_servers.map{|ee| ee['ServerId']}.include?(e['InstanceId']) }
         | 
| 332 | 
            +
             | 
| 333 | 
            +
                    puts ecss.map { |row|
         | 
| 334 | 
            +
                      {
         | 
| 335 | 
            +
                        Id: row['InstanceId'],
         | 
| 336 | 
            +
                        Name: row['InstanceName'],
         | 
| 337 | 
            +
                        PrivateIP: row['PrivateIP'].join(','),
         | 
| 338 | 
            +
                        PublicIP: row['PublicIP'].join(','),
         | 
| 339 | 
            +
                        CPU: row['Cpu'],
         | 
| 340 | 
            +
                        RAM: "#{row['Memory'] / 1024.0} GB"
         | 
| 341 | 
            +
                      }
         | 
| 342 | 
            +
                    }.table.to_s.gsub(/^/, '    ')
         | 
| 343 | 
            +
                    puts
         | 
| 344 | 
            +
                  end
         | 
| 345 | 
            +
             | 
| 346 | 
            +
                  vserver_groups = exec('slb', 'DescribeVServerGroups', '--pager', "--LoadBalancerId=#{lb['LoadBalancerId']}", **options)["VServerGroups"]["VServerGroup"] || []
         | 
| 347 | 
            +
                  vserver_group_servers = vserver_groups.flat_map do |vg|
         | 
| 348 | 
            +
                    vg_attr = exec('slb', 'DescribeVServerGroupAttribute', "--VServerGroupId=#{vg['VServerGroupId']}", **options)["BackendServers"]["BackendServer"]
         | 
| 349 | 
            +
                    vg_attr.each_with_index.map do |attr, idx|
         | 
| 350 | 
            +
                      ecs = @ecs.find {|e| e['InstanceId'] == attr['ServerId'] }
         | 
| 351 | 
            +
                      {
         | 
| 352 | 
            +
                        VGroupId: (idx.zero? ? vg['VServerGroupId'] : ''),
         | 
| 353 | 
            +
                        VGroupName: (idx.zero? ? vg['VServerGroupName'] : ''),
         | 
| 354 | 
            +
                        Weight: attr['Weight'],
         | 
| 355 | 
            +
                        Port: attr['Port'],
         | 
| 356 | 
            +
                        Type: attr['Type'],
         | 
| 357 | 
            +
                        EcsId: attr['ServerId'],
         | 
| 358 | 
            +
                        EcsName: ecs['InstanceName'],
         | 
| 359 | 
            +
                        PrivateIP: ecs['PrivateIP'].join(','),
         | 
| 360 | 
            +
                        PublicIP: ecs['PublicIP'].join(','),
         | 
| 361 | 
            +
                        CPU: ecs['Cpu'],
         | 
| 362 | 
            +
                        RAM: "#{ecs['Memory'] / 1024.0} GB"
         | 
| 363 | 
            +
                      }
         | 
| 364 | 
            +
                    end + [nil]
         | 
| 365 | 
            +
                  end
         | 
| 366 | 
            +
                  puts '    VServer Groups:'
         | 
| 367 | 
            +
                  puts vserver_group_servers[0..-2].table.to_s.gsub(/^/, '    ')
         | 
| 368 | 
            +
                  puts
         | 
| 369 | 
            +
             | 
| 370 | 
            +
                  listeners.each do |listener|
         | 
| 371 | 
            +
                    listener_type = ['HTTP', 'HTTPS', 'TCP', 'TCPS', 'UDP'].find { |e| !listener["#{e}ListenerConfig"].empty? }
         | 
| 372 | 
            +
                    listener['ListenerType'] = listener_type
         | 
| 184 373 | 
             
                  end
         | 
| 185 374 |  | 
| 186 375 | 
             
                  listeners_info = listeners.map do |listener|
         | 
| 187 376 | 
             
                    {
         | 
| 377 | 
            +
                      Description: listener['Description'],
         | 
| 188 378 | 
             
                      Port: listener['ListenerPort'],
         | 
| 189 379 | 
             
                      Protocol: listener['ListenerProtocol'],
         | 
| 190 380 | 
             
                      Status: listener['Status'],
         | 
| 381 | 
            +
                      HeathCheck: (listener["#{listener['ListenerType']}ListenerConfig"] || {}).dig("HealthCheck") || 'off',
         | 
| 191 382 | 
             
                      BackendServerPort: listener['BackendServerPort'],
         | 
| 192 383 | 
             
                      ForwardPort: listener.dig('HTTPListenerConfig', 'ForwardPort'),
         | 
| 193 | 
            -
                      VServerGroup: listener['VServerGroupId']
         | 
| 384 | 
            +
                      VServerGroup: listener['VServerGroupId'],
         | 
| 385 | 
            +
                      AclStatus: listener['AclStatus'] || 'off',
         | 
| 386 | 
            +
                      AclType: listener['AclType'],
         | 
| 387 | 
            +
                      AclIds: (listener['AclIds'] || []).join(','),
         | 
| 194 388 | 
             
                    }
         | 
| 195 389 | 
             
                  end
         | 
| 196 390 |  | 
| 197 | 
            -
                  puts 'Configured Listeners:'
         | 
| 198 | 
            -
                  puts listeners_info.table.to_s
         | 
| 391 | 
            +
                  puts '    Configured Listeners:'
         | 
| 392 | 
            +
                  puts listeners_info.table.to_s.gsub(/^/, '    ')
         | 
| 199 393 | 
             
                  puts
         | 
| 200 394 |  | 
| 201 | 
            -
                   | 
| 202 | 
            -
                     | 
| 203 | 
            -
             | 
| 204 | 
            -
             | 
| 205 | 
            -
             | 
| 206 | 
            -
             | 
| 207 | 
            -
                          EcsInstanceId: e['ServerId'],
         | 
| 208 | 
            -
                          Port: e['Port'],
         | 
| 209 | 
            -
                          Weight: e['Weight'],
         | 
| 210 | 
            -
                          Type: e['Type']
         | 
| 211 | 
            -
                        }
         | 
| 212 | 
            -
                      }.table.to_s)
         | 
| 213 | 
            -
                      puts
         | 
| 395 | 
            +
                  listener_rules = listeners.flat_map do |listener|
         | 
| 396 | 
            +
                    listener_type = listener['ListenerType']
         | 
| 397 | 
            +
                    next [] unless listener_type
         | 
| 398 | 
            +
                    rules = exec('slb', "DescribeLoadBalancer#{listener_type}ListenerAttribute", "--LoadBalancerId=#{lb['LoadBalancerId']}", "--ListenerPort=#{listener['ListenerPort']}", **options).dig('Rules', 'Rule') || []
         | 
| 399 | 
            +
                    rules.map do |rule|
         | 
| 400 | 
            +
                      {'Listener' => listener['Description']}.merge(rule)
         | 
| 214 401 | 
             
                    end
         | 
| 215 402 | 
             
                  end
         | 
| 216 403 |  | 
| 217 | 
            -
                   | 
| 218 | 
            -
                   | 
| 219 | 
            -
             | 
| 220 | 
            -
                      exec('slb', 'DescribeVServerGroupAttribute', "--VServerGroupId=#{e[:VServerGroup]}", **options)["BackendServers"]["BackendServer"].map { |e| e['ServerId'] }
         | 
| 221 | 
            -
                    else
         | 
| 222 | 
            -
                      []
         | 
| 223 | 
            -
                    end
         | 
| 224 | 
            -
                  }
         | 
| 225 | 
            -
                  ecs_ids.uniq!
         | 
| 226 | 
            -
             | 
| 227 | 
            -
                  ecss = @ecs.select { |e| ecs_ids.include?(e['InstanceId']) }
         | 
| 228 | 
            -
             | 
| 229 | 
            -
                  puts "Referenced ECS Instances:"
         | 
| 404 | 
            +
                  puts '    Listener Rules:'
         | 
| 405 | 
            +
                  puts listener_rules.table.to_s.gsub(/^/, '    ')
         | 
| 406 | 
            +
                  puts
         | 
| 230 407 |  | 
| 231 | 
            -
                   | 
| 232 | 
            -
                    {
         | 
| 233 | 
            -
             | 
| 234 | 
            -
                       | 
| 235 | 
            -
             | 
| 236 | 
            -
             | 
| 237 | 
            -
             | 
| 238 | 
            -
             | 
| 239 | 
            -
             | 
| 240 | 
            -
             | 
| 408 | 
            +
                  if options['acl']
         | 
| 409 | 
            +
                    acl_ids = listeners.flat_map { |listener| listener['AclIds'] || [] }.uniq
         | 
| 410 | 
            +
                    unless acl_ids.empty?
         | 
| 411 | 
            +
                      alc_entries = acl_ids.flat_map do |acl_id|
         | 
| 412 | 
            +
                        attr = exec('slb', 'DescribeAccessControlListAttribute', "--AclId=#{acl_id}", **options)
         | 
| 413 | 
            +
                        (attr.dig('AclEntrys', 'AclEntry') || []).each_with_index.map do |e, idx|
         | 
| 414 | 
            +
                          {
         | 
| 415 | 
            +
                            AclId: (idx.zero? ? attr['AclId'] : ''),
         | 
| 416 | 
            +
                            AclName: (idx.zero? ? attr['AclName'] : ''),
         | 
| 417 | 
            +
                            AclEntryIP: e['AclEntryIP'],
         | 
| 418 | 
            +
                            AclEntryComment: e['AclEntryComment']
         | 
| 419 | 
            +
                          }
         | 
| 420 | 
            +
                        end + [nil]
         | 
| 421 | 
            +
                      end
         | 
| 422 | 
            +
                      puts '    Access Control Lists:'
         | 
| 423 | 
            +
                      puts alc_entries[0..-2].table.to_s.gsub(/^/, '    ')
         | 
| 424 | 
            +
                      puts
         | 
| 425 | 
            +
                    end
         | 
| 241 426 |  | 
| 427 | 
            +
                  end
         | 
| 242 428 | 
             
                end
         | 
| 243 429 |  | 
| 244 430 | 
             
                def show_ecs(host)
         | 
    
        data/lib/aly/cli.rb
    CHANGED
    
    | @@ -4,6 +4,8 @@ module Aly | |
| 4 4 | 
             
              class CLI < ::Thor
         | 
| 5 5 | 
             
                class_option :profile, type: :string, optional: true, aliases: ['-p'], desc: 'select profile'
         | 
| 6 6 | 
             
                class_option :detail, type: :boolean, optional: true, default: false, aliases: ['-d'], desc: 'show detail infomation in JSON format'
         | 
| 7 | 
            +
                class_option :full, type: :boolean, optional: true, default: false, aliases: ['-f'], desc: 'print tables with more infomation'
         | 
| 8 | 
            +
                class_option :acl, type: :boolean, optional: true, default: false, aliases: ['-a'], desc: 'show ACL entries'
         | 
| 7 9 |  | 
| 8 10 | 
             
                desc 'ecs', 'get ECS information'
         | 
| 9 11 | 
             
                def ecs(query = nil)
         | 
    
        data/lib/aly/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: aly
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Liu Xiang
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2022-03- | 
| 11 | 
            +
            date: 2022-03-22 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: thor
         |