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 +7 -0
- data/.document +5 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/.semver +5 -0
- data/Gemfile +26 -0
- data/Gemfile.lock +149 -0
- data/LICENSE.txt +20 -0
- data/README.org +106 -0
- data/Rakefile +66 -0
- data/bin/es-snapshot +10 -0
- data/elastic-backup-2s3.gemspec +117 -0
- data/lib/elastic-backup-2s3/cli/delete.rb +8 -0
- data/lib/elastic-backup-2s3/cli/list.rb +71 -0
- data/lib/elastic-backup-2s3/cli.rb +71 -0
- data/lib/elastic-backup-2s3/snapshot.rb +125 -0
- data/lib/elastic-backup-2s3.rb +18 -0
- data/spec/elastic-backup-2s3_spec.rb +37 -0
- data/spec/spec_helper.rb +29 -0
- metadata +350 -0
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
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.3.0
|
data/.semver
ADDED
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,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,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
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -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: []
|