Skip to content

Commit

Permalink
multi: add SideSail support
Browse files Browse the repository at this point in the history
  • Loading branch information
torkelrogstad committed Dec 5, 2023
1 parent d36042d commit e2d298b
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 73 deletions.
25 changes: 24 additions & 1 deletion autoloads/appstate.gd
Original file line number Diff line number Diff line change
Expand Up @@ -131,16 +131,28 @@ func load_config():
if err != OK:
print(ProjectSettings.globalize_path(DEFAULT_CHAIN_PROVIDERS_PATH) + " not found. Something went terribly wrong")
get_tree().quit() # TODO: Set exit code

else:
print("Loaded config file from path ", CHAIN_PROVIDERS_PATH)


var sections = chain_providers_config.get_sections()
var dict = {}
for s in sections:
var inner_dict = {}

# Let the chain providers specify a download URL
var baseURL = chain_providers_config.get_value(s, "base_download_url")

# But fallback to the global download URL if that's not set
if baseURL == null:
baseURL = version_config.get_value("", "base_download_url")

inner_dict['base_download_url'] = baseURL

var keys = chain_providers_config.get_section_keys(s)
for k in keys:
inner_dict[k] = chain_providers_config.get_value(s, k) #TODO: Default?
inner_dict['base_download_url'] = version_config.get_value("", "base_download_url")
dict[s] = inner_dict


Expand Down Expand Up @@ -184,6 +196,17 @@ func save_config():
chain_providers_config.save(CHAIN_PROVIDERS_PATH)



func get_platform_config_suffix() -> String:
match OS.get_name():
"Windows", "UWP":
return "_win"
"macOS":
return "_mac"
"Linux", "FreeBSD", "NetBSD", "OpenBSD", "BSD":
return "_linux"
return ""

func get_platform() -> platform:
match OS.get_name():
"Windows", "UWP":
Expand Down
26 changes: 26 additions & 0 deletions chain_providers.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -213,3 +213,29 @@ port=19035
slot=6
version="4.01.00"
chain_type=5

[TestSail]

id="testsail"
display_name="TestSail"
description="User interface for Testchain"
repo_url="https://github.com/barebitcoin/sidesail"
base_download_url="https://github.com/barebitcoin/sidesail/releases/download/v0.1"
download_file_linux=""
download_file_win=""
download_file_mac="TestSail.zip"
download_size_linux=0
download_size_win=0
download_size_mac=28247101
download_hash_linux="johnny"
download_hash_win="goes to"
download_hash_mac="dingustown"
base_dir_linux=".testsail"
base_dir_win="TestSail"
base_dir_mac="TestSail"
binary_zip_path_mac="TestSail.app/Contents/MacOS/TestSail"
executable_name_mac="TestSail.app/Contents/MacOS/TestSail"
port=19000
slot=0
version="0"
chain_type=1
36 changes: 22 additions & 14 deletions models/chain_provider.gd
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ func _init(dict: Dictionary):
self.display_name = dict.get('display_name', '')
self.description = dict.get('description', '')
self.repo_url = dict.get('repo_url', '')
self.binary_zip_path = dict.get('binary_zip_path', '')

var binary_zip_path_fallback = dict.get('binary_zip_path', '')
self.binary_zip_path = dict.get('binary_zip_path' + Appstate.get_platform_config_suffix(), binary_zip_path_fallback)
self.port = dict.get('port', -1)
self.slot = dict.get('slot', -1)
self.chain_type = dict.get('chain_type', 0)
Expand Down Expand Up @@ -55,7 +57,12 @@ func _init(dict: Dictionary):
self.binary_zip_size = dict.get('download_size_mac', 0)
self.base_dir = Appstate.get_home() + "/Library/Application Support/" + dict.get('base_dir_mac', '')

self.executable_name = self.binary_zip_path.split("/")[-1]
# If the chain doesn't specify the name of the executable,
# fallback to the file name of the ZIP path.
self.executable_name = dict.get(
"executable_name" + Appstate.get_platform_config_suffix(),
self.binary_zip_path.split("/")[-1],
)


func available_for_platform() -> bool:
Expand Down Expand Up @@ -127,6 +134,7 @@ func read_conf():


func write_start_script():
print("Writing start script: ", get_start_path())
if FileAccess.file_exists(get_start_path()):
DirAccess.remove_absolute(get_start_path())

Expand Down Expand Up @@ -174,18 +182,18 @@ func write_dir():


func start_chain():
match Appstate.get_platform():
Appstate.platform.LINUX,Appstate.platform.MAC,Appstate.platform.WIN:
if id == "zside":
var dir = DirAccess.open(ProjectSettings.globalize_path(Appstate.get_home() + "/.zcash-params"))
if dir == null:
Appstate.show_zparams_modal(self)
else:
var pid = OS.create_process(get_start_path(), [], false)
print("Process with started with pid: " + str(pid))
else:
var pid = OS.create_process(get_start_path(), [], false)
print("Process with started with pid: " + str(pid))
if id == "zside":
var dir = DirAccess.open(ProjectSettings.globalize_path(Appstate.get_home() + "/.zcash-params"))
if dir == null:
Appstate.show_zparams_modal(self)

var binary = get_start_path()
print("Starting binary: ", binary)

var pid = OS.create_process(binary, [], false)
assert(pid != -1, "could not start process: " + binary)
print("Process started with pid: " + str(pid))



func get_start_path() -> String:
Expand Down
2 changes: 1 addition & 1 deletion release.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ To run on macOS, unzip and mount the .dmg file:

```
Depending on your macOS version, its possible that GateKeeper will not allow you to run the launcher.
We are working on notarizing the macOS build so that this isnt a problem.
We are working on notarizing the macOS build so that this isn't a problem.
```

To run on Windows, unzip and run the .exe
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ func download():
progress_timer.stop()
remove_child(progress_timer)

print("Downloading ", chain_provider.display_name, " from " , chain_provider.download_url)
download_req = HTTPRequest.new()
add_child(download_req)

Expand Down Expand Up @@ -182,65 +183,44 @@ func _on_download_progress():
func _on_download_complete(result, response_code, _headers, body):
reset_download()
if result != 0 or response_code != 200:
print("Could not download ", chain_provider.display_name, ": ", response_code)
return

print("Downloading ", chain_provider.display_name, ": OK" )
var path = chain_provider.base_dir + "/" + chain_provider.id + ".zip"
var save_game = FileAccess.open(path, FileAccess.WRITE)
save_game.store_buffer(body)
save_game.close()

unzip_file_and_setup_binary(path)
unzip_file_and_setup_binary(chain_provider.base_dir, path)


func unzip_file_and_setup_binary(zip_path: String):
var reader := ZIPReader.new()
var err := reader.open(zip_path)
if err != OK:
push_error("Unabled to read zip")
show_download_state()
return

var files = reader.get_files()
var binary_index: int
for i in files.size():
if files[i].ends_with(chain_provider.binary_zip_path):
binary_index = i
break

var zside_params_index = -1
var zside_params_name = "zside-fetch-params.sh"
if chain_provider.id == "zside":
for i in files.size():
if files[i].ends_with(zside_params_name):
zside_params_index = i
break

if binary_index != null && binary_index >= 0:
var path = files[binary_index]
var binary = reader.read_file(path)

if binary.size() > 0:
var save = FileAccess.open(chain_provider.get_executable_path(), FileAccess.WRITE)
save.store_buffer(binary)
save.close()

if zside_params_index > -1:
var zside_params = files[zside_params_index]
var zside_binary = reader.read_file(zside_params)
if zside_binary.size() > 0:
var save_zside_params = FileAccess.open(ProjectSettings.globalize_path(chain_provider.base_dir + "/" + zside_params_name), FileAccess.WRITE)
save_zside_params.store_buffer(zside_binary)
save_zside_params.close()

if Appstate.get_platform() != Appstate.platform.WIN:
OS.execute("chmod", ["+x", ProjectSettings.globalize_path(chain_provider.base_dir + "/" + zside_params_name)])

chain_provider.write_start_script()

if Appstate.get_platform() != Appstate.platform.WIN:
OS.execute("chmod", ["+x", chain_provider.get_executable_path()])
OS.execute("chmod", ["+x", ProjectSettings.globalize_path(chain_provider.get_start_path())])

# A prior implementation of this unzipped through using ZIPReader.
# However, this swallowed file types and permissions. Instead, we
# execute a program that handles this for us.
# TODO: handle Linux, Windows
func unzip_file_and_setup_binary(base_dir: String, zip_path: String):
var prog = "unzip"
var args = [zip_path, "-d", base_dir]
if Appstate.get_platform() == Appstate.platform.WIN:
prog = "powershell.exe"
args = ["-Command", 'Expand-Archive -Force ' + zip_path + ' ' + base_dir]


print("Unzipping ", zip_path, ": ", prog, " ", args)
assert(
OS.execute(prog, args) == OK,
"Was not able to unzip"
)

chain_provider.write_start_script()
if Appstate.get_platform() != Appstate.platform.WIN:
OS.execute("chmod", ["+x", ProjectSettings.globalize_path(chain_provider.get_start_path())])

# This will error on non-zcash chains, but that's OK. Just swallow it.
var zside_params_name = "zside-fetch-params.sh"
OS.execute("chmod", ["+x", ProjectSettings.globalize_path(chain_provider.base_dir + "/" + zside_params_name)])

update_view()


Expand All @@ -258,18 +238,17 @@ func reset_download():


func _on_start_button_pressed():
print("Starting chain: ", chain_provider.id)

if chain_provider.id != "drivechain":
var drivechain_state = Appstate.get_drivechain_state()
if drivechain_state == null:
return
assert(drivechain_state != null)

if await drivechain_state.needs_activation(chain_provider):
print("Activating sidechain: ", chain_provider.id)
await drivechain_state.request_create_sidechain_proposal(chain_provider)
chain_provider.start_chain()
else:
chain_provider.start_chain()
else:
chain_provider.start_chain()

chain_provider.start_chain()

start_button.disabled = true

Expand Down

0 comments on commit e2d298b

Please sign in to comment.