aggkit 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.dockerignore +20 -0
- data/.gitignore +109 -0
- data/.gitlab-ci.yml +66 -0
- data/.rspec +4 -0
- data/.rubocop.yml +98 -0
- data/.travis.yml +30 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +55 -0
- data/README.md +96 -0
- data/aggkit.gemspec +38 -0
- data/bin/agg +167 -0
- data/bin/aggconsul +222 -0
- data/bin/agglock +71 -0
- data/bin/aggmerge +118 -0
- data/bin/aggwait +262 -0
- data/bin/consul.rb +222 -0
- data/bin/locker.rb +71 -0
- data/bin/merger.rb +118 -0
- data/bin/terminator.rb +71 -0
- data/bin/waiter.rb +262 -0
- data/docker/Dockerfile +112 -0
- data/docker/docker-compose.yml +12 -0
- data/docker/down.sh +4 -0
- data/docker/run_tests.sh +23 -0
- data/lib/aggkit/childprocess/abstract_io.rb +38 -0
- data/lib/aggkit/childprocess/abstract_process.rb +194 -0
- data/lib/aggkit/childprocess/errors.rb +28 -0
- data/lib/aggkit/childprocess/jruby/io.rb +17 -0
- data/lib/aggkit/childprocess/jruby/process.rb +161 -0
- data/lib/aggkit/childprocess/jruby/pump.rb +55 -0
- data/lib/aggkit/childprocess/jruby.rb +58 -0
- data/lib/aggkit/childprocess/tools/generator.rb +148 -0
- data/lib/aggkit/childprocess/unix/fork_exec_process.rb +72 -0
- data/lib/aggkit/childprocess/unix/io.rb +22 -0
- data/lib/aggkit/childprocess/unix/lib.rb +188 -0
- data/lib/aggkit/childprocess/unix/platform/i386-linux.rb +14 -0
- data/lib/aggkit/childprocess/unix/platform/i386-solaris.rb +13 -0
- data/lib/aggkit/childprocess/unix/platform/x86_64-linux.rb +14 -0
- data/lib/aggkit/childprocess/unix/platform/x86_64-macosx.rb +13 -0
- data/lib/aggkit/childprocess/unix/posix_spawn_process.rb +135 -0
- data/lib/aggkit/childprocess/unix/process.rb +91 -0
- data/lib/aggkit/childprocess/unix.rb +11 -0
- data/lib/aggkit/childprocess/version.rb +5 -0
- data/lib/aggkit/childprocess/windows/handle.rb +93 -0
- data/lib/aggkit/childprocess/windows/io.rb +25 -0
- data/lib/aggkit/childprocess/windows/lib.rb +418 -0
- data/lib/aggkit/childprocess/windows/process.rb +132 -0
- data/lib/aggkit/childprocess/windows/process_builder.rb +177 -0
- data/lib/aggkit/childprocess/windows/structs.rb +151 -0
- data/lib/aggkit/childprocess/windows.rb +35 -0
- data/lib/aggkit/childprocess.rb +213 -0
- data/lib/aggkit/env.rb +219 -0
- data/lib/aggkit/runner.rb +80 -0
- data/lib/aggkit/version.rb +5 -0
- data/lib/aggkit/watcher.rb +239 -0
- data/lib/aggkit.rb +15 -0
- metadata +196 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 15b728b147389a89556cf28472062477aab155141d7ace18127c9815efaed608
|
4
|
+
data.tar.gz: eeb6be7bcf4547c69218f54ed15182a89f6235520c32d0a0c7e83adb356fc1c5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b6816ebfa8a4daf33bc359a859a949147cbc242af2dff814b2d3a17b494bd6bded39c4117ccb968b53e434407edb665cb0232cd9ca4e6bfc9d91d80d2c097253
|
7
|
+
data.tar.gz: c106261c69ca34d8a0daf3e78d39ee1ed65357c81f23b2e6003aeb3eadc04c28562178c9ddd12ac983400ad9c21ad9c37b071aaa1a30772f32e2d911c5122898
|
data/.dockerignore
ADDED
data/.gitignore
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
|
2
|
+
#
|
3
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
4
|
+
# or operating system, you probably want to add a global ignore instead:
|
5
|
+
# git config --global core.excludesfile '~/.gitignore_global'
|
6
|
+
|
7
|
+
# bundler state
|
8
|
+
/.bundle
|
9
|
+
vendor/cache
|
10
|
+
vendor/bundle
|
11
|
+
/vendor/ruby/
|
12
|
+
|
13
|
+
# minimal Rails specific artifacts
|
14
|
+
db/*.sqlite3
|
15
|
+
/db/*.sqlite3-journal
|
16
|
+
/log/*
|
17
|
+
/tmp/*
|
18
|
+
|
19
|
+
# add /config/database.yml if it contains passwords
|
20
|
+
# /config/database.yml
|
21
|
+
|
22
|
+
# various artifacts
|
23
|
+
**.war
|
24
|
+
*.rbc
|
25
|
+
*.sassc
|
26
|
+
.redcar/
|
27
|
+
.sass-cache
|
28
|
+
/config/config.yml
|
29
|
+
/coverage.data
|
30
|
+
/coverage/
|
31
|
+
/db/*.javadb/
|
32
|
+
/db/*.sqlite3
|
33
|
+
/config/database.yml
|
34
|
+
/config/secrets.yml
|
35
|
+
oxymoron.js
|
36
|
+
/doc/api/
|
37
|
+
/doc/app/
|
38
|
+
/doc/features.html
|
39
|
+
/doc/specs.html
|
40
|
+
/public/cache
|
41
|
+
/public/uploads
|
42
|
+
/public/stylesheets/compiled
|
43
|
+
/public/system/*
|
44
|
+
/spec/tmp/*
|
45
|
+
/cache
|
46
|
+
/capybara*
|
47
|
+
/capybara-*.html
|
48
|
+
/gems
|
49
|
+
/specifications
|
50
|
+
app/assets/fonts/disp-preview.html
|
51
|
+
rerun.txt
|
52
|
+
pickle-email-*.html
|
53
|
+
*.sublime-project
|
54
|
+
*.sublime-workspace
|
55
|
+
.zeus.sock
|
56
|
+
.byebug_history
|
57
|
+
|
58
|
+
#test
|
59
|
+
/docs
|
60
|
+
|
61
|
+
|
62
|
+
# If you find yourself ignoring temporary files generated by your text editor
|
63
|
+
# or operating system, you probably want to add a global ignore instead:
|
64
|
+
# git config --global core.excludesfile ~/.gitignore_global
|
65
|
+
#
|
66
|
+
# Here are some files you may want to ignore globally:
|
67
|
+
|
68
|
+
# scm revert files
|
69
|
+
**.orig
|
70
|
+
|
71
|
+
# Mac finder artifacts
|
72
|
+
.DS_Store
|
73
|
+
|
74
|
+
# Netbeans project directory
|
75
|
+
/nbproject/
|
76
|
+
|
77
|
+
# RubyMine project files
|
78
|
+
.idea
|
79
|
+
|
80
|
+
# Textmate project files
|
81
|
+
/*.tmproj
|
82
|
+
|
83
|
+
# vim artifacts
|
84
|
+
**.swp
|
85
|
+
|
86
|
+
# Environment files that may contain sensitive data
|
87
|
+
.env
|
88
|
+
.powenv
|
89
|
+
|
90
|
+
# tilde files are usually backup files from a text editor
|
91
|
+
*~
|
92
|
+
public/assets/
|
93
|
+
config/keys
|
94
|
+
.ruby-gemset
|
95
|
+
.ruby-version
|
96
|
+
spec/reports/
|
97
|
+
app/assets/javascripts/oxymoron.js
|
98
|
+
|
99
|
+
!/log/.keep
|
100
|
+
!/tmp/.keep
|
101
|
+
|
102
|
+
/node_modules
|
103
|
+
/yarn-error.log
|
104
|
+
|
105
|
+
.byebug_history
|
106
|
+
/public/packs
|
107
|
+
/public/packs-test
|
108
|
+
/node_modules
|
109
|
+
passenger.*.pid.lock
|
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
before_script: &before_pipeline_script
|
2
|
+
# Install ssh-agent if not already installed, it is required by Docker.
|
3
|
+
# (change apt-get to yum if you use a CentOS-based image)
|
4
|
+
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
|
5
|
+
|
6
|
+
# Run ssh-agent (inside the build environment)
|
7
|
+
- eval $(ssh-agent -s)
|
8
|
+
|
9
|
+
# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
|
10
|
+
- ssh-add <(echo "$SSH_PRIVATE_KEY")
|
11
|
+
|
12
|
+
# For Docker builds disable host key checking. Be aware that by adding that
|
13
|
+
# you are suspectible to man-in-the-middle attacks.
|
14
|
+
# WARNING: Use this only with the Docker executor, if you use it with shell
|
15
|
+
# you will overwrite your user's SSH config.
|
16
|
+
- mkdir -p ~/.ssh
|
17
|
+
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
|
18
|
+
- mkdir -p ~/.docker
|
19
|
+
|
20
|
+
stages:
|
21
|
+
- build
|
22
|
+
- tests
|
23
|
+
- deploy
|
24
|
+
|
25
|
+
build:
|
26
|
+
image: rnds/ruby:2.3.0-test
|
27
|
+
stage: build
|
28
|
+
script:
|
29
|
+
- bundle install --jobs=3 --path vendor/bundle && bundle package --all
|
30
|
+
- gem build `ls | grep gemspec` && gem install `ls | grep -e '.gem$'`
|
31
|
+
cache:
|
32
|
+
paths:
|
33
|
+
- vendor/bundle
|
34
|
+
- vendor/cache
|
35
|
+
artifacts:
|
36
|
+
name: "gem"
|
37
|
+
paths:
|
38
|
+
- ./*.gem
|
39
|
+
|
40
|
+
test-2.1:
|
41
|
+
image: rnds/ruby:2.3.0-test
|
42
|
+
stage: tests
|
43
|
+
variables:
|
44
|
+
RUBY_VERSION: '2.1'
|
45
|
+
script:
|
46
|
+
- docker/run_tests.sh
|
47
|
+
|
48
|
+
test-2.5:
|
49
|
+
image: rnds/ruby:2.3.0-test
|
50
|
+
stage: tests
|
51
|
+
variables:
|
52
|
+
RUBY_VERSION: '2.5'
|
53
|
+
script:
|
54
|
+
- docker/run_tests.sh
|
55
|
+
|
56
|
+
pushgem:
|
57
|
+
image: rnds/ruby:2.3.0-test
|
58
|
+
stage: deploy
|
59
|
+
script:
|
60
|
+
- mkdir -p ~/.gem
|
61
|
+
- echo ":rubygems_api_key: ${RUBYGEMS_KEY}" > credentials
|
62
|
+
- export GEMFILE=`ls *.gem | tail -n 1`
|
63
|
+
- export GEMVERSION=`echo $GEMFILE | sed s/\.gem// | sed s/.*-//`
|
64
|
+
- gem yank aggkit -v ${GEMVERSION}
|
65
|
+
- gem push $GEMFILE
|
66
|
+
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.5
|
3
|
+
Exclude:
|
4
|
+
- 'storage/**/*'
|
5
|
+
- 'docker/**/*'
|
6
|
+
- 'lib/aggkit/childprocess/**/*'
|
7
|
+
- 'lib/aggkit/childprocess,rb'
|
8
|
+
|
9
|
+
|
10
|
+
Security/YAMLLoad:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Style/AsciiComments:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Style/RedundantBegin:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Style/GlobalVars:
|
20
|
+
AllowedVariables: ['$logger', '$root']
|
21
|
+
|
22
|
+
Metrics/BlockLength:
|
23
|
+
Exclude:
|
24
|
+
- 'spec/**/*.rb'
|
25
|
+
|
26
|
+
Metrics/MethodLength:
|
27
|
+
Max: 20
|
28
|
+
|
29
|
+
Style/ClassAndModuleChildren:
|
30
|
+
EnforcedStyle: compact
|
31
|
+
Enabled: false
|
32
|
+
|
33
|
+
Style/Documentation:
|
34
|
+
Enabled: false
|
35
|
+
|
36
|
+
Style/Lambda:
|
37
|
+
Enabled: false
|
38
|
+
|
39
|
+
|
40
|
+
Style/RaiseArgs:
|
41
|
+
EnforcedStyle: compact
|
42
|
+
|
43
|
+
Style/SpecialGlobalVars:
|
44
|
+
Enabled: false
|
45
|
+
|
46
|
+
Metrics/LineLength:
|
47
|
+
Max: 100
|
48
|
+
|
49
|
+
#Layout/IndentationWidth:
|
50
|
+
# Enabled: true
|
51
|
+
|
52
|
+
#Layout/IndentAssignment:
|
53
|
+
# Enabled: false
|
54
|
+
# IndentationWidth: false
|
55
|
+
|
56
|
+
#Layout/ElseAlignment:
|
57
|
+
# Enabled: false
|
58
|
+
|
59
|
+
#Layout/EndAlignment:
|
60
|
+
# Enabled: false
|
61
|
+
|
62
|
+
#Lint/AssignmentInCondition:
|
63
|
+
# Enabled: false
|
64
|
+
|
65
|
+
Layout/IndentationConsistency:
|
66
|
+
EnforcedStyle: rails
|
67
|
+
|
68
|
+
Layout/EmptyLines:
|
69
|
+
Enabled: false
|
70
|
+
|
71
|
+
Layout/EmptyLinesAroundClassBody:
|
72
|
+
EnforcedStyle: empty_lines
|
73
|
+
|
74
|
+
Layout/EmptyLinesAroundModuleBody:
|
75
|
+
EnforcedStyle: empty_lines
|
76
|
+
|
77
|
+
Layout/SpaceInsideBlockBraces:
|
78
|
+
EnforcedStyle: space
|
79
|
+
SpaceBeforeBlockParameters: false
|
80
|
+
|
81
|
+
Layout/SpaceAroundBlockParameters:
|
82
|
+
EnforcedStyleInsidePipes: no_space
|
83
|
+
|
84
|
+
Layout/SpaceBeforeBlockBraces:
|
85
|
+
Enabled: false
|
86
|
+
|
87
|
+
Style/NumericPredicate:
|
88
|
+
Enabled: false
|
89
|
+
|
90
|
+
Style/FrozenStringLiteralComment:
|
91
|
+
Enabled: false
|
92
|
+
|
93
|
+
Style/DoubleNegation:
|
94
|
+
Enabled: false
|
95
|
+
|
96
|
+
Style/SymbolArray:
|
97
|
+
Enabled: false
|
98
|
+
|
data/.travis.yml
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
language: ruby
|
3
|
+
rvm:
|
4
|
+
- 2.0
|
5
|
+
- 2.5
|
6
|
+
|
7
|
+
stage: test
|
8
|
+
|
9
|
+
before_install:
|
10
|
+
- sudo apt-get install -y libxml2-dev unzip curl
|
11
|
+
|
12
|
+
script:
|
13
|
+
- gem build `ls | grep gemspec`
|
14
|
+
- gem install `ls | grep -e '.gem$'`
|
15
|
+
- curl -sSLo /tmp/consul.zip https://releases.hashicorp.com/consul/1.2.1/consul_1.2.1_linux_amd64.zip
|
16
|
+
- sudo unzip -d /bin /tmp/consul.zip
|
17
|
+
- bundle exec rspec
|
18
|
+
|
19
|
+
|
20
|
+
jobs:
|
21
|
+
include:
|
22
|
+
- stage: gem release
|
23
|
+
rvm: 2.0
|
24
|
+
script: echo "Deploying to rubygems.org ..."
|
25
|
+
deploy:
|
26
|
+
provider: rubygems
|
27
|
+
api_key: $RUBYGEMS_KEY
|
28
|
+
gemspec: aggkit.gemspec
|
29
|
+
|
30
|
+
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
aggkit (0.2.5)
|
5
|
+
diplomat
|
6
|
+
dotenv
|
7
|
+
json
|
8
|
+
tty-tree
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
awesome_print (1.8.0)
|
14
|
+
diff-lcs (1.3)
|
15
|
+
diplomat (2.0.2)
|
16
|
+
faraday (~> 0.9)
|
17
|
+
json
|
18
|
+
dotenv (2.6.0)
|
19
|
+
faraday (0.15.4)
|
20
|
+
multipart-post (>= 1.2, < 3)
|
21
|
+
json (2.1.0)
|
22
|
+
multipart-post (2.0.0)
|
23
|
+
rake (10.5.0)
|
24
|
+
rspec (3.8.0)
|
25
|
+
rspec-core (~> 3.8.0)
|
26
|
+
rspec-expectations (~> 3.8.0)
|
27
|
+
rspec-mocks (~> 3.8.0)
|
28
|
+
rspec-core (3.8.0)
|
29
|
+
rspec-support (~> 3.8.0)
|
30
|
+
rspec-expectations (3.8.1)
|
31
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
32
|
+
rspec-support (~> 3.8.0)
|
33
|
+
rspec-mocks (3.8.0)
|
34
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
35
|
+
rspec-support (~> 3.8.0)
|
36
|
+
rspec-retry (0.6.1)
|
37
|
+
rspec-core (> 3.3)
|
38
|
+
rspec-set (0.1.3)
|
39
|
+
rspec-support (3.8.0)
|
40
|
+
tty-tree (0.2.0)
|
41
|
+
|
42
|
+
PLATFORMS
|
43
|
+
ruby
|
44
|
+
|
45
|
+
DEPENDENCIES
|
46
|
+
aggkit!
|
47
|
+
awesome_print
|
48
|
+
bundler (~> 1.14)
|
49
|
+
rake (~> 10.0)
|
50
|
+
rspec
|
51
|
+
rspec-retry
|
52
|
+
rspec-set
|
53
|
+
|
54
|
+
BUNDLED WITH
|
55
|
+
1.16.2
|
data/README.md
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# aggkit
|
2
|
+
Helper tools for work with docker and consul
|
3
|
+
|
4
|
+
[![Build Status](https://travis-ci.com/RnD-Soft/aggkit.svg?branch=master)](https://travis-ci.com/RnD-Soft/aggkit) [![Gem Version](https://badge.fury.io/rb/aggkit.svg)](https://badge.fury.io/rb/aggkit)
|
5
|
+
|
6
|
+
## Scripts
|
7
|
+
|
8
|
+
Some useful scripts to run inside or outside container
|
9
|
+
|
10
|
+
### waiter.rb
|
11
|
+
|
12
|
+
waiter.rb allows to wait many conditions:
|
13
|
+
|
14
|
+
* tcp port opening
|
15
|
+
* PostgreSQL database creation
|
16
|
+
* PostgreSQL table creation
|
17
|
+
* file creation
|
18
|
+
* healthy Consul service
|
19
|
+
|
20
|
+
```
|
21
|
+
Usage: waiter.rb [options] -- exec
|
22
|
+
--tcp host:port Wait for tcp accepts on host:port
|
23
|
+
--db dbname Wait for PG database exists. Using --tcp to conenct PG
|
24
|
+
--tb tablename Wait for PG table exists. Using --tcp to conenct PG
|
25
|
+
-f, --file filename Wait for file exists.
|
26
|
+
--consul-addr addr=http://localhost:8500
|
27
|
+
HTTP addres to connect to consul
|
28
|
+
--consul Wait for local consul agent to be ready
|
29
|
+
--consul-service service Wait for service appear in consul
|
30
|
+
--consul-service-count count Wait for this count services appear in consul
|
31
|
+
--consul-tag tag User tag to filter services in consul
|
32
|
+
--user user username
|
33
|
+
--pass pass password
|
34
|
+
-t, --timeout secs=15 Total timeout
|
35
|
+
-i, --interval secs=2 Interval between attempts
|
36
|
+
-q, --quiet Do not output any status messages
|
37
|
+
```
|
38
|
+
|
39
|
+
|
40
|
+
### consul.rb
|
41
|
+
|
42
|
+
Helper to use Consul in 12Factor application. Inspired by https://github.com/hashicorp/envconsul:
|
43
|
+
|
44
|
+
* export Consul key/value as environment variables
|
45
|
+
* references in Consul key/value store
|
46
|
+
* read config file and store values in Consul
|
47
|
+
* read files and store it in Consul key/value store
|
48
|
+
|
49
|
+
```
|
50
|
+
Usage: consul.rb [options] -- exec
|
51
|
+
--consul url Set up a custom Consul URL
|
52
|
+
--token token Connect into consul with custom access token (ACL)
|
53
|
+
--init [service] Initialize Consul services from config
|
54
|
+
--config file Read service configulation from file
|
55
|
+
--upload Upload files to variables
|
56
|
+
--show [service] Show service configulation from Consul
|
57
|
+
--override override existed keys
|
58
|
+
-d, --dereference dereference consul values in form of "consul://key/subkey"
|
59
|
+
--env prefix export KV values from prefix as env varaibles
|
60
|
+
--export add export to --env output
|
61
|
+
--pristine not include the parent processes' environment when exec child process
|
62
|
+
--put path:value put value to path
|
63
|
+
--get path get value from
|
64
|
+
```
|
65
|
+
|
66
|
+
Example config.yml:
|
67
|
+
```yaml
|
68
|
+
.dbconfig: &dbconfig
|
69
|
+
DATABASE_HOST:
|
70
|
+
value: db
|
71
|
+
DATABASE_NAME:
|
72
|
+
value: dbname
|
73
|
+
|
74
|
+
srv1: &srv1
|
75
|
+
<<: [*dbconfig]
|
76
|
+
LOG_LEVEL:
|
77
|
+
value: debug
|
78
|
+
CA_CERT:
|
79
|
+
file: /tmp/ca/cacert.pem
|
80
|
+
CLIENT_CERT:
|
81
|
+
value: consul://services/ca/private/cert.pem
|
82
|
+
CLIENT_KEY:
|
83
|
+
value: consul://services/ca/private/key.pem
|
84
|
+
|
85
|
+
srv2:
|
86
|
+
<<: *srv1
|
87
|
+
CA_CERT:
|
88
|
+
value: consul://services/env/srv1/ca_cert
|
89
|
+
```
|
90
|
+
|
91
|
+
### merger.rb
|
92
|
+
|
93
|
+
Merge docker-compose file of any version. Allow inheritance and extending services.
|
94
|
+
```bash
|
95
|
+
COMPOSE_FILE=file1.yml:file2.yml merger.rb > /tmp/result.yml
|
96
|
+
```
|
data/aggkit.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
$:.push File.expand_path('lib', __dir__)
|
2
|
+
|
3
|
+
# Maintain your gem's version:
|
4
|
+
require 'aggkit/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'aggkit'
|
8
|
+
spec.version = Aggkit::VERSION
|
9
|
+
spec.license = 'MIT'
|
10
|
+
spec.authors = ['Godko Ivan', 'Samoilenko Yuri']
|
11
|
+
spec.email = ['igodko@rnds.pro', 'kinnalru@gmail.com']
|
12
|
+
spec.homepage = 'https://br.rnds.pro/aggredator/support/aggkit'
|
13
|
+
spec.required_ruby_version = '>= 2.0.0'
|
14
|
+
|
15
|
+
spec.summary = 'Helper scripts for work with docker and consul in Aggredator'
|
16
|
+
spec.description = 'Advanced docker and consul control scripts'
|
17
|
+
|
18
|
+
spec.bindir = 'bin'
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
if File.exist?(File.join(__dir__, '/', '.git'))
|
22
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
23
|
+
f.match(%r{^(test|spec|features)/})
|
24
|
+
end
|
25
|
+
|
26
|
+
spec.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f) }
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
spec.add_dependency 'diplomat'
|
31
|
+
spec.add_dependency 'dotenv'
|
32
|
+
spec.add_dependency 'json'
|
33
|
+
spec.add_dependency 'tty-tree'
|
34
|
+
|
35
|
+
|
36
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
37
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
38
|
+
end
|
data/bin/agg
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'tty-tree'
|
5
|
+
require 'aggkit/env'
|
6
|
+
require 'json'
|
7
|
+
|
8
|
+
@commands = {}
|
9
|
+
|
10
|
+
@exec = (begin
|
11
|
+
ARGV.join(' ').split(' -- ')[1].strip.tap do |cmd|
|
12
|
+
cmd.empty? ? nil : cmd
|
13
|
+
end
|
14
|
+
rescue StandardError
|
15
|
+
nil
|
16
|
+
end)
|
17
|
+
|
18
|
+
@opts = {}
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
exmaple_usage = "
|
23
|
+
#{'agg env --list'.ljust(30)} - list avaibale environments
|
24
|
+
#{'agg <envname> --show'.ljust(30)} - show environment details
|
25
|
+
#{'agg <envname> exec -- cmd'.ljust(30)} - exec command in environment
|
26
|
+
"
|
27
|
+
|
28
|
+
env_cmd_parser = OptionParser.new do |o|
|
29
|
+
o.banner = "Usage: agg env [options]"
|
30
|
+
o.on("-l", "--list", "list environments") do
|
31
|
+
@opts[:list] = true
|
32
|
+
end
|
33
|
+
o.on("-t", "--tree", "print as tree") do
|
34
|
+
@opts[:tree] = true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
exec_cmd_parser = OptionParser.new do |o|
|
39
|
+
o.banner = "Usage: agg <envname> [options] exec [options] -- cmd"
|
40
|
+
o.on('-p', '--pristine', "not include the parent processes' environment when exec child process") do
|
41
|
+
@opts[:pristine] = true
|
42
|
+
end
|
43
|
+
o.on('--cd', "cd to envroot") do
|
44
|
+
@opts[:cd] = true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
@single_subcommands ||= {
|
49
|
+
'exec' => exec_cmd_parser
|
50
|
+
}
|
51
|
+
|
52
|
+
@global_subcommands ||= {
|
53
|
+
'env' => env_cmd_parser
|
54
|
+
}
|
55
|
+
|
56
|
+
single_parser = OptionParser.new do |o|
|
57
|
+
o.banner = "Aggredator environment manager\nagg <envname> [options] [subcommand [options]]"
|
58
|
+
|
59
|
+
o.on("-s", "--show", "show envname details") do
|
60
|
+
@opts[:show] = true
|
61
|
+
end
|
62
|
+
|
63
|
+
o.on("-h", "--help", "show help") do
|
64
|
+
puts o.help
|
65
|
+
exit 0
|
66
|
+
end
|
67
|
+
|
68
|
+
o.separator ""
|
69
|
+
o.separator "Subcommands: #{@single_subcommands.keys.join(', ')}"
|
70
|
+
end
|
71
|
+
|
72
|
+
global_parser = OptionParser.new do |o|
|
73
|
+
o.banner = "Aggredator manager\nUsage: agg [envname] [options] [subcommand [options]]"
|
74
|
+
|
75
|
+
o.on("-h", "--help", "show help") do
|
76
|
+
puts o.help
|
77
|
+
exit 0
|
78
|
+
end
|
79
|
+
|
80
|
+
o.separator ""
|
81
|
+
o.separator "Subcommands: #{@global_subcommands.keys.join(', ')}"
|
82
|
+
|
83
|
+
o.separator ""
|
84
|
+
o.separator "Examples:\n#{exmaple_usage}"
|
85
|
+
end
|
86
|
+
|
87
|
+
if Aggkit::Env.list.include?(ARGV.first)
|
88
|
+
$env = Aggkit::Env.new(ARGV.shift)
|
89
|
+
end
|
90
|
+
|
91
|
+
if $env
|
92
|
+
$parser = single_parser
|
93
|
+
$parser.order!
|
94
|
+
@commands[:single] = true
|
95
|
+
@subcommands = @single_subcommands
|
96
|
+
else
|
97
|
+
$parser = global_parser
|
98
|
+
$parser.order!
|
99
|
+
@commands[:global] = true
|
100
|
+
@subcommands = @global_subcommands
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
if command = ARGV.shift
|
106
|
+
if @subcommands.has_key?(command)
|
107
|
+
$parser = @subcommands[command]
|
108
|
+
@commands[command.to_sym] = true
|
109
|
+
$parser.parse!
|
110
|
+
else
|
111
|
+
STDERR.puts "No such command: #{command.inspect}"
|
112
|
+
STDOUT.puts $parser.help
|
113
|
+
exit 1
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
|
118
|
+
def env_command opts
|
119
|
+
if opts[:list]
|
120
|
+
envs = Aggkit::Env.list
|
121
|
+
# if opts[:tree]
|
122
|
+
# data = envs.each_with_object([]) do |dir, ret|
|
123
|
+
# dir.split(File::SEPARATOR).reduce(ret) do |struct, token|
|
124
|
+
# puts "token: #{token} struct: #{struct}"
|
125
|
+
# struct << {token => []}
|
126
|
+
# puts " result: struct: #{struct}"
|
127
|
+
# struct.last[token]
|
128
|
+
# end
|
129
|
+
# end
|
130
|
+
# puts data
|
131
|
+
# puts TTY::Tree.new(data.first).render
|
132
|
+
# else
|
133
|
+
puts envs
|
134
|
+
# end
|
135
|
+
exit 0
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def exec_command opts
|
140
|
+
raise "envname not specified!" unless $env
|
141
|
+
raise "cmd not specified!" unless @exec
|
142
|
+
|
143
|
+
e = $env.environment
|
144
|
+
e = ENV.to_h.merge(e) unless opts[:pristine]
|
145
|
+
|
146
|
+
Dir.chdir $env.env_root if opts[:cd]
|
147
|
+
exec(e, @exec, unsetenv_others: true)
|
148
|
+
end
|
149
|
+
|
150
|
+
if @commands[:global]
|
151
|
+
env_command(@opts) if @commands[:env]
|
152
|
+
end
|
153
|
+
|
154
|
+
if @commands[:single]
|
155
|
+
exec_command(@opts) if @commands[:exec]
|
156
|
+
|
157
|
+
if @opts[:show]
|
158
|
+
raise "envname not specified!" unless $env
|
159
|
+
|
160
|
+
puts JSON.pretty_generate($env.show)
|
161
|
+
exit 0
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
STDOUT.puts $parser.help
|
167
|
+
exit 1
|