hiiro 0.1.148 → 0.1.149
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.
- checksums.yaml +4 -4
- data/lib/hiiro/service_manager.rb +171 -4
- data/lib/hiiro/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f67c9b0a2688514af184098d8c69497f0fe09adb4a91a4e41b17596a4069e352
|
|
4
|
+
data.tar.gz: c6f3ef4544274739bdbdde419a25101948d5af2119d0da2b6015a580864d80ec
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 00e92bb9a9186cea72209f320df3b43c3e3f1537596ddecd78d740d0c87ba42b7f9ccd1c250b36e6fa331371875fdf15b2f0d8baf2d7b115b76ec64183aeb9aa
|
|
7
|
+
data.tar.gz: 16e4b2d2af8857cd4d1bd7739add2d919466d58b2c0c9806371079344d8c094a66c75c32f49766efc36eda4dde6a5113c3bfde1710719919912745709d210429
|
|
@@ -7,6 +7,7 @@ class Hiiro
|
|
|
7
7
|
CONFIG_FILE = File.join(Dir.home, '.config', 'hiiro', 'services.yml')
|
|
8
8
|
STATE_DIR = File.join(Dir.home, '.config', 'hiiro', 'services')
|
|
9
9
|
STATE_FILE = File.join(STATE_DIR, 'running.yml')
|
|
10
|
+
ENV_TEMPLATES_DIR = File.join(Dir.home, '.config', 'hiiro', 'env_templates')
|
|
10
11
|
|
|
11
12
|
attr_reader :config_file, :state_file
|
|
12
13
|
|
|
@@ -30,6 +31,94 @@ class Hiiro
|
|
|
30
31
|
{ name: svc_name, **symbolize_keys(configs[svc_name]) }
|
|
31
32
|
end
|
|
32
33
|
|
|
34
|
+
def find_group(name)
|
|
35
|
+
configs = services
|
|
36
|
+
names = configs.keys.select { |k| configs[k].is_a?(Hash) && configs[k].key?('services') }
|
|
37
|
+
return nil if names.empty?
|
|
38
|
+
|
|
39
|
+
structs = names.map { |k| OpenStruct.new(name: k) }
|
|
40
|
+
result = Hiiro::Matcher.new(structs, :name).by_prefix(name)
|
|
41
|
+
match = result.resolved || result.first
|
|
42
|
+
return nil unless match
|
|
43
|
+
|
|
44
|
+
group_name = match.item.name
|
|
45
|
+
{ name: group_name, **symbolize_keys(configs[group_name]) }
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def prepare_env(svc_name, variation_overrides: {})
|
|
49
|
+
svc = find_service(svc_name)
|
|
50
|
+
return unless svc
|
|
51
|
+
|
|
52
|
+
env_vars = svc[:env_vars]
|
|
53
|
+
return unless env_vars || svc[:base_env]
|
|
54
|
+
|
|
55
|
+
base_dir = svc[:base_dir]
|
|
56
|
+
env_file = svc[:env_file]
|
|
57
|
+
base_env = svc[:base_env]
|
|
58
|
+
|
|
59
|
+
# Copy base env template if configured
|
|
60
|
+
if base_env && env_file && base_dir
|
|
61
|
+
src = File.join(ENV_TEMPLATES_DIR, base_env)
|
|
62
|
+
dest = File.join(base_dir, env_file)
|
|
63
|
+
if File.exist?(src)
|
|
64
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
|
65
|
+
FileUtils.cp(src, dest)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Inject variation values into env file
|
|
70
|
+
return unless env_vars && env_file && base_dir
|
|
71
|
+
|
|
72
|
+
dest = File.join(base_dir, env_file)
|
|
73
|
+
lines = File.exist?(dest) ? File.readlines(dest) : []
|
|
74
|
+
|
|
75
|
+
env_vars.each do |var_name, var_config|
|
|
76
|
+
next unless var_config.is_a?(Hash) && var_config['variations']
|
|
77
|
+
|
|
78
|
+
variation = (variation_overrides[var_name] || variation_overrides[var_name.to_sym] || 'local').to_s
|
|
79
|
+
value = var_config['variations'][variation]
|
|
80
|
+
next unless value
|
|
81
|
+
|
|
82
|
+
# Replace existing line or append
|
|
83
|
+
replaced = false
|
|
84
|
+
lines.map! do |line|
|
|
85
|
+
if line.match?(/\A#{Regexp.escape(var_name)}=/)
|
|
86
|
+
replaced = true
|
|
87
|
+
"#{var_name}=#{value}\n"
|
|
88
|
+
else
|
|
89
|
+
line
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
lines << "#{var_name}=#{value}\n" unless replaced
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
File.write(dest, lines.join)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def start_group(name, tmux_info: {}, task_info: {})
|
|
99
|
+
group = find_group(name)
|
|
100
|
+
unless group
|
|
101
|
+
puts "Group '#{name}' not found"
|
|
102
|
+
return false
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
members = group[:services]
|
|
106
|
+
unless members && !members.empty?
|
|
107
|
+
puts "Group '#{group[:name]}' has no services"
|
|
108
|
+
return false
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
puts "Starting group '#{group[:name]}'..."
|
|
112
|
+
members.each do |member|
|
|
113
|
+
member_name = member['name'] || member[:name]
|
|
114
|
+
use_overrides = member['use'] || member[:use] || {}
|
|
115
|
+
|
|
116
|
+
prepare_env(member_name, variation_overrides: use_overrides)
|
|
117
|
+
start(member_name, tmux_info: tmux_info, task_info: task_info, skip_env: true)
|
|
118
|
+
end
|
|
119
|
+
true
|
|
120
|
+
end
|
|
121
|
+
|
|
33
122
|
def running?(name)
|
|
34
123
|
state = load_state
|
|
35
124
|
state.key?(name)
|
|
@@ -39,7 +128,7 @@ class Hiiro
|
|
|
39
128
|
load_state
|
|
40
129
|
end
|
|
41
130
|
|
|
42
|
-
def start(name, tmux_info: {}, task_info: {})
|
|
131
|
+
def start(name, tmux_info: {}, task_info: {}, variation_overrides: {}, skip_env: false)
|
|
43
132
|
svc = find_service(name)
|
|
44
133
|
unless svc
|
|
45
134
|
puts "Service '#{name}' not found"
|
|
@@ -54,6 +143,11 @@ class Hiiro
|
|
|
54
143
|
return false
|
|
55
144
|
end
|
|
56
145
|
|
|
146
|
+
# Prepare env file unless already handled by start_group
|
|
147
|
+
unless skip_env
|
|
148
|
+
prepare_env(svc_name, variation_overrides: variation_overrides)
|
|
149
|
+
end
|
|
150
|
+
|
|
57
151
|
# Run init commands
|
|
58
152
|
if svc[:init]
|
|
59
153
|
svc[:init].each do |cmd|
|
|
@@ -283,12 +377,24 @@ class Hiiro
|
|
|
283
377
|
h.run_subcmd(:ls)
|
|
284
378
|
end
|
|
285
379
|
|
|
286
|
-
h.add_subcmd(:start) do |svc_name=nil|
|
|
380
|
+
h.add_subcmd(:start) do |svc_name=nil, *extra_args|
|
|
287
381
|
unless svc_name
|
|
288
|
-
puts "Usage: service start <name>"
|
|
382
|
+
puts "Usage: service start <name> [--use VAR=variation ...]"
|
|
289
383
|
next
|
|
290
384
|
end
|
|
291
385
|
|
|
386
|
+
# Parse --use flags from extra_args
|
|
387
|
+
variation_overrides = {}
|
|
388
|
+
extra_args.each_with_index do |arg, i|
|
|
389
|
+
if arg == '--use' && extra_args[i + 1]
|
|
390
|
+
key, val = extra_args[i + 1].split('=', 2)
|
|
391
|
+
variation_overrides[key] = val if key && val
|
|
392
|
+
elsif arg.start_with?('--use=')
|
|
393
|
+
key, val = arg.sub('--use=', '').split('=', 2)
|
|
394
|
+
variation_overrides[key] = val if key && val
|
|
395
|
+
end
|
|
396
|
+
end
|
|
397
|
+
|
|
292
398
|
tmux_info = {
|
|
293
399
|
session: ENV['TMUX'] ? `tmux display-message -p '#S'`.chomp : nil,
|
|
294
400
|
window: ENV['TMUX'] ? `tmux display-message -p '#I'`.chomp : nil,
|
|
@@ -308,7 +414,13 @@ class Hiiro
|
|
|
308
414
|
end
|
|
309
415
|
end
|
|
310
416
|
|
|
311
|
-
|
|
417
|
+
# Check if it's a group or individual service
|
|
418
|
+
group = sm.find_group(svc_name)
|
|
419
|
+
if group
|
|
420
|
+
sm.start_group(svc_name, tmux_info: tmux_info, task_info: task_info)
|
|
421
|
+
else
|
|
422
|
+
sm.start(svc_name, tmux_info: tmux_info, task_info: task_info, variation_overrides: variation_overrides)
|
|
423
|
+
end
|
|
312
424
|
end
|
|
313
425
|
|
|
314
426
|
h.add_subcmd(:stop) do |svc_name=nil|
|
|
@@ -433,6 +545,61 @@ class Hiiro
|
|
|
433
545
|
editor = ENV['EDITOR'] || 'nvim'
|
|
434
546
|
system(editor, sm.config_file)
|
|
435
547
|
end
|
|
548
|
+
|
|
549
|
+
h.add_subcmd(:groups) do
|
|
550
|
+
configs = sm.services
|
|
551
|
+
groups = configs.select { |_, v| v.is_a?(Hash) && v.key?('services') }
|
|
552
|
+
|
|
553
|
+
if groups.empty?
|
|
554
|
+
puts "No service groups configured."
|
|
555
|
+
next
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
puts "Service groups:"
|
|
559
|
+
puts
|
|
560
|
+
groups.each do |name, cfg|
|
|
561
|
+
members = (cfg['services'] || []).map { |m| m['name'] || m[:name] }.compact
|
|
562
|
+
puts format(" %-20s %s", name, members.join(', '))
|
|
563
|
+
end
|
|
564
|
+
end
|
|
565
|
+
|
|
566
|
+
h.add_subcmd(:env) do |svc_name=nil|
|
|
567
|
+
unless svc_name
|
|
568
|
+
puts "Usage: service env <name>"
|
|
569
|
+
next
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
svc = sm.find_service(svc_name)
|
|
573
|
+
unless svc
|
|
574
|
+
puts "Service '#{svc_name}' not found"
|
|
575
|
+
next
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
env_vars = svc[:env_vars]
|
|
579
|
+
unless env_vars
|
|
580
|
+
puts "No env_vars configured for '#{svc[:name]}'"
|
|
581
|
+
next
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
puts "Env vars for '#{svc[:name]}':"
|
|
585
|
+
puts
|
|
586
|
+
env_vars.each do |var_name, var_config|
|
|
587
|
+
next unless var_config.is_a?(Hash) && var_config['variations']
|
|
588
|
+
|
|
589
|
+
puts " #{var_name}:"
|
|
590
|
+
var_config['variations'].each do |variation, value|
|
|
591
|
+
puts " #{variation}: #{value}"
|
|
592
|
+
end
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
if svc[:base_env]
|
|
596
|
+
puts
|
|
597
|
+
puts "Base env template: #{svc[:base_env]}"
|
|
598
|
+
end
|
|
599
|
+
if svc[:env_file]
|
|
600
|
+
puts "Env file: #{svc[:env_file]}"
|
|
601
|
+
end
|
|
602
|
+
end
|
|
436
603
|
end
|
|
437
604
|
end
|
|
438
605
|
|
data/lib/hiiro/version.rb
CHANGED