takelage 0.18.1

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 (73) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +674 -0
  3. data/README.md +213 -0
  4. data/bin/tau +6 -0
  5. data/lib/Thorfile +3 -0
  6. data/lib/takelage.rb +230 -0
  7. data/lib/takelage/bit/check/cli.rb +23 -0
  8. data/lib/takelage/bit/check/workspace.rb +37 -0
  9. data/lib/takelage/bit/cli.rb +15 -0
  10. data/lib/takelage/bit/clipboard/cli.rb +73 -0
  11. data/lib/takelage/bit/clipboard/copy.rb +140 -0
  12. data/lib/takelage/bit/clipboard/lib.rb +132 -0
  13. data/lib/takelage/bit/clipboard/paste.rb +57 -0
  14. data/lib/takelage/bit/clipboard/pull.rb +37 -0
  15. data/lib/takelage/bit/clipboard/push.rb +37 -0
  16. data/lib/takelage/bit/scope/add.rb +55 -0
  17. data/lib/takelage/bit/scope/cli.rb +74 -0
  18. data/lib/takelage/bit/scope/inbit.rb +13 -0
  19. data/lib/takelage/bit/scope/list.rb +41 -0
  20. data/lib/takelage/bit/scope/new.rb +44 -0
  21. data/lib/takelage/completion/cli.rb +24 -0
  22. data/lib/takelage/default.yml +68 -0
  23. data/lib/takelage/docker/check/cli.rb +23 -0
  24. data/lib/takelage/docker/check/running.rb +23 -0
  25. data/lib/takelage/docker/cli.rb +18 -0
  26. data/lib/takelage/docker/container/check/cli.rb +57 -0
  27. data/lib/takelage/docker/container/check/existing.rb +31 -0
  28. data/lib/takelage/docker/container/check/network.rb +31 -0
  29. data/lib/takelage/docker/container/check/orphaned.rb +31 -0
  30. data/lib/takelage/docker/container/clean.rb +39 -0
  31. data/lib/takelage/docker/container/cli.rb +114 -0
  32. data/lib/takelage/docker/container/command.rb +33 -0
  33. data/lib/takelage/docker/container/daemon.rb +13 -0
  34. data/lib/takelage/docker/container/lib.rb +160 -0
  35. data/lib/takelage/docker/container/login.rb +46 -0
  36. data/lib/takelage/docker/container/prune.rb +30 -0
  37. data/lib/takelage/docker/image/check/cli.rb +39 -0
  38. data/lib/takelage/docker/image/check/outdated.rb +40 -0
  39. data/lib/takelage/docker/image/cli.rb +44 -0
  40. data/lib/takelage/docker/image/tag/check/cli.rb +48 -0
  41. data/lib/takelage/docker/image/tag/check/local.rb +42 -0
  42. data/lib/takelage/docker/image/tag/check/remote.rb +38 -0
  43. data/lib/takelage/docker/image/tag/cli.rb +15 -0
  44. data/lib/takelage/docker/image/tag/latest/cli.rb +57 -0
  45. data/lib/takelage/docker/image/tag/latest/local.rb +20 -0
  46. data/lib/takelage/docker/image/tag/latest/remote.rb +25 -0
  47. data/lib/takelage/docker/image/tag/list/cli.rb +53 -0
  48. data/lib/takelage/docker/image/tag/list/local.rb +19 -0
  49. data/lib/takelage/docker/image/tag/list/remote.rb +28 -0
  50. data/lib/takelage/docker/image/update.rb +33 -0
  51. data/lib/takelage/docker/socket/cli.rb +75 -0
  52. data/lib/takelage/docker/socket/host.rb +25 -0
  53. data/lib/takelage/docker/socket/lib.rb +88 -0
  54. data/lib/takelage/docker/socket/scheme.rb +63 -0
  55. data/lib/takelage/docker/socket/start.rb +34 -0
  56. data/lib/takelage/docker/socket/stop.rb +55 -0
  57. data/lib/takelage/git/check/clean.rb +46 -0
  58. data/lib/takelage/git/check/cli.rb +49 -0
  59. data/lib/takelage/git/check/master.rb +26 -0
  60. data/lib/takelage/git/check/workspace.rb +33 -0
  61. data/lib/takelage/git/cli.rb +9 -0
  62. data/lib/takelage/info/cli.rb +9 -0
  63. data/lib/takelage/info/project/cli.rb +56 -0
  64. data/lib/takelage/lib/config.rb +114 -0
  65. data/lib/takelage/lib/logging.rb +47 -0
  66. data/lib/takelage/lib/project.rb +69 -0
  67. data/lib/takelage/lib/subcmd.rb +16 -0
  68. data/lib/takelage/lib/system.rb +104 -0
  69. data/lib/takelage/self/cli.rb +43 -0
  70. data/lib/takelage/self/config/cli.rb +82 -0
  71. data/lib/takelage/self/list.rb +30 -0
  72. data/lib/takelage/version +1 -0
  73. metadata +298 -0
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takelage
4
+ # takelage docker
5
+ class Docker < SubCommandBase
6
+ desc 'check [COMMAND]', 'Check docker'
7
+ subcommand 'check', DockerCheck
8
+
9
+ desc 'container [COMMAND]', 'Handle docker container'
10
+ subcommand 'container', DockerContainer
11
+
12
+ desc 'image [COMMAND]', 'Handle docker images'
13
+ subcommand 'image', DockerImage
14
+
15
+ desc 'socket [COMMAND]', 'Handle sockets for docker containers'
16
+ subcommand 'socket', DockerSocket
17
+ end
18
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takelage
4
+ # takelage docker container check
5
+ class DockerContainerCheck < SubCommandBase
6
+ include LoggingModule
7
+ include SystemModule
8
+ include ConfigModule
9
+ include DockerCheckRunning
10
+ include DockerContainerCheckExisting
11
+ include DockerContainerCheckNetwork
12
+ include DockerContainerCheckOrphaned
13
+
14
+ #
15
+ # docker container check existing
16
+ #
17
+ desc 'existing [CONTAINER]', 'Check if docker [CONTAINER] is existing'
18
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
19
+ Check if docker container is existing
20
+ This check looks for a container with a given name.
21
+ If such a container is existing the result is true else false.
22
+ LONGDESC
23
+ # Check if docker container is existing.
24
+ def existing(container)
25
+ exit docker_container_check_existing container
26
+ end
27
+
28
+ #
29
+ # docker container check network
30
+ #
31
+ desc 'network [NETWORK]', 'Check if docker [NETWORK] is existing'
32
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
33
+ Check if docker network is existing
34
+ This check looks for a network with a given name.
35
+ If such a network is existing the result is true else false.
36
+ LONGDESC
37
+ # Check if docker network is existing.
38
+ def network(network)
39
+ exit docker_container_check_network network
40
+ end
41
+
42
+ #
43
+ # docker container check orphaned
44
+ #
45
+ desc 'orphaned [CONTAINER]', 'Check if docker [CONTAINER] is orphaned'
46
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
47
+ Check if docker container is orphaned
48
+ This check looks for a process which is started
49
+ when you log in to an takelage docker container.
50
+ If such a process is found the result is true else false.
51
+ LONGDESC
52
+ # Check if docker container is orphaned.
53
+ def orphaned(container)
54
+ exit docker_container_check_orphaned container
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker container check existing
4
+ module DockerContainerCheckExisting
5
+ # Backend method for docker container check existing.
6
+ # @return [Boolean] is container existing?
7
+ def docker_container_check_existing(container)
8
+ log.debug "Checking if container \"#{container}\" is existing"
9
+
10
+ return false unless docker_check_running
11
+
12
+ stdout_str = run _docker_container_cmd_check_existing container
13
+
14
+ if stdout_str.to_s.strip.empty?
15
+ log.debug "Container \"#{container}\" is not existing"
16
+ return false
17
+ end
18
+
19
+ log.debug "Container \"#{container}\" is existing"
20
+ true
21
+ end
22
+
23
+ private
24
+
25
+ def _docker_container_cmd_check_existing(container)
26
+ format(
27
+ config.active['cmd_docker_container_check_existing_docker_ps'],
28
+ container: container
29
+ )
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker container check network
4
+ module DockerContainerCheckNetwork
5
+ # Backend method for docker container check network.
6
+ # @return [Boolean] is network existing?
7
+ def docker_container_check_network(network)
8
+ log.debug "Checking if network \"#{network}\" is existing"
9
+
10
+ return false unless docker_check_running
11
+
12
+ stdout_str = run _docker_container_cmd_check_network network
13
+
14
+ if stdout_str.to_s.strip.empty?
15
+ log.debug "Network \"#{network}\" is not existing"
16
+ return false
17
+ end
18
+
19
+ log.debug "Network \"#{network}\" is existing"
20
+ true
21
+ end
22
+
23
+ private
24
+
25
+ def _docker_container_cmd_check_network(network)
26
+ format(
27
+ config.active['cmd_docker_container_check_network_docker_network'],
28
+ network: network
29
+ )
30
+ end
31
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker container check orphaned
4
+ module DockerContainerCheckOrphaned
5
+ # Backend method for docker container check orphaned.
6
+ # @return [Boolean] is container orphaned?
7
+ def docker_container_check_orphaned(container)
8
+ log.debug "Check if container \"#{container}\" is orphaned"
9
+
10
+ return false unless docker_check_running
11
+
12
+ stdout_str = run _docker_container_cmd_check_orphaned container
13
+
14
+ if stdout_str.include? '/loginpoint.py'
15
+ log.debug "Container \"#{container}\" isn't orphaned"
16
+ return false
17
+ end
18
+
19
+ log.debug "Container \"#{container}\" is orphaned"
20
+ true
21
+ end
22
+
23
+ private
24
+
25
+ def _docker_container_cmd_check_orphaned(container)
26
+ format(
27
+ config.active['cmd_docker_container_check_orphaned_docker_exec'],
28
+ container: container
29
+ )
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage 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_running
10
+
11
+ return false if _docker_container_clean_harakiri?
12
+
13
+ networks = _docker_container_clean_kill_existing_containers
14
+ _docker_container_lib_remove_networks networks
15
+ end
16
+
17
+ private
18
+
19
+ # Check if we are running tau clean inside a takelage container
20
+ def _docker_container_clean_harakiri?
21
+ hostname = ENV['HOSTNAME'] || ''
22
+ return false unless hostname.start_with? "#{@docker_repo}_"
23
+
24
+ log.error "Please run \"tau clean\" outside of #{@docker_repo} containers"
25
+ log.info "Run \"tau prune\" to remove orphaned #{@docker_repo} containers"
26
+ true
27
+ end
28
+
29
+ # Kill all docker containers and return list of networks
30
+ def _docker_container_clean_kill_existing_containers
31
+ networks = []
32
+ _docker_container_lib_get_containers.each do |container|
33
+ name = _docker_container_lib_get_container_name_by_id container
34
+ _docker_container_lib_stop_container container
35
+ networks << name unless networks.include? name
36
+ end
37
+ networks
38
+ end
39
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takelage
4
+ # takelage docker container
5
+ class DockerContainer < SubCommandBase
6
+ include LoggingModule
7
+ include SystemModule
8
+ include ConfigModule
9
+ include DockerCheckRunning
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 DockerImageTagLatestLocal
20
+ include DockerImageTagListLocal
21
+ include DockerImageTagCheckLocal
22
+ include DockerImageCheckOutdated
23
+ include DockerSocketLib
24
+ include DockerSocketHost
25
+ include DockerSocketScheme
26
+ include DockerSocketStart
27
+
28
+ # Initialize docker container
29
+ # rubocop:disable Metrics/AbcSize
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_repo}_#{File.basename(@workdir)}"
41
+ @socket_host = docker_socket_host
42
+ @sockets = docker_socket_scheme
43
+ end
44
+ # rubocop:enable Metrics/AbcSize
45
+
46
+ desc 'check [COMMAND]', 'Check docker container'
47
+ subcommand 'check', DockerContainerCheck
48
+
49
+ #
50
+ # docker container clean
51
+ #
52
+ desc 'clean', 'Remove all docker containers'
53
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
54
+ Remove all docker containers
55
+ LONGDESC
56
+ # Remove all docker containers.
57
+ def clean
58
+ docker_container_clean
59
+ end
60
+
61
+ #
62
+ # docker container command
63
+ #
64
+ desc 'command [CMD]', 'Run [CMD] in a docker container'
65
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
66
+ Run command in docker container
67
+ LONGDESC
68
+ # Run command in docker container.
69
+ def command(command)
70
+ docker_container_command(command)
71
+ end
72
+
73
+ #
74
+ # docker container daemon
75
+ #
76
+ desc 'daemon', 'Run docker container in daemon mode'
77
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
78
+ Run docker container in daemon mode
79
+ LONGDESC
80
+ # Run docker container in daemon mode.
81
+ def daemon
82
+ docker_container_daemon
83
+ end
84
+
85
+ #
86
+ # docker container login
87
+ #
88
+ option :debug,
89
+ aliases: 'd',
90
+ type: :boolean,
91
+ default: false,
92
+ desc: 'Log in to docker container in debug mode'
93
+ desc 'login', 'Log in to latest local docker container'
94
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
95
+ Log in to latest local docker container
96
+ LONGDESC
97
+ # Log in to latest local docker container.
98
+ def login
99
+ docker_container_login
100
+ end
101
+
102
+ #
103
+ # docker container prune
104
+ #
105
+ desc 'prune', 'Remove orphaned docker containers'
106
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
107
+ Remove orphaned docker containers
108
+ LONGDESC
109
+ # Remove orphaned docker containers.
110
+ def prune
111
+ docker_container_prune
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage 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_running
10
+
11
+ docker_socket_start
12
+ return false unless _docker_container_lib_create_net_and_ctr @hostname
13
+
14
+ _docker_container_command_run_command @hostname, command
15
+ end
16
+
17
+ private
18
+
19
+ # Prepare run command in container command.
20
+ def _docker_container_command_run_command(container, command)
21
+ log.debug "Running command \"#{command}\" in container \"#{container}\""
22
+
23
+ cmd_docker_run_command =
24
+ format(
25
+ config.active['cmd_docker_container_docker_exec'],
26
+ container: container,
27
+ username: @username,
28
+ command: command
29
+ )
30
+
31
+ run_and_exit cmd_docker_run_command
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage 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_running
10
+
11
+ _docker_container_lib_create_net_and_ctr @hostname
12
+ end
13
+ end
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker container lib
4
+ # rubocop:disable Metrics/ModuleLength
5
+ module DockerContainerLib
6
+ private
7
+
8
+ # Create docker container and network.
9
+ # rubocop:disable Style/IfUnlessModifier
10
+ def _docker_container_lib_create_net_and_ctr(name)
11
+ unless docker_container_check_network name
12
+ _docker_container_lib_create_network name
13
+ end
14
+
15
+ return true if docker_container_check_existing name
16
+
17
+ _docker_container_lib_create_container name
18
+ end
19
+ # rubocop:enable Style/IfUnlessModifier
20
+
21
+ # Remove docker networks.
22
+ # rubocop:disable Style/IfUnlessModifier
23
+ def _docker_container_lib_remove_networks(networks)
24
+ networks.each do |network|
25
+ if docker_container_check_network network
26
+ _docker_container_lib_remove_network network
27
+ end
28
+ end
29
+ end
30
+ # rubocop:enable Style/IfUnlessModifier
31
+
32
+ # Create docker network.
33
+ def _docker_container_lib_create_network(network)
34
+ log.debug "Create network \"#{network}\""
35
+
36
+ cmd_create_network = format(
37
+ config.active['cmd_docker_container_create_network'],
38
+ network: network
39
+ )
40
+
41
+ run cmd_create_network
42
+ end
43
+
44
+ # Remove docker network.
45
+ def _docker_container_lib_remove_network(network)
46
+ log.debug "Remove network \"#{network}\""
47
+
48
+ cmd_remove_network = format(
49
+ config.active['cmd_docker_container_remove_network'],
50
+ network: network
51
+ )
52
+
53
+ run cmd_remove_network
54
+ end
55
+
56
+ # Create docker container.
57
+ # rubocop:disable Metrics/MethodLength
58
+ # rubocop:disable Metrics/AbcSize
59
+ # rubocop:disable Style/IfUnlessModifier
60
+ def _docker_container_lib_create_container(container)
61
+ log.debug "Creating container \"#{container}\""
62
+
63
+ image = "#{@docker_user}/#{@docker_repo}:#{@docker_tag}"
64
+
65
+ return false unless _docker_container_lib_image_available? image
66
+
67
+ log.debug "Using docker image \"#{image}\""
68
+
69
+ unless @socket_host == '127.0.0.1'
70
+ addhost = "--add-host host.docker.internal:#{@socket_host}"
71
+ end
72
+
73
+ docker_debug = config.active['docker_debug']
74
+ entrypoint = '/entrypoint.py '
75
+ volume_dev = ''
76
+ if options[:debug]
77
+ entrypoint = '/debug/entrypoint.py --debug '
78
+ volume_dev = "--volume #{@workdir}/#{docker_debug}:/debug "
79
+ end
80
+
81
+ cmd_docker_create = format(
82
+ config.active['cmd_docker_container_create'],
83
+ addhost: addhost,
84
+ container: container,
85
+ docker_run_options: config.active['docker_run_options'],
86
+ docker_daemon_port: config.active['docker_socket_docker_daemon_port'],
87
+ entrypoint: entrypoint,
88
+ entrypoint_options: config.active['docker_entrypoint_options'],
89
+ extra: config.active['docker_entrypoint_extra'],
90
+ gid: Etc.getpwnam(@username).gid,
91
+ gpg_agent_port: config.active['docker_socket_gpg_agent_port'],
92
+ gpg_ssh_agent_port: config.active['docker_socket_gpg_ssh_agent_port'],
93
+ homedir: ENV['HOME'] || '/tmp',
94
+ image: image,
95
+ shmsize: config.active['docker_shm_size'],
96
+ timezone: 'Europe/Berlin',
97
+ uid: Etc.getpwnam(@username).uid,
98
+ username: @username,
99
+ volume_dev: volume_dev,
100
+ workdir: @workdir
101
+ )
102
+
103
+ try cmd_docker_create
104
+ end
105
+ # rubocop:enable Style/IfUnlessModifier
106
+ # rubocop:enable Metrics/AbcSize
107
+ # rubocop:enable Metrics/MethodLength
108
+
109
+ # Check if docker image is available
110
+ def _docker_container_lib_image_available?(image)
111
+ return true if docker_image_tag_list_local.include? @docker_tag
112
+
113
+ log.error "No local image \"#{image}\" available"
114
+ log.info "Try: docker pull #{image}"
115
+ false
116
+ end
117
+
118
+ # Get container name by id.
119
+ def _docker_container_lib_get_container_name_by_id(container)
120
+ log.debug "Getting name of container \"#{container}\""
121
+
122
+ cmd_get_container_name_by_id = format(
123
+ config.active['cmd_docker_container_get_container_name'],
124
+ container: container
125
+ )
126
+
127
+ name = (run cmd_get_container_name_by_id).chomp
128
+
129
+ log.debug "Container #{container} has name \"#{name}\""
130
+
131
+ name
132
+ end
133
+
134
+ # Get all docker containers.
135
+ # @return [Array] list of docker containers
136
+ def _docker_container_lib_get_containers
137
+ log.debug "Getting all containers of image \"#{@docker_repo}\""
138
+
139
+ cmd_docker_get = format(
140
+ config.active['cmd_docker_container_get_containers'],
141
+ docker_repo: @docker_repo
142
+ )
143
+
144
+ # convert stdout lines to array and return array
145
+ (run cmd_docker_get).split(/\n+/)
146
+ end
147
+
148
+ # Stop container.
149
+ def _docker_container_lib_stop_container(container)
150
+ log.debug "Stopping container \"#{container}\""
151
+
152
+ cmd_docker_stop = format(
153
+ config.active['cmd_docker_container_stop_container'],
154
+ container: container
155
+ )
156
+
157
+ run cmd_docker_stop
158
+ end
159
+ end
160
+ # rubocop:enable Metrics/ModuleLength