roku_builder 3.13.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/CHANGELOG +12 -0
- data/Gemfile.lock +22 -7
- data/Guardfile +3 -3
- data/README.md +22 -398
- data/bin/roku +1 -194
- data/config.json.example +1 -1
- data/intergration/roku_builder/test_core.rb +52 -0
- data/intergration/roku_builder/test_files/core_intergration_test/manifest_template +7 -0
- data/intergration/roku_builder/test_files/core_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/components/rectanglescene.xml +28 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/source/main.brs +23 -0
- data/intergration/roku_builder/test_files/inspector_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/linker_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/loader_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/monitor_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/navigator_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/packager_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/profiler_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/scripter_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/components/rectanglescene.xml +29 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_mm_focus_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_fhd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rde_splash_sd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_bg_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_mm_focus_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/images/rsgde_splash_hd.jpg +0 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/manifest +21 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/source/main.brs +21 -0
- data/intergration/roku_builder/test_files/tester_intergration_test/test.pkg +0 -0
- data/intergration/roku_builder/test_helper.rb +138 -0
- data/intergration/roku_builder/test_inspector.rb +35 -0
- data/intergration/roku_builder/test_linker.rb +32 -0
- data/intergration/roku_builder/test_loader.rb +38 -0
- data/intergration/roku_builder/test_monitor.rb +21 -0
- data/intergration/roku_builder/test_navigator.rb +34 -0
- data/intergration/roku_builder/test_packager.rb +41 -0
- data/intergration/roku_builder/test_profiler.rb +48 -0
- data/intergration/roku_builder/test_scripter.rb +38 -0
- data/intergration/roku_builder/test_tester.rb +21 -0
- data/lib/roku_builder.rb +143 -154
- data/lib/roku_builder/config.rb +17 -40
- data/lib/roku_builder/config_parser.rb +49 -200
- data/lib/roku_builder/config_validator.rb +1 -1
- data/lib/roku_builder/errors.rb +12 -0
- data/lib/roku_builder/git.rb +28 -0
- data/lib/roku_builder/hash.rb +8 -0
- data/lib/roku_builder/manifest.rb +121 -0
- data/lib/roku_builder/options.rb +68 -29
- data/lib/roku_builder/plugin.rb +30 -0
- data/lib/roku_builder/plugins/core.rb +117 -0
- data/lib/roku_builder/plugins/inspector.rb +104 -0
- data/lib/roku_builder/{linker.rb → plugins/linker.rb} +38 -12
- data/lib/roku_builder/plugins/loader.rb +152 -0
- data/lib/roku_builder/{monitor.rb → plugins/monitor.rb} +20 -9
- data/lib/roku_builder/{navigator.rb → plugins/navigator.rb} +136 -88
- data/lib/roku_builder/plugins/packager.rb +194 -0
- data/lib/roku_builder/plugins/profiler.rb +135 -0
- data/lib/roku_builder/plugins/scripter.rb +53 -0
- data/lib/roku_builder/{tester.rb → plugins/tester.rb} +28 -19
- data/lib/roku_builder/stager.rb +48 -12
- data/lib/roku_builder/string.rb +20 -0
- data/lib/roku_builder/util.rb +10 -34
- data/lib/roku_builder/version.rb +1 -1
- data/rakefile +5 -1
- data/roku_builder.gemspec +2 -0
- data/test/roku_builder/plugins/test_core.rb +112 -0
- data/test/roku_builder/plugins/test_inspector.rb +165 -0
- data/test/roku_builder/plugins/test_linker.rb +123 -0
- data/test/roku_builder/plugins/test_loader.rb +115 -0
- data/test/roku_builder/plugins/test_monitor.rb +141 -0
- data/test/roku_builder/plugins/test_navigator.rb +274 -0
- data/test/roku_builder/plugins/test_packager.rb +202 -0
- data/test/roku_builder/plugins/test_profiler.rb +127 -0
- data/test/roku_builder/plugins/test_scripter.rb +110 -0
- data/test/roku_builder/plugins/test_tester.rb +109 -0
- data/test/roku_builder/test_config.rb +51 -35
- data/test/roku_builder/test_config_parser.rb +76 -154
- data/test/roku_builder/test_config_validator.rb +18 -1
- data/test/roku_builder/test_files/{loader_test/manifest → config_parser_test/test.pkg} +0 -0
- data/test/roku_builder/test_files/config_test/config.json +3 -0
- data/test/roku_builder/test_files/controller_commands_test/manifest_template +7 -0
- data/test/roku_builder/test_files/core_test/manifest_template +7 -0
- data/test/roku_builder/test_files/core_test/test.pkg +0 -0
- data/test/roku_builder/test_files/inspector_test/manifest +6 -0
- data/test/roku_builder/test_files/inspector_test/test.pkg +0 -0
- data/test/roku_builder/test_files/linker_test/manifest +6 -0
- data/test/roku_builder/test_files/linker_test/test.pkg +0 -0
- data/test/roku_builder/test_files/loader_test/manifest_template +6 -0
- data/test/roku_builder/test_files/loader_test/test.pkg +0 -0
- data/test/roku_builder/test_files/loader_test/test.zip +0 -0
- data/test/roku_builder/test_files/manifest_test/manifest_comments +6 -0
- data/test/roku_builder/test_files/manifest_test/manifest_template +7 -0
- data/test/roku_builder/test_files/manifest_test/test.zip +0 -0
- data/test/roku_builder/test_files/packager_test/manifest +6 -0
- data/test/roku_builder/test_files/packager_test/scripter_test/manifest +6 -0
- data/test/roku_builder/test_files/packager_test/test.pkg +0 -0
- data/test/roku_builder/test_files/roku_builder_test/config.json +32 -0
- data/test/roku_builder/test_files/scripter_test/manifest +6 -0
- data/test/roku_builder/test_files/scripter_test/test.pkg +0 -0
- data/test/roku_builder/test_files/stager_test/test.pkg +0 -0
- data/test/roku_builder/test_files/tester_test/manifest +6 -0
- data/test/roku_builder/test_files/tester_test/test.pkg +0 -0
- data/test/roku_builder/test_helper.rb +44 -11
- data/test/roku_builder/test_logger.rb +1 -0
- data/test/roku_builder/test_manifest.rb +99 -0
- data/test/roku_builder/test_options.rb +106 -77
- data/test/roku_builder/test_options_plugins.rb +111 -0
- data/test/roku_builder/test_plugin.rb +48 -0
- data/test/roku_builder/test_roku_builder.rb +239 -0
- data/test/roku_builder/test_stager.rb +49 -101
- data/test/roku_builder/test_util.rb +19 -4
- metadata +241 -47
- data/lib/roku_builder/controller.rb +0 -98
- data/lib/roku_builder/controller_commands.rb +0 -224
- data/lib/roku_builder/error_handler.rb +0 -142
- data/lib/roku_builder/inspector.rb +0 -82
- data/lib/roku_builder/keyer.rb +0 -106
- data/lib/roku_builder/loader.rb +0 -131
- data/lib/roku_builder/manifest_manager.rb +0 -126
- data/lib/roku_builder/packager.rb +0 -43
- data/lib/roku_builder/profiler.rb +0 -96
- data/lib/roku_builder/scripter.rb +0 -39
- data/test/roku_builder/test_controller.rb +0 -70
- data/test/roku_builder/test_controller_commands.rb +0 -465
- data/test/roku_builder/test_error_handler.rb +0 -90
- data/test/roku_builder/test_inspector.rb +0 -298
- data/test/roku_builder/test_keyer.rb +0 -176
- data/test/roku_builder/test_linker.rb +0 -110
- data/test/roku_builder/test_loader.rb +0 -337
- data/test/roku_builder/test_manifest_manager.rb +0 -103
- data/test/roku_builder/test_monitor.rb +0 -137
- data/test/roku_builder/test_navigator.rb +0 -280
- data/test/roku_builder/test_packager.rb +0 -127
- data/test/roku_builder/test_profiler.rb +0 -35
- data/test/roku_builder/test_scripter.rb +0 -102
- data/test/roku_builder/test_tester.rb +0 -130
@@ -0,0 +1,194 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
|
5
|
+
class Packager < Util
|
6
|
+
extend Plugin
|
7
|
+
|
8
|
+
def self.commands
|
9
|
+
{
|
10
|
+
package: {device: true, source: true, stage: true, exclude: true},
|
11
|
+
genkey: {device: true},
|
12
|
+
key: {device: true, source: true}
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.parse_options(parser:, options:)
|
17
|
+
parser.separator "Commands:"
|
18
|
+
parser.on("-p", "--package", "Package an app") do
|
19
|
+
options[:package] = true
|
20
|
+
end
|
21
|
+
parser.on("-k", "--key", "Change device key") do
|
22
|
+
options[:key] = true
|
23
|
+
end
|
24
|
+
parser.on("--genkey", "Generate a new key") do
|
25
|
+
options[:genkey] = true
|
26
|
+
end
|
27
|
+
parser.separator "Options:"
|
28
|
+
parser.on("-i", "--inspect-package", "Inspect package after packaging") do
|
29
|
+
options[:inspect_package] = true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.dependencies
|
34
|
+
[Loader, Inspector]
|
35
|
+
end
|
36
|
+
|
37
|
+
def package(options:)
|
38
|
+
check_options(options)
|
39
|
+
#sideload
|
40
|
+
Loader.new(config: @config).sideload(options: options)
|
41
|
+
#rekey
|
42
|
+
key(options: options)
|
43
|
+
#package
|
44
|
+
sign_package(app_name_version: "", password: @config.key[:password], stage: options[:stage])
|
45
|
+
#inspect
|
46
|
+
if options[:inspect_package]
|
47
|
+
@config.in = @config.out
|
48
|
+
options[:password] = @config.key[:password]
|
49
|
+
Inspector.new(config: @config).inspect(options: options)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def genkey(options:)
|
54
|
+
password, dev_id = generate_new_key()
|
55
|
+
@logger.unknown("Password: "+password)
|
56
|
+
@logger.info("DevID: "+dev_id)
|
57
|
+
|
58
|
+
out = @config.out
|
59
|
+
out[:file] ||= "key_"+dev_id+".pkg"
|
60
|
+
@config.out = out
|
61
|
+
|
62
|
+
Dir.mktmpdir { |dir|
|
63
|
+
config_copy = @config.dup
|
64
|
+
config_copy.root_dir = dir
|
65
|
+
Manifest.generate({config: config_copy, attributes: {}})
|
66
|
+
Dir.mkdir(File.join(dir, "source"))
|
67
|
+
File.open(File.join(dir, "source", "main.brs"), "w") do |io|
|
68
|
+
io.puts "sub main()"
|
69
|
+
io.puts " print \"Load\""
|
70
|
+
io.puts "end sub"
|
71
|
+
end
|
72
|
+
loader = Loader.new(config: config_copy)
|
73
|
+
options[:current] = true
|
74
|
+
loader.sideload(options: options)
|
75
|
+
sign_package(app_name_version: "key_"+dev_id, password: password, stage: options[:stage])
|
76
|
+
@logger.unknown("Keyed PKG: #{File.join(@config.out[:folder], @config.out[:file])}")
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
# Sets the key on the roku device
|
81
|
+
# @param keyed_pkg [String] Path for a package signed with the desired key
|
82
|
+
# @param password [String] Password for the package
|
83
|
+
# @return [Boolean] True if key changed, false otherwise
|
84
|
+
def key(options:)
|
85
|
+
oldId = dev_id
|
86
|
+
|
87
|
+
# upload new key with password
|
88
|
+
payload = {
|
89
|
+
mysubmit: "Rekey",
|
90
|
+
passwd: @config.key[:password],
|
91
|
+
archive: Faraday::UploadIO.new(@config.key[:keyed_pkg], 'application/octet-stream')
|
92
|
+
}
|
93
|
+
multipart_connection.post "/plugin_inspect", payload
|
94
|
+
|
95
|
+
# check key
|
96
|
+
newId = dev_id
|
97
|
+
@logger.info("Key did not change") unless newId != oldId
|
98
|
+
@logger.debug(oldId + " -> " + newId)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Get the current dev id
|
102
|
+
# @return [String] The current dev id
|
103
|
+
def dev_id
|
104
|
+
path = "/plugin_package"
|
105
|
+
conn = simple_connection
|
106
|
+
response = conn.get path
|
107
|
+
|
108
|
+
dev_id = /Your Dev ID:\s*<font[^>]*>([^<]*)<\/font>/.match(response.body)
|
109
|
+
dev_id ||= /Your Dev ID:[^>]*<\/label> ([^<]*)/.match(response.body)
|
110
|
+
dev_id = dev_id[1] if dev_id
|
111
|
+
dev_id ||= "none"
|
112
|
+
dev_id
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
def check_options(options)
|
118
|
+
raise InvalidOptions, "Can not use '--in' for packaging" if options[:in]
|
119
|
+
raise InvalidOptions, "Can not use '--ref' for packaging" if options[:ref]
|
120
|
+
raise InvalidOptions, "Can not use '--current' for packaging" if options[:current]
|
121
|
+
end
|
122
|
+
|
123
|
+
# Sign and download the currently sideloaded app
|
124
|
+
def sign_package(app_name_version:, password:, stage: nil)
|
125
|
+
payload = {
|
126
|
+
mysubmit: "Package",
|
127
|
+
app_name: app_name_version,
|
128
|
+
passwd: password,
|
129
|
+
pkg_time: Time.now.to_i
|
130
|
+
}
|
131
|
+
response = multipart_connection.post "/plugin_package", payload
|
132
|
+
|
133
|
+
# Check for error
|
134
|
+
failed = /(Failed: [^\.]*\.)/.match(response.body)
|
135
|
+
raise ExecutionError, failed[1] if failed
|
136
|
+
|
137
|
+
# Download signed package
|
138
|
+
pkg = /<a href="pkgs[^>]*>([^<]*)</.match(response.body)[1]
|
139
|
+
path = "/pkgs/#{pkg}"
|
140
|
+
conn = Faraday.new(url: @url) do |f|
|
141
|
+
f.request :digest, @dev_username, @dev_password
|
142
|
+
f.adapter Faraday.default_adapter
|
143
|
+
end
|
144
|
+
response = conn.get path
|
145
|
+
raise ExecutionError, "Failed to download signed package" if response.status != 200
|
146
|
+
out_file = nil
|
147
|
+
unless @config.out[:file]
|
148
|
+
out = @config.out
|
149
|
+
if stage
|
150
|
+
out[:file] = "#{@config.project[:app_name]}_#{stage}"
|
151
|
+
else
|
152
|
+
out[:file] = "#{@config.project[:app_name]}_working"
|
153
|
+
end
|
154
|
+
@config.out = out
|
155
|
+
end
|
156
|
+
out_file = File.join(@config.out[:folder], @config.out[:file])
|
157
|
+
out_file = out_file+".pkg" unless out_file.end_with?(".pkg")
|
158
|
+
File.open(out_file, 'w+') {|fp| fp.write(response.body)}
|
159
|
+
true
|
160
|
+
end
|
161
|
+
|
162
|
+
# Uses the device to generate a new signing key
|
163
|
+
# @return [Array<String>] Password and dev_id for the new key
|
164
|
+
def generate_new_key()
|
165
|
+
telnet_config = {
|
166
|
+
'Host' => @roku_ip_address,
|
167
|
+
'Port' => 8080
|
168
|
+
}
|
169
|
+
connection = Net::Telnet.new(telnet_config)
|
170
|
+
connection.puts("genkey")
|
171
|
+
waitfor_config = {
|
172
|
+
'Match' => /./,
|
173
|
+
'Timeout' => false
|
174
|
+
}
|
175
|
+
password = nil
|
176
|
+
dev_id = nil
|
177
|
+
while password.nil? or dev_id.nil?
|
178
|
+
connection.waitfor(waitfor_config) do |txt|
|
179
|
+
while line = txt.slice!(/^.*\n/) do
|
180
|
+
words = line.split
|
181
|
+
if words[0] == "Password:"
|
182
|
+
password = words[1]
|
183
|
+
elsif words[0] == "DevID:"
|
184
|
+
dev_id = words[1]
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
connection.close
|
190
|
+
return password, dev_id
|
191
|
+
end
|
192
|
+
end
|
193
|
+
RokuBuilder.register_plugin(Packager)
|
194
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
|
5
|
+
# Scene Graph Profiler
|
6
|
+
class Profiler < Util
|
7
|
+
extend Plugin
|
8
|
+
|
9
|
+
def self.commands
|
10
|
+
{profile: {device: true}}
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.parse_options(parser:, options:)
|
14
|
+
parser.separator "Commands:"
|
15
|
+
parser.on("--profile COMMAND", "Run various profiler options") do |c|
|
16
|
+
options[:profile] = c
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Run the profiler commands
|
21
|
+
# @param command [Symbol] The profiler command to run
|
22
|
+
def profile(options:)
|
23
|
+
case options[:profile].to_sym
|
24
|
+
when :stats
|
25
|
+
print_stats
|
26
|
+
when :all
|
27
|
+
print_all_nodes
|
28
|
+
when :images
|
29
|
+
print_image_information
|
30
|
+
when :textures
|
31
|
+
print_texture_information
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# Print the node stats
|
38
|
+
def print_stats
|
39
|
+
end_reg = /<\/All_Nodes>/
|
40
|
+
start_reg = /<All_Nodes>/
|
41
|
+
lines = get_command_response(command: "sgnodes all", start_reg: start_reg, end_reg: end_reg)
|
42
|
+
xml_string = lines.join("\n")
|
43
|
+
stats = {"Total" => 0}
|
44
|
+
doc = Nokogiri::XML(xml_string)
|
45
|
+
handle_node(stats: stats, node: doc.root)
|
46
|
+
stats = stats.to_a
|
47
|
+
stats = stats.sort {|a, b| b[1] <=> a[1]}
|
48
|
+
printf "%30s | %5s\n", "Name", "Count"
|
49
|
+
stats.each do |key_pair|
|
50
|
+
printf "%30s | %5d\n", key_pair[0], key_pair[1]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def handle_node(stats:, node:)
|
55
|
+
node.element_children.each do |element|
|
56
|
+
stats[element.name] ||= 0
|
57
|
+
stats[element.name] += 1
|
58
|
+
stats["Total"] += 1
|
59
|
+
handle_node(stats: stats, node: element)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def print_all_nodes
|
64
|
+
start_reg = /<All_Nodes>/
|
65
|
+
end_reg = /<\/All_Nodes>/
|
66
|
+
lines = get_command_response(command: "sgnodes all", start_reg: start_reg, end_reg: end_reg)
|
67
|
+
lines.each {|line| print line}
|
68
|
+
end
|
69
|
+
def print_image_information
|
70
|
+
start_reg = /RoGraphics instance/
|
71
|
+
end_reg = /Available memory/
|
72
|
+
lines = get_command_response(command: "r2d2_bitmaps", start_reg: start_reg, end_reg: end_reg)
|
73
|
+
lines.each {|line| print line}
|
74
|
+
end
|
75
|
+
def print_texture_information
|
76
|
+
start_reg = /\*+/
|
77
|
+
end_reg = /#{SecureRandom.uuid}/
|
78
|
+
lines = get_command_response(command: "loaded_textures", start_reg: start_reg, end_reg: end_reg)
|
79
|
+
lines.each {|line| print line}
|
80
|
+
end
|
81
|
+
|
82
|
+
# Retrive list of all nodes
|
83
|
+
# @return [Array<String>] Array of lines
|
84
|
+
def get_command_response(command:, start_reg:, end_reg:, unique: false)
|
85
|
+
waitfor_config = {
|
86
|
+
'Match' => /.+/,
|
87
|
+
'Timeout' => 5
|
88
|
+
}
|
89
|
+
telnet_config ={
|
90
|
+
'Host' => @roku_ip_address,
|
91
|
+
'Port' => 8080
|
92
|
+
}
|
93
|
+
|
94
|
+
connection = Net::Telnet.new(telnet_config)
|
95
|
+
|
96
|
+
@lines = []
|
97
|
+
@all_txt = ""
|
98
|
+
@begun = false
|
99
|
+
@done = false
|
100
|
+
connection.puts("#{command}\n")
|
101
|
+
while not @done
|
102
|
+
begin
|
103
|
+
connection.waitfor(waitfor_config) do |txt|
|
104
|
+
handle_text(txt: txt, start_reg: start_reg, end_reg: end_reg, unique: unique)
|
105
|
+
end
|
106
|
+
rescue Net::ReadTimeout
|
107
|
+
@logger.warn "Timed out reading profiler information"
|
108
|
+
@done = true
|
109
|
+
end
|
110
|
+
end
|
111
|
+
@lines
|
112
|
+
end
|
113
|
+
|
114
|
+
# Handle profiling text
|
115
|
+
# @param all_txt [String] remainder text from last run
|
116
|
+
# @param txt [String] current text from telnet
|
117
|
+
# @param in_nodes [Boolean] currently parsing test text
|
118
|
+
# @return [Boolean] currently parsing test text
|
119
|
+
def handle_text(txt:, start_reg:, end_reg:, unique:)
|
120
|
+
@all_txt += txt
|
121
|
+
while line = @all_txt.slice!(/^.*\n/) do
|
122
|
+
if line =~ start_reg
|
123
|
+
@begun = true
|
124
|
+
@lines = [] if unique
|
125
|
+
end
|
126
|
+
@lines.push(line) if @begun
|
127
|
+
if line =~ end_reg
|
128
|
+
@begun = false
|
129
|
+
@done = true
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
RokuBuilder.register_plugin(Profiler)
|
135
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# ********** Copyright Viacom, Inc. Apache 2.0 **********
|
2
|
+
|
3
|
+
module RokuBuilder
|
4
|
+
|
5
|
+
# Helper for extending for scripting
|
6
|
+
class Scripter
|
7
|
+
extend Plugin
|
8
|
+
|
9
|
+
def self.commands
|
10
|
+
{print: {source: true, stage: true}}
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.parse_options(parser:, options:)
|
14
|
+
parser.separator("Commands:")
|
15
|
+
parser.on("--print ATTRIBUTE", "Print attribute for scripting") do |a|
|
16
|
+
options[:print] = a.to_sym
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(config:)
|
21
|
+
@config = config
|
22
|
+
end
|
23
|
+
|
24
|
+
def print(options:)
|
25
|
+
attributes = [
|
26
|
+
:title, :build_version, :app_version, :root_dir, :app_name
|
27
|
+
]
|
28
|
+
|
29
|
+
unless attributes.include? options[:print]
|
30
|
+
raise ExecutionError, "Unknown attribute: #{options[:print]}"
|
31
|
+
end
|
32
|
+
|
33
|
+
manifest = Manifest.new(config: @config)
|
34
|
+
|
35
|
+
case options[:print]
|
36
|
+
when :root_dir
|
37
|
+
printf "%s", @config.project[:directory]
|
38
|
+
when :app_name
|
39
|
+
printf "%s", @config.project[:app_name]
|
40
|
+
when :title
|
41
|
+
printf "%s", manifest.title
|
42
|
+
when :build_version
|
43
|
+
printf "%s", manifest.build_version
|
44
|
+
when :app_version
|
45
|
+
major = manifest.major_version
|
46
|
+
minor = manifest.minor_version
|
47
|
+
printf "%s.%s", major, minor
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
RokuBuilder.register_plugin(Scripter)
|
53
|
+
end
|
@@ -6,10 +6,25 @@ module RokuBuilder
|
|
6
6
|
# This is intended to be used with the brstest librbary but should work
|
7
7
|
# with other testing libraries
|
8
8
|
class Tester < Util
|
9
|
+
extend Plugin
|
10
|
+
|
11
|
+
def self.commands
|
12
|
+
{test: {device: true, source: true, stage: true}}
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.parse_options(parser:, options:)
|
16
|
+
parser.separator "Commands:"
|
17
|
+
parser.on("-t", "--test", "Test an app") do
|
18
|
+
options[:test] = true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.dependencies
|
23
|
+
[Loader, Linker]
|
24
|
+
end
|
9
25
|
|
10
26
|
# Initialize starting and ending regular expressions
|
11
|
-
def init(
|
12
|
-
@root_dir = root_dir
|
27
|
+
def init()
|
13
28
|
@end_reg = /\*+\s*End testing\s*\*+/
|
14
29
|
@start_reg = /\*+\s*Start testing\s*\*+/
|
15
30
|
@test_logger = ::Logger.new(STDOUT)
|
@@ -22,29 +37,22 @@ module RokuBuilder
|
|
22
37
|
|
23
38
|
# Run tests and report results
|
24
39
|
# @param sideload_config [Hash] The config for sideloading the app
|
25
|
-
def
|
40
|
+
def test(options:)
|
41
|
+
loader = Loader.new(config: @config)
|
42
|
+
loader.sideload(options: options)
|
43
|
+
linker = Linker.new(config: @config)
|
44
|
+
linker.deeplink(options: Options.new(options: {deeplink: "RunTests:true"}))
|
45
|
+
|
26
46
|
telnet_config ={
|
27
47
|
'Host' => @roku_ip_address,
|
28
48
|
'Port' => 8085
|
29
49
|
}
|
30
|
-
|
31
|
-
@device_config[:init_params] = {
|
32
|
-
root_dir: @root_dir
|
33
|
-
}
|
34
|
-
loader = Loader.new(**@device_config)
|
35
50
|
connection = Net::Telnet.new(telnet_config)
|
36
|
-
|
37
|
-
|
38
|
-
@device_config[:init_params] = nil
|
39
|
-
linker = Linker.new(**@device_config)
|
40
|
-
linker.launch(options: "RunTests:true")
|
41
|
-
|
42
|
-
connection.waitfor(@end_reg) do |txt|
|
43
|
-
handle_text(txt: txt)
|
44
|
-
end
|
45
|
-
print_logs
|
46
|
-
connection.puts("cont\n")
|
51
|
+
connection.waitfor(@end_reg) do |txt|
|
52
|
+
handle_text(txt: txt)
|
47
53
|
end
|
54
|
+
print_logs
|
55
|
+
connection.puts("cont\n")
|
48
56
|
end
|
49
57
|
|
50
58
|
private
|
@@ -95,4 +103,5 @@ module RokuBuilder
|
|
95
103
|
end
|
96
104
|
end
|
97
105
|
end
|
106
|
+
RokuBuilder.register_plugin(Tester)
|
98
107
|
end
|