aws_docker_utils 0.0.5 → 0.0.6

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.
@@ -0,0 +1 @@
1
+ aws_docker_utils
@@ -0,0 +1,38 @@
1
+ #### This is WIP
2
+
3
+
4
+ ####Usage:
5
+
6
+ ##### Installation:
7
+ ```bash
8
+ gem install aws_docker_utils
9
+ ```
10
+
11
+ ##### Set AWS credentials:
12
+ ```bash
13
+ aws_docker_utils configure init
14
+ ```
15
+
16
+ #####Reset (delete) stored AWS credentials:
17
+ ```bash
18
+ aws_docker_utils configure reset
19
+ ```
20
+ #####Create SQL from Docker container and upload SQL file to AWS S3:
21
+ ```bash
22
+ aws_docker_utils backup_file from \<container_name\> to \<s3_bucket_name\> as 'backup_database' using \<cmd\>
23
+ ```
24
+
25
+ #####Example:
26
+ ```bash
27
+ aws_docker_utils backup_file from database to 'my-super-bucket-name' as 'backup' using "pg_dump -U postgres -O my_app_production"
28
+ ```
29
+
30
+ The SQL backup file will be extacted from the database container, compressed and pushed to 'my-super-bucket-name' S3 bucket with the name like
31
+ ```bash
32
+ backup_16-04-15_16-34.sql
33
+ ```
34
+
35
+ If the AWS S3 bucket is not exists, it will be created.
36
+
37
+ #####License
38
+ Author: Bogdan Kulbida, under MIT Lic. 2016.
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "docopt"
4
- require_relative "../lib/collectors/to_s3.rb"
4
+ require_relative "../lib/aws_docker_utils/router.rb"
5
5
 
6
6
  module AwsDockerUtils
7
7
 
@@ -13,6 +13,8 @@ Author: Bogdan Kulbida.
13
13
 
14
14
  Usage:
15
15
  #{__FILE__} backup_file from <container_name> to <s3_bucket_name> as <as_task> using <cmd>
16
+ #{__FILE__} configure init
17
+ #{__FILE__} configure reset
16
18
  #{__FILE__} -h | --help
17
19
  #{__FILE__} --version
18
20
 
@@ -23,8 +25,7 @@ Options:
23
25
  DOCOPT
24
26
 
25
27
  begin
26
- collector = Collectors::ToS3.new(Docopt::docopt(doc))
27
- collector.push
28
+ Router.new(Docopt::docopt(doc)).route!.activate
28
29
  rescue Docopt::Exit => e
29
30
  puts e.message
30
31
  end
@@ -0,0 +1,42 @@
1
+ require 'yaml'
2
+
3
+ module AwsDockerUtils
4
+ class AwsConfigStorage
5
+
6
+ attr_accessor :config
7
+
8
+ CONFIG_FILE_PATH = "./aws_docker_utils.yml"
9
+
10
+ def initialize
11
+ self.config = fetch_config
12
+ end
13
+
14
+ def persist!(key, value)
15
+ `echo '#{key}: "#{value}"' >> #{file_name}`
16
+ end
17
+
18
+ def clear!
19
+ `echo "# AWS credentials:" > #{file_name}`
20
+ end
21
+
22
+ def valid?
23
+ @config && @config.fetch('access_key') && @config.fetch('secret_key')
24
+ end
25
+
26
+ private
27
+
28
+ def exists?
29
+ !`ls #{file_name}`.empty?
30
+ end
31
+
32
+ def fetch_config
33
+ clear! unless exists?
34
+ YAML::load_file(file_name)
35
+ end
36
+
37
+ def file_name
38
+ CONFIG_FILE_PATH
39
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,14 @@
1
+ module AwsDockerUtils
2
+ class Compressor
3
+
4
+ def initialize(file_path)
5
+ @file_path = file_path
6
+ end
7
+
8
+ def compress
9
+ # for now it does nothing
10
+ @file_path
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ module AwsDockerUtils
2
+ module Controllers
3
+
4
+ class Base
5
+
6
+ def initialize(opts={})
7
+
8
+ end
9
+
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,40 @@
1
+ require 'io/console'
2
+ require_relative '../aws_config_storage'
3
+
4
+ module AwsDockerUtils
5
+ module Controllers
6
+
7
+ class Configurator
8
+
9
+ def initialize(opts={})
10
+ @opts = opts
11
+ @config = AwsConfigStorage.new
12
+ end
13
+
14
+ def activate
15
+ if @opts.fetch('init')
16
+ publish(:access_key, std_input("Please enter AWS user ACCESS KEY:"))
17
+ publish(:secret_key, std_input("Please enter AWS user SERCET KEY:"))
18
+ publish(:region, std_input("Please enter AWS preferred REGION:"))
19
+ else
20
+ @config.clear!
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def std_input(request)
27
+ print request
28
+ STDIN.noecho do |b|
29
+ b.gets.chomp
30
+ end
31
+ end
32
+
33
+ def publish(type, value)
34
+ @config.persist!(type, value)
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,33 @@
1
+ require 'tempfile'
2
+ require_relative "../compressor"
3
+ require_relative "../docker/client"
4
+ require_relative "../providers/s3"
5
+
6
+ module AwsDockerUtils
7
+ module Controllers
8
+
9
+ class S3
10
+
11
+ def initialize(opts={})
12
+ @bucket_name = opts.fetch('<s3_bucket_name>')
13
+ @task_name = opts.fetch('<as_task>', "file")
14
+ @container_name = opts.fetch('<container_name>')
15
+ @cmd = opts.fetch('<cmd>')
16
+ @file_name = Tempfile.new("#{`date '+#{@task_name}_%y-%m-%d_%H-%M'`.chop}.sql")
17
+ end
18
+
19
+ def activate
20
+ Docker::Client.new(container_name: @container_name, cmd: "#{@cmd} > #{@file_name.path}").exec
21
+ s3 = Providers::S3.new(bucket_name: @bucket_name)
22
+ if s3.put(Compressor.new(@file_name.path).compress)
23
+ puts "Pushed to S3."
24
+ else
25
+ puts "Unable to do the job."
26
+ end
27
+ @file_name.close
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,18 @@
1
+ module AwsDockerUtils
2
+ module Docker
3
+
4
+ class Client
5
+
6
+ def initialize(opts={})
7
+ @container_name = opts[:container_name]
8
+ @cmd = opts[:cmd]
9
+ end
10
+
11
+ def exec
12
+ `docker exec $(docker ps -q --filter 'name=#{@container_name}') #{@cmd}`
13
+ end
14
+
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,59 @@
1
+ require 'yaml'
2
+ require 'aws-sdk'
3
+
4
+ module AwsDockerUtils
5
+ module Providers
6
+
7
+ class S3
8
+
9
+ DEFAULT_REGION = "us-east-1"
10
+
11
+ def initialize(opts={})
12
+ @bucket_name = opts.fetch(:bucket_name)
13
+
14
+ storage = AwsConfigStorage.new
15
+ client = if storage.valid?
16
+ config = storage.config
17
+ Aws::S3::Client.new(
18
+ region: (config.fetch("region").to_s || DEFAULT_REGION),
19
+ access_key_id: config.fetch("access_key").to_s,
20
+ secret_access_key: config.fetch("secret_key").to_s
21
+ )
22
+ else
23
+ Aws::S3::Client.new(region: DEFAULT_REGION)
24
+ end
25
+
26
+ @s3 = Aws::S3::Resource.new(client: client)
27
+ end
28
+
29
+ def put(file_path)
30
+ raise "Please set bucket name with constructor." if @bucket_name.nil?
31
+
32
+ bucket = create_bucket(@bucket_name)
33
+ obj = bucket.object(File.basename(file_path.gsub(/\.sql.+/, '.sql')))
34
+
35
+ if obj.upload_file(file_path)
36
+ return true
37
+ else
38
+ puts "could not upload file #{@file_path} to S3."
39
+ end
40
+
41
+ false
42
+ end
43
+
44
+ private
45
+
46
+ def create_bucket(bucket_name)
47
+ bucket = @s3.bucket(bucket_name)
48
+ unless bucket.exists?
49
+ puts 'Bucket does not exist. Creating...'
50
+ bucket.create
51
+ puts 'Done.'
52
+ end
53
+ bucket
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,20 @@
1
+ require_relative "controllers/s3.rb"
2
+ require_relative "controllers/configurator.rb"
3
+
4
+ class Router
5
+
6
+ def initialize(opts={})
7
+ @opts = opts
8
+ end
9
+
10
+ def route!
11
+ case
12
+ when @opts.fetch('configure') then AwsDockerUtils::Controllers::Configurator.new(@opts)
13
+ when @opts.fetch('backup_file') then AwsDockerUtils::Controllers::S3.new(@opts)
14
+ else raise "NOP"
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ end
@@ -1,3 +1,3 @@
1
1
  module AwsDockerUtils
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws_docker_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -51,16 +51,22 @@ extensions: []
51
51
  extra_rdoc_files: []
52
52
  files:
53
53
  - .gitignore
54
+ - .rbenv-gemsets
54
55
  - Gemfile
55
56
  - Gemfile.lock
57
+ - README.md
56
58
  - aws_docker_utils.gemspec
57
59
  - bin/aws_docker_utils
58
60
  - lib/aws_docker_utils.rb
61
+ - lib/aws_docker_utils/aws_config_storage.rb
62
+ - lib/aws_docker_utils/compressor.rb
63
+ - lib/aws_docker_utils/controllers/base.rb
64
+ - lib/aws_docker_utils/controllers/configurator.rb
65
+ - lib/aws_docker_utils/controllers/s3.rb
66
+ - lib/aws_docker_utils/docker/client.rb
67
+ - lib/aws_docker_utils/providers/s3.rb
68
+ - lib/aws_docker_utils/router.rb
59
69
  - lib/aws_docker_utils/version.rb
60
- - lib/collectors/to_s3.rb
61
- - lib/docker_compose/client.rb
62
- - lib/s3/client.rb
63
- - lib/utils.rb
64
70
  homepage: http://rubygems.org/gems/aws_docker_utils
65
71
  licenses:
66
72
  - MIT
@@ -1,33 +0,0 @@
1
- require "utils"
2
- require "docker_compose/client"
3
- require "s3/client"
4
-
5
- module AwsDockerUtils
6
- module Collectors
7
- class ToS3
8
-
9
- def initialize(opts={})
10
- @bucket_name = opts.fetch('<s3_bucket_name>')
11
- @task_name = opts.fetch('<as_task>', "file")
12
- @container_name = opts.fetch('<container_name>')
13
- @cmd = opts.fetch('<cmd>')
14
-
15
- @file_name = "#{`date '+#{@task_name}_%y-%m-%d_%H-%M'`.chop}.sql"
16
- end
17
-
18
- def push
19
- DockerCompose::Client.new(container_name: @container_name, cmd: "#{@cmd} > #{@file_name}").exec
20
- file_name = Utils.compress(@file_name)
21
-
22
- s3 = S3::Client.new(file_name: file_name, bucket_name: @bucket_name)
23
- if s3.put(file_name)
24
- Utils.rm(file_name)
25
- puts "Pushed to S3."
26
- else
27
- puts "Unable to do the job."
28
- end
29
- end
30
-
31
- end
32
- end
33
- end
@@ -1,14 +0,0 @@
1
- module DockerCompose
2
- class Client
3
-
4
- def initialize(opts={})
5
- @container_name = opts[:container_name]
6
- @cmd = opts[:cmd]
7
- end
8
-
9
- def exec
10
- `docker exec $(docker ps -q --filter 'name=#{@container_name}') #{@cmd}`
11
- end
12
-
13
- end
14
- end
@@ -1,49 +0,0 @@
1
- require 'yaml'
2
- require 'aws-sdk'
3
-
4
- module S3
5
- class Client
6
-
7
- DEFAULT_REGION = "us-east-1"
8
-
9
- def initialize(opts={})
10
- @bucket_name = opts[:bucket_name]
11
-
12
- config = YAML.load(File.read(File.join(File.dirname(__FILE__), "credentials.yml")))
13
- client = Aws::S3::Client.new(
14
- region: (config["region"] || DEFAULT_REGION),
15
- access_key_id: config["access_key"],
16
- secret_access_key: config["secret_key"]
17
- )
18
- @s3 = Aws::S3::Resource.new(client: client)
19
- end
20
-
21
- def put(file_path)
22
- raise "Please set bucket name with constructor." if @bucket_name.nil?
23
-
24
- bucket = create_bucket(@bucket_name)
25
- obj = bucket.object(File.basename(file_path))
26
-
27
- if obj.upload_file(file_path)
28
- return true
29
- else
30
- puts "could not upload file #{@file_path} to S3."
31
- end
32
-
33
- false
34
- end
35
-
36
- private
37
-
38
- def create_bucket(bucket_name)
39
- bucket = @s3.bucket(bucket_name)
40
- unless bucket.exists?
41
- puts 'Bucket does not exist. Creating...'
42
- bucket.create
43
- puts 'Done.'
44
- end
45
- bucket
46
- end
47
-
48
- end
49
- end
@@ -1,15 +0,0 @@
1
- module Utils
2
-
3
- extend self
4
-
5
- def rm(file_path)
6
- `rm -f #{file_path.gsub(".tar.gz", '')}`
7
- `rm -f #{file_path}`
8
- end
9
-
10
- def compress(source)
11
- `tar -pcvzf #{source}.tar.gz #{source}`
12
- "#{source}.tar.gz"
13
- end
14
-
15
- end