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,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takelage
4
+ # takelage docker image tag list
5
+ class DockerImageTagList < SubCommandBase
6
+ include LoggingModule
7
+ include SystemModule
8
+ include ConfigModule
9
+ include DockerCheckRunning
10
+ include DockerImageTagListLocal
11
+ include DockerImageTagListRemote
12
+
13
+ # Initialize takelage docker image tag list
14
+ def initialize(args = [], local_options = {}, configuration = {})
15
+ # initialize thor parent class
16
+ super args, local_options, configuration
17
+
18
+ @docker_user = config.active['docker_user']
19
+ @docker_repo = config.active['docker_repo']
20
+ @docker_registry = config.active['docker_registry']
21
+ end
22
+
23
+ #
24
+ # docker image tag list local
25
+ #
26
+ desc 'local', 'Print local docker image tags'
27
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
28
+ Print local docker image tags
29
+ LONGDESC
30
+ # Print local docker image tags.
31
+ def local
32
+ tag_list_local = docker_image_tag_list_local
33
+ exit false if tag_list_local == false
34
+ say tag_list_local
35
+ true
36
+ end
37
+
38
+ #
39
+ # docker image tag list remote
40
+ #
41
+ desc 'remote', 'Print remote docker image tags'
42
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
43
+ Print remote docker image tags
44
+ LONGDESC
45
+ # Print latest remote docker image tag.
46
+ def remote
47
+ tag_list_remote = docker_image_tag_list_remote
48
+ exit false if tag_list_remote == false
49
+ say tag_list_remote
50
+ true
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker image tag list local
4
+ module DockerImageTagListLocal
5
+ # Backend method for docker image tag list local.
6
+ # @return [Array] local docker image tags
7
+ def docker_image_tag_list_local
8
+ cmd_docker_tags =
9
+ format(
10
+ config.active['cmd_docker_image_tag_list_local_docker_images'],
11
+ docker_user: @docker_user,
12
+ docker_repo: @docker_repo
13
+ )
14
+
15
+ tags = (run cmd_docker_tags).split("\n")
16
+
17
+ VersionSorter.sort(tags)
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker image tag list remote
4
+ module DockerImageTagListRemote
5
+ # Backend method for docker image tag list remote.
6
+ # @return [Array] remote docker image tags
7
+ def docker_image_tag_list_remote
8
+ log.debug 'Getting docker remote tags ' \
9
+ "of \"#{@docker_user}/#{@docker_repo}\" " \
10
+ "from \"#{@docker_registry}\""
11
+ _docker_image_tag_list_remote_tags
12
+ end
13
+
14
+ private
15
+
16
+ # Get docker remote tags.
17
+ def _docker_image_tag_list_remote_tags
18
+ user = File.basename @docker_user
19
+ begin
20
+ registry = DockerRegistry2.connect(@docker_registry)
21
+ tags = registry.tags("#{user}/#{@docker_repo}")
22
+ VersionSorter.sort(tags['tags'])
23
+ rescue RestClient::Exceptions::OpenTimeout
24
+ log.error "Timeout while connecting to \"#{@docker_registry}\""
25
+ false
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker image uppdate
4
+ module DockerImageUpdate
5
+ # Backend method for docker image update.
6
+ def docker_image_update
7
+ return false unless docker_check_running
8
+
9
+ tags_remote = docker_image_tag_list_remote
10
+
11
+ tag = 'latest'
12
+ tag = docker_image_tag_latest_remote unless tags_remote.include?('latest')
13
+
14
+ cmd_docker_pull_latest = _docker_image_update_cmd_docker_pull_latest tag
15
+
16
+ cmd_docker_remove_dangling =
17
+ config.active['cmd_docker_image_update_docker_remove_dangling']
18
+
19
+ run_and_exit "#{cmd_docker_pull_latest} && #{cmd_docker_remove_dangling}"
20
+ end
21
+
22
+ private
23
+
24
+ # Prepare dpcker pull latest command.
25
+ def _docker_image_update_cmd_docker_pull_latest(tag)
26
+ format(
27
+ config.active['cmd_docker_image_update_docker_pull_latest'],
28
+ docker_user: @docker_user,
29
+ docker_repo: @docker_repo,
30
+ tag_latest_remote: tag
31
+ )
32
+ end
33
+ end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Takelage
4
+ # takelage docker socket
5
+ class DockerSocket < SubCommandBase
6
+ include LoggingModule
7
+ include SystemModule
8
+ include ConfigModule
9
+ include DockerCheckRunning
10
+ include DockerSocketLib
11
+ include DockerSocketHost
12
+ include DockerSocketScheme
13
+ include DockerSocketStart
14
+ include DockerSocketStop
15
+
16
+ # Initialize docker socket
17
+ def initialize(args = [], local_options = {}, configuration = {})
18
+ # initialize thor parent class
19
+ super args, local_options, configuration
20
+
21
+ @socket_host = docker_socket_host
22
+ @sockets = docker_socket_scheme
23
+ end
24
+
25
+ #
26
+ # docker socket host
27
+ #
28
+ desc 'host', 'Print docker socket host ip address'
29
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
30
+ Print docker socket host ip address
31
+ LONGDESC
32
+ # Print docker socket host ip address.
33
+ def host
34
+ say @socket_host
35
+ true
36
+ end
37
+
38
+ #
39
+ # docker socket scheme
40
+ #
41
+ desc 'scheme', 'Print docker socket scheme'
42
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
43
+ Print docker socket scheme
44
+ LONGDESC
45
+ # Print docker socket scheme.
46
+ def scheme
47
+ say hash_to_yaml(@sockets)
48
+ true
49
+ end
50
+
51
+ #
52
+ # docker socket start
53
+ #
54
+ desc 'start', 'Start sockets for docker container'
55
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
56
+ Start sockets for docker container
57
+ LONGDESC
58
+ # Start sockets for docker container.
59
+ def start
60
+ exit docker_socket_start
61
+ end
62
+
63
+ #
64
+ # docker socket stop
65
+ #
66
+ desc 'stop', 'Stop sockets for docker container'
67
+ long_desc <<-LONGDESC.gsub("\n", "\x5")
68
+ Stop sockets for docker container
69
+ LONGDESC
70
+ # Stop sockets for docker container.
71
+ def stop
72
+ exit docker_socket_stop
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker socket host
4
+ module DockerSocketHost
5
+ # Backend method for docker socket host.
6
+ def docker_socket_host
7
+ log.debug 'Getting docker socket host ip address'
8
+
9
+ socket_host = '127.0.0.1'
10
+
11
+ addr_infos = Socket.getifaddrs
12
+
13
+ # if interface docker0 exists (== linux host)
14
+ # then return the ip address
15
+ addr_infos.each do |addr_info|
16
+ if addr_info.name == 'docker0'
17
+ socket_host = addr_info.addr.ip_address if addr_info.addr.ipv4?
18
+ end
19
+ end
20
+
21
+ log.debug "Docker socket host ip address is \"#{socket_host}\""
22
+
23
+ socket_host
24
+ end
25
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker socket lib
4
+ module DockerSocketLib
5
+ private
6
+
7
+ # Get socket start commands.
8
+ # sockets_up is a boolean which defines if the sockets need to be up
9
+ # to be included in the resulting array of socket start commands
10
+ def _docker_socket_lib_get_socket_start_commands(mode)
11
+ cmds_start_socket = []
12
+
13
+ # loop over sockets
14
+ @sockets.each do |socket, socket_config|
15
+ host = socket_config['host']
16
+ port = socket_config['port']
17
+ path = socket_config['path']
18
+
19
+ cmd = _docker_socket_lib_get_start_cmd(mode, socket, host, port, path)
20
+ cmds_start_socket.push cmd if cmd
21
+ end
22
+
23
+ cmds_start_socket
24
+ end
25
+
26
+ # Get socket start command
27
+ def _docker_socket_lib_get_start_cmd(mode, socket, host, port, path)
28
+ if mode == 'start'
29
+ unless _docker_socket_lib_socket_up? socket, host, port, path
30
+ return _docker_socket_lib_start_cmd(host, port, path)
31
+ end
32
+ elsif _docker_socket_lib_socket_up? socket, host, port, path
33
+ return _docker_socket_lib_start_cmd(host, port, path)
34
+ end
35
+ nil
36
+ end
37
+
38
+ # Get socket start command.
39
+ def _docker_socket_lib_start_cmd(host, port, path)
40
+ format(
41
+ config.active['cmd_docker_socket_get_start'],
42
+ host: host,
43
+ port: port,
44
+ path: path
45
+ )
46
+ end
47
+
48
+ # Check if a socket is available by trying to connect to it via TCP
49
+ def _docker_socket_lib_socket_up?(socket, host, port, path)
50
+ error_message = _docker_socket_lib_error_msg socket, host, port, path
51
+ begin
52
+ Timeout.timeout(1) do
53
+ _docker_socket_lib_socket_reachable? socket, host, port, error_message
54
+ end
55
+ rescue Timeout::Error
56
+ log.debug "Timeout: #{error_message}"
57
+ false
58
+ end
59
+ end
60
+
61
+ # Create error message.
62
+ def _docker_socket_lib_error_msg(socket, host, port, path)
63
+ 'failed to connect to ' \
64
+ "socket \"#{socket}\" " \
65
+ "using host \"#{host}\", " \
66
+ "port \"#{port}\", " \
67
+ "path \"#{path}\""
68
+ end
69
+
70
+ # Test socket.
71
+ # rubocop:disable Metrics/MethodLength
72
+ def _docker_socket_lib_socket_reachable?(socket, host, port, error_message)
73
+ begin
74
+ s = TCPSocket.new host, port
75
+ s.close
76
+ log.debug "Socket \"#{socket}\" up"
77
+ return true
78
+ rescue Errno::ECONNREFUSED
79
+ log.debug "Connection refused: #{error_message}"
80
+ rescue Errno::EHOSTUNREACH
81
+ log.debug "Host unreachable: #{error_message}"
82
+ rescue SocketError
83
+ log.debug "Socket error: #{error_message}"
84
+ end
85
+ false
86
+ end
87
+ # rubocop:enable Metrics/MethodLength
88
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker socket scheme
4
+ module DockerSocketScheme
5
+ # Backend method for docker socket scheme.
6
+ def docker_socket_scheme
7
+ log.debug 'Getting docker socket scheme'
8
+
9
+ socket_scheme = _socket_get_scheme _socket_get_config
10
+
11
+ log.debug "Docker socket scheme is \n\"\"\"\n#{hash_to_yaml socket_scheme}\"\"\""
12
+
13
+ socket_scheme
14
+ end
15
+
16
+ private
17
+
18
+ # Get docker socket config.
19
+ def _socket_get_config
20
+ socket_config = {
21
+ 'docker_path' => _socket_get_docker_daemon_path,
22
+ 'docker_port' => config.active['docker_socket_docker_daemon_port'],
23
+ 'gpg_path' => _socket_get_agent_socket_path,
24
+ 'gpg_port' => config.active['docker_socket_gpg_agent_port'],
25
+ 'ssh_path' => _socket_get_agent_ssh_socket_path,
26
+ 'ssh_port' => config.active['docker_socket_gpg_ssh_agent_port']
27
+ }
28
+
29
+ socket_config
30
+ end
31
+
32
+ # Get docker socket path.
33
+ def _socket_get_docker_daemon_path
34
+ '/var/run/docker.sock'
35
+ end
36
+
37
+ # Get gpg agent socket path.
38
+ def _socket_get_agent_socket_path
39
+ cmd_agent_socket_path =
40
+ config.active['cmd_docker_socket_config_agent_socket_path']
41
+ (run cmd_agent_socket_path).chomp
42
+ end
43
+
44
+ # Get gpg ssh agent socket path.
45
+ def _socket_get_agent_ssh_socket_path
46
+ cmd_agent_ssh_socket_path =
47
+ config.active['cmd_docker_socket_config_agent_ssh_socket_path']
48
+ (run cmd_agent_ssh_socket_path).chomp
49
+ end
50
+
51
+ # Create socket scheme.
52
+ def _socket_get_scheme(socket_config)
53
+ { 'docker-daemon' => { 'path' => socket_config['docker_path'],
54
+ 'host' => @socket_host,
55
+ 'port' => socket_config['docker_port'] },
56
+ 'gpg-agent' => { 'path' => socket_config['gpg_path'],
57
+ 'host' => @socket_host,
58
+ 'port' => socket_config['gpg_port'] },
59
+ 'gpg-ssh-agent' => { 'path' => socket_config['ssh_path'],
60
+ 'host' => @socket_host,
61
+ 'port' => socket_config['ssh_port'] } }
62
+ end
63
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker socket start
4
+ module DockerSocketStart
5
+ # Backend method for docker socket start.
6
+ def docker_socket_start
7
+ log.debug 'Starting sockets for docker container'
8
+
9
+ return false unless docker_check_running
10
+
11
+ cmds_start_socket = _docker_socket_lib_get_socket_start_commands 'start'
12
+
13
+ return true if cmds_start_socket.empty?
14
+
15
+ _docker_socket_start_get_sudo
16
+
17
+ cmds_start_socket.each do |cmd_start_socket|
18
+ run_and_fork cmd_start_socket
19
+ end
20
+
21
+ true
22
+ end
23
+
24
+ private
25
+
26
+ # Get sudo.
27
+ def _docker_socket_start_get_sudo
28
+ log.debug 'Request sudo so that ' \
29
+ 'subsequent background tasks run without delay'
30
+ cmd_sudo_true =
31
+ config.active['cmd_docker_socket_start_sudo_true']
32
+ run cmd_sudo_true
33
+ end
34
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ # takelage docker socket stop
4
+ module DockerSocketStop
5
+ # Backend method for docker socket stop.
6
+ def docker_socket_stop
7
+ log.debug 'Stopping sockets for docker container'
8
+
9
+ return false unless docker_check_running
10
+
11
+ # get process list
12
+ # assuming format: "pid command"
13
+ cmd_ps =
14
+ config.active['cmd_docker_socket_stop_docker_socket_ps']
15
+
16
+ stdout_str = run cmd_ps
17
+
18
+ cmds_start_socket = _docker_socket_lib_get_socket_start_commands 'stop'
19
+
20
+ # loop over process list
21
+ stdout_str.split(/\n+/).each do |process|
22
+ _docker_socket_stop_kill_process process, cmds_start_socket
23
+ end
24
+
25
+ true
26
+ end
27
+
28
+ private
29
+
30
+ # Stop process.
31
+ def _docker_socket_stop_kill_process(process, cmds_start_socket)
32
+ # split processes in process id and process command
33
+ pid_command = process.strip.split(/ /, 2)
34
+ pid = pid_command[0]
35
+ command = pid_command[1]
36
+
37
+ # loop over socket start commands
38
+ cmds_start_socket.each do |cmd_start_socket|
39
+ next unless command == cmd_start_socket
40
+
41
+ _docker_socket_stop_kill_pid pid
42
+ end
43
+ end
44
+
45
+ # Kill process.
46
+ def _docker_socket_stop_kill_pid(pid)
47
+ log.debug "Killing PID #{pid}"
48
+ cmd_kill =
49
+ format(
50
+ config.active['cmd_docker_socket_stop_docker_socket_kill'],
51
+ pid: pid
52
+ )
53
+ run cmd_kill
54
+ end
55
+ end