idcfcloud 0.1.0

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 (57) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +21 -0
  3. data/.gitignore +56 -0
  4. data/.rubocop.yml +26 -0
  5. data/Gemfile +7 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +91 -0
  8. data/Rakefile +8 -0
  9. data/bin/idcfcloud +17 -0
  10. data/config/config_sample.ini +16 -0
  11. data/exe/idcfcloud +4 -0
  12. data/idcfcloud.gemspec +43 -0
  13. data/lib/idcf/cli/conf/conf.yml +10 -0
  14. data/lib/idcf/cli/conf/const.rb +37 -0
  15. data/lib/idcf/cli/conf/service/.gitkeep +0 -0
  16. data/lib/idcf/cli/controller/base.rb +151 -0
  17. data/lib/idcf/cli/controller/extend/command.rb +48 -0
  18. data/lib/idcf/cli/controller/extend/init.rb +17 -0
  19. data/lib/idcf/cli/controller/extend/override.rb +21 -0
  20. data/lib/idcf/cli/controller/extend/search_module.rb +54 -0
  21. data/lib/idcf/cli/controller/ilb.rb +62 -0
  22. data/lib/idcf/cli/controller/include/command.rb +106 -0
  23. data/lib/idcf/cli/controller/include/init.rb +21 -0
  24. data/lib/idcf/cli/controller/include/override.rb +30 -0
  25. data/lib/idcf/cli/controller/include/sdk.rb +83 -0
  26. data/lib/idcf/cli/controller/include/util.rb +101 -0
  27. data/lib/idcf/cli/controller/include/validate.rb +79 -0
  28. data/lib/idcf/cli/controller/your.rb +57 -0
  29. data/lib/idcf/cli/error/cli_error.rb +11 -0
  30. data/lib/idcf/cli/extend/configure.rb +71 -0
  31. data/lib/idcf/cli/extend/init.rb +13 -0
  32. data/lib/idcf/cli/extend/update.rb +109 -0
  33. data/lib/idcf/cli/extend/update_file.rb +53 -0
  34. data/lib/idcf/cli/gem_ext/thor/init_util.rb +92 -0
  35. data/lib/idcf/cli/index.rb +71 -0
  36. data/lib/idcf/cli/lib/convert/formatter/base.rb +21 -0
  37. data/lib/idcf/cli/lib/convert/formatter/csv_format.rb +115 -0
  38. data/lib/idcf/cli/lib/convert/formatter/json_format.rb +19 -0
  39. data/lib/idcf/cli/lib/convert/formatter/table_format.rb +19 -0
  40. data/lib/idcf/cli/lib/convert/formatter/xml_format.rb +21 -0
  41. data/lib/idcf/cli/lib/convert/helper.rb +28 -0
  42. data/lib/idcf/cli/lib/util/ini_conf.rb +67 -0
  43. data/lib/idcf/cli/lib/util/template.rb +29 -0
  44. data/lib/idcf/cli/lib/util/yml_conf.rb +37 -0
  45. data/lib/idcf/cli/service/base.rb +56 -0
  46. data/lib/idcf/cli/service/ilb/add_server_for_protocol.rb +20 -0
  47. data/lib/idcf/cli/service/ilb/base_server_for_protocol.rb +111 -0
  48. data/lib/idcf/cli/service/ilb/delete_server_for_protocol.rb +29 -0
  49. data/lib/idcf/cli/templates/bash/complement.erb +37 -0
  50. data/lib/idcf/cli/templates/zsh/complement.erb +46 -0
  51. data/lib/idcf/cli/validate/custom/init.rb +14 -0
  52. data/lib/idcf/cli/validate/custom/month_check_validator.rb +39 -0
  53. data/lib/idcf/cli/validate/custom/require_relation_validator.rb +50 -0
  54. data/lib/idcf/cli/validate/define/base.rb +36 -0
  55. data/lib/idcf/cli/validate/define/ilb/base.rb +27 -0
  56. data/lib/idcf/cli/version.rb +5 -0
  57. metadata +317 -0
@@ -0,0 +1,109 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'idcf/cli/conf/const'
4
+ require 'idcf/cli/lib/util/template'
5
+ require_relative 'update_file'
6
+ module Idcf
7
+ module Cli
8
+ module Extend
9
+ # update settings
10
+ module Update
11
+ protected
12
+
13
+ include UpdateFile
14
+
15
+ COMP_N = 'complement'.freeze
16
+
17
+ def do_update(_o)
18
+ clients = make_clients
19
+ writable_setting_file clients.keys
20
+ infos = {}
21
+
22
+ clients.each do |s_name, client|
23
+ info = make_module_info(client)
24
+ output_yaml(s_name, info)
25
+ infos[s_name] = info
26
+ end
27
+ output_complement
28
+ end
29
+
30
+ def make_clients
31
+ {}.tap do |result|
32
+ self.class.subcommand_classes.each do |k, v|
33
+ next unless v.ancestors.include?(Idcf::Cli::Controller::Base)
34
+ client = v.make_blank_client
35
+ result[k] = client unless client.nil?
36
+ end
37
+ end
38
+ end
39
+
40
+ def make_module_info(client)
41
+ {}.tap do |result|
42
+ module_methods = []
43
+ client.class.included_modules.each do |m|
44
+ next unless m.to_s =~ /\AIdcf::.*::ClientExtensions/
45
+ module_methods.concat(m.instance_methods)
46
+ end
47
+ module_methods.each do |method|
48
+ result[method] = make_method_info(client, method)
49
+ end
50
+ end
51
+ end
52
+
53
+ def make_method_info(client, method_sym)
54
+ params = []
55
+ client.method(method_sym).parameters.each do |param|
56
+ next if param[0] == :block
57
+ params << {
58
+ name: param[1].to_s,
59
+ arg_type: param[0].to_s
60
+ }
61
+ end
62
+
63
+ { desc: '', params: params }
64
+ end
65
+
66
+ def output_complement
67
+ view = Idcf::Cli::Lib::Util::Template.new
68
+ view.set('variables', make_script_variables)
69
+ paths = []
70
+ %w(bash zsh).each do |e|
71
+ str = view.fetch("#{e}/#{COMP_N}.erb")
72
+ path = "#{Idcf::Cli::Conf::Const::OUT_DIR}/#{COMP_N}.#{e}"
73
+ paths << File.expand_path(path)
74
+ output_complement_file(str, paths.last)
75
+ end
76
+ output_notification(paths)
77
+ end
78
+
79
+ def output_notification(paths)
80
+ notification = Idcf::Cli::Conf::Const::COMP_NOTIFICATION
81
+ puts format(notification, *paths)
82
+ end
83
+
84
+ def make_script_variables
85
+ self.class.init
86
+ make_flat_variables(self.class.subcommand_structure)
87
+ end
88
+
89
+ # bash 3.x
90
+ #
91
+ # @param list [Hash]
92
+ # @param names [Array]
93
+ # @return Hash
94
+ def make_flat_variables(list, names = [])
95
+ {}.tap do |result|
96
+ name = names.empty? ? 'top' : names.join('_')
97
+ result[name] = list.keys
98
+ list.each do |k, v|
99
+ next unless v.class == Hash
100
+ names << k
101
+ result.merge!(make_flat_variables(v, names))
102
+ names.pop
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,53 @@
1
+ require 'fileutils'
2
+ require 'idcf/cli/conf/const'
3
+
4
+ module Idcf
5
+ module Cli
6
+ module Extend
7
+ # update file
8
+ module UpdateFile
9
+ protected
10
+
11
+ def writable_setting_file(services)
12
+ b_dir = File.expand_path(Idcf::Cli::Conf::Const::CMD_FILE_DIR)
13
+ FileUtils.mkdir_p(b_dir) unless Dir.exist?(b_dir)
14
+ writable?(File.dirname(b_dir))
15
+
16
+ services.each do |v|
17
+ path = "#{b_dir}/#{v}.#{Idcf::Cli::Conf::Const::CMD_FILE_EXT}"
18
+ writable?(File.dirname(path)) if File.exist?(path)
19
+ end
20
+ end
21
+
22
+ def output_yaml(s_name, data)
23
+ dir = Idcf::Cli::Conf::Const::CMD_FILE_DIR
24
+ ext = Idcf::Cli::Conf::Const::CMD_FILE_EXT
25
+ path = "#{File.expand_path(dir)}/#{s_name}.#{ext}"
26
+ write_file(path, data.to_yaml)
27
+ end
28
+
29
+ def output_complement_file(str, outpath)
30
+ dir_path = File.dirname(outpath)
31
+ unless Dir.exist?(dir_path)
32
+ writable?(File.dirname(dir_path))
33
+ Dir.mkdir(dir_path)
34
+ end
35
+ writable?(dir_path)
36
+
37
+ write_file(outpath, str)
38
+ end
39
+
40
+ def write_file(path, str)
41
+ File.open(path, 'w') do |f|
42
+ f.puts(str)
43
+ end
44
+ end
45
+
46
+ def writable?(path)
47
+ msg = "Permission error (#{path})"
48
+ raise Idcf::Cli::CliError, msg unless File.writable?(path)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,92 @@
1
+ # Thor extention
2
+ class Thor
3
+ class << self
4
+ # Thor 0.19.4 ( https://github.com/erikhuda/thor/issues/244 )
5
+ def exit_on_failure?
6
+ true
7
+ end
8
+
9
+ # initialize settings
10
+ def init
11
+ # When initialization is needed, override.
12
+ end
13
+
14
+ # command description
15
+ #
16
+ # @return String
17
+ def description
18
+ raise Idcf::Cli::CliError, 'Required Override'
19
+ end
20
+
21
+ # register sub command
22
+ #
23
+ # @param dir [String] underlayer path
24
+ # @param parent_dir_path [Stirng]
25
+ # @return nil
26
+ def sub_command_regist(under_path, parent_dir_path = '')
27
+ b_path = module_path
28
+ Dir.glob(parent_dir_path + "/#{under_path}/*.rb").each do |f|
29
+ file_name = File.basename(f, '.*')
30
+ next if file_name == 'base'
31
+
32
+ command_regist file_name, "#{b_path}/#{under_path}/#{file_name}"
33
+ end
34
+ end
35
+
36
+ # command regist
37
+ #
38
+ # @param command [String]
39
+ # @param require_path [String]
40
+ def command_regist(command, require_path)
41
+ require require_path
42
+
43
+ class_const = require_path.classify.constantize
44
+ class_const.init
45
+ register class_const,
46
+ command,
47
+ "#{command_help_string(command)} [OPTION]",
48
+ class_const.description
49
+ end
50
+
51
+ def command_help_string(command)
52
+ result = [command]
53
+ map.each do |k, v|
54
+ result << k if v.to_s == command.to_s
55
+ end
56
+ result.join('/')
57
+ end
58
+
59
+ # module path
60
+ #
61
+ # @return String
62
+ def module_path
63
+ class_names = to_s.underscore.split('/')
64
+ class_names.pop
65
+ class_names.join('/')
66
+ end
67
+
68
+ def subcommand_structure
69
+ {}.tap do |result|
70
+ commands.each do |k, _v|
71
+ result[k.to_s] = nil
72
+ end
73
+ result = subcommand_class_structure(result)
74
+
75
+ map.each do |k, v|
76
+ result[k.to_s] = result[v.to_s] unless result[v.to_s].nil?
77
+ end
78
+ end
79
+ end
80
+
81
+ protected
82
+
83
+ def subcommand_class_structure(result)
84
+ subcommand_classes.each do |k, v|
85
+ commands = v.subcommand_structure
86
+ result[k.to_s] = nil
87
+ result[k.to_s] = commands unless commands.empty?
88
+ end
89
+ result
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,71 @@
1
+ require 'thor'
2
+ require 'active_support'
3
+ require 'active_support/core_ext'
4
+ require 'idcf/cli/conf/const'
5
+ require 'idcf/cli/error/cli_error'
6
+ require_relative './version'
7
+ require_relative './validate/custom/init'
8
+ require_relative './gem_ext/thor/init_util'
9
+ require_relative './extend/init'
10
+
11
+ module Idcf
12
+ module Cli
13
+ # Index
14
+ class Index < Thor
15
+ @variables = nil
16
+ # command alias [alias] => [command]
17
+ COMMAND_MAPS = {}.freeze
18
+
19
+ include Idcf::Cli::Extend::Init
20
+
21
+ class << self
22
+ def init
23
+ map COMMAND_MAPS
24
+ sub_command_regist('controller', File.dirname(__FILE__))
25
+ end
26
+ end
27
+
28
+ def initialize(*args)
29
+ @variables = {}
30
+ super(*args)
31
+ end
32
+
33
+ desc 'init', 'initialize'
34
+ options global: true,
35
+ profile: 'default'
36
+
37
+ def init
38
+ configure
39
+ update
40
+ rescue => e
41
+ puts e.message
42
+ end
43
+
44
+ desc 'update', 'list update'
45
+
46
+ def update
47
+ do_update(options)
48
+ rescue => e
49
+ puts e.message
50
+ end
51
+
52
+ desc 'configure', 'create configure'
53
+ options global: true,
54
+ profile: 'default'
55
+
56
+ def configure
57
+ do_configure(options)
58
+ rescue => e
59
+ puts e.message
60
+ end
61
+
62
+ desc 'version', 'version string'
63
+
64
+ def version
65
+ puts "idcfcloud version #{Idcf::Cli::VERSION}"
66
+ rescue => e
67
+ puts e.message
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,21 @@
1
+ module Idcf
2
+ module Cli
3
+ module Lib
4
+ module Convert
5
+ module Formatter
6
+ # formatter base
7
+ class Base
8
+ # format
9
+ #
10
+ # @param _data [Hash]
11
+ # @param _err_f [Boolean]
12
+ # @return String
13
+ def format(_data, _err_f)
14
+ raise Idcf::Cli::CliError, 'override'
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,115 @@
1
+ require_relative './base'
2
+ require 'csv'
3
+
4
+ module Idcf
5
+ module Cli
6
+ module Lib
7
+ module Convert
8
+ module Formatter
9
+ # csv formatter
10
+ class CsvFormat < Base
11
+ def format(data, err_f)
12
+ result = CSV.generate do |csv|
13
+ scrape_line(data, err_f).each do |v|
14
+ csv << v
15
+ end
16
+ end
17
+
18
+ result.strip
19
+ end
20
+
21
+ protected
22
+
23
+ def scrape_line(data, err_f)
24
+ list = scrape(data, err_f)
25
+ return [] if list.size.zero?
26
+
27
+ result = []
28
+ headers = make_header(list.first)
29
+ result << headers
30
+ push_list(list, headers, result)
31
+ end
32
+
33
+ def make_header(first_list)
34
+ result = []
35
+ if first_list.class == Hash
36
+ first_list.each do |k, _v|
37
+ result << k
38
+ end
39
+ else
40
+ result = [*(0..(first_list.size - 1))]
41
+ end
42
+ result
43
+ end
44
+
45
+ def push_list(list, headers, result)
46
+ list.each do |v|
47
+ col = []
48
+ headers.each do |h|
49
+ col << v[h]
50
+ end
51
+ result << col
52
+ end
53
+
54
+ result
55
+ end
56
+
57
+ # scrape
58
+ # @param data [Hash]
59
+ # @param err_f [Boolean]
60
+ # @return Array in Hash
61
+ def scrape(data, err_f)
62
+ return [flat_hash(data)] if err_f
63
+ return [flat_hash(data)] if data.class == Hash
64
+ return [[data]] unless data.class == Array
65
+
66
+ two_dimensional(data)
67
+ end
68
+
69
+ # two dimensional
70
+ # @param list [Array] One-dimensional [array or Hash List]
71
+ # @return Array
72
+ def two_dimensional(list)
73
+ [].tap do |result|
74
+ list.each do |v|
75
+ next if v.class == Array
76
+ unless v.class == Hash
77
+ result << [v]
78
+ next
79
+ end
80
+ result << flat_hash(v)
81
+ end
82
+ end
83
+ end
84
+
85
+ def flat_hash(data)
86
+ {}.tap do |result|
87
+ return {} unless data.class == Hash
88
+ data.each do |k, v|
89
+ value = v
90
+ arr_f = v.class == Array || v.class == Hash
91
+ next if k != :message && arr_f
92
+ value = flat(value) if arr_f
93
+ result[k.to_sym] = value
94
+ end
95
+ end
96
+ end
97
+
98
+ def flat(list)
99
+ result = []
100
+ list.each do |k, v|
101
+ if list.class == Hash
102
+ result << "#{k}:#{v.join('/')}"
103
+ next
104
+ end
105
+ result << (v.nil? ? k : v)
106
+ end
107
+
108
+ result.join("\n")
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,19 @@
1
+ require_relative './base'
2
+ require 'json'
3
+
4
+ module Idcf
5
+ module Cli
6
+ module Lib
7
+ module Convert
8
+ module Formatter
9
+ # json formatter
10
+ class JsonFormat < Base
11
+ def format(data, _err_f)
12
+ JSON.pretty_generate(data)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require_relative './csv_format'
2
+
3
+ module Idcf
4
+ module Cli
5
+ module Lib
6
+ module Convert
7
+ module Formatter
8
+ # table formatter
9
+ class TableFormat < CsvFormat
10
+ def format(data, err_f)
11
+ require 'kosi'
12
+ Kosi::Table.new.render(scrape_line(data, err_f))
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ require_relative './base'
2
+ require 'builder/xmlmarkup'
3
+ require 'active_support'
4
+ require 'active_support/core_ext'
5
+
6
+ module Idcf
7
+ module Cli
8
+ module Lib
9
+ module Convert
10
+ module Formatter
11
+ # xml formatter
12
+ class XmlFormat < Base
13
+ def format(data, _err_f)
14
+ data.to_xml
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_support/core_ext/string/inflections'
2
+ require 'idcf/cli/lib/convert/formatter/xml_format'
3
+ require 'idcf/cli/lib/convert/formatter/json_format'
4
+ require 'idcf/cli/lib/convert/formatter/csv_format'
5
+ require 'idcf/cli/lib/convert/formatter/table_format'
6
+
7
+ module Idcf
8
+ module Cli
9
+ module Lib
10
+ module Convert
11
+ # format helper
12
+ class Helper
13
+ # data convert
14
+ #
15
+ # @param data [Hash]
16
+ # @param err_f [Boolean]
17
+ # @param f [String] format
18
+ # @return String
19
+ def format(data, err_f, f)
20
+ base_name = 'Idcf::Cli::Lib::Convert::Formatter'
21
+ cl = "#{base_name}::#{f.capitalize}Format"
22
+ cl.constantize.new.format(data, err_f)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,67 @@
1
+ require 'inifile'
2
+ require 'fileutils'
3
+ module Idcf
4
+ module Cli
5
+ module Lib
6
+ module Util
7
+ # ini conf
8
+ class IniConf
9
+ attr_reader :load_data, :tmp_data
10
+
11
+ # initialize
12
+ #
13
+ # @param path [String] ini file path
14
+ def initialize(*path)
15
+ @tmp_data = {}
16
+ @load_data = IniFile.load(path[0])
17
+ end
18
+
19
+ def load_error?
20
+ @load_data.nil?
21
+ end
22
+
23
+ def [](profile)
24
+ return nil if load_error?
25
+ @load_data[profile.to_s]
26
+ end
27
+
28
+ def []=(profile, value)
29
+ data = load_error? ? @tmp_data : @load_data
30
+ data[profile.to_s] = value
31
+ end
32
+
33
+ # get config value
34
+ #
35
+ # @param name [String]
36
+ # @param profile [String]
37
+ # @return String or Hash
38
+ # @raise
39
+ def find(name, profile)
40
+ begin
41
+ @load_data[profile].fetch(name)
42
+ rescue
43
+ @load_data['default'].fetch(name)
44
+ end
45
+ rescue
46
+ msg = "Error: could not read #{profile}:#{name}"
47
+ raise Idcf::Cli::CliError, msg
48
+ end
49
+
50
+ def write(path)
51
+ unless File.exist?(path)
52
+ dir_path = File.dirname(path)
53
+ FileUtils.mkdir_p(dir_path) unless Dir.exist?(dir_path)
54
+ File.open(path, 'w').close
55
+ @load_data = IniFile.load(path)
56
+ end
57
+
58
+ @tmp_data.each do |k, v|
59
+ @load_data[k] = v
60
+ end
61
+ @load_data.write(filename: path)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,29 @@
1
+ require 'idcf/cli/conf/const'
2
+ require 'erb'
3
+ module Idcf
4
+ module Cli
5
+ module Lib
6
+ module Util
7
+ # template
8
+ class Template
9
+ def set(name, value)
10
+ instance_variable_set("@#{name}", value)
11
+ end
12
+
13
+ # return string
14
+ #
15
+ # @param path [String]
16
+ # @param attr
17
+ def fetch(path, attr = {})
18
+ tmp_path = "#{Idcf::Cli::Conf::Const::TEMPLATE_DIR}/#{path}"
19
+ attr.each do |k, v|
20
+ set(k, v)
21
+ end
22
+ f_content = File.open(File.expand_path(tmp_path)).read
23
+ ERB.new(f_content).result(binding)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ require 'yaml'
2
+ module Idcf
3
+ module Cli
4
+ module Lib
5
+ module Util
6
+ # yml conf
7
+ class YmlConf
8
+ @load_data = nil
9
+
10
+ # initialize
11
+ #
12
+ # @param path [String] yml file path
13
+ def initialize(*path)
14
+ @load_data = YAML.load_file(path[0])
15
+ end
16
+
17
+ # get config value
18
+ #
19
+ # @param path [String]
20
+ # @return String or Hash
21
+ # @raise
22
+ def find(path)
23
+ result = @load_data
24
+ return result[path] if path.class == Symbol
25
+ path.split('.').each do |name|
26
+ result = result.fetch(name)
27
+ end
28
+
29
+ result
30
+ rescue
31
+ raise Idcf::Cli::CliError, "Error: could not read '#{path}'"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end