dce 1.0.3 → 1.2.1

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 +151 -0
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 410c6336ffcf9712522df3b800a4863b9fe1f848
4
- data.tar.gz: f52bd91ed2dd453a42154bfd7f486aba3bda6da5
2
+ SHA256:
3
+ metadata.gz: ade08fae6e838cf29b366a060d826eaad54d843d383326556bea190935f893f1
4
+ data.tar.gz: eb6edf4a9ee854980e5570a8dde1c3e9dfb98cc967ef27061a0abddf5e30b4d2
5
5
  SHA512:
6
- metadata.gz: 82027542b4cca252c83556da7cc7306e06fa6e7a0178295abbf26ff08b80a601d9f10a7fd7b229c03a5b47b7bcbda580765d6181bb34c2c278aa57db5f19bf49
7
- data.tar.gz: 2712fc499dff43367ba902f7a4cde5418c31012e9989c6964d9baedaa51879bc0b4bb97f12c83ddb3bdd9f09748df96525c2996a4fc248e1419d9be30b951a39
6
+ metadata.gz: a9a0c16b156794011fb66081ab145c6c02e067f2c2668dcf1071f9a704c9203c92b3ea327ee4336b9a323e17e551f1404f50ad68e0ee7646442bbe08462aaeb1
7
+ data.tar.gz: 1b6c4fa0b5c17dcfa297036d5b743f1c46c00ec1affbd543419c1b638da4c88b91db0833512e839a85e6cd7ed760f02480f560f005977e7c658028dbf9898c49
data/lib/dce.rb ADDED
@@ -0,0 +1,151 @@
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
+ # Older Psychs took whether to allow YAML aliases as a fourth
142
+ # argument, while newer has a keyword argument. Try both to be
143
+ # compatible with as many versions as possible.
144
+ begin
145
+ content = YAML::safe_load(File.read(docker_compose_file), aliases: true)
146
+ rescue ArgumentError
147
+ content = YAML::safe_load(File.read(docker_compose_file), [], [], true)
148
+ end
149
+ content.has_key?('version') ? content['services'].keys : content.keys
150
+ end
151
+ 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.3
4
+ version: 1.2.1
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-21 00:00:00.000000000 Z
11
+ date: 2021-10-01 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