elastic-backup-2s3 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 47eee9a9335bffd0b8bab48968951cdc083e2681
4
+ data.tar.gz: f7fd70416ea1b88a132cb96a4bdf3a02beadf151
5
+ SHA512:
6
+ metadata.gz: 9c0d514cee046bc8d4e5ab3d4ed51924a2826fc48613c63272b71e56cff4cab5c79b8443a3cb8c8937edf6da4accabcc4118057ea8d41f3250ace73529edcc06
7
+ data.tar.gz: 36e251166434dc4ac969621bc73e3d2690ec57616913934a3a30a0a05412dc81f0885db2294f9aafa129ed0173ba052593d1ee4a71e0b64d68c3bfb8205df073
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.0
data/.semver ADDED
@@ -0,0 +1,5 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 0
4
+ :patch: 1
5
+ :special: ''
data/Gemfile ADDED
@@ -0,0 +1,26 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "semver", "~> 1"
4
+ gem "aws-sdk", "~> 2"
5
+ gem "elasticsearch", "~> 1"
6
+ gem "multi_json", "~> 1"
7
+ gem "faraday", "~> 0"
8
+ gem "activesupport", "~> 4"
9
+ gem "awesome_print", "~> 1"
10
+ gem "text-table", "~> 1"
11
+
12
+ group :development do
13
+ gem "rspec", "~> 2.8.0"
14
+ gem "yard", "~> 0.7"
15
+ gem "rdoc", "~> 3.12"
16
+ gem "bundler", "~> 1.0"
17
+ gem "juwelier", "~> 2.1.0"
18
+ gem "simplecov", ">= 0"
19
+
20
+ gem 'pry', '~> 0'
21
+ gem 'pry-byebug', '~> 3'
22
+ gem 'pry-doc', '~> 0'
23
+ gem 'pry-remote', '~> 0'
24
+ gem 'pry-rescue', '~> 1'
25
+ gem 'pry-stack_explorer', '~> 0'
26
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,149 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ activesupport (4.2.6)
5
+ i18n (~> 0.7)
6
+ json (~> 1.7, >= 1.7.7)
7
+ minitest (~> 5.1)
8
+ thread_safe (~> 0.3, >= 0.3.4)
9
+ tzinfo (~> 1.1)
10
+ addressable (2.4.0)
11
+ awesome_print (1.6.1)
12
+ aws-sdk (2.2.34)
13
+ aws-sdk-resources (= 2.2.34)
14
+ aws-sdk-core (2.2.34)
15
+ jmespath (~> 1.0)
16
+ aws-sdk-resources (2.2.34)
17
+ aws-sdk-core (= 2.2.34)
18
+ binding_of_caller (0.7.2)
19
+ debug_inspector (>= 0.0.1)
20
+ builder (3.2.2)
21
+ byebug (8.2.4)
22
+ coderay (1.1.1)
23
+ debug_inspector (0.0.2)
24
+ descendants_tracker (0.0.4)
25
+ thread_safe (~> 0.3, >= 0.3.1)
26
+ diff-lcs (1.1.3)
27
+ docile (1.1.5)
28
+ elasticsearch (1.0.17)
29
+ elasticsearch-api (= 1.0.17)
30
+ elasticsearch-transport (= 1.0.17)
31
+ elasticsearch-api (1.0.17)
32
+ multi_json
33
+ elasticsearch-transport (1.0.17)
34
+ faraday
35
+ multi_json
36
+ faraday (0.9.2)
37
+ multipart-post (>= 1.2, < 3)
38
+ git (1.3.0)
39
+ github_api (0.13.1)
40
+ addressable (~> 2.4.0)
41
+ descendants_tracker (~> 0.0.4)
42
+ faraday (~> 0.8, < 0.10)
43
+ hashie (>= 3.4)
44
+ multi_json (>= 1.7.5, < 2.0)
45
+ oauth2
46
+ hashie (3.4.3)
47
+ highline (1.7.8)
48
+ i18n (0.7.0)
49
+ interception (0.5)
50
+ jmespath (1.2.4)
51
+ json_pure (>= 1.8.1)
52
+ json (1.8.3)
53
+ json_pure (1.8.3)
54
+ juwelier (2.1.2)
55
+ builder
56
+ bundler (>= 1.0)
57
+ git (>= 1.2.5)
58
+ github_api
59
+ highline (>= 1.6.15)
60
+ nokogiri (>= 1.5.10)
61
+ rake
62
+ rdoc
63
+ semver
64
+ jwt (1.5.1)
65
+ method_source (0.8.2)
66
+ mini_portile2 (2.0.0)
67
+ minitest (5.8.4)
68
+ multi_json (1.11.2)
69
+ multi_xml (0.5.5)
70
+ multipart-post (2.0.0)
71
+ nokogiri (1.6.7.2)
72
+ mini_portile2 (~> 2.0.0.rc2)
73
+ oauth2 (1.1.0)
74
+ faraday (>= 0.8, < 0.10)
75
+ jwt (~> 1.0, < 1.5.2)
76
+ multi_json (~> 1.3)
77
+ multi_xml (~> 0.5)
78
+ rack (>= 1.2, < 3)
79
+ pry (0.10.3)
80
+ coderay (~> 1.1.0)
81
+ method_source (~> 0.8.1)
82
+ slop (~> 3.4)
83
+ pry-byebug (3.3.0)
84
+ byebug (~> 8.0)
85
+ pry (~> 0.10)
86
+ pry-doc (0.8.0)
87
+ pry (~> 0.9)
88
+ yard (~> 0.8)
89
+ pry-remote (0.1.8)
90
+ pry (~> 0.9)
91
+ slop (~> 3.0)
92
+ pry-rescue (1.4.2)
93
+ interception (>= 0.5)
94
+ pry
95
+ pry-stack_explorer (0.4.9.2)
96
+ binding_of_caller (>= 0.7)
97
+ pry (>= 0.9.11)
98
+ rack (1.6.4)
99
+ rake (11.1.2)
100
+ rdoc (3.12.2)
101
+ json (~> 1.4)
102
+ rspec (2.8.0)
103
+ rspec-core (~> 2.8.0)
104
+ rspec-expectations (~> 2.8.0)
105
+ rspec-mocks (~> 2.8.0)
106
+ rspec-core (2.8.0)
107
+ rspec-expectations (2.8.0)
108
+ diff-lcs (~> 1.1.2)
109
+ rspec-mocks (2.8.0)
110
+ semver (1.0.1)
111
+ simplecov (0.11.2)
112
+ docile (~> 1.1.0)
113
+ json (~> 1.8)
114
+ simplecov-html (~> 0.10.0)
115
+ simplecov-html (0.10.0)
116
+ slop (3.6.0)
117
+ text-table (1.2.4)
118
+ thread_safe (0.3.5)
119
+ tzinfo (1.2.2)
120
+ thread_safe (~> 0.1)
121
+ yard (0.8.7.6)
122
+
123
+ PLATFORMS
124
+ ruby
125
+
126
+ DEPENDENCIES
127
+ activesupport (~> 4)
128
+ awesome_print (~> 1)
129
+ aws-sdk (~> 2)
130
+ bundler (~> 1.0)
131
+ elasticsearch (~> 1)
132
+ faraday (~> 0)
133
+ juwelier (~> 2.1.0)
134
+ multi_json (~> 1)
135
+ pry (~> 0)
136
+ pry-byebug (~> 3)
137
+ pry-doc (~> 0)
138
+ pry-remote (~> 0)
139
+ pry-rescue (~> 1)
140
+ pry-stack_explorer (~> 0)
141
+ rdoc (~> 3.12)
142
+ rspec (~> 2.8.0)
143
+ semver (~> 1)
144
+ simplecov
145
+ text-table (~> 1)
146
+ yard (~> 0.7)
147
+
148
+ BUNDLED WITH
149
+ 1.11.2
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2016 Fred Mitchell
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.org ADDED
@@ -0,0 +1,106 @@
1
+ * elastic-backup-2s3 -- Snapshot, Backup, and Restore Elasicsearch Indicies to and from S3
2
+
3
+ When you have an itch to scratch...
4
+
5
+ I simply want to be able to control the backup and
6
+ restoration of the Elasticsearch cluster to S3
7
+ without any fuss or having to dilly around with
8
+ curl -XPUTS and friends.
9
+
10
+ So here it is, and I make no apologies about not
11
+ supporting the "shared volume" option of Elasticsearch
12
+ snapshots. I may add support at a later date. Or
13
+ feel free to add it and do a pull request.
14
+
15
+ There are many features I wish to add to this, and
16
+ if you have any suggestions, please feel free to send
17
+ them my way!
18
+
19
+ ** Overview
20
+ Elastic Backup simply allows you to specifiy some
21
+ or all of the indicies, some target bucket, and
22
+ run the backup / snapshot.
23
+
24
+ It hides all the sordid details about "registration"
25
+ and the like, and will optionally clean up behind
26
+ itself and remove the registration if you did not
27
+ specify a name for the registration.
28
+
29
+ ** TODO Documentation
30
+ Documentation is comming. Basically,
31
+ just running the command without any parameters
32
+ will give you some basic usage.
33
+
34
+ *** S3URL format
35
+ We adopt a convention to make it easy for you
36
+ to specify the S3 bucket, path, and snapshot
37
+ name stored in the bucket. The S3 URL format is:
38
+
39
+ s3://AWS_S3_BUCKET/path/in/bucket:SNAPSHOT
40
+
41
+ In some cases, :SNAPSHOT is optional, but usually
42
+ expected to be there.
43
+
44
+ ** Examples
45
+ To backup/snapshot your ES to S3
46
+ and wait until the backup is completed:
47
+ #+BEGIN_SRC bash
48
+ es-snapshot snapshot localhost s3://your-backup-bucket/your-backup-path:snap_1 -v2 -w
49
+ #+END_SRC
50
+
51
+ The default repository of 'elastic-backup' is used.
52
+ To specify your own repository name:
53
+ #+BEGIN_SRC bash
54
+ es-snapshot snapshot localhost s3://your-backup-bucket/your-backup-path:snap_1 -v2 -w --repo your-repo-name
55
+ #+END_SRC
56
+
57
+
58
+ To backup/snapshot two indices index1 and index2:
59
+ #+BEGIN_SRC bash
60
+ es-snapshot snapshot localhost s3://your-backup-bucket/your-backup-path:snap_1 -v2 -w --indices index1 index2
61
+ #+END_SRC
62
+
63
+ To restore your snapshot
64
+ #+BEGIN_SRC bash
65
+ es-snapshot restore s3://your-backup-bucket/your-backup-path:snap_1 localhost -v2 -w
66
+ #+END_SRC
67
+
68
+ To restore your snapshot using your-repo-name:
69
+ #+BEGIN_SRC bash
70
+ es-snapshot restore s3://your-backup-bucket/your-backup-path:snap_1 localhost -v2 -w --repo your-repo-name
71
+ #+END_SRC
72
+
73
+ You may specify --dryrun (-u) to see the JSON that will
74
+ be sent without actually executing the commands. Also
75
+ -v2 will show you the same while allowing your
76
+ commands to execute.
77
+
78
+ To see the status of your snapshots:
79
+ #+BEGIN_SRC bash
80
+ es-snapshot list status localhost
81
+ #+END_SRC
82
+
83
+ To see a list of your indices:
84
+ #+BEGIN_SRC bash
85
+ es-snapshot list indices localhost
86
+ #+END_SRC
87
+
88
+ ** Scratchpad
89
+ My own personal notes on this project. These
90
+ are not gauranteed to be useful to you nor
91
+ up-to-date.
92
+
93
+ ** Contributing to elastic-backup-2s3
94
+
95
+ + Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
96
+ + Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
97
+ + Fork the project.
98
+ + Start a feature/bugfix branch.
99
+ + Commit and push until you are happy with your contribution.
100
+ + Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
101
+ + Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
102
+
103
+ ** Copyright
104
+
105
+ Copyright (c) 2016 Fred Mitchell. See LICENSE.txt for
106
+ further details.
data/Rakefile ADDED
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ require 'semver'
6
+
7
+ def s_version
8
+ SemVer.find.format "%M.%m.%p%s"
9
+ end
10
+
11
+ begin
12
+ Bundler.setup(:default, :development)
13
+ rescue Bundler::BundlerError => e
14
+ $stderr.puts e.message
15
+ $stderr.puts "Run `bundle install` to install missing gems"
16
+ exit e.status_code
17
+ end
18
+ require 'rake'
19
+
20
+ require 'juwelier'
21
+ Juwelier::Tasks.new do |gem|
22
+ # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
23
+ gem.name = "elastic-backup-2s3"
24
+ gem.homepage = "http://github.com/flajann2/elastic-backup-2s3"
25
+ gem.license = "MIT"
26
+ gem.version = s_version
27
+ gem.summary = %Q{Elasticsearch to AWS S3 Backup, Snapshotting, and Restore Tool}
28
+ gem.description = %Q{
29
+ I simply want to be able to control the backup and
30
+ restoration of the Elasticsearch cluster to S3
31
+ without any fuss or having to dilly around with
32
+ curl -XPUTS and friends.
33
+
34
+ So here it is, and I make no apologies about not
35
+ supporting the "shared volume" option of Elasticsearch
36
+ snapshots. I may add support at a later date. Or
37
+ feel free to add it and do a pull request.
38
+
39
+ There are many features I wish to add to this, and
40
+ if you have any suggestions, please feel free to send
41
+ them my way!}
42
+
43
+ gem.email = "fred.mitchell@gmx.de"
44
+ gem.authors = ["Fred Mitchell"]
45
+ gem.required_ruby_version = '>= 2.0'
46
+
47
+ # dependencies defined in Gemfile
48
+ end
49
+ Juwelier::RubygemsDotOrgTasks.new
50
+
51
+ require 'rspec/core'
52
+ require 'rspec/core/rake_task'
53
+ RSpec::Core::RakeTask.new(:spec) do |spec|
54
+ spec.pattern = FileList['spec/**/*_spec.rb']
55
+ end
56
+
57
+ desc "Code coverage detail"
58
+ task :simplecov do
59
+ ENV['COVERAGE'] = "true"
60
+ Rake::Task['spec'].execute
61
+ end
62
+
63
+ task :default => :spec
64
+
65
+ require 'yard'
66
+ YARD::Rake::YardocTask.new
data/bin/es-snapshot ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ESS_PATH = File.expand_path '..', File.dirname(__FILE__)
4
+ ESS_EXECUTABLE = File.expand_path 'bin/es-snapshot', Dir.pwd
5
+
6
+ $:.unshift File.join([ESS_PATH, 'lib'])
7
+
8
+ require 'elastic-backup-2s3/cli'
9
+
10
+ ElasticBackup::Cli::Main.start
@@ -0,0 +1,117 @@
1
+ # Generated by juwelier
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+ # stub: elastic-backup-2s3 0.0.1 ruby lib
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "elastic-backup-2s3"
9
+ s.version = "0.0.1"
10
+
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
+ s.require_paths = ["lib"]
13
+ s.authors = ["Fred Mitchell"]
14
+ s.date = "2016-04-15"
15
+ s.description = "\n I simply want to be able to control the backup and\n restoration of the Elasticsearch cluster to S3\n without any fuss or having to dilly around with\n curl -XPUTS and friends.\n\n So here it is, and I make no apologies about not \n supporting the \"shared volume\" option of Elasticsearch\n snapshots. I may add support at a later date. Or\n feel free to add it and do a pull request.\n\n There are many features I wish to add to this, and\n if you have any suggestions, please feel free to send\n them my way!"
16
+ s.email = "fred.mitchell@gmx.de"
17
+ s.executables = ["es-snapshot"]
18
+ s.extra_rdoc_files = [
19
+ "LICENSE.txt",
20
+ "README.org"
21
+ ]
22
+ s.files = [
23
+ ".document",
24
+ ".rspec",
25
+ ".ruby-version",
26
+ ".semver",
27
+ "Gemfile",
28
+ "Gemfile.lock",
29
+ "LICENSE.txt",
30
+ "README.org",
31
+ "Rakefile",
32
+ "bin/es-snapshot",
33
+ "elastic-backup-2s3.gemspec",
34
+ "lib/elastic-backup-2s3.rb",
35
+ "lib/elastic-backup-2s3/cli.rb",
36
+ "lib/elastic-backup-2s3/cli/delete.rb",
37
+ "lib/elastic-backup-2s3/cli/list.rb",
38
+ "lib/elastic-backup-2s3/snapshot.rb",
39
+ "spec/elastic-backup-2s3_spec.rb",
40
+ "spec/spec_helper.rb"
41
+ ]
42
+ s.homepage = "http://github.com/flajann2/elastic-backup-2s3"
43
+ s.licenses = ["MIT"]
44
+ s.required_ruby_version = Gem::Requirement.new(">= 2.0")
45
+ s.rubygems_version = "2.5.1"
46
+ s.summary = "Elasticsearch to AWS S3 Backup, Snapshotting, and Restore Tool"
47
+
48
+ if s.respond_to? :specification_version then
49
+ s.specification_version = 4
50
+
51
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
+ s.add_runtime_dependency(%q<semver>, ["~> 1"])
53
+ s.add_runtime_dependency(%q<aws-sdk>, ["~> 2"])
54
+ s.add_runtime_dependency(%q<elasticsearch>, ["~> 1"])
55
+ s.add_runtime_dependency(%q<multi_json>, ["~> 1"])
56
+ s.add_runtime_dependency(%q<faraday>, ["~> 0"])
57
+ s.add_runtime_dependency(%q<activesupport>, ["~> 4"])
58
+ s.add_runtime_dependency(%q<awesome_print>, ["~> 1"])
59
+ s.add_runtime_dependency(%q<text-table>, ["~> 1"])
60
+ s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
61
+ s.add_development_dependency(%q<yard>, ["~> 0.7"])
62
+ s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
63
+ s.add_development_dependency(%q<bundler>, ["~> 1.0"])
64
+ s.add_development_dependency(%q<juwelier>, ["~> 2.1.0"])
65
+ s.add_development_dependency(%q<simplecov>, [">= 0"])
66
+ s.add_development_dependency(%q<pry>, ["~> 0"])
67
+ s.add_development_dependency(%q<pry-byebug>, ["~> 3"])
68
+ s.add_development_dependency(%q<pry-doc>, ["~> 0"])
69
+ s.add_development_dependency(%q<pry-remote>, ["~> 0"])
70
+ s.add_development_dependency(%q<pry-rescue>, ["~> 1"])
71
+ s.add_development_dependency(%q<pry-stack_explorer>, ["~> 0"])
72
+ else
73
+ s.add_dependency(%q<semver>, ["~> 1"])
74
+ s.add_dependency(%q<aws-sdk>, ["~> 2"])
75
+ s.add_dependency(%q<elasticsearch>, ["~> 1"])
76
+ s.add_dependency(%q<multi_json>, ["~> 1"])
77
+ s.add_dependency(%q<faraday>, ["~> 0"])
78
+ s.add_dependency(%q<activesupport>, ["~> 4"])
79
+ s.add_dependency(%q<awesome_print>, ["~> 1"])
80
+ s.add_dependency(%q<text-table>, ["~> 1"])
81
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
82
+ s.add_dependency(%q<yard>, ["~> 0.7"])
83
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
84
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
85
+ s.add_dependency(%q<juwelier>, ["~> 2.1.0"])
86
+ s.add_dependency(%q<simplecov>, [">= 0"])
87
+ s.add_dependency(%q<pry>, ["~> 0"])
88
+ s.add_dependency(%q<pry-byebug>, ["~> 3"])
89
+ s.add_dependency(%q<pry-doc>, ["~> 0"])
90
+ s.add_dependency(%q<pry-remote>, ["~> 0"])
91
+ s.add_dependency(%q<pry-rescue>, ["~> 1"])
92
+ s.add_dependency(%q<pry-stack_explorer>, ["~> 0"])
93
+ end
94
+ else
95
+ s.add_dependency(%q<semver>, ["~> 1"])
96
+ s.add_dependency(%q<aws-sdk>, ["~> 2"])
97
+ s.add_dependency(%q<elasticsearch>, ["~> 1"])
98
+ s.add_dependency(%q<multi_json>, ["~> 1"])
99
+ s.add_dependency(%q<faraday>, ["~> 0"])
100
+ s.add_dependency(%q<activesupport>, ["~> 4"])
101
+ s.add_dependency(%q<awesome_print>, ["~> 1"])
102
+ s.add_dependency(%q<text-table>, ["~> 1"])
103
+ s.add_dependency(%q<rspec>, ["~> 2.8.0"])
104
+ s.add_dependency(%q<yard>, ["~> 0.7"])
105
+ s.add_dependency(%q<rdoc>, ["~> 3.12"])
106
+ s.add_dependency(%q<bundler>, ["~> 1.0"])
107
+ s.add_dependency(%q<juwelier>, ["~> 2.1.0"])
108
+ s.add_dependency(%q<simplecov>, [">= 0"])
109
+ s.add_dependency(%q<pry>, ["~> 0"])
110
+ s.add_dependency(%q<pry-byebug>, ["~> 3"])
111
+ s.add_dependency(%q<pry-doc>, ["~> 0"])
112
+ s.add_dependency(%q<pry-remote>, ["~> 0"])
113
+ s.add_dependency(%q<pry-rescue>, ["~> 1"])
114
+ s.add_dependency(%q<pry-stack_explorer>, ["~> 0"])
115
+ end
116
+ end
117
+
@@ -0,0 +1,8 @@
1
+ module ElasticBackup
2
+ module Cli
3
+ class Delete < Thor
4
+
5
+ end
6
+ end
7
+ end
8
+
@@ -0,0 +1,71 @@
1
+ # -*- coding: utf-8 -*-
2
+ module ElasticBackup
3
+ module Cli
4
+ class List < Thor
5
+
6
+ desc 'indices [ES]', 'List indicies in Elasticsearch'
7
+ option :detailed, type: :boolean, aliases: '-d', desc: "Give full detailed dump of the indices.", default: false
8
+ def indices es = "localhost"
9
+ esurl = Snapshot.esurl suri: es
10
+ puts "query #{esurl}" unless options[:verbose] < 1
11
+ cli = Snapshot.elastic esurl
12
+ indices = MultiJson.load cli.cat.indices
13
+
14
+ unless options[:detailed]
15
+ table = Text::Table.new
16
+ table.head = ['Index',
17
+ 'Status',
18
+ 'Health',
19
+ 'Docs',
20
+ 'Size']
21
+ table.rows = indices.map { |idx|
22
+ [idx["index"],
23
+ idx["status"],
24
+ idx["health"],
25
+ idx["docs.count"],
26
+ idx["store.size"]]
27
+ }
28
+ puts table
29
+ else
30
+ ap indices
31
+ end
32
+ end
33
+
34
+ desc 'snaphots [S3URL]', 'List all snapshots or clusters stored at S3URL. A cluster is assumed to be a collection of clusters within the S3URL, each containing one or more snapshots.'
35
+ #option :detailed, type: :boolean, aliases: '-d', desc: "Give full detailed dump of the snapshots.", default: false
36
+ #option :clusters, type: :boolean, aliases: '-c', desc: "List clusters instead of snapshots. NOT SUPPORTED YET", default: false
37
+ def snapshots surl
38
+ bucket_name, path, snapshot = Snapshot.s3url_splice surl
39
+ puts "from bucket #{bucket_name}, path #{path}" unless options[:verbose] < 1
40
+ bucket = Snapshot.s3.bucket bucket_name
41
+ raise "bucket #{bucket_name} does not exist" unless bucket.exists?
42
+ ap bucket.objects(prefix: "#{path}/snapshot").map { |ob|
43
+ ob.key.split('snapshot-').last
44
+ }
45
+ end
46
+
47
+ desc 'status [ES]', 'List the status of the snapshots on the given ES cluster.'
48
+ option :detailed, type: :boolean, aliases: '-d', desc: "Give full detailed dump of the status.", default: false
49
+ def status es = "localhost"
50
+ esurl = Snapshot.esurl suri: es
51
+ puts "query #{esurl}" unless options[:verbose] < 1
52
+ cli = Snapshot.elastic esurl
53
+ statuses = MultiJson.load cli.snapshot.get(repository: options[:repo],
54
+ snapshot: '_all')
55
+ unless options[:detailed]
56
+ table = Text::Table.new
57
+ table.head = ['Snapshot', 'State', 'Started']
58
+ table.rows = statuses['snapshots'].map { |s|
59
+ [s["snapshot"],
60
+ s["state"],
61
+ s["start_time"]]
62
+ }
63
+ puts table
64
+ else
65
+ ap statuses
66
+ end
67
+
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,71 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'elastic-backup-2s3'
3
+ require_relative 'cli/delete'
4
+ require_relative 'cli/list'
5
+
6
+ module ElasticBackup
7
+ module Cli
8
+ class Main < Thor
9
+ long_desc <<-LONGDESC
10
+ Main long desc
11
+ LONGDESC
12
+
13
+ class_option :verbose, type: :numeric,
14
+ banner: '[1|2|3]',
15
+ desc: "Verbosity setting.",
16
+ aliases: '-v', default: 0
17
+
18
+ class_option :repo, type: :string,
19
+ aliases: '-r',
20
+ banner: "[NAME]",
21
+ default: 'elastic-backup',
22
+ desc: "Repository name to use."
23
+
24
+ class_option :monitor, type: :boolean, aliases: '-m', desc: "Monitor the progress.", default: false
25
+ class_option :wait, type: :boolean, aliases: '-w', desc: "Wait for completion.", default: false
26
+ class_option :timeout, type: :numeric,
27
+ banner: '[SECONDS]',
28
+ desc: "Explicit operation timeout for connection to master node.",
29
+ aliases: '-t', default: 60
30
+
31
+ class_option :indices, type: :array, aliases: ['-i', '--indexes'],
32
+ banner: "[INDEX1[ INDEX2...]|all]",
33
+ required: false,
34
+ desc: 'A list of indices to snapshot'
35
+
36
+ class_option :dryrun, type: :boolean,
37
+ aliases: '-u',
38
+ desc: "Dry run, do not actually execute."
39
+
40
+ desc 'snapshot [ES S3URL]', 'Backups Elasticsearch indices to S3'
41
+ def snapshot es, s3url
42
+ Snapshot.snapshot Snapshot.esurl(suri: es), s3url, options
43
+ end
44
+
45
+ desc 'restore [S3URL ES]', 'Restore indices from S3 to Elasticsearch.'
46
+ def restore s3url, es
47
+ Snapshot.restore s3url, Snapshot.esurl(suri: es), options
48
+ end
49
+
50
+ desc 'monitor [ES, SNAPSHOT]', 'Not Implemented Yet -- Monitor the progress of an ongoing snapshot or restore.'
51
+ def monitor
52
+ end
53
+
54
+ desc 'delete', 'Not Implemented Yet -- Delete snapshots, indicies, registrations'
55
+ subcommand 'delete', Delete
56
+
57
+ desc 'list', 'list indicies, snapshots'
58
+ subcommand 'list', List
59
+
60
+ no_commands do
61
+ def massage(options)
62
+ opt = Thor::CoreExt::HashWithIndifferentAccess.new options
63
+ opt[:extra] = Thor::CoreExt::HashWithIndifferentAccess.new opt[:extra].map{ |s| s.split(':', 2)}.to_h
64
+ opt[:tags] = opt[:tags].join(',') unless opt[:tags].nil?
65
+ opt[:sktags] = opt[:sktags].join(',') unless opt[:sktags].nil?
66
+ opt
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,125 @@
1
+ # -*- coding: utf-8 -*-
2
+ module ElasticBackup
3
+ module Snapshot
4
+ class << self
5
+ def s3
6
+ @s3 ||= Aws::S3::Resource.new
7
+ end
8
+
9
+ def opt
10
+ @opt
11
+ end
12
+
13
+ # We only need to set this once anyway
14
+ def set_opts(options)
15
+ @opt ||= options
16
+ end
17
+
18
+ # Take the s3 url and break it down to
19
+ # its components [BUCKET, PATH, SNAPSHOT]
20
+ def s3url_splice(surl)
21
+ protocol, b, snapshot = surl.split(':')
22
+ empty, empty, bucket, path = b.split('/', 4)
23
+ raise "Protocol must be 's3' in #{surl}" unless protocol.downcase == 's3'
24
+ [bucket, path, snapshot]
25
+ end
26
+
27
+ def esurl(suri: 'localhost', port: 9200)
28
+ _suri, _port = suri.split(':')
29
+ "http://#{_suri}:#{_port || port}"
30
+ end
31
+
32
+ # The first time this is called must have a
33
+ # valid esurl!!!!
34
+ def elastic(esurl = nil)
35
+ @elastic ||= ESClient.new esurl
36
+ end
37
+
38
+ # For now, this will overwrite the repo if it is
39
+ # there already.
40
+ def set_repository s3url
41
+ bucket, base_path, _ignore = s3url_splice s3url
42
+ cmd = { repository: opt[:repo],
43
+ body: {
44
+ type: 's3',
45
+ settings: {
46
+ bucket: bucket,
47
+ base_path: base_path
48
+ }}}
49
+ ap cmd if opt[:dryrun] || (opt[:verbose] >= 2)
50
+ unless opt[:dryrun]
51
+ ret = MultiJson.load elastic.snapshot.create_repository(cmd)
52
+ ap ret unless opt[:verbose] < 2
53
+ raise "Error #{ret['status']} detected: #{ret['error']}" unless ret['error'].nil?
54
+ end
55
+ end
56
+
57
+ def initiate_snapshot s3url
58
+ _ignore, _ignore, snapname = s3url_splice s3url
59
+ raise "Must specify :SNAPSHOTNAME at the end of your S3URL #{s3url}" if snapname.nil?
60
+
61
+ cmd = {
62
+ repository: opt[:repo],
63
+ snapshot: snapname,
64
+ wait_for_completion: opt[:wait],
65
+ master_timeout: opt[:timeout],
66
+ body: {}}
67
+ cmd[:body][:indices] = opt[:indices].join(',') unless opt[:indices].nil?
68
+ ap cmd if opt[:dryrun] || (opt[:verbose] >= 2)
69
+ unless opt[:dryrun]
70
+ ret = MultiJson.load elastic.snapshot.create(cmd)
71
+ ap ret unless opt[:verbose] < 2
72
+ raise "Error #{ret['status']} detected: #{ret['error']}" unless ret['error'].nil?
73
+ end
74
+ end
75
+
76
+ def initiate_restore s3url
77
+ _ignore, _ignore, snapname = s3url_splice s3url
78
+ raise "Must specify :SNAPSHOTNAME at the end of your S3URL #{s3url}" if snapname.nil?
79
+
80
+ cmd = {
81
+ repository: opt[:repo],
82
+ snapshot: snapname,
83
+ wait_for_completion: opt[:wait],
84
+ master_timeout: opt[:timeout]
85
+ }
86
+ ap cmd if opt[:dryrun] || (opt[:verbose] >= 2)
87
+ unless opt[:dryrun]
88
+ ret = MultiJson.load elastic.snapshot.restore(cmd)
89
+ ap ret unless opt[:verbose] < 2
90
+ raise "Error #{ret['status']} detected: #{ret['error']}" unless ret['error'].nil?
91
+ end
92
+ end
93
+
94
+ # Do a snapshot of an elasticsearch cluster
95
+ def snapshot esurl, s3url, options
96
+ elastic esurl
97
+ set_opts(options)
98
+ set_repository s3url
99
+ initiate_snapshot s3url
100
+ end
101
+
102
+ def restore s3url, esurl, options
103
+ elastic esurl
104
+ set_opts(options)
105
+ set_repository s3url
106
+ initiate_restore s3url
107
+ end
108
+ end
109
+
110
+ class ESClient
111
+ include Elasticsearch::API
112
+ attr :conn
113
+
114
+ def initialize(esurl)
115
+ @conn = ::Faraday::Connection.new url: esurl
116
+ end
117
+
118
+ def perform_request(method, path, params, body)
119
+ conn.run_request method.downcase.to_sym, path,
120
+ ( body ? MultiJson.dump(body) : nil ),
121
+ {'Content-Type' => 'application/json'}
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,18 @@
1
+ require 'thor'
2
+ require 'semver'
3
+ require 'pp'
4
+ require 'open3'
5
+ require 'colorize'
6
+ require 'elasticsearch'
7
+ require 'aws-sdk'
8
+ require 'multi_json'
9
+ require 'faraday'
10
+ require 'elasticsearch/api'
11
+ require 'awesome_print'
12
+ require 'text-table'
13
+ require 'active_support/hash_with_indifferent_access'
14
+
15
+ require_relative 'elastic-backup-2s3/snapshot'
16
+
17
+ module ElasticBackup
18
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'spec_helper'
2
+
3
+ include ElasticBackup
4
+
5
+ S3URL = "s3://mybucket/my/path:my_snapshot"
6
+ S3URL2 = "s3://mybucket/my/path"
7
+
8
+ describe Snapshot do
9
+ it "parses the S3 Url" do
10
+ bucket, path, snapshot = Snapshot.s3url_splice(S3URL)
11
+ expect(bucket).to eq("mybucket")
12
+ expect(path).to eq("my/path")
13
+ expect(snapshot).to eq("my_snapshot")
14
+ end
15
+
16
+ it "parses the S3 Url without the snapshot" do
17
+ bucket, path, snapshot = Snapshot.s3url_splice(S3URL2)
18
+ expect(bucket).to eq("mybucket")
19
+ expect(path).to eq("my/path")
20
+ expect(snapshot).to eq(nil)
21
+ end
22
+
23
+ it "has a valid s3 resource" do
24
+ expect(s3 = Snapshot.s3).to_not be nil
25
+ end
26
+
27
+ it "has a valid Elastic resource" do
28
+ expect(Snapshot.elastic).to_not be nil
29
+ end
30
+
31
+ it "esurl defaults nicely" do
32
+ expect(Snapshot.esurl).to eq('http://localhost:9200')
33
+ expect(Snapshot.esurl port: 5900).to eq('http://localhost:5900')
34
+ expect(Snapshot.esurl suri: 'localhost:5900').to eq('http://localhost:5900')
35
+ end
36
+ end
37
+
@@ -0,0 +1,29 @@
1
+ require 'simplecov'
2
+
3
+ module SimpleCov::Configuration
4
+ def clean_filters
5
+ @filters = []
6
+ end
7
+ end
8
+
9
+ SimpleCov.configure do
10
+ clean_filters
11
+ load_adapter 'test_frameworks'
12
+ end
13
+
14
+ ENV["COVERAGE"] && SimpleCov.start do
15
+ add_filter "/.rvm/"
16
+ end
17
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
18
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
19
+
20
+ require 'rspec'
21
+ require 'elastic-backup-2s3'
22
+
23
+ # Requires supporting files with custom matchers and macros, etc,
24
+ # in ./support/ and its subdirectories.
25
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
26
+
27
+ RSpec.configure do |config|
28
+
29
+ end
metadata ADDED
@@ -0,0 +1,350 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elastic-backup-2s3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Fred Mitchell
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: semver
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: elasticsearch
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: multi_json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faraday
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '4'
97
+ - !ruby/object:Gem::Dependency
98
+ name: awesome_print
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: text-table
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 2.8.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 2.8.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: yard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.7'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.7'
153
+ - !ruby/object:Gem::Dependency
154
+ name: rdoc
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.12'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.12'
167
+ - !ruby/object:Gem::Dependency
168
+ name: bundler
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: juwelier
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 2.1.0
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 2.1.0
195
+ - !ruby/object:Gem::Dependency
196
+ name: simplecov
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: pry
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: pry-byebug
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '3'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '3'
237
+ - !ruby/object:Gem::Dependency
238
+ name: pry-doc
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: pry-remote
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '0'
265
+ - !ruby/object:Gem::Dependency
266
+ name: pry-rescue
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '1'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: '1'
279
+ - !ruby/object:Gem::Dependency
280
+ name: pry-stack_explorer
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: '0'
293
+ description: "\n I simply want to be able to control the backup and\n restoration
294
+ of the Elasticsearch cluster to S3\n without any fuss or having to dilly around
295
+ with\n curl -XPUTS and friends.\n\n So here it is, and I make no apologies about
296
+ not \n supporting the \"shared volume\" option of Elasticsearch\n snapshots. I
297
+ may add support at a later date. Or\n feel free to add it and do a pull request.\n\n
298
+ \ There are many features I wish to add to this, and\n if you have any suggestions,
299
+ please feel free to send\n them my way!"
300
+ email: fred.mitchell@gmx.de
301
+ executables:
302
+ - es-snapshot
303
+ extensions: []
304
+ extra_rdoc_files:
305
+ - LICENSE.txt
306
+ - README.org
307
+ files:
308
+ - ".document"
309
+ - ".rspec"
310
+ - ".ruby-version"
311
+ - ".semver"
312
+ - Gemfile
313
+ - Gemfile.lock
314
+ - LICENSE.txt
315
+ - README.org
316
+ - Rakefile
317
+ - bin/es-snapshot
318
+ - elastic-backup-2s3.gemspec
319
+ - lib/elastic-backup-2s3.rb
320
+ - lib/elastic-backup-2s3/cli.rb
321
+ - lib/elastic-backup-2s3/cli/delete.rb
322
+ - lib/elastic-backup-2s3/cli/list.rb
323
+ - lib/elastic-backup-2s3/snapshot.rb
324
+ - spec/elastic-backup-2s3_spec.rb
325
+ - spec/spec_helper.rb
326
+ homepage: http://github.com/flajann2/elastic-backup-2s3
327
+ licenses:
328
+ - MIT
329
+ metadata: {}
330
+ post_install_message:
331
+ rdoc_options: []
332
+ require_paths:
333
+ - lib
334
+ required_ruby_version: !ruby/object:Gem::Requirement
335
+ requirements:
336
+ - - ">="
337
+ - !ruby/object:Gem::Version
338
+ version: '2.0'
339
+ required_rubygems_version: !ruby/object:Gem::Requirement
340
+ requirements:
341
+ - - ">="
342
+ - !ruby/object:Gem::Version
343
+ version: '0'
344
+ requirements: []
345
+ rubyforge_project:
346
+ rubygems_version: 2.5.1
347
+ signing_key:
348
+ specification_version: 4
349
+ summary: Elasticsearch to AWS S3 Backup, Snapshotting, and Restore Tool
350
+ test_files: []