dce 1.0.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +5 -5
  2. data/lib/dce.rb +144 -0
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6fb46a4887d82611812bc4ae14fae8ae4c63b6a1
4
- data.tar.gz: c93a3498e675087d972f67530ee38919c9813087
2
+ SHA256:
3
+ metadata.gz: d3452bd5f5b90988aa64257d32161a05639b6ed915cba8d37d8704de4cd26309
4
+ data.tar.gz: 7aaf58b132dd50115108c8fa6e9b4e629e831a7df0432f639cc71eacad724b38
5
5
  SHA512:
6
- metadata.gz: 0ae944aff12066dac245eb9ed85544e7cf37e33b4919b9271b6ebc23fad2d04e77abb37279784812ac9aacf981d5c1e3741ea9313441e328dbdffcea9ea5e1f3
7
- data.tar.gz: 74ad253d14046e9318b02f288e9b011b2d459d3809df2fe72a5262cfba8e258240707be9d37a527bd1d52d0d97e19cf875998485208c9fff46e974e468701e26
6
+ metadata.gz: '0294dc3e0dbdd8219ba6e82b5aeee8c64b87b7a1c2b72b665ee3545f1c0170550c7a4ffb54ad7f60923a5b9d85786a8549af2a4a2afb44981b10f2560efa85dc'
7
+ data.tar.gz: b38c1269bb5ce5f3a702b808f63cc566867949dd3b17a9225325ef40dde2e6f1400d5f126ca7cdafe58fb0d5e92f1bac533348856732ecbefc980431d4df2d76
data/lib/dce.rb ADDED
@@ -0,0 +1,144 @@
1
+ # Wishlist:
2
+ # Option to delete .dce_container.
3
+ # Option for using run instead of exec?
4
+
5
+ class DCE
6
+ # Run the command
7
+ def run
8
+ parse_args
9
+
10
+ @conf_file = File.join(File.dirname(docker_compose_file), '.dce_container')
11
+ config_container = nil
12
+ if File.exists? @conf_file
13
+ config_container = File.read @conf_file
14
+ end
15
+
16
+ if @list_containers
17
+ STDOUT.puts(get_containers.join(', '))
18
+ exit
19
+ end
20
+
21
+ if @query
22
+ if config_container
23
+ STDOUT.puts(config_container)
24
+ exit
25
+ else
26
+ abort "No container saved."
27
+ end
28
+ end
29
+
30
+ if !@container
31
+ @container = config_container ? config_container : query_container
32
+ end
33
+
34
+ if @container != config_container
35
+ File.write(@conf_file, @container)
36
+ end
37
+
38
+ # If no command given, open a shell.
39
+ if (@command.strip.empty?)
40
+ @command = "if [ -e /usr/bin/fish ]; then /usr/bin/fish; elif [ -e /bin/bash ]; then /bin/bash; else /bin/sh; fi"
41
+ end
42
+
43
+ args = '-i'
44
+ args += 't' if STDIN.tty?
45
+ container_id = %x{docker-compose ps -q #{@container}}.chomp
46
+
47
+ abort("Container #{@container} not created.") if container_id.empty?
48
+
49
+ command = "docker exec #{args} #{container_id} sh -c '#{@command}'"
50
+ STDERR.puts "Exec'ing: " + command if @verbose
51
+ exec command unless @dry_run
52
+ end
53
+
54
+ # Return path to the docker-compose.yml file
55
+ # Will exit with an error if not found
56
+ def docker_compose_file
57
+ unless @compose_file
58
+ dir = Dir.pwd()
59
+ while dir != "/"
60
+ file = Dir.glob('docker-compose.{yml,yaml}', base: dir).first
61
+ if file
62
+ @compose_file = File.join(dir, file)
63
+ break
64
+ end
65
+ dir = File.dirname(dir)
66
+ end
67
+
68
+ if !@compose_file
69
+ abort "No docker-compose.yml file found."
70
+ end
71
+ end
72
+
73
+ return @compose_file
74
+ end
75
+
76
+ # Parse command line arguments
77
+ def parse_args
78
+ # Not using a proper option parse library, as it will get confused
79
+ # by options for the command given. We use a simple parser.
80
+ while /^-/ =~ ARGV[0]
81
+ option = ARGV.shift
82
+ case option
83
+ when '-c', '--container'
84
+ @container = ARGV.shift
85
+ if !get_containers.include? @container
86
+ abort "Unknown container #{@container}"
87
+ end
88
+ when '-v', '--verbose'
89
+ @verbose = true
90
+ when '-n', '--dry-run'
91
+ @verbose = true
92
+ @dry_run = true
93
+ when '-?', '--print-service'
94
+ @query = true
95
+ when '-l', '--list-containers'
96
+ @list_containers = true
97
+ when '-h', '--help'
98
+ STDERR.puts <<-HEREDOC
99
+ Usage: #{File.basename($0)} [OPTIONS]... COMMAND
100
+ Runs COMMAND in docker-compose container.
101
+
102
+ On first run, asks for the service container to use and saves it to .dce_container next
103
+ to the docker-compose.yml file.
104
+
105
+ If no command given, opens a shell.
106
+
107
+ Options:
108
+ -c, --container SERVICE use the container of the specified service
109
+ replaces the selected container in the .dce_container
110
+ -v, --verbose print exec'ed command
111
+ -n, --dry-run only print exec'ed command, don't run
112
+ -?, --print-service print the service saved
113
+ -l, --list-containers print the containers available
114
+ -h, --help print this help and exit
115
+
116
+ HEREDOC
117
+ exit
118
+ else
119
+ abort "Unknown option #{option}"
120
+ end
121
+ end
122
+
123
+ @command = ARGV.join(' ')
124
+ end
125
+
126
+ # Ask the user to select a container
127
+ # The options are taken from the docker-compose.yml file
128
+ def query_container
129
+ containers = get_containers
130
+ STDERR.puts "Please select container [#{containers.join(', ')}]"
131
+ choice = STDIN.gets.strip
132
+ exit if choice.empty?
133
+ if !containers.include?(choice)
134
+ abort "Illegal choice."
135
+ end
136
+ choice
137
+ end
138
+
139
+ # Read containers from docker-compose.yml
140
+ def get_containers
141
+ content = YAML::load(File.read(docker_compose_file))
142
+ content.has_key?('version') ? content['services'].keys : content.keys
143
+ end
144
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dce
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Fini Hansen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-20 00:00:00.000000000 Z
11
+ date: 2021-08-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Run shell commands in docker.
14
14
  email: xen@xen.dk
@@ -18,6 +18,7 @@ extensions: []
18
18
  extra_rdoc_files: []
19
19
  files:
20
20
  - bin/dce
21
+ - lib/dce.rb
21
22
  homepage: https://github.com/xendk/dce
22
23
  licenses:
23
24
  - GPL-3.0
@@ -37,8 +38,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
37
38
  - !ruby/object:Gem::Version
38
39
  version: '0'
39
40
  requirements: []
40
- rubyforge_project:
41
- rubygems_version: 2.6.14.4
41
+ rubygems_version: 3.0.3.1
42
42
  signing_key:
43
43
  specification_version: 4
44
44
  summary: DCE