#!/usr/bin/ruby

require 'rubygems'
require 'right_aws'
require 'yaml'
require 'pp'
require "time"

require "libs.rb"

$default_retention = 7

##
# main proccess
##
config = YAML.load(File.open('config.yml'))

config[:accounts].each_pair do |account, params|
  begin
    puts "[Info] <#{account}> Start Backup"

    ec2 = RightAws::Ec2.new(
      params[:access_key_id], 
      params[:secret_access_key], 
      :region => config[:region],
      :logger => Logger.new('/dev/null')
    )

    instances = ec2.describe_instances(:filters => {'instance-state-name' => 'running'})
    volumes   = ec2.describe_volumes

    # Create Snapshot.
    target_volumes = elect_snapshot_targets(instances, volumes)
    target_volumes.each do |volume|
      snapshot = ec2.create_snapshot(volume[:aws_id], "<instance_name:#{volume[:aws_instance_name]}> <volume_id:#{volume[:aws_id]}>")
      tags     = ec2.create_tags(snapshot[:aws_id], {"ManagedByAutoBackup" => "True"})
      puts "[Info] <#{account}> Created snapshot <instance_name:#{volume[:aws_instance_name]}> <volume_id:#{volume[:aws_id]}> <snapshot_id:#{snapshot[:aws_id]}>"
    end

    snapshots = ec2.describe_snapshots(:owner => ['self'], :filters => {'tag:ManagedByAutoBackup' => 'True'})
    grouped_snapshots = grouping_snapshots_by_volume_id(snapshots)

    # Delete aged Snapshot.
    aged_snapshot_ids = detect_aged_snapshots(grouped_snapshots, volumes)
    aged_snapshot_ids.each do |aged_snapshot_id|
      ec2.delete_snapshot(aged_snapshot_id)
      puts "[Info] <#{account}> Deleted aged snapshot <snapshot_id:#{aged_snapshot_id}>"  
    end

    # Detect deleted volume.
    deleted_volume_ids = detect_deleted_volumes(grouped_snapshots, volumes)
    deleted_volume_ids.each do |deleted_volume_id|
      warn "[info] <#{account}> Detected deleted volume <volume_id:#{deleted_volume_ids}>"
    end

    # Detect unused volume.
    unused_volume_ids = detect_unused_volumes(volumes)
    unused_volume_ids.each do |unused_volume_id|
      warn "[info] <#{account}> Detected unused volume <volume_id:#{unused_volume_id}>"
    end

  rescue => ex
    warn "[Error] #{account} Error has Occured"
    warn "[Error] #{account} #{ex.message}"
    next
  end
end