takeltau 0.34.9

Sign up to get free protection for your applications and to get access to all the features.
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