takeltau 0.34.9

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.
Files changed (94) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +235 -0
  4. data/bin/tau +6 -0
  5. data/lib/Thorfile +3 -0
  6. data/lib/takeltau.rb +257 -0
  7. data/lib/takeltau/bit/check/cli.rb +23 -0
  8. data/lib/takeltau/bit/check/workspace.rb +37 -0
  9. data/lib/takeltau/bit/cli.rb +18 -0
  10. data/lib/takeltau/bit/clipboard/cli.rb +73 -0
  11. data/lib/takeltau/bit/clipboard/copy.rb +142 -0
  12. data/lib/takeltau/bit/clipboard/lib.rb +143 -0
  13. data/lib/takeltau/bit/clipboard/paste.rb +60 -0
  14. data/lib/takeltau/bit/clipboard/pull.rb +37 -0
  15. data/lib/takeltau/bit/clipboard/push.rb +37 -0
  16. data/lib/takeltau/bit/require/cli.rb +57 -0
  17. data/lib/takeltau/bit/require/export.rb +34 -0
  18. data/lib/takeltau/bit/require/import.rb +133 -0
  19. data/lib/takeltau/bit/require/lib.rb +19 -0
  20. data/lib/takeltau/bit/scope/add.rb +55 -0
  21. data/lib/takeltau/bit/scope/cli.rb +74 -0
  22. data/lib/takeltau/bit/scope/list.rb +41 -0
  23. data/lib/takeltau/bit/scope/new.rb +44 -0
  24. data/lib/takeltau/bit/scope/ssh.rb +13 -0
  25. data/lib/takeltau/completion/cli.rb +24 -0
  26. data/lib/takeltau/default.yml +95 -0
  27. data/lib/takeltau/docker/check/cli.rb +23 -0
  28. data/lib/takeltau/docker/check/daemon.rb +27 -0
  29. data/lib/takeltau/docker/cli.rb +15 -0
  30. data/lib/takeltau/docker/container/check/cli.rb +57 -0
  31. data/lib/takeltau/docker/container/check/existing.rb +32 -0
  32. data/lib/takeltau/docker/container/check/network.rb +32 -0
  33. data/lib/takeltau/docker/container/check/orphaned.rb +32 -0
  34. data/lib/takeltau/docker/container/clean.rb +40 -0
  35. data/lib/takeltau/docker/container/cli.rb +118 -0
  36. data/lib/takeltau/docker/container/command.rb +38 -0
  37. data/lib/takeltau/docker/container/daemon.rb +17 -0
  38. data/lib/takeltau/docker/container/lib.rb +181 -0
  39. data/lib/takeltau/docker/container/login.rb +58 -0
  40. data/lib/takeltau/docker/container/prune.rb +31 -0
  41. data/lib/takeltau/docker/image/cli.rb +39 -0
  42. data/lib/takeltau/docker/image/tag/check.rb +42 -0
  43. data/lib/takeltau/docker/image/tag/cli.rb +68 -0
  44. data/lib/takeltau/docker/image/tag/latest.rb +24 -0
  45. data/lib/takeltau/docker/image/tag/list.rb +19 -0
  46. data/lib/takeltau/docker/image/update.rb +27 -0
  47. data/lib/takeltau/git/check/bit.rb +26 -0
  48. data/lib/takeltau/git/check/clean.rb +46 -0
  49. data/lib/takeltau/git/check/cli.rb +49 -0
  50. data/lib/takeltau/git/check/workspace.rb +34 -0
  51. data/lib/takeltau/git/cli.rb +9 -0
  52. data/lib/takeltau/info/cli.rb +12 -0
  53. data/lib/takeltau/info/project/cli.rb +69 -0
  54. data/lib/takeltau/info/status/bar.rb +112 -0
  55. data/lib/takeltau/info/status/cli.rb +107 -0
  56. data/lib/takeltau/info/status/git.rb +47 -0
  57. data/lib/takeltau/info/status/gopass.rb +37 -0
  58. data/lib/takeltau/info/status/gpg.rb +39 -0
  59. data/lib/takeltau/info/status/lib.rb +46 -0
  60. data/lib/takeltau/info/status/ssh.rb +46 -0
  61. data/lib/takeltau/init/cli.rb +12 -0
  62. data/lib/takeltau/init/lib.rb +86 -0
  63. data/lib/takeltau/init/packer/cli.rb +82 -0
  64. data/lib/takeltau/init/packer/docker.rb +64 -0
  65. data/lib/takeltau/init/packer/templates/ansiblelint.tt +3 -0
  66. data/lib/takeltau/init/packer/templates/bitrequireyml.tt +13 -0
  67. data/lib/takeltau/init/packer/templates/groupvarsprojectyml.tt +2 -0
  68. data/lib/takeltau/init/packer/templates/playbooksiteyml.tt +6 -0
  69. data/lib/takeltau/init/packer/templates/projectyml.tt +19 -0
  70. data/lib/takeltau/init/takelage/cli.rb +70 -0
  71. data/lib/takeltau/init/takelage/rake.rb +61 -0
  72. data/lib/takeltau/init/takelage/templates/bitrequireyml.tt +5 -0
  73. data/lib/takeltau/init/takelage/templates/projectyml.tt +3 -0
  74. data/lib/takeltau/init/templates/Rakefile.tt +3 -0
  75. data/lib/takeltau/init/templates/gitignore.tt +16 -0
  76. data/lib/takeltau/lib/config.rb +130 -0
  77. data/lib/takeltau/lib/logging.rb +49 -0
  78. data/lib/takeltau/lib/project.rb +72 -0
  79. data/lib/takeltau/lib/subcmd.rb +18 -0
  80. data/lib/takeltau/lib/system.rb +194 -0
  81. data/lib/takeltau/mutagen/check/cli.rb +40 -0
  82. data/lib/takeltau/mutagen/check/daemon.rb +76 -0
  83. data/lib/takeltau/mutagen/cli.rb +12 -0
  84. data/lib/takeltau/mutagen/socket/check.rb +33 -0
  85. data/lib/takeltau/mutagen/socket/cli.rb +103 -0
  86. data/lib/takeltau/mutagen/socket/create.rb +47 -0
  87. data/lib/takeltau/mutagen/socket/list.rb +33 -0
  88. data/lib/takeltau/mutagen/socket/terminate.rb +32 -0
  89. data/lib/takeltau/mutagen/socket/tidy.rb +21 -0
  90. data/lib/takeltau/self/cli.rb +43 -0
  91. data/lib/takeltau/self/config/cli.rb +82 -0
  92. data/lib/takeltau/self/list.rb +35 -0
  93. data/lib/takeltau/version +1 -0
  94. metadata +319 -0
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau docker container clean
4
+ module DockerContainerClean
5
+ # Backend method for docker container clean.
6
+ def docker_container_clean
7
+ log.debug 'Removing all docker containers'
8
+
9
+ return false unless docker_check_daemon
10
+
11
+ return false if _docker_container_clean_harakiri?
12
+
13
+ mutagen_socket_terminate "--label-selector='#{@takellabel}'"
14
+ networks = _docker_container_clean_kill_existing_containers
15
+ _docker_container_lib_remove_networks networks
16
+ end
17
+
18
+ private
19
+
20
+ # Check if we are running tau clean inside a takelage container.
21
+ def _docker_container_clean_harakiri?
22
+ hostname = ENV['HOSTNAME'] || ''
23
+ return false unless hostname.start_with? "#{@docker_repo}_"
24
+
25
+ log.error "Please run \"tau clean\" outside of #{@docker_repo} containers"
26
+ log.info "Run \"tau prune\" to remove orphaned #{@docker_repo} containers"
27
+ true
28
+ end
29
+
30
+ # Kill all docker containers and return list of networks.
31
+ def _docker_container_clean_kill_existing_containers
32
+ networks = []
33
+ _docker_container_lib_get_containers.each do |container|
34
+ name = _docker_container_lib_get_container_name_by_id container
35
+ _docker_container_lib_stop_container container
36
+ networks << name unless networks.include? name
37
+ end
38
+ networks
39
+ end
40
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takeltau
4
+ # takeltau docker container
5
+ class DockerContainer < SubCommandBase
6
+ include LoggingModule
7
+ include SystemModule
8
+ include ConfigModule
9
+ include DockerCheckDaemon
10
+ include DockerContainerCheckExisting
11
+ include DockerContainerCheckNetwork
12
+ include DockerContainerCheckOrphaned
13
+ include DockerContainerLib
14
+ include DockerContainerCommand
15
+ include DockerContainerDaemon
16
+ include DockerContainerLogin
17
+ include DockerContainerClean
18
+ include DockerContainerPrune
19
+ include DockerImageTagLatest
20
+ include DockerImageTagList
21
+ include DockerImageTagCheck
22
+ include MutagenCheckDaemon
23
+ include MutagenSocketCheck
24
+ include MutagenSocketCreate
25
+ include MutagenSocketTerminate
26
+
27
+ # Initialize docker container
28
+ # rubocop:disable Metrics/AbcSize
29
+ # rubocop:disable Metrics/MethodLength
30
+ def initialize(args = [], local_options = {}, configuration = {})
31
+ # initialize thor parent class
32
+ super args, local_options, configuration
33
+
34
+ @docker_user = config.active['docker_user']
35
+ @docker_repo = config.active['docker_repo']
36
+ @docker_tag = config.active['docker_tag']
37
+ @docker_registry = config.active['docker_registry']
38
+ @username = ENV['USER'] || 'noname'
39
+ @workdir = Dir.getwd
40
+ @hostname = _docker_container_lib_hostname
41
+ @hostlabel = "hostname=#{@hostname}"
42
+ @takellabel = config.active['mutagen_socket_takelage_label']
43
+ @mutagensock = config.active['mutagen_socket_path_mutagen']
44
+ @gpgsock = config.active['mutagen_socket_path_gpg']
45
+ @sshsock = config.active['mutagen_socket_path_ssh']
46
+ end
47
+ # rubocop:enable Metrics/MethodLength
48
+ # rubocop:enable Metrics/AbcSize
49
+
50
+ desc 'check [COMMAND]', 'Check docker container'
51
+ subcommand 'check', DockerContainerCheck
52
+
53
+ #
54
+ # docker container clean
55
+ #
56
+ desc 'clean', 'Remove all docker containers'
57
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
58
+ Remove all docker containers
59
+ LONGDESC
60
+ # Remove all docker containers.
61
+ def clean
62
+ docker_container_clean
63
+ end
64
+
65
+ #
66
+ # docker container command
67
+ #
68
+ desc 'command [CMD]', 'Run [CMD] in a docker container'
69
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
70
+ Run command in docker container
71
+ LONGDESC
72
+ # Run command in docker container.
73
+ def command(command)
74
+ docker_container_command(command)
75
+ end
76
+
77
+ #
78
+ # docker container daemon
79
+ #
80
+ desc 'daemon', 'Run docker container in daemon mode'
81
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
82
+ Run docker container in daemon mode
83
+ LONGDESC
84
+ # Run docker container in daemon mode.
85
+ def daemon
86
+ docker_container_daemon
87
+ end
88
+
89
+ #
90
+ # docker container login
91
+ #
92
+ option :debug,
93
+ aliases: 'd',
94
+ type: :boolean,
95
+ default: false,
96
+ desc: 'Log in to docker container in debug mode'
97
+ desc 'login', 'Log in to latest local docker container'
98
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
99
+ Log in to latest local docker container
100
+ LONGDESC
101
+ # Log in to latest local docker container.
102
+ def login
103
+ docker_container_login
104
+ end
105
+
106
+ #
107
+ # docker container prune
108
+ #
109
+ desc 'prune', 'Remove orphaned docker containers'
110
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
111
+ Remove orphaned docker containers
112
+ LONGDESC
113
+ # Remove orphaned docker containers.
114
+ def prune
115
+ docker_container_prune
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau docker container command
4
+ module DockerContainerCommand
5
+ # Backend method for docker container command.
6
+ def docker_container_command(command)
7
+ log.debug 'Running command in container'
8
+
9
+ return false unless docker_check_daemon
10
+
11
+ # no matrjoschka test here
12
+
13
+ unless docker_container_check_existing @hostname
14
+ return false unless _docker_container_lib_create_net_and_ctr @hostname
15
+
16
+ _docker_container_lib_start_sockets
17
+ end
18
+
19
+ _docker_container_command_run_command @hostname, command
20
+ end
21
+
22
+ private
23
+
24
+ # Prepare run command in container command.
25
+ def _docker_container_command_run_command(container, command)
26
+ log.debug "Running command \"#{command}\" in container \"#{container}\""
27
+
28
+ cmd_docker_run_command =
29
+ format(
30
+ config.active['cmd_docker_container_docker_exec'],
31
+ container: container,
32
+ username: @username,
33
+ command: command
34
+ )
35
+
36
+ run_and_exit cmd_docker_run_command
37
+ end
38
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau docker container daemon
4
+ module DockerContainerDaemon
5
+ # Backend method for docker container daemon.
6
+ def docker_container_daemon
7
+ log.debug 'Starting docker container as daemon'
8
+
9
+ return false unless docker_check_daemon
10
+
11
+ result = _docker_container_lib_create_net_and_ctr @hostname
12
+
13
+ _docker_container_lib_start_sockets
14
+
15
+ result
16
+ end
17
+ end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau docker container lib
4
+ # rubocop:disable Metrics/ModuleLength
5
+ # rubocop:disable Style/IfUnlessModifier
6
+ module DockerContainerLib
7
+ private
8
+
9
+ # Create mutagen sockets
10
+ def _docker_container_lib_start_sockets
11
+ return false unless mutagen_check_daemon
12
+
13
+ mutagen_socket_create 'mutagen', @mutagensock, @mutagensock
14
+ mutagen_socket_create 'gpg', @gpgsock, @gpgsock
15
+ mutagen_socket_create 'ssh', @sshsock, @sshsock
16
+ end
17
+
18
+ # Create unique docker hostname
19
+ def _docker_container_lib_hostname
20
+ relative_name = "#{@docker_repo}_#{File.basename(@workdir)}"
21
+ absolute_name = "#{@docker_repo}_#{@workdir}"
22
+ digest = Digest::SHA256.bubblebabble absolute_name
23
+ "#{relative_name}_#{digest[0..10]}"
24
+ end
25
+
26
+ # Create docker container and network.
27
+ def _docker_container_lib_create_net_and_ctr(name)
28
+ return true if docker_container_check_existing name
29
+
30
+ unless docker_container_check_network name
31
+ _docker_container_lib_create_network name
32
+ end
33
+
34
+ _docker_container_lib_create_container name
35
+ end
36
+
37
+ # Remove docker networks.
38
+ def _docker_container_lib_remove_networks(networks)
39
+ networks.each do |network|
40
+ if docker_container_check_network network
41
+ _docker_container_lib_remove_network network
42
+ end
43
+ end
44
+ end
45
+
46
+ # Create docker network.
47
+ def _docker_container_lib_create_network(network)
48
+ log.debug "Create network \"#{network}\""
49
+
50
+ cmd_create_network = format(
51
+ config.active['cmd_docker_container_create_network'],
52
+ network: network
53
+ )
54
+
55
+ run cmd_create_network
56
+ end
57
+
58
+ # Remove docker network.
59
+ def _docker_container_lib_remove_network(network)
60
+ log.debug "Remove network \"#{network}\""
61
+
62
+ cmd_remove_network = format(
63
+ config.active['cmd_docker_container_remove_network'],
64
+ network: network
65
+ )
66
+
67
+ run cmd_remove_network
68
+ end
69
+
70
+ # Create docker container.
71
+ # rubocop:disable Metrics/MethodLength
72
+ # rubocop:disable Metrics/AbcSize
73
+ def _docker_container_lib_create_container(container)
74
+ log.debug "Creating container \"#{container}\""
75
+
76
+ image = "#{@docker_user}/#{@docker_repo}:#{@docker_tag}"
77
+
78
+ return false unless _docker_container_lib_image_available? image
79
+
80
+ log.debug "Using docker image \"#{image}\""
81
+
82
+ docker_debug = config.active['docker_debug']
83
+ entrypoint = '/entrypoint.py '
84
+ volume_dev = ''
85
+ if options[:debug]
86
+ entrypoint = '/debug/entrypoint.py --debug '
87
+ volume_dev = "--volume #{@workdir}/#{docker_debug}:/debug "
88
+ end
89
+
90
+ cmd_docker_create = format(
91
+ config.active['cmd_docker_container_create'],
92
+ container: container,
93
+ docker_run_options: config.active['docker_run_options'],
94
+ dockersock: '/var/run/docker.sock',
95
+ entrypoint: entrypoint,
96
+ entrypoint_options: config.active['docker_entrypoint_options'],
97
+ extra: config.active['docker_entrypoint_extra'],
98
+ gid: Etc.getpwnam(@username).gid,
99
+ homedir: ENV['HOME'] || '/tmp',
100
+ image: image,
101
+ shmsize: config.active['docker_shm_size'],
102
+ timezone: 'Europe/Berlin',
103
+ uid: Etc.getpwnam(@username).uid,
104
+ username: @username,
105
+ volume_dev: volume_dev,
106
+ workdir: @workdir
107
+ )
108
+
109
+ try cmd_docker_create
110
+ end
111
+
112
+ # rubocop:enable Metrics/AbcSize
113
+ # rubocop:enable Metrics/MethodLength
114
+
115
+ # Check if we are already inside a takelage container
116
+ def _docker_container_lib_check_matrjoschka
117
+ log.debug 'Checking if we are already inside a takelage container'
118
+
119
+ unless ENV.keys.include? 'TAKELAGE_PROJECT_BASE_DIR'
120
+ log.debug 'We are not inside a takelage container'
121
+ return false
122
+ end
123
+
124
+ log.debug 'We are inside a takelage container'
125
+
126
+ true
127
+ end
128
+
129
+ # Check if docker image is available
130
+ def _docker_container_lib_image_available?(image)
131
+ return true if docker_image_tag_list.include? @docker_tag
132
+
133
+ log.error "No local image \"#{image}\" available"
134
+ log.info "Try: docker pull #{image}"
135
+ false
136
+ end
137
+
138
+ # Get container name by id.
139
+ def _docker_container_lib_get_container_name_by_id(container)
140
+ log.debug "Getting name of container \"#{container}\""
141
+
142
+ cmd_get_container_name_by_id = format(
143
+ config.active['cmd_docker_container_get_container_name'],
144
+ container: container
145
+ )
146
+
147
+ name = (run cmd_get_container_name_by_id).chomp
148
+
149
+ log.debug "Container #{container} has name \"#{name}\""
150
+
151
+ name
152
+ end
153
+
154
+ # Get all docker containers.
155
+ # @return [Array] list of docker containers
156
+ def _docker_container_lib_get_containers
157
+ log.debug "Getting all containers of image \"#{@docker_repo}\""
158
+
159
+ cmd_docker_get = format(
160
+ config.active['cmd_docker_container_get_containers'],
161
+ docker_repo: @docker_repo
162
+ )
163
+
164
+ # convert stdout lines to array and return array
165
+ (run cmd_docker_get).split(/\n+/)
166
+ end
167
+
168
+ # Stop container.
169
+ def _docker_container_lib_stop_container(container)
170
+ log.debug "Stopping container \"#{container}\""
171
+
172
+ cmd_docker_stop = format(
173
+ config.active['cmd_docker_container_stop_container'],
174
+ container: container
175
+ )
176
+
177
+ run cmd_docker_stop
178
+ end
179
+ end
180
+ # rubocop:enable Style/IfUnlessModifier
181
+ # rubocop:enable Metrics/ModuleLength
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takeltau docker container login
4
+ module DockerContainerLogin
5
+ # Backend method for docker container login.
6
+ def docker_container_login
7
+ log.debug 'Logging in to docker container'
8
+
9
+ return false unless docker_check_daemon
10
+
11
+ if _docker_container_lib_check_matrjoschka
12
+ log.error 'You cannot log in to takelage from within takelage'
13
+ return false
14
+ end
15
+
16
+ # rubocop:disable Style/IfUnlessModifier
17
+ unless docker_container_check_existing @hostname
18
+ _docker_container_login_create_container @hostname
19
+ end
20
+ # rubocop:enable Style/IfUnlessModifier
21
+
22
+ run_and_exit _docker_container_login_enter_container @hostname
23
+ end
24
+
25
+ private
26
+
27
+ # Create container, network and forward sockets
28
+ def _docker_container_login_create_container(container)
29
+ return false unless _docker_container_lib_create_net_and_ctr container
30
+
31
+ _docker_container_lib_start_sockets
32
+ _docker_container_wait_for_sockets
33
+ end
34
+
35
+ # Prepare enter existing container command.
36
+ def _docker_container_login_enter_container(container)
37
+ log.debug "Entering container \"#{container}\""
38
+
39
+ loginpoint = '/loginpoint.py'
40
+ loginpoint = '/debug/loginpoint.py --debug ' if options[:debug]
41
+
42
+ format(
43
+ config.active['cmd_docker_container_enter_container'],
44
+ container: container,
45
+ loginpoint: loginpoint,
46
+ username: @username
47
+ )
48
+ end
49
+
50
+ # Wait for the sockets to come up
51
+ def _docker_container_wait_for_sockets
52
+ wait_for_sockets = config.active['login_wait_for_sockets'].to_i
53
+ return if wait_for_sockets.zero?
54
+
55
+ log.debug "Waiting for #{wait_for_sockets} #{pluralize(wait_for_sockets, 'second', 'seconds')}"
56
+ sleep wait_for_sockets
57
+ end
58
+ end