aggkit 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](https://travis-ci.com/RnD-Soft/aggkit) [](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
|